ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5kMDg5MGZlIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxOSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmF1ZGlvcG9saWN5c2VydmljZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lzZXJ2aWNlX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQubWsgYi9jYW1lcmEvQW5kcm9pZC5tawppbmRleCA1Y2VkYWIwLi5kYTVhYzU5IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5taworKysgYi9jYW1lcmEvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIENBTUVSQV9DTElFTlRfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOCw2ICsyMiw3IEBACiAJQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhTWV0YWRhdGEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKQEAgLTIyLDYgKzM3LDggQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCUNhbWVyYVV0aWxzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTM1LDYgKzUyLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYV9jbGllbnQKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCAyMjE5OWZhLi44NWY0NGYwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtNzcsNiArNzcsMzIgQEAKICAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQpOwogfQogCitzdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICBpZiAoY3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqL2MtPm1DYW1lcmEpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgeworICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBjYW1lcmEgPSBjOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIGMuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDc3NjU5MTQuLjA0MzQzN2YgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjUsNiArMjUsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKyNkZWZpbmUgQUxJR05fVE8odmFsLCBhbGlnbm1lbnQpIFwKKyAgICAoKCh1aW50cHRyX3QpKHZhbCkgKyAoKGFsaWdubWVudCkgLSAxKSkgJiB+KChhbGlnbm1lbnQpIC0gMSkpCisKIHR5cGVkZWYgUGFyY2VsOjpXcml0YWJsZUJsb2IgV3JpdGFibGVCbG9iOwogdHlwZWRlZiBQYXJjZWw6OlJlYWRhYmxlQmxvYiBSZWFkYWJsZUJsb2I7CiAKQEAgLTI3MCw3ICsyNzMsOCBAQAogICAgIGlmICggKHJlcyA9IGNoZWNrVHlwZSh0YWcsIFRZUEVfQllURSkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQotICAgIHJldHVybiB1cGRhdGVJbXBsKHRhZywgKGNvbnN0IHZvaWQqKXN0cmluZy5zdHJpbmcoKSwgc3RyaW5nLnNpemUoKSk7CisgICAgLy8gc3RyaW5nLnNpemUoKSBkb2Vzbid0IGNvdW50IHRoZSBudWxsIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4KKyAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkgKyAxKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnVwZGF0ZUltcGwodWludDMyX3QgdGFnLCBjb25zdCB2b2lkICpkYXRhLApAQCAtNDMxLDQwICs0MzUsNzAgQEAKICAgICAgICAgKm91dCA9IE5VTEw7CiAgICAgfQogCi0gICAgLy8gYXJnMCA9IG1ldGFkYXRhU2l6ZSAoaW50MzIpCi0gICAgaW50MzJfdCBtZXRhZGF0YVNpemVUbXAgPSAtMTsKLSAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZtZXRhZGF0YVNpemVUbXApKSAhPSBPSykgeworICAgIC8vIFNlZSBDYW1lcmFNZXRhZGF0YTo6d3JpdGVUb1BhcmNlbCBmb3IgcGFyY2VsIGRhdGEgbGF5b3V0IGRpYWdyYW0gYW5kIGV4cGxhbmF0aW9uLgorICAgIC8vIGFyZzAgPSBibG9iU2l6ZSAoaW50MzIpCisgICAgaW50MzJfdCBibG9iU2l6ZVRtcCA9IC0xOworICAgIGlmICgoZXJyID0gZGF0YS5yZWFkSW50MzIoJmJsb2JTaXplVG1wKSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBtZXRhZGF0YSBzaXplIChlcnJvciAlZCAlcykiLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVyciwgc3RyZXJyb3IoLWVycikpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtZXRhZGF0YVNpemVUbXApOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYmxvYlNpemVUbXApOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOwogCi0gICAgaWYgKG1ldGFkYXRhU2l6ZSA9PSAwKSB7CisgICAgLy8gU3BlY2lhbCBjYXNlOiB6ZXJvIGJsb2Igc2l6ZSBtZWFucyB6ZXJvIHNpemVkIChOVUxMKSBtZXRhZGF0YS4KKyAgICBpZiAoYmxvYlNpemUgPT0gMCkgewogICAgICAgICBBTE9HVigiJXM6IFJlYWQgMC1zaXplZCBtZXRhZGF0YSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbnQgdGhlIGJsb2IKKyAgICBpZiAoYmxvYlNpemUgPD0gYWxpZ25tZW50KSB7CisgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYmxvYiBpcyBtYWxmb3JtZWQsIGJsb2JTaXplKCV6dSkgc2hvdWxkIGJlIGxhcmdlciB0aGFuIGFsaWdubWVudCglenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBibG9iU2l6ZSAtIGFsaWdubWVudDsKKworICAgIC8vIE5PVEU6IHRoaXMgZG9lc24ndCBtYWtlIHNlbnNlIHRvIG1lLiBzaG91bGRuJ3QgdGhlIGJsb2IKICAgICAvLyBrbm93IGhvdyBiaWcgaXQgaXM/IHdoeSBkbyB3ZSBoYXZlIHRvIHNwZWNpZnkgdGhlIHNpemUKICAgICAvLyB0byBQYXJjZWw6OnJlYWRCbG9iID8KLQogICAgIFJlYWRhYmxlQmxvYiBibG9iOwogICAgIC8vIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikKICAgICBkbyB7Ci0gICAgICAgIGlmICgoZXJyID0gZGF0YS5yZWFkQmxvYihtZXRhZGF0YVNpemUsICZibG9iKSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJWQpLiBQb3NzaWJsZSAiCisgICAgICAgIGlmICgoZXJyID0gZGF0YS5yZWFkQmxvYihibG9iU2l6ZSwgJmJsb2IpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBtZXRhZGF0YSBibG9iIChzaXplZCAlenUpLiBQb3NzaWJsZSAiCiAgICAgICAgICAgICAgICAgICAiIHNlcmlhbGl6YXRpb24gYnVnLiBFcnJvciAlZCAlcyIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1ldGFkYXRhU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQotICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4oYmxvYi5kYXRhKCkpOwogCisgICAgICAgIC8vIGFyZzIgPSBvZmZzZXQgKGJsb2IpCisgICAgICAgIC8vIE11c3QgYmUgYWZ0ZXIgYmxvYiBzaW5jZSB3ZSBkb24ndCBrbm93IG9mZnNldCB1bnRpbCBhZnRlciB3cml0ZUJsb2IuCisgICAgICAgIGludDMyX3Qgb2Zmc2V0VG1wOworICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZvZmZzZXRUbXApKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBtZXRhZGF0YSBvZmZzZXRUbXAgKGVycm9yICVkICVzKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0VG1wKTsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBhbGlnbm1lbnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgb2Zmc2V0KCV6dSkgc2hvdWxkIGJlIGxlc3MgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmxvYlNpemUsIGFsaWdubWVudCk7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnRwdHJfdCBtZXRhZGF0YVN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKSArIG9mZnNldDsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIHRtcCA9CisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YVN0YXJ0KTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsIHRtcCwgb2Zmc2V0KTsKICAgICAgICAgbWV0YWRhdGEgPSBhbGxvY2F0ZV9jb3B5X2NhbWVyYV9tZXRhZGF0YV9jaGVja2VkKHRtcCwgbWV0YWRhdGFTaXplKTsKICAgICAgICAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIFdlIGNvbnNpZGVyIHRoYXQgYWxsb2NhdGlvbiBvbmx5IGZhaWxzIGlmIHRoZSB2YWxpZGF0aW9uCiAgICAgICAgICAgICAvLyBhbHNvIGZhaWxlZCwgdGhlcmVmb3JlIHRoZSByZWFkRnJvbVBhcmNlbCB3YXMgYSBmYWlsdXJlLgorICAgICAgICAgICAgQUxPR0UoIiVzOiBtZXRhZGF0YSBhbGxvY2F0aW9uIGFuZCBjb3B5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IHdoaWxlKDApOwpAQCAtNDg1LDM4ICs1MTksODAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgLy8gYXJnMCA9IG1ldGFkYXRhU2l6ZSAoaW50MzIpCisgICAgLyoqCisgICAgICogQmVsb3cgaXMgdGhlIGNhbWVyYSBtZXRhZGF0YSBwYXJjZWwgbGF5b3V0OgorICAgICAqCisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgYXJnMDogYmxvYlNpemUgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLVNraXAgdGhlIHJlc3QgaWYgYmxvYlNpemUgPT0gMC4KKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzE6IGJsb2IgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8IChsZW5ndGggPSB2YXJpYWJsZSwgc2VlIGFyZzEgbGF5b3V0IGJlbG93KSB8CisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogfCAgICAgICAgICAgICAgYXJnMjogb2Zmc2V0ICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgIChsZW5ndGggPSA0KSAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICovCiAKKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQogICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFdyaXRlIHplcm8gYmxvYlNpemUgZm9yIG51bGwgbWV0YWRhdGEuCiAgICAgICAgIHJldHVybiBkYXRhLndyaXRlSW50MzIoMCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWx3YXlzIG1ha2UgdGhlIGJsb2Igc2l6ZSBzdWZmaWNpZW50bHkgbGFyZ2VyLCBhcyB3ZSBuZWVkIHB1dCBhbGlnbm1lbnQKKyAgICAgKiBwYWRkaW5nIGFuZCBtZXRhZGF0YSBpbnRvIHRoZSBibG9iLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBhbGlnbm1lbnQKKyAgICAgKiBvZmZzZXQgYmVmb3JlIHdyaXRlQmxvYi4gVGhlbiB3cml0ZSB0aGUgbWV0YWRhdGEgdG8gYWxpZ25lZCBvZmZzZXQuCisgICAgICovCiAgICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfY29tcGFjdF9zaXplKG1ldGFkYXRhKTsKLSAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obWV0YWRhdGFTaXplKSk7CisgICAgY29uc3Qgc2l6ZV90IGFsaWdubWVudCA9IGdldF9jYW1lcmFfbWV0YWRhdGFfYWxpZ25tZW50KCk7CisgICAgY29uc3Qgc2l6ZV90IGJsb2JTaXplID0gbWV0YWRhdGFTaXplICsgYWxpZ25tZW50OworICAgIHJlcyA9IGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihibG9iU2l6ZSkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgLyoqCisgICAgICogYXJnMSA9IG1ldGFkYXRhIChibG9iKS4KKyAgICAgKgorICAgICAqIFRoZSBibG9iIHNpemUgaXMgdGhlIHN1bSBvZiBmcm9udCBwYWRkaW5nIHNpemUsIG1ldGFkYXRhIHNpemUgYW5kIGJhY2sgcGFkZGluZworICAgICAqIHNpemUsIHdoaWNoIGlzIGVxdWFsIHRvIG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudC4KKyAgICAgKgorICAgICAqIFRoZSBibG9iIGxheW91dCBpczoKKyAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLS0tU3RhcnQgYWRkcmVzcyBvZiB0aGUgYmxvYiAodW5hbGlnbmVkKS4KKyAgICAgKiB8ICAgICAgICAgICBmcm9udCBwYWRkaW5nICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgKHNpemUgPSBvZmZzZXQpICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUFsaWduZWQgc3RhcnQgYWRkcmVzcyBvZiBtZXRhZGF0YS4KKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgIG1ldGFkYXRhICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgIChzaXplID0gbWV0YWRhdGFTaXplKSAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgIGJhY2sgcGFkZGluZyAgICAgICAgICAgICB8CisgICAgICogfCAgICAgKHNpemUgPSBhbGlnbm1lbnQgLSBvZmZzZXQpICAgIHwKKyAgICAgKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfDwtLS0tRW5kIGFkZHJlc3Mgb2YgYmxvYi4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJsb2Igc3RhcnQgYWRkcmVzcyArIGJsb2Igc2l6ZSkuCisgICAgICovCiAgICAgV3JpdGFibGVCbG9iIGJsb2I7CiAgICAgZG8gewotICAgICAgICByZXMgPSBkYXRhLndyaXRlQmxvYihtZXRhZGF0YVNpemUsICZibG9iKTsKKyAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IoYmxvYlNpemUsICZibG9iKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY29weV9jYW1lcmFfbWV0YWRhdGEoYmxvYi5kYXRhKCksIG1ldGFkYXRhU2l6ZSwgbWV0YWRhdGEpOwotCi0gICAgICAgIElGX0FMT0dWKCkgewotICAgICAgICAgICAgaWYgKHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqKWJsb2IuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGFkYXRhU2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEZhaWxlZCB0byB2YWxpZGF0ZSBtZXRhZGF0YSAlcCBhZnRlciB3cml0aW5nIGJsb2IiLAotICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2IuZGF0YSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNZXRhZGF0YSB3cml0dGVuIHRvIGJsb2IuIFZhbGlkYXRpb24gc3VjY2VzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGNvbnN0IHVpbnRwdHJfdCBtZXRhZGF0YVN0YXJ0ID0gQUxJR05fVE8oYmxvYi5kYXRhKCksIGFsaWdubWVudCk7CisgICAgICAgIG9mZnNldCA9IG1ldGFkYXRhU3RhcnQgLSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYmxvYi5kYXRhKCkpOworICAgICAgICBBTE9HVigiJXM6IGFsaWdubWVudCBpczogJXp1LCBtZXRhZGF0YSBzdGFydDogJXAsIG9mZnNldDogJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFsaWdubWVudCwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQgKj4obWV0YWRhdGFTdGFydCksIG9mZnNldCk7CisgICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KG1ldGFkYXRhU3RhcnQpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKIAogICAgICAgICAvLyBOb3QgdG9vIGJpZyBvZiBhIHByb2JsZW0gc2luY2UgcmVjZWl2aW5nIHNpZGUgZG9lcyBoYXJkIHZhbGlkYXRpb24KICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgdGhlIHNpemUgc2luY2UgdGhlIGNvbXBhY3Qgc2l6ZSBjb3VsZCBiZSBsYXJnZXIKQEAgLTUyOCw2ICs2MDQsOSBAQAogICAgIH0gd2hpbGUoZmFsc2UpOwogICAgIGJsb2IucmVsZWFzZSgpOwogCisgICAgLy8gYXJnMiA9IG9mZnNldCAoaW50MzIpCisgICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG9mZnNldCkpOworCiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDc4ZWI0ZDYuLjI1ZDYzMmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyBQYXJhbWV0ZXIga2V5cyB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIGNhbWVyYSBhcHBsaWNhdGlvbiBhbmQgZHJpdmVyLgpAQCAtNDgzLDQgKzQ4NCw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyhWZWN0b3I8aW50PiYgZm9ybWF0cykgY29uc3QgeworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzID0KKyAgICAgICAgICBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZPUk1BVFMpOworCisgICAgU3RyaW5nOCBmbXRTdHIoc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMpOworICAgIGNoYXIqIHByZXZGbXRzID0gZm10U3RyLmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7CisKKyAgICBjaGFyKiBzYXZlUHRyOworICAgIGNoYXIqIGZtdCA9IHN0cnRva19yKHByZXZGbXRzLCAiLCIsICZzYXZlUHRyKTsKKyAgICB3aGlsZSAoZm10KSB7CisgICAgICAgIGludCBhY3R1YWwgPSBwcmV2aWV3Rm9ybWF0VG9FbnVtKGZtdCk7CisgICAgICAgIGlmIChhY3R1YWwgIT0gLTEpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGFjdHVhbCk7CisgICAgICAgIH0KKyAgICAgICAgZm10ID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZVB0cik7CisgICAgfQorICAgIGZtdFN0ci51bmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7Cit9CisKKworaW50IENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KSB7CisgICAgcmV0dXJuCisgICAgICAgICFmb3JtYXQgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1lVVjQyMlNQKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIySSkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCNTY1KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1JHQkE4ODg4KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQorICAgICAgICAtMTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGVhYzc5ZTEuLjM3OGFmZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMzYyLDYgKzM2Miw3IEBACiAKIHN0YXR1c190IENhbWVyYVBhcmFtZXRlcnMyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKIHsKKyAgICAodm9pZClhcmdzOwogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcCBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNDRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVV0aWxzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBudWxsIHRyYW5zZm9ybSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnRyYW5zZm9ybSA9IDA7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlGYWNpbmcgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0ZBQ0lORyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQubGVucy5mYWNpbmcgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07CisKKyAgICBib29sIG1pcnJvciA9IChlbnRyeUZhY2luZy5kYXRhLnU4WzBdID09IEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQpOworICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIGlmICghbWlycm9yKSB7CisgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSEFMIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIHZhbHVlOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRnJvbnQgY2FtZXJhIG5lZWRzIHRvIGJlIGhvcml6b250YWxseSBmbGlwcGVkIGZvciBtaXJyb3ItbGlrZSBiZWhhdmlvci4KKyAgICAgICAgLy8gTm90ZTogRmxpcHMgYXJlIGFwcGxpZWQgYmVmb3JlIHJvdGF0ZXM7IHVzaW5nIFhPUiBoZXJlIGFzIHNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlCisgICAgICAgIC8vIGNvbXBvc2VkIGluIHRlcm1zIG9mIG90aGVyIGZsaXAvcm90YXRpb24gZmxhZ3MsIGFuZCBhcmUgbm90IGJpdHdpc2UtT1JhYmxlLgorICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKKyAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCisgICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCisgICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCisgICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgorICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5CisgICAgICogc3RyZXRjaGVkLgorICAgICAqLworICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKKworICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCisgICAgcmV0dXJuIE9LOworfQorCisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM2MTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEtQ2FwdHVyZVJlc3VsdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FwdHVyZVJlc3VsdEV4dHJhczo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gcmVxdWVzdElkID49IDA7Cit9CisKK3N0YXR1c190IENhcHR1cmVSZXN1bHRFeHRyYXM6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+cmVhZEludDMyKCZyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZidXJzdElkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQzMigmYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYXB0dXJlUmVzdWx0RXh0cmFzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihidXJzdElkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgorICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKK30KKworQ2FwdHVyZVJlc3VsdDo6Q2FwdHVyZVJlc3VsdChjb25zdCBDYXB0dXJlUmVzdWx0ICZvdGhlclJlc3VsdCkgeworICAgIG1SZXN1bHRFeHRyYXMgPSBvdGhlclJlc3VsdC5tUmVzdWx0RXh0cmFzOworICAgIG1NZXRhZGF0YSA9IG90aGVyUmVzdWx0Lm1NZXRhZGF0YTsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpIHsKKworICAgIEFMT0dWKCIlczogcGFyY2VsID0gJXAiLCBfX0ZVTkNUSU9OX18sIHBhcmNlbCk7CisKKyAgICBpZiAocGFyY2VsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJjZWwgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJlcyA9IG1SZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVzdWx0IGV4dHJhcyBmcm9tIHBhcmNlbC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogUmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworCisgICAgQUxPR1YoIiVzOiBwYXJjZWwgPSAlcCIsIF9fRlVOQ1RJT05fXywgcGFyY2VsKTsKKworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICByZXMgPSBtTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBXcm90ZSBtZXRhZGF0YSB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmVzID0gbVJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXh0cmFzIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcmVzdWx0IGV4dHJhcyB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ZmM4OWZiLi41NDg1MjA1IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJCcENhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzQsNiArMzYsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTQzLDYgKzE0NiwyNCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8vIEdldCBlbnVtZXJhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdmVuZG9yIHRhZ3MgZm9yIGNhbWVyYQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGlmIChyZWFkRXhjZXB0aW9uQ29kZShyZXBseSkpIHJldHVybiAtRVBST1RPOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZDsKKyAgICAgICAgICAgIGlmIChWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZyZXBseSwgLypvdXQqL2QpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlIChhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCkBAIC0xNjUsNiArMTg2LDI5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPElDYW1lcmE+JiBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFsVmVyc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAocHJvIGNsaWVudCkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKQEAgLTIzMyw2ICsyNzcsNDEgQEAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExlZ2FjeVBhcmFtZXRlcnMoaW50IGNhbWVyYUlkLCBTdHJpbmcxNiogcGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9MRUdBQ1lfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOyAvLyAtMSBtZWFucyBudWxsCisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IFN0cmluZzE2KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaVZlcnNpb24pOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTVVBQT1JUU19DQU1FUkFfQVBJLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZSIpOwpAQCAtMjc1LDYgKzM1NCwyMiBAQAogICAgICAgICAgICAgaW5mby53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcihkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworCisgICAgICAgICAgICAvLyBvdXQtdmFyaWFibGVzIGFyZSBhZnRlciBleGNlcHRpb24gYW5kIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsgLy8gbWVhbnMgdGhlIHBhcmNlbGFibGUgaXMgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICBkLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9CkBAIC0yODQsNyArMzc5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovIGNhbWVyYSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewpAQCAtMzA0LDcgKzM5OSw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4gY2FtZXJhOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdFBybyhjYW1lcmFDbGllbnQsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki8gY2FtZXJhKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CkBAIC0zMjQsNyArNDE5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBjYW1lcmE7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RGV2aWNlKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqLyBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki9jYW1lcmEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKQEAgLTM1MSw2ICs0NDYsNTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0xFR0FDWV9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmcxNiBwYXJhbWV0ZXJzOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRMZWdhY3lQYXJhbWV0ZXJzKGNhbWVyYUlkLCAmcGFyYW1ldGVycykpOworICAgICAgICAgICAgLy8gb3V0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOyAvLyBwYXJhbWV0ZXJzIGlzIGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVUFBPUlRTX0NBTUVSQV9BUEk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBhcGlWZXJzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWQsIGFwaVZlcnNpb24pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUX0xFR0FDWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjYW1lcmFDbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3QgaGFsVmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBjbGllbnROYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RMZWdhY3koY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvUHJvQ2FtZXJhLmNwcCBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCmluZGV4IGJhNWE0OGMuLjQ4ZjhlOGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCkBAIC0yNDksMTEgKzI0OSwxNCBAQAogICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGhlYXBDb3VudC8qLCBzeW5jaHJvbm91c01vZGUqLyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGhlYXBDb3VudAorICAgICAgICAgICAgLyosIHN5bmNocm9ub3VzTW9kZSovKTsKICAgICBjYy0+c2V0TmFtZShTdHJpbmc4KCJQcm9DYW1lcmE6Om1DcHVDb25zdW1lciIpKTsKIAotICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzID0gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Yy0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLApkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlZlbmRvclRhZ0Rlc2NyaXB0b3IiCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdik7CitzdGF0aWMgdm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90KiB0YWdBcnJheSk7CitzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZyk7CitzdGF0aWMgaW50IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIE11dGV4IHNMb2NrOworc3RhdGljIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yOworCitWZW5kb3JUYWdEZXNjcmlwdG9yOjpWZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KKworVmVuZG9yVGFnRGVzY3JpcHRvcjo6flZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgc2l6ZV90IGxlbiA9IG1SZXZlcnNlTWFwcGluZy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgIHsKKyAgICAgICAgZGVsZXRlIG1SZXZlcnNlTWFwcGluZ1tpXTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIGlmICh2T3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3JfdGFnX29wcyBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0YWdDb3VudCA9IHZPcHMtPmdldF90YWdfY291bnQodk9wcyk7CisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciBvcHMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworCisgICAgdk9wcy0+Z2V0X2FsbF90YWdzKHZPcHMsIC8qb3V0Ki90YWdBcnJheS5lZGl0QXJyYXkoKSk7CisKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBkZXNjLT5tVGFnQ291bnQgPSB0YWdDb3VudDsKKworICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBzZWN0aW9uczsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpOworICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgaW50IHRhZ1R5cGUgPSB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgIH0KKworICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdGFnQ291bnQgPSAwOworICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ0NvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3Igb3BzIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICB1aW50MzJfdCBtYXhTZWN0aW9uSW5kZXggPSAwOworICAgIGludDMyX3QgdGFnVHlwZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGFsbFRhZ3M7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ0YWcpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgdGFnIGlkIGZyb20gcGFyY2VsIGZvciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ1R5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgdHlwZSBmcm9tIHBhcmNlbCBmb3IgdGFnICVkIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICBpZiAodGFnTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHRhZyBuYW1lIHdhcyBOVUxMIGZvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZzZWN0aW9uSW5kZXgpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgc2VjdGlvbiBpbmRleCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWF4U2VjdGlvbkluZGV4ID0gKG1heFNlY3Rpb25JbmRleCA+PSBzZWN0aW9uSW5kZXgpID8gbWF4U2VjdGlvbkluZGV4IDogc2VjdGlvbkluZGV4OworCisgICAgICAgIGFsbFRhZ3MuYWRkKHRhZyk7CisgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgdGFnTmFtZSk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvbkluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNlY3Rpb25Db3VudDsKKyAgICBpZiAodGFnQ291bnQgPiAwKSB7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnNlY3Rpb25Db3VudCkpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCBzZWN0aW9uIGNvdW50IGZvci4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VjdGlvbkNvdW50IDwgKG1heFNlY3Rpb25JbmRleCArIDEpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEluY29ycmVjdCBudW1iZXIgb2Ygc2VjdGlvbnMgZGVmaW5lZCwgcmVjZWl2ZWQgJXp1LCBuZWVkcyAlZC4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlY3Rpb25Db3VudCwgKG1heFNlY3Rpb25JbmRleCArIDEpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXNjLT5tU2VjdGlvbnMuc2V0Q2FwYWNpdHkoc2VjdGlvbkNvdW50KSA8PSAwLAorICAgICAgICAgICAgICAgICJWZWN0b3IgY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHNlY3Rpb25OYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgaWYgKHNlY3Rpb25OYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHNlY3Rpb24gbmFtZSB3YXMgTlVMTCBmb3Igc2VjdGlvbiAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tU2VjdGlvbnMuYWRkKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0YWdDb3VudCkgIT0gYWxsVGFncy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ291bnQgbXVzdCBiZSB0aGUgc2FtZSBhcyBhbGxUYWdzIHNpemUiKTsKKyAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IGFsbFRhZ3NbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IGRlc2MtPm1TZWN0aW9uc1tkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyldOworCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQ291bnQoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB0YWdBcnJheVtpXSA9IG1UYWdUb05hbWVNYXAua2V5QXQoaSk7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtU2VjdGlvbnNbbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUF0KGluZGV4KV0uc3RyaW5nKCk7Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1UYWdUb05hbWVNYXAuaW5kZXhPZktleSh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaW5kZXgpLnN0cmluZygpOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvTmFtZU1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKK30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKG1UYWdDb3VudCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICBpbnQzMl90IHRhZ1R5cGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdGFnID0gbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gbVRhZ1RvTmFtZU1hcFtpXTsKKyAgICAgICAgc2VjdGlvbkluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICB0YWdUeXBlID0gbVRhZ1RvVHlwZU1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMih0YWcpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKHRhZ1R5cGUpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgodGFnTmFtZSkpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlSW50MzIoc2VjdGlvbkluZGV4KSkgIT0gT0spIGJyZWFrOworICAgIH0KKworICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IG1TZWN0aW9ucy5zaXplKCk7CisgICAgaWYgKG51bVNlY3Rpb25zID4gMCkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMihudW1TZWN0aW9ucykpICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgobVNlY3Rpb25zW2ldKSkgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0QWxsU2VjdGlvbk5hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtU2VjdGlvbnM7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6Omxvb2t1cFRhZyhTdHJpbmc4IG5hbWUsIFN0cmluZzggc2VjdGlvbiwgLypvdXQqL3VpbnQzMl90KiB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHNlY3Rpb24uc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgbmFtZUluZGV4ID0gbVJldmVyc2VNYXBwaW5nW2luZGV4XS0+aW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAobmFtZUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFRhZyBuYW1lICclcycgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodGFnICE9IE5VTEwpIHsKKyAgICAgICAgKnRhZyA9IG1SZXZlcnNlTWFwcGluZ1tpbmRleF0tPnZhbHVlQXQobmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKKworICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6IE5vbmUgc2V0XG4iLAorICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLCAiIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6ICV6dSBlbnRyaWVzXG4iLAorICAgICAgICAgICAgaW5kZW50YXRpb24sICIiLCBzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSAgbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKworICAgICAgICBpZiAodmVyYm9zaXR5IDwgMSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXhcbiIsIGluZGVudGF0aW9uICsgMiwgIiIsIHRhZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IG5hbWUgPSBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIHVpbnQzMl90IHNlY3Rpb25JZCA9IG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uTmFtZSA9IG1TZWN0aW9uc1tzZWN0aW9uSWRdOworICAgICAgICBpbnQgdHlwZSA9IG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgY29uc3QgY2hhciogdHlwZU5hbWUgPSAodHlwZSA+PSAwICYmIHR5cGUgPCBOVU1fVFlQRVMpID8KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdHlwZV9uYW1lc1t0eXBlXSA6ICJVTktOT1dOIjsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXggKCVzKSB3aXRoIHR5cGUgJWQgKCVzKSBkZWZpbmVkIGluIHNlY3Rpb24gJXNcbiIsIGluZGVudGF0aW9uICsgMiwKKyAgICAgICAgICAgICIiLCB0YWcsIG5hbWUuc3RyaW5nKCksIHR5cGUsIHR5cGVOYW1lLCBzZWN0aW9uTmFtZS5zdHJpbmcoKSk7CisgICAgfQorCit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihjb25zdCBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPSBkZXNjOworCisgICAgdmVuZG9yX3RhZ19vcHNfdCogb3BzUHRyID0gTlVMTDsKKyAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgIG9wc1B0ciA9ICYoZGVzYy0+bVZlbmRvck9wcyk7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ19jb3VudCA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX2NvdW50OworICAgICAgICBvcHNQdHItPmdldF9hbGxfdGFncyA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3M7CisgICAgICAgIG9wc1B0ci0+Z2V0X3NlY3Rpb25fbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lOworICAgICAgICBvcHNQdHItPmdldF90YWdfbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX25hbWU7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ190eXBlID0gdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZTsKKyAgICB9CisgICAgaWYoKHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcyhvcHNQdHIpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCByZWNlaXZlZCBlcnJvciAlcyAoJWQpLiIKKyAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3Jfb3BzKE5VTEwpOworICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLmNsZWFyKCk7Cit9CisKK3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit9CisKK2V4dGVybiAiQyIgeworCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLyp2Ki8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnQ291bnQoKTsKK30KKwordm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCogdGFnQXJyYXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7Cit9CisKK2NvbnN0IGNoYXIqIHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0U2VjdGlvbk5hbWUodGFnKTsKK30KKworY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnTmFtZSh0YWcpOworfQorCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnVHlwZSh0YWcpOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKaW5kZXggNjEzMzU4YS4uNGNjN2I1ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ2LDEyICs0NywxNCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSkKKyAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKQogICAgIHsKICAgICAgICAgQUxPR1YoIm9uRGV2aWNlRXJyb3IiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVycm9yQ29kZSkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7IC8vIHRvIG1hcmsgcHJlc2VuY2Ugb2YgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QKKyAgICAgICAgcmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwoJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FNRVJBX0VSUk9SLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICAgICAgZGF0YS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtNjUsMjUgKzY4LDI4IEBACiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwgaW50NjRfdCB0aW1lc3RhbXApCisgICAgdm9pZCBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdCwgaW50NjRfdCB0aW1lc3RhbXApCiAgICAgewogICAgICAgICBBTE9HVigib25DYXB0dXJlU3RhcnRlZCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdElkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0CisgICAgICAgIHJlc3VsdC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQVBUVVJFX1NUQVJURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CiAKIAotICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgeworICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBtZXRhZGF0YSBvYmplY3QKLSAgICAgICAgcmVzdWx0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBtZXRhZGF0YS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHQgb2JqZWN0CisgICAgICAgIHJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1VMVF9SRUNFSVZFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KQEAgLTEwNCw3ICsxMTAsMTMgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhRXJyb3JDb2RlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChjb25zdF9jYXN0PFBhcmNlbCo+KCZkYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJObyBDYXB0dXJlUmVzdWx0RXh0cmFzIG9iamVjdCBpcyBwcmVzZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xMTgsMjMgKzEzMCwzMyBAQAogICAgICAgICBjYXNlIENBUFRVUkVfU1RBUlRFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uQ2FwdHVyZVN0YXJ0ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQhIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgZGF0YS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFU1VMVF9SRUNFSVZFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXN1bHQ7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5vIG1ldGFkYXRhIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIHJlc3VsdCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gY2FwdHVyZSByZXN1bHQgZXh0cmFzIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChtZXRhZGF0YSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIGRhdGEucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcAppbmRleCAxZTU4MjJmLi5mZjRhMGMyIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCkBAIC0zNSw3ICszNSwxMCBAQAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1VCTUlUX1JFUVVFU1QsCisgICAgU1VCTUlUX1JFUVVFU1RfTElTVCwKICAgICBDQU5DRUxfUkVRVUVTVCwKKyAgICBCRUdJTl9DT05GSUdVUkUsCisgICAgRU5EX0NPTkZJR1VSRSwKICAgICBERUxFVEVfU1RSRUFNLAogICAgIENSRUFURV9TVFJFQU0sCiAgICAgQ1JFQVRFX0RFRkFVTFRfUkVRVUVTVCwKQEAgLTc1LDcgKzc4LDggQEAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LCBib29sIHN0cmVhbWluZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC04OSwxNSArOTMsNjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1pbmcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICByZXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXF1ZXN0TGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0TGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IHJlcXVlc3RMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1RfTElTVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNiw2ICsxNjIsMzcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTF9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImJlZ2luQ29uZmlndXJlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQkVHSU5fQ09ORklHVVJFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImVuZENvbmZpZ3VyZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTE5NywxNCArMjg0LDI1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIEFMT0dWKCJmbHVzaCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzOSwxMSArMzM3LDQzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHJlcGVhdGluZyA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgc3RyZWFtaW5nKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChyZXF1ZXN0LCByZXBlYXRpbmcsICZsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVF9SRVFVRVNUX0xJU1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgICAgICAgICAgaW50IHJlcXVlc3RMaXN0U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RMaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkEgcmVxdWVzdCBpcyBtaXNzaW5nLiBTZW5kaW5nIGluIG51bGwgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgcmVwZWF0aW5nLCAmbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI1MSw3ICszODEsMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFTEVURV9TVFJFQU06IHsKQEAgLTMzOSw5ICs0NzIsMjQgQEAKICAgICAgICAgY2FzZSBGTFVTSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQkVHSU5fQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihiZWdpbkNvbmZpZ3VyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFTkRfQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZWMxMzkxMS4uNjEzODVlNSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsOSArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJbWFpbi5jcHAgXAogCVByb0NhbWVyYVRlc3RzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1dGlscyBcCkBAIC0yNiw2ICs0MSw4IEBACiAJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCiAJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL3Rlc3RzIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX3Rlc3RzX2Zha2VfdmVuZG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZW51bSB7CisgICAgQkFEX1RBR19BUlJBWSA9IDB4REVBREJFRUZ1LAorICAgIEJBRF9UQUcgPSAweDhERUFEQkFEdSwKK307CisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAgICAgIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworc3RhdGljIGJvb2wgQ29udGFpbnNUYWcodWludDMyX3QqIHRhZ0FycmF5LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgdGFnKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKHRhZyA9PSB0YWdBcnJheVtpXSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBFWFBFQ1RfQ09OVEFJTlNfVEFHKHQsIGEpIFwKKyAgICBFWFBFQ1RfVFJVRShDb250YWluc1RhZyhhLCBBUlJBWV9TSVpFKGEpLCB0KSkKKworI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAorICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBOVUxMKQorCitleHRlcm4gIkMiIHsKKworc3RhdGljIGludCBkZWZhdWx0X2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9nZXRfYWxsX3RhZ3MoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QqIHRhZ0FycmF5KSB7CisgICAgLy9Ob29wCit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0X2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9TRUNUSU9OX05BTUVfRVJSOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdF9nZXRfdGFnX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7Cit9CisKK30gLypleHRlcm4gIkMiKi8KKworLy8gU2V0IGRlZmF1bHQgdmVuZG9yIG9wZXJhdGlvbnMgZm9yIGEgdmVuZG9yX3RhZ19vcHMgc3RydWN0CitzdGF0aWMgdm9pZCBGaWxsV2l0aERlZmF1bHRzKHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKKyAgICBBU1NFUlRfTk9UX05VTEwodk9wcyk7CisgICAgdk9wcy0+Z2V0X3RhZ19jb3VudCA9IGRlZmF1bHRfZ2V0X3RhZ19jb3VudDsKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3MgPSBkZWZhdWx0X2dldF9hbGxfdGFnczsKKyAgICB2T3BzLT5nZXRfc2VjdGlvbl9uYW1lID0gZGVmYXVsdF9nZXRfc2VjdGlvbl9uYW1lOworICAgIHZPcHMtPmdldF90YWdfbmFtZSA9IGRlZmF1bHRfZ2V0X3RhZ19uYW1lOworICAgIHZPcHMtPmdldF90YWdfdHlwZSA9IGRlZmF1bHRfZ2V0X3RhZ190eXBlOworfQorCisvKioKKyAqIFRlc3QgaWYgdmFsdWVzIGZyb20gVmVuZG9yVGFnRGVzY3JpcHRvciBtZXRob2RzIG1hdGNoIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBmcm9tIHZlbmRvcl90YWdfb3BzIGZ1bmN0aW9ucy4KKyAqLworVEVTVChWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdCwgQ29uc2lzdGVudFdpdGhWZW5kb3JUYWdzKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdkRlc2M7CisgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqdk9wcyA9ICZmYWtldmVuZG9yX29wczsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKHZPcHMsIC8qb3V0Ki92RGVzYykpOworCisgICAgQVNTRVJUX05PVF9OVUxMKHZEZXNjKTsKKworICAgIC8vIEVuc3VyZSByZWFzb25hYmxlIHRhZyBjb3VudAorICAgIGludCB0YWdDb3VudCA9IHZEZXNjLT5nZXRUYWdDb3VudCgpOworICAgIEVYUEVDVF9FUSh0YWdDb3VudCwgdk9wcy0+Z2V0X3RhZ19jb3VudCh2T3BzKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IG9wc1RhZ0FycmF5W3RhZ0NvdW50XTsKKworICAgIC8vIEdldCBhbGwgdGFnIGlkcworICAgIHZEZXNjLT5nZXRUYWdBcnJheShkZXNjVGFnQXJyYXkpOworICAgIHZPcHMtPmdldF9hbGxfdGFncyh2T3BzLCBvcHNUYWdBcnJheSk7CisKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzY1RhZ0FycmF5KTsKKyAgICBBU1NFUlRfTk9UX05VTEwob3BzVGFnQXJyYXkpOworCisgICAgdWludDMyX3QgdGFnOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICAvLyBGb3IgZWFjaCB0YWcgaWQsIGNoZWNrIHdoZXRoZXIgdHlwZSwgc2VjdGlvbiBuYW1lLCB0YWcgbmFtZSBtYXRjaAorICAgICAgICB0YWcgPSBkZXNjVGFnQXJyYXlbaV07CisgICAgICAgIEVYUEVDVF9DT05UQUlOU19UQUcodGFnLCBvcHNUYWdBcnJheSk7CisgICAgICAgIEVYUEVDVF9FUSh2RGVzYy0+Z2V0VGFnVHlwZSh0YWcpLCB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzYy0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdk9wcy0+Z2V0X3NlY3Rpb25fbmFtZSh2T3BzLCB0YWcpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHZEZXNjLT5nZXRUYWdOYW1lKHRhZyksIHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpKTsKKyAgICB9Cit9CisKKy8qKgorICogVGVzdCBpZiB2YWx1ZXMgZnJvbSBWZW5kb3JUYWdEZXNjcmlwdG9yIG1ldGhvZHMgc3RheSBjb25zaXN0ZW50IGFmdGVyIGJlaW5nCisgKiBwYXJjZWxsZWQvdW5wYXJjZWxsZWQuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIENvbnNpc3RlbnRBY3Jvc3NQYXJjZWwpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2RGVzY09yaWdpbmFsLCB2RGVzY1BhcmNlbGVkOworICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKnZPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyh2T3BzLCAvKm91dCovdkRlc2NPcmlnaW5hbCkpOworCisgICAgQVNTRVJUX1RSVUUodkRlc2NPcmlnaW5hbCAhPSBOVUxMKTsKKworICAgIFBhcmNlbCBwOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBwYXJjZWwgcmVhZC93cml0ZSBzdWNjZWVkCisgICAgRVhQRUNUX0VRKE9LLCB2RGVzY09yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZwLCB2RGVzY1BhcmNlbGVkKSk7CisKKyAgICAvLyBFbnN1cmUgY29uc2lzdGVudCB0YWcgY291bnQKKyAgICBpbnQgdGFnQ291bnQgPSB2RGVzY09yaWdpbmFsLT5nZXRUYWdDb3VudCgpOworICAgIEFTU0VSVF9FUSh0YWdDb3VudCwgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnQ291bnQoKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IGRlc2MyVGFnQXJyYXlbdGFnQ291bnRdOworCisgICAgLy8gR2V0IGFsbCB0YWcgaWRzCisgICAgdkRlc2NPcmlnaW5hbC0+Z2V0VGFnQXJyYXkoZGVzY1RhZ0FycmF5KTsKKyAgICB2RGVzY1BhcmNlbGVkLT5nZXRUYWdBcnJheShkZXNjMlRhZ0FycmF5KTsKKworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjVGFnQXJyYXkpOworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjMlRhZ0FycmF5KTsKKworICAgIHVpbnQzMl90IHRhZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdGFnIGlkLCBjaGVjayBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0d28gdmVuZG9yIHRhZworICAgICAgICAvLyBkZXNjcmlwdG9ycyBmb3IgZWFjaCB0eXBlLCBzZWN0aW9uIG5hbWUsIHRhZyBuYW1lCisgICAgICAgIHRhZyA9IGRlc2NUYWdBcnJheVtpXTsKKyAgICAgICAgRVhQRUNUX0NPTlRBSU5TX1RBRyh0YWcsIGRlc2MyVGFnQXJyYXkpOworICAgICAgICBFWFBFQ1RfRVEodkRlc2NPcmlnaW5hbC0+Z2V0VGFnVHlwZSh0YWcpLCB2RGVzY1BhcmNlbGVkLT5nZXRUYWdUeXBlKHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2NPcmlnaW5hbC0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdkRlc2NQYXJjZWxlZC0+Z2V0U2VjdGlvbk5hbWUodGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzY09yaWdpbmFsLT5nZXRUYWdOYW1lKHRhZyksIHZEZXNjUGFyY2VsZWQtPmdldFRhZ05hbWUodGFnKSk7CisgICAgfQorfQorCisvKioKKyAqIFRlc3QgZGVmYXVsdHMgYW5kIGVycm9yIGNvbmRpdGlvbnMuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIEVycm9yQ29uZGl0aW9ucykgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZEZXNjOworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wczsKKyAgICBGaWxsV2l0aERlZmF1bHRzKCZ2T3BzKTsKKworICAgIC8vIEVuc3VyZSBjcmVhdGUgZmFpbHMgd2hlbiB1c2luZyBudWxsIHZPcHMKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygvKnZPcHMqL05VTEwsIHZEZXNjKSk7CisKKyAgICAvLyBFbnN1cmUgY3JlYXRlIHdvcmtzIHdoZW4gdGhlcmUgYXJlIG5vIHZ0YWdzIGRlZmluZWQgaW4gYSB3ZWxsLWZvcm1lZCB2T3BzCisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgdkRlc2MpKTsKKworICAgIC8vIEVuc3VyZSBkZWZhdWx0cyBhcmUgcmV0dXJuZWQgd2hlbiBubyB2dGFncyBhcmUgZGVmaW5lZCwgb3IgdGFnIGlzIHVua25vd24KKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19DT1VOVF9FUlIsIHZEZXNjLT5nZXRUYWdDb3VudCgpKTsKKyAgICB1aW50MzJfdCogdGFnQXJyYXkgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oQkFEX1RBR19BUlJBWSk7CisgICAgdWludDMyX3QqIHRlc3RBcnJheSA9IHRhZ0FycmF5OworICAgIHZEZXNjLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7CisgICAgRVhQRUNUX0VRKHRlc3RBcnJheSwgdGFnQXJyYXkpOworICAgIEVYUEVDVF9FUShWRU5ET1JfU0VDVElPTl9OQU1FX0VSUiwgdkRlc2MtPmdldFNlY3Rpb25OYW1lKEJBRF9UQUcpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19OQU1FX0VSUiwgdkRlc2MtPmdldFRhZ05hbWUoQkFEX1RBRykpOworICAgIEVYUEVDVF9FUShWRU5ET1JfVEFHX1RZUEVfRVJSLCB2RGVzYy0+Z2V0VGFnVHlwZShCQURfVEFHKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgZ2xvYmFsIGNhbiBiZSBzZXQvY2xlYXJlZAorICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKmZha2VPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gcHJldkdsb2JhbCA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcih2RGVzYykpOworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1NFQ1RJT05fTkFNRV9FUlIsIHZEZXNjLT5nZXRTZWN0aW9uTmFtZShCQURfVEFHKSk7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IocHJldkdsb2JhbCkpOworICAgIEVYUEVDVF9FUShwcmV2R2xvYmFsLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkpOworfQorCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAKaW5kZXggNmMzNzUwMS4uMDNlMDA2MiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmNwcApAQCAtNjcsOSArNjcsMTEgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKC8qbmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKi8pOwotICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIobUJ1ZmZlclF1ZXVlLCBtRXh0VGV4dHVyZU5hbWUsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtNzksNyArODEsNyBAQAogCiAgICAgbVBpeGVsQnVmID0gbmV3IHVpbnQ4X3Rbd2lkdGggKiBoZWlnaHQgKiBrR2xCeXRlc1BlclBpeGVsXTsKIAotICAgICpwQnVmZmVyUHJvZHVjZXIgPSBtQnVmZmVyUXVldWU7CisgICAgKnBCdWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOwogCiAgICAgQUxPR0QoIkZyYW1lT3V0cHV0OjpjcmVhdGVJbnB1dFN1cmZhY2UgT0siKTsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oIGIvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuaAppbmRleCA0YWMzZThhLi5jNDllYzNiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmgKQEAgLTM0LDkgKzM0LDYgQEAKICAgICAgICAgbUV4dFRleHR1cmVOYW1lKDApLAogICAgICAgICBtUGl4ZWxCdWYoTlVMTCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5GcmFtZU91dHB1dCgpIHsKLSAgICAgICAgZGVsZXRlW10gbVBpeGVsQnVmOwotICAgIH0KIAogICAgIC8vIENyZWF0ZSBhbiAiaW5wdXQgc3VyZmFjZSIsIHNpbWlsYXIgaW4gcHVycG9zZSB0byBhIE1lZGlhQ29kZWMgaW5wdXQKICAgICAvLyBzdXJmYWNlLCB0aGF0IHRoZSB2aXJ0dWFsIGRpc3BsYXkgY2FuIHNlbmQgYnVmZmVycyB0by4gIEFsc28gY29uZmlndXJlcwpAQCAtNTksNiArNTYsMTEgQEAKICAgICBGcmFtZU91dHB1dChjb25zdCBGcmFtZU91dHB1dCYpOwogICAgIEZyYW1lT3V0cHV0JiBvcGVyYXRvcj0oY29uc3QgRnJhbWVPdXRwdXQmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfkZyYW1lT3V0cHV0KCkgeworICAgICAgICBkZWxldGVbXSBtUGl4ZWxCdWY7CisgICAgfQorCiAgICAgLy8gKG92ZXJyaWRlcyBHTENvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG1ldGhvZCkKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogCkBAIC03NSwxMCArNzcsNiBAQAogICAgIC8vIFNldCBieSB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBjYWxsYmFjay4KICAgICBib29sIG1GcmFtZUF2YWlsYWJsZTsKIAotICAgIC8vIE91ciBxdWV1ZS4gIFRoZSBwcm9kdWNlciBzaWRlIGlzIHBhc3NlZCB0byB0aGUgdmlydHVhbCBkaXNwbGF5LCB0aGUKLSAgICAvLyBjb25zdW1lciBzaWRlIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKLQogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgogICAgIHNwPEdMQ29uc3VtZXI+IG1HbENvbnN1bWVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAppbmRleCAzNWJlMjIxLi43ZmVmNTNkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjZGVmaW5lIExPR19UQUcgIlNjcmVlblJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDkgKzMxLDYgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgpAQCAtODQsNyArODUsNyBAQAogICAgIGFzc2VydChtU3RhdGUgPT0gUlVOTklORyk7CiAKICAgICBBTE9HVigiT3ZlcmxheTo6c3RhcnQgc3VjY2Vzc2Z1bCIpOwotICAgICpwQnVmZmVyUHJvZHVjZXIgPSBtQnVmZmVyUXVldWU7CisgICAgKnBCdWZmZXJQcm9kdWNlciA9IG1Qcm9kdWNlcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTE2OSw5ICsxNzAsMTAgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKC8qbmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKi8pOwotICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIobUJ1ZmZlclF1ZXVlLCBtRXh0VGV4dHVyZU5hbWUsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIG1FeHRUZXh0dXJlTmFtZSwKKyAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgdHJ1ZSwgZmFsc2UpOwogICAgIG1HbENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoInZpcnR1YWwgZGlzcGxheSIpKTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgbUdsQ29uc3VtZXItPnNldERlZmF1bHRNYXhCdWZmZXJDb3VudCg1KTsKQEAgLTE4Nyw3ICsxODksNyBAQAogICAgIEFMT0dWKCJPdmVybGF5OjpyZWxlYXNlX2wiKTsKICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOwogICAgIG1HbENvbnN1bWVyLmNsZWFyKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLmNsZWFyKCk7CisgICAgbVByb2R1Y2VyLmNsZWFyKCk7CiAKICAgICBtVGV4UHJvZ3JhbS5yZWxlYXNlKCk7CiAgICAgbUV4dFRleFByb2dyYW0ucmVsZWFzZSgpOwpAQCAtMjM0LDcgKzIzNiw3IEBACiAKICAgICBjaGFyIHRleHRCdWZbNjRdOwogICAgIGdldFRpbWVTdHJpbmdfbChtb25vdG9uaWNOc2VjLCB0ZXh0QnVmLCBzaXplb2YodGV4dEJ1ZikpOwotICAgIFN0cmluZzggdGltZVN0cihTdHJpbmc4Ojpmb3JtYXQoIiVzIGY9JWxsZCAoJXpkKSIsCisgICAgU3RyaW5nOCB0aW1lU3RyKFN0cmluZzg6OmZvcm1hdCgiJXMgZj0lIiBQUklkNjQgIiAoJXpkKSIsCiAgICAgICAgICAgICB0ZXh0QnVmLCBmcmFtZU51bWJlciwgbVRvdGFsRHJvcHBlZEZyYW1lcykpOwogICAgIG1UZXh0UmVuZGVyZXIuZHJhd1N0cmluZyhtVGV4UHJvZ3JhbSwgUHJvZ3JhbTo6a0lkZW50aXR5LCAwLCAwLCB0aW1lU3RyKTsKIApkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oIGIvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCmluZGV4IGI4NDczYjQuLmIxYjVjMjkgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKQEAgLTQ3LDcgKzQ3LDYgQEAKICAgICAgICAgbUxhc3RGcmFtZU51bWJlcigtMSksCiAgICAgICAgIG1Ub3RhbERyb3BwZWRGcmFtZXMoMCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5PdmVybGF5KCkgeyBhc3NlcnQobVN0YXRlID09IFVOSU5JVElBTElaRUQgfHwgbVN0YXRlID09IFNUT1BQRUQpOyB9CiAKICAgICAvLyBDcmVhdGVzIGEgdGhyZWFkIHRoYXQgcGVyZm9ybXMgdGhlIG92ZXJsYXkuICBQYXNzIGluIHRoZSBzdXJmYWNlIHRoYXQKICAgICAvLyBvdXRwdXQgd2lsbCBiZSBzZW50IHRvLgpAQCAtNzEsNiArNzAsOSBAQAogICAgIE92ZXJsYXkoY29uc3QgT3ZlcmxheSYpOwogICAgIE92ZXJsYXkmIG9wZXJhdG9yPShjb25zdCBPdmVybGF5Jik7CiAKKyAgICAvLyBEZXN0cnVjdGlvbiB2aWEgUmVmQmFzZS4KKyAgICB2aXJ0dWFsIH5PdmVybGF5KCkgeyBhc3NlcnQobVN0YXRlID09IFVOSU5JVElBTElaRUQgfHwgbVN0YXRlID09IFNUT1BQRUQpOyB9CisKICAgICAvLyBEcmF3IHRoZSBpbml0aWFsIGluZm8gc2NyZWVuLgogICAgIHN0YXRpYyB2b2lkIGRvRHJhd0luZm9QYWdlKGNvbnN0IEVnbFdpbmRvdyYgd2luZG93LAogICAgICAgICAgICAgY29uc3QgUHJvZ3JhbSYgdGV4UmVuZGVyLCBUZXh0UmVuZGVyZXImIHRleHRSZW5kZXJlcik7CkBAIC0xMjAsOSArMTIyLDkgQEAKICAgICAvLyBzdXJmYWNlLgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXRTdXJmYWNlOwogCi0gICAgLy8gT3VyIHF1ZXVlLiAgVGhlIHByb2R1Y2VyIHNpZGUgaXMgcGFzc2VkIHRvIHRoZSB2aXJ0dWFsIGRpc3BsYXksIHRoZQotICAgIC8vIGNvbnN1bWVyIHNpZGUgZmVlZHMgaW50byBvdXIgR0xDb25zdW1lci4KLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIFByb2R1Y2VyIHNpZGUgb2YgcXVldWUsIHBhc3NlZCBpbnRvIHRoZSB2aXJ0dWFsIGRpc3BsYXkuCisgICAgLy8gVGhlIGNvbnN1bWVyIGVuZCBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKIAogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKaW5kZXggNzg0MDU1Yy4uNmE5MTc2YiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCkBAIC0zNTMsNiArMzUzLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJnb29kUG9zPSVkIGZvciBzdHI9JyVzJyIsIGdvb2RQb3MsIHN0cik7CisgICAgQUxPR1YoImdvb2RQb3M9JXp1IGZvciBzdHI9JyVzJyIsIGdvb2RQb3MsIHN0cik7CiAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcio+KHN0ciArIGdvb2RQb3MpOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKaW5kZXggMDJlZDUzYS4uMDJkZjFkMiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCkBAIC0xNCw2ICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNkZWZpbmUgTE9HX1RBRyAiU2NyZWVuUmVjb3JkIgogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKQEAgLTM2LDE4ICs0OSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8dGVybWlvcy5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIkZyYW1lT3V0cHV0LmgiCkBAIC0zNTQsNyArMzU1LDcgQEAKICAgICAgICAgY2FzZSBOT19FUlJPUjoKICAgICAgICAgICAgIC8vIGdvdCBhIGJ1ZmZlcgogICAgICAgICAgICAgaWYgKChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBjb2RlYyBjb25maWcgYnVmZmVyICgldSBieXRlcykiLCBzaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiR290IGNvZGVjIGNvbmZpZyBidWZmZXIgKCV6dSBieXRlcykiLCBzaXplKTsKICAgICAgICAgICAgICAgICBpZiAobXV4ZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyAtLSB3ZSBwYXNzZWQgdGhlIENTRCBpbnRvIE1lZGlhTXV4ZXIgd2hlbgogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBnb3QgdGhlIGZvcm1hdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCkBAIC0zNjIsNyArMzYzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlZCwgc2l6ZT0lZCwgcHRzPSVsbGQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgZGF0YSBpbiBidWZmZXIgJXp1LCBzaXplPSV6dSwgcHRzPSUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkluZGV4LCBzaXplLCBwdHNVc2VjKTsKIAogICAgICAgICAgICAgICAgIHsgLy8gc2NvcGUKQEAgLTQ3Myw3ICs0NzQsNyBAQAogCiAgICAgQUxPR1YoIkVuY29kZXIgc3RvcHBpbmcgKHJlcT0lZCkiLCBnU3RvcFJlcXVlc3RlZCk7CiAgICAgaWYgKGdWZXJib3NlKSB7Ci0gICAgICAgIHByaW50ZigiRW5jb2RlciBzdG9wcGluZzsgcmVjb3JkZWQgJXUgZnJhbWVzIGluICVsbGQgc2Vjb25kc1xuIiwKKyAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJSIgUFJJZDY0ICIgc2Vjb25kc1xuIiwKICAgICAgICAgICAgICAgICBkZWJ1Z051bUZyYW1lcywgbmFub3NlY29uZHNfdG9fc2Vjb25kcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0V2hlbk5zZWMpKTsKICAgICB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKaW5kZXggNWQyZDcyMS4uMWIyZjc5MiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjc1LDcgKzI3Niw4IEBACiAKICAgICBtRXh0cmFjdG9yID0gbmV3IE51TWVkaWFFeHRyYWN0b3I7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1QYXRoLmNfc3RyKCkpOworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtUGF0aC5jX3N0cigpKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgbUV4dHJhY3Rvci5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKaW5kZXggMTRiNDMwNi4uNTg3MDc3YSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTaW5lU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBTaW5lU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKQEAgLTU4LDcgKzU4LDcgQEAKIH0KIAogc3RhdHVzX3QgU2luZVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKaW5kZXggZWQ3ZDZjYi4uOTYwNzNmMSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcApAQCAtMSw0ICsxLDE4IEBACi0jaW5jbHVkZSAiU2luZVNvdXJjZS5oIgorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgpAQCAtMTAsNDEgKzI0LDc5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotaW50IG1haW4oKSB7Ci0gICAgLy8gV2Ugb25seSBoYXZlIGFuIEFNUi1XQiBlbmNvZGVyIG9uIHNob2xlcy4uLgotICAgIHN0YXRpYyBib29sIG91dHB1dFdCQU1SID0gZmFsc2U7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGUgPSBvdXRwdXRXQkFNUiA/IDE2MDAwIDogODAwMDsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQ2hhbm5lbHMgPSAxOworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWQgZHVyYXRpb25dIFstbV0gWy13XSBbPG91dHB1dC1maWxlPl1cbiIsIG5hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RlcyBlaXRoZXIgYSBzaW5lIHdhdmUgb3IgbWljcm9waG9uZSBpbnB1dCB0byBBTVIgZm9ybWF0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtZCAgICBkdXJhdGlvbiBpbiBzZWNvbmRzLCBkZWZhdWx0IDUgc2Vjb25kc1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLW0gICAgdXNlIG1pY3JvcGhvbmUgZm9yIGlucHV0LCBkZWZhdWx0IHNpbmUgc291cmNlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdyAgICB1c2UgQU1SIHdpZGViYW5kIChkZWZhdWx0IG5hcnJvd2JhbmQpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICA8b3V0cHV0LWZpbGU+IG91dHB1dCBmaWxlIGZvciBBTVIgZW5jb2RpbmcsIgorICAgICAgICAgICAgIiBpZiB1bnNwZWNpZmllZCwgZGVjb2RlIHRvIHNwZWFrZXIuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGNoYW5uZWxzID0gMTsgLy8gbm90IHBlcm1pdHRlZCB0byBiZSBzdGVyZW8gbm93CisgICAgdW5zaWduZWQgZHVyYXRpb24gPSA1OworICAgIGJvb2wgdXNlTWljID0gZmFsc2U7CisgICAgYm9vbCBvdXRwdXRXQkFNUiA9IGZhbHNlOworICAgIGJvb2wgcGxheVRvU3BlYWtlciA9IHRydWU7CisgICAgY29uc3QgY2hhciogZmlsZU91dCA9IE5VTEw7CisgICAgaW50IGNoOworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImQ6bXciKSkgIT0gLTEpIHsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGR1cmF0aW9uID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgdXNlTWljID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIG91dHB1dFdCQU1SID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICBmaWxlT3V0ID0gYXJndlswXTsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOworICAgIGNvbnN0IGludDMyX3Qga0JpdFJhdGUgPSBvdXRwdXRXQkFNUiA/IDE2MDAwIDogODAwMDsKIAogICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLQogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlOwogCi0jaWYgMAotICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBuZXcgU2luZVNvdXJjZShrU2FtcGxlUmF0ZSwga051bUNoYW5uZWxzKTsKLSNlbHNlCi0gICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBBdWRpb1NvdXJjZSgKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULAotICAgICAgICAgICAga1NhbXBsZVJhdGUsCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChrTnVtQ2hhbm5lbHMpKTsKLSNlbmRpZgorICAgIGlmICh1c2VNaWMpIHsKKyAgICAgICAgLy8gdGFsayBpbnRvIHRoZSBhcHByb3ByaWF0ZSBtaWNyb3Bob25lIGZvciB0aGUgZHVyYXRpb24KKyAgICAgICAgc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAorICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAga1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHVzZSBhIHNpbmUgc291cmNlIGF0IDUwMCBoei4KKyAgICAgICAgc291cmNlID0gbmV3IFNpbmVTb3VyY2Uoa1NhbXBsZVJhdGUsIGNoYW5uZWxzKTsKKyAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQogICAgIG1ldGEtPnNldENTdHJpbmcoCiAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsCiAgICAgICAgICAgICBvdXRwdXRXQkFNUiA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgotICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBrTnVtQ2hhbm5lbHMpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxzKTsKICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga1NhbXBsZVJhdGUpOwotCisgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGtCaXRSYXRlKTsKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBpZiAoc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhJbnB1dFNpemUpKSB7CiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CkBAIC01NSw0NyArMTA3LDQxIEBACiAgICAgICAgICAgICBtZXRhLCB0cnVlIC8qIGNyZWF0ZUVuY29kZXIgKi8sCiAgICAgICAgICAgICBzb3VyY2UpOwogCi0jaWYgMQotICAgIHNwPEFNUldyaXRlcj4gd3JpdGVyID0gbmV3IEFNUldyaXRlcigiL3NkY2FyZC9vdXQuYW1yIik7Ci0gICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7Ci0gICAgd3JpdGVyLT5zdGFydCgpOwotICAgIHNsZWVwKDEwKTsKLSAgICB3cml0ZXItPnN0b3AoKTsKLSNlbHNlCi0gICAgc3A8TWVkaWFTb3VyY2U+IGRlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLAotICAgICAgICAgICAgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywKLSAgICAgICAgICAgIGVuY29kZXIpOworICAgIGlmIChmaWxlT3V0ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gdGFyZ2V0IGZpbGUgc3BlY2lmaWVkLCB3cml0ZSBlbmNvZGVkIEFNUiBvdXRwdXQKKyAgICAgICAgc3A8QU1SV3JpdGVyPiB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKGZpbGVPdXQpOworICAgICAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKyAgICAgICAgd3JpdGVyLT5zdGFydCgpOworICAgICAgICBzbGVlcChkdXJhdGlvbik7CisgICAgICAgIHdyaXRlci0+c3RvcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG90aGVyd2lzZSBkZWNvZGUgdG8gc3BlYWtlcgorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLAorICAgICAgICAgICAgICAgIG1ldGEsIGZhbHNlIC8qIGNyZWF0ZUVuY29kZXIgKi8sCisgICAgICAgICAgICAgICAgZW5jb2Rlcik7CiAKLSNpZiAwCi0gICAgQXVkaW9QbGF5ZXIgKnBsYXllciA9IG5ldyBBdWRpb1BsYXllcihOVUxMKTsKLSAgICBwbGF5ZXItPnNldFNvdXJjZShkZWNvZGVyKTsKLQotICAgIHBsYXllci0+c3RhcnQoKTsKLQotICAgIHNsZWVwKDEwKTsKLQotICAgIHBsYXllci0+c3RvcCgpOwotCi0gICAgZGVsZXRlIHBsYXllcjsKLSAgICBwbGF5ZXIgPSBOVUxMOwotI2VsaWYgMAotICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHdoaWxlIChkZWNvZGVyLT5yZWFkKCZidWZmZXIpID09IE9LKSB7Ci0gICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIGJ1ZmZlcgotCi0gICAgICAgIHB1dGNoYXIoJy4nKTsKLSAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChwbGF5VG9TcGVha2VyKSB7CisgICAgICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOworICAgICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UoZGVjb2Rlcik7CisgICAgICAgICAgICBwbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgICAgICBzbGVlcChkdXJhdGlvbik7CisgICAgICAgICAgICBzb3VyY2UtPnN0b3AoKTsgLy8gbXVzdCBzdG9wIHNvdXJjZSBvdGhlcndpc2UgZGVsZXRlIHBsYXllciB3aWxsIGhhbmcKKyAgICAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7IC8vIHRoZXJlIGlzIG5vIHBsYXllci0+c3RvcCgpLi4uCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKKyAgICAgICAgICAgIHdoaWxlIChkZWNvZGVyLT5yZWFkKCZidWZmZXIpID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggYnVmZmVyIChzYXZlIGl0IGV2ZW50dWFsbHk/KQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RvcCBhZnRlciBzb21lIGNvdW50IHRob3VnaC4uLgorICAgICAgICAgICAgICAgIHB1dGNoYXIoJy4nKTsKKyAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOworICAgICAgICB9CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOwotI2VuZGlmCi0jZW5kaWYKLQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCBkMTI1YWQxLi5mZDAyYmNjIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03Niw3ICs3Nyw3IEBACiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IDkwZGFlYTIuLmY0YTMzZTggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNTksNyArNjAsNyBAQAogICAgICAgICBpbnQgdHJpbUVuZFRpbWVNcywKICAgICAgICAgaW50IHJvdGF0aW9uRGVncmVlcykgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggYjdhNDBjMi4uZmRjMzUyZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMjk2LDcgKzI5Niw3IEBACiB9CiAjZWxzZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyICoqIC8qIGFyZ3YgKi8pIHsKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAppbmRleCAxZDI2N2Y5Li45ZjU0N2M3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgX191bnVzZWQpIHsKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC04Myw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC0xMDAsOCArMTAwLDEyIEBACiAgICAgICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzLiB3ZSBqdXN0IHRlc3QgdmlkZW8gZW5jb2RlcgogICAgICAgICAvLyBBbHNvLCBieSBza2lwcGluZyB0aGUgY29udGVudCBnZW5lcmF0aW9uLCB3ZSBjYW4gcmV0dXJuIGZyb20KICAgICAgICAgLy8gcmVhZCgpIG11Y2ggZmFzdGVyLgotICAgICAgICAvL2NoYXIgeCA9IChjaGFyKSgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYICogMjU1KTsKLSAgICAgICAgLy9tZW1zZXQoKCpidWZmZXIpLT5kYXRhKCksIHgsIG1TaXplKTsKKyNpZiAwCisgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBzb2xpZCBwbGFuZXMgb2YgY29sb3IuCisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHggPSAweDYwOworICAgICAgICBtZW1zZXQoKCpidWZmZXIpLT5kYXRhKCksIHgsIG1TaXplKTsKKyAgICAgICAgeCA9IHggPj0gMHhhMCA/IDB4NjAgOiB4ICsgMTsKKyNlbmRpZgogICAgICAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgwLCBtU2l6ZSk7CiAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMTYzLDcgKzE2Nyw3IEBACiAgICAgaW50IGxldmVsID0gLTE7ICAgICAgICAvLyBFbmNvZGVyIHNwZWNpZmljIGRlZmF1bHQKICAgICBpbnQgcHJvZmlsZSA9IC0xOyAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAogICAgIGludCBjb2RlYyA9IDA7Ci0gICAgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXQubXA0IjsKKyAgICBjb25zdCBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dC5tcDQiOwogICAgIGJvb2wgcHJlZmVyU29mdHdhcmVDb2RlYyA9IGZhbHNlOwogCiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGIyYjljZTUuLjBmNzI5YTMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTE5LDggKzE5LDEyIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPHNpZ25hbC5oPgorCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00Myw2ICs0NywxOCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAordm9sYXRpbGUgc3RhdGljIGJvb2wgY3RybGMgPSBmYWxzZTsKKworc3RhdGljIHNpZ2hhbmRsZXJfdCBvbGRoYW5kbGVyID0gTlVMTDsKKworc3RhdGljIHZvaWQgbXlzaWdoYW5kbGVyKGludCBzaWdudW0pIHsKKyAgICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgICAgICBjdHJsYyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgb2xkaGFuZGxlcihzaWdudW0pOworfQorCiBzdHJ1Y3QgQ29udHJvbGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgQ29udHJvbGxlcihjb25zdCBjaGFyICp1cmksIGJvb2wgZGVjb2RlQXVkaW8sCiAgICAgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgYm9vbCByZW5kZXJUb1N1cmZhY2UpCkBAIC02Myw3ICs3OSwzMCBAQAogICAgIHZpcnR1YWwgfkNvbnRyb2xsZXIoKSB7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHByaW50U3RhdGlzdGljcygpIHsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1TdGFydFRpbWVVczsKKworICAgICAgICBpZiAobURlY29kZUF1ZGlvKSB7CisgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCisgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkICogMUU2IC8gMTAyNCAvIGRlbGF5VXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlZCBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICUiIFBSSWQ2NCAiIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQsCisgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkICogMUU2IC8gZGVsYXlVcywKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCisgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkICogMUU2IC8gMTAyNCAvIGRlbGF5VXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGlmIChjdHJsYykgeworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgcHJpbnRTdGF0aXN0aWNzKCk7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICBjdHJsYyA9IGZhbHNlOworICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgIGNhc2Uga1doYXRTdGFydDoKICAgICAgICAgICAgIHsKQEAgLTc2LDcgKzExNSw4IEBACiAjZW5kaWYKIAogICAgICAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1VUkkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywgbVVSSS5jX3N0cigpKTsKIAogICAgICAgICAgICAgICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPQogICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtOTksNyArMTM5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDSEVDSyhtU291cmNlICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJubyAlcyB0cmFjayBmb3VuZFxuIiwgbURlY29kZUF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBDSEVDS19FUShtU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCkBAIC0xNjgsNDIgKzIxMSwyOCBAQAogICAgICAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKLSAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgb25GaWxsVGhpc0J1ZmZlcihtc2cpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKChtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkKysgJSAxNikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG9uRHJhaW5UaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdoYXQgPT0gQUNvZGVjOjprV2hhdEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50Zigod2hhdCA9PSBBQ29kZWM6OmtXaGF0RU9TKSA/ICIkXG4iIDogIkVcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RU9TCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB3aGF0ID09IENvZGVjQmFzZTo6a1doYXRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVPUykgPyAiJFxuIiA6ICJFXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVN0YXJ0VGltZVVzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlQXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQgZnJhbWVzIGRlY29kZWQsICUuMmYgZnBzLiAlIiBQUklkNjQgIiBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKSktPnBvc3QoNTAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlTG9vcGVyICE9IGxvb3BlcigpKSB7CkBAIC0yMTEsMTIgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsb29wZXIoKS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNvbWV0aGluZyB3ZW50IHdyb25nLCBjb2RlYyByZXBvcnRlZCBhbiBlcnJvci4iKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzksNiArNjYyLDggQEAKIAogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCisgICAgc2lnbmFsKFNJR0lOVCwgbXlzaWdoYW5kbGVyKTsKKwogICAgIGNvbnRyb2xsZXItPnN0YXJ0QXN5bmMoKTsKIAogICAgIENIRUNLX0VRKGxvb3Blci0+c3RhcnQodHJ1ZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBhYjJjNTRiLi44MWVkY2I0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgpAQCAtOTM4LDkgKzkzOSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0hFQ0sodXNlU3VyZmFjZVRleEFsbG9jKTsKIAotICAgICAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoYnEsIDAgLyogdGV4ICovKTsKLSAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIDAgLyogdGV4ICovLAorICAgICAgICAgICAgICAgICAgICBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLCB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworICAgICAgICAgICAgZ1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCkBAIC05NTgsNyArOTYzLDggQEAKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoZmlsZW5hbWUpOworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBkYmE2N2E5Li4wNTY2ZDE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE1OSw3ICsxNjAsOSBAQAogTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtMzcxLDcgKzM3NCw3IEBACiAgICAgfQogCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCAwKTsKKyAgICAgICAgc2VydmljZS0+Y3JlYXRlKGNsaWVudCwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSk7CiAKICAgICBpZiAocGxheWVyICE9IE5VTEwgJiYgcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDJiNzE5MDQuLjYzMzQxZTAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCwxOCBAQAogc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CiAKIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggMjM0YWVmMi4uZjQwMDczMiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0zMTYsNiArMzE2LDcgQEAKIAogICAgIGlmICgtMSA8IGZpbGVEZXNjKSB7CiAgICAgICAgIGlmIChGd2RMb2NrRmlsZV9hdHRhY2goZmlsZURlc2MpIDwgMCkgeworICAgICAgICAgICAgY2xvc2UoZmlsZURlc2MpOwogICAgICAgICAgICAgcmV0dXJuIG1pbWVTdHJpbmc7CiAgICAgICAgIH0KICAgICAgICAgY29uc3QgY2hhciogcE1pbWVUeXBlID0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmOGQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorCisjaW5jbHVkZSAiQWVzQ3RyRGVjcnlwdG9yLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0Jsb2NrQml0Q291bnQgPSBrQmxvY2tTaXplICogODsKKworYW5kcm9pZDo6c3RhdHVzX3QgQWVzQ3RyRGVjcnlwdG9yOjpkZWNyeXB0KGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYga2V5LAorICAgICAgICBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc291cmNlLAorICAgICAgICB1aW50OF90KiBkZXN0aW5hdGlvbiwKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgIHVpbnQzMl90IGJsb2NrT2Zmc2V0ID0gMDsKKyAgICB1aW50OF90IHByZXZpb3VzRW5jcnlwdGVkQ291bnRlcltrQmxvY2tTaXplXTsKKyAgICBtZW1zZXQocHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLCAwLCBrQmxvY2tTaXplKTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIEFFU19LRVkgb3BlbnNzbEtleTsKKyAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleS5hcnJheSgpLCBrQmxvY2tCaXRDb3VudCwgJm9wZW5zc2xLZXkpOworICAgIEl2IG9wZW5zc2xJdjsKKyAgICBtZW1jcHkob3BlbnNzbEl2LCBpdiwgc2l6ZW9mKG9wZW5zc2xJdikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworCisgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGEgPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24gKyBvZmZzZXQsIHNvdXJjZSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzdWJTYW1wbGUubU51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgICAgIEFFU19jdHIxMjhfZW5jcnlwdChzb3VyY2UgKyBvZmZzZXQsIGRlc3RpbmF0aW9uICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhLCAmb3BlbnNzbEtleSwKKyAgICAgICAgICAgICAgICAgICAgb3BlbnNzbEl2LCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICZibG9ja09mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpieXRlc0RlY3J5cHRlZE91dCA9IG9mZnNldDsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTYyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworI2RlZmluZSBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPFV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEFlc0N0ckRlY3J5cHRvciB7CitwdWJsaWM6CisgICAgQWVzQ3RyRGVjcnlwdG9yKCkge30KKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGRlY3J5cHQoY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBrZXksIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCogc291cmNlLCB1aW50OF90KiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBZXNDdHJEZWNyeXB0b3IpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0FFU19DVFJfREVDUllQVE9SX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLm1rIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE4NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDYyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBZXNDdHJEZWNyeXB0b3IuY3BwIFwKKyAgICBDbGVhcktleVVVSUQuY3BwIFwKKyAgICBDcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwIFwKKyAgICBDcnlwdG9GYWN0b3J5LmNwcCBcCisgICAgQ3J5cHRvUGx1Z2luLmNwcCBcCisgICAgRHJtRmFjdG9yeS5jcHAgXAorICAgIERybVBsdWdpbi5jcHAgXAorICAgIEluaXREYXRhUGFyc2VyLmNwcCBcCisgICAgSnNvbldlYktleS5jcHAgXAorICAgIFNlc3Npb24uY3BwIFwKKyAgICBTZXNzaW9uTGlicmFyeS5jcHAgXAorICAgIFV0aWxzLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGJpb25pYyBcCisgICAgZXh0ZXJuYWwvanNtbiBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5IFwKKyAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAorCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtY2xlYXJrZXlwbHVnaW4KKworTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IG1lZGlhZHJtCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmNyeXB0byBcCisgICAgbGlibG9nIFwKKyAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICBsaWJ1dGlscyBcCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmpzbW4gXAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgdW5pdCB0ZXN0cworCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyODk1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfVFlQRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfVFlQRVNfSF8KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY29uc3QgdWludDhfdCBrQmxvY2tTaXplID0gQUVTX0JMT0NLX1NJWkU7Cit0eXBlZGVmIHVpbnQ4X3QgS2V5SWRba0Jsb2NrU2l6ZV07Cit0eXBlZGVmIHVpbnQ4X3QgSXZba0Jsb2NrU2l6ZV07CisKK3R5cGVkZWYgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgU3ViU2FtcGxlOworCit0eXBlZGVmIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiwKKyAgICAgICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+ID4gS2V5TWFwOworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfVFlQRVNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDUwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBpc0NsZWFyS2V5VVVJRChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NsZWFyS2V5VVVJRFsxNl0gPSB7CisgICAgICAgIDB4MTAsMHg3NywweEVGLDB4RUMsMHhDMCwweEIyLDB4NEQsMHgwMiwKKyAgICAgICAgMHhBQywweEUzLDB4M0MsMHgxRSwweDUyLDB4RTIsMHhGQiwweDRCCisgICAgfTsKKworICAgIHJldHVybiAhbWVtY21wKHV1aWQsIGtDbGVhcktleVVVSUQsIHNpemVvZihrQ2xlYXJLZXlVVUlEKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmgKaW5kZXggMTNjYWM2ZC4uYWM5OTQxOAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2lmbmRlZiBDTEVBUktFWV9VVUlEX0hfCisjZGVmaW5lIENMRUFSS0VZX1VVSURfSF8KIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworYm9vbCBpc0NsZWFyS2V5VVVJRChjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKIAorfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1VVSURfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDYxJQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAppbmRleCAxM2NhYzZkLi5lYzE0MjBlCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlICJDcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCIKIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisjaW5jbHVkZSAiRHJtRmFjdG9yeS5oIgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitleHRlcm4gIkMiIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworYW5kcm9pZDo6RHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IGNsZWFya2V5ZHJtOjpEcm1GYWN0b3J5KCk7Cit9CiAKK2FuZHJvaWQ6OkNyeXB0b0ZhY3RvcnkqIGNyZWF0ZUNyeXB0b0ZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBjbGVhcmtleWRybTo6Q3J5cHRvRmFjdG9yeSgpOworfQorCit9IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmluZGV4IDEzY2FjNmQuLmQ5YWNlYzEKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK2V4dGVybiAiQyIgeworICAgIGFuZHJvaWQ6OkRybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKTsKKyAgICBhbmRyb2lkOjpDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCk7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQorI2VuZGlmIC8vIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzE4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkNyeXB0b0ZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIkNyeXB0b1BsdWdpbi5oIgorI2luY2x1ZGUgIlNlc3Npb24uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitib29sIENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDbGVhcktleVVVSUQodXVpZCk7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IENyeXB0b0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbioqIHBsdWdpbikgeworICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgKnBsdWdpbiA9IE5VTEw7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgfQorCisgICAgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IFNlc3Npb25MaWJyYXJ5OjpnZXQoKS0+ZmluZFNlc3Npb24oCisgICAgICAgICAgICBkYXRhLCBzaXplKTsKKyAgICAqcGx1Z2luID0gbmV3IENyeXB0b1BsdWdpbihzZXNzaW9uKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4YmM0YgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXworI2RlZmluZSBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBDcnlwdG9GYWN0b3J5IDogcHVibGljIGFuZHJvaWQ6OkNyeXB0b0ZhY3RvcnkgeworcHVibGljOgorICAgIENyeXB0b0ZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgfkNyeXB0b0ZhY3RvcnkoKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIGNvbnN0OworCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b0ZhY3RvcnkpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGFkMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OworCisvLyBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlcyBmb3IgZXJyb3IgY29kZSBhbmQgcG9zaXRpdmUgdmFsdWVzIGZvciB0aGUgc2l6ZSBvZgorLy8gZGVjcnlwdGVkIGRhdGEuICBJbiB0aGVvcnksIHRoZSBvdXRwdXQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGlucHV0CisvLyBzaXplLCBidXQgaW4gcHJhY3RpY2UgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgQUVTLUNUUi4KK3NzaXplX3QgQ3J5cHRvUGx1Z2luOjpkZWNyeXB0KGJvb2wgc2VjdXJlLCBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQqIHNyY1B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3RQdHIsIEFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKSB7CisgICAgaWYgKHNlY3VyZSkgeworICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oIlNlY3VyZSBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xlYXJLZXkuIik7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBpZiAobW9kZSA9PSBrTW9kZV9VbmVuY3J5cHRlZCkgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSYgc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsTXNnLT5zZXRUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWQgc3Vic2FtcGxlcyBmb3VuZCBpbiBhbGxlZ2VkbHkgdW5lbmNyeXB0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9ERUNSWVBUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZHN0UHRyKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc3JjUHRyKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZV9BRVNfQ1RSKSB7CisgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVNlc3Npb24tPmRlY3J5cHQoa2V5SWQsIGl2LCBzcmNQdHIsIGRzdFB0ciwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywgJmJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVycm9yRGV0YWlsTXNnLT5zZXRUbygiRGVjcnlwdGlvbiBFcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oCisgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBDbGVhcktleSBEUk0gIgorICAgICAgICAgICAgICAgICJQbHVnaW4uIik7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJkOWUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworI2RlZmluZSBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIlNlc3Npb24uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBDcnlwdG9QbHVnaW4oY29uc3QgYW5kcm9pZDo6c3A8U2Vzc2lvbj4mIHNlc3Npb24pIDogbVNlc3Npb24oc2Vzc2lvbikge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9QbHVnaW4oKSB7fQorCisgICAgdmlydHVhbCBib29sIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyKiBtaW1lKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBkZWNyeXB0KAorICAgICAgICAgICAgYm9vbCBzZWN1cmUsIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIE1vZGUgbW9kZSwgY29uc3Qgdm9pZCogc3JjUHRyLAorICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIHZvaWQqIGRzdFB0ciwgYW5kcm9pZDo6QVN0cmluZyogZXJyb3JEZXRhaWxNc2cpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b1BsdWdpbik7CisKKyAgICBhbmRyb2lkOjpzcDxTZXNzaW9uPiBtU2Vzc2lvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjc1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiRHJtRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCitib29sIERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmaW5pdERhdGFUeXBlKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHR5cGVzIGhhbmRlZCBieSBJbml0RGF0YVBhcnNlci4KKyAgICByZXR1cm4gaW5pdERhdGFUeXBlID09ICJjZW5jIiB8fAorICAgICAgICAgICBpbml0RGF0YVR5cGUgPT0gIndlYm0iOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBEcm1GYWN0b3J5OjpjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGFuZHJvaWQ6OkRybVBsdWdpbioqIHBsdWdpbikgeworICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgKnBsdWdpbiA9IE5VTEw7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgfQorCisgICAgKnBsdWdpbiA9IG5ldyBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnk6OmdldCgpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0ZDNkMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworI2RlZmluZSBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIERybUZhY3RvcnkgOiBwdWJsaWMgYW5kcm9pZDo6RHJtRmFjdG9yeSB7CitwdWJsaWM6CisgICAgRHJtRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCB+RHJtRmFjdG9yeSgpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICZpbml0RGF0YVR5cGUpOworCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBjcmVhdGVEcm1QbHVnaW4oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBhbmRyb2lkOjpEcm1QbHVnaW4qKiBwbHVnaW4pOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUZhY3RvcnkpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZjYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OnNwOworCitzdGF0dXNfdCBEcm1QbHVnaW46Om9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCisgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwpIHsKKyAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKKyAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBkZWZhdWx0VXJsLmNsZWFyKCk7CisgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgJnJlcXVlc3QpOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0IHsKKyAgICBpZiAobmFtZSA9PSAidmVuZG9yIikgeworICAgICAgICB2YWx1ZSA9ICJHb29nbGUiOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAidmVyc2lvbiIpIHsKKyAgICAgICAgdmFsdWUgPSAiMS4wIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImRlc2NyaXB0aW9uIikgeworICAgICAgICB2YWx1ZSA9ICJDbGVhcktleSBDRE0iOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiYWxnb3JpdGhtcyIpIHsKKyAgICAgICAgdmFsdWUgPSAiIjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHN0cmluZyBwcm9wZXJ0eSAlcyIsIG5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZGY5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXworI2RlZmluZSBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpLZXllZFZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6Okxpc3Q7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK2NsYXNzIERybVBsdWdpbiA6IHB1YmxpYyBhbmRyb2lkOjpEcm1QbHVnaW4geworcHVibGljOgorICAgIERybVBsdWdpbihTZXNzaW9uTGlicmFyeSogc2Vzc2lvbkxpYnJhcnkpCisgICAgICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSkge30KKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCisgICAgICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZUtleXMoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlTZXRJZCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGluZm9NYXApOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2VydF90eXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2VydF9hdXRob3JpdHksCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCisgICAgICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgICAgIFVOVVNFRChjZXJ0X3R5cGUpOworICAgICAgICBVTlVTRUQoY2VydF9hdXRob3JpdHkpOworICAgICAgICBVTlVTRUQocmVxdWVzdCk7CisgICAgICAgIFVOVVNFRChkZWZhdWx0VXJsKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXkpIHsKKyAgICAgICAgVU5VU0VEKHJlc3BvbnNlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRpZmljYXRlKTsKKyAgICAgICAgVU5VU0VEKHdyYXBwZWRLZXkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiYgc2VjdXJlU3RvcHMpIHsKKyAgICAgICAgVU5VU0VEKHNlY3VyZVN0b3BzKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc3NSZWxlYXNlKSB7CisgICAgICAgIFVOVVNFRChzc1JlbGVhc2UpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChuYW1lKTsKKyAgICAgICAgVU5VU0VEKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgeworICAgICAgICBVTlVTRUQobmFtZSk7CisgICAgICAgIFVOVVNFRCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgeworICAgICAgICBVTlVTRUQobmFtZSk7CisgICAgICAgIFVOVVNFRCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0pIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChhbGdvcml0aG0pOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoYWxnb3JpdGhtKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChpbnB1dCk7CisgICAgICAgIFVOVVNFRChpdik7CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKGlucHV0KTsKKyAgICAgICAgVU5VU0VEKGl2KTsKKyAgICAgICAgVU5VU0VEKG91dHB1dCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKG1lc3NhZ2UpOworICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUsIGJvb2wmIG1hdGNoKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQobWVzc2FnZSk7CisgICAgICAgIFVOVVNFRChzaWduYXR1cmUpOworICAgICAgICBVTlVTRUQobWF0Y2gpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0sCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXksCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGFsZ29yaXRobSk7CisgICAgICAgIFVOVVNFRChtZXNzYWdlKTsKKyAgICAgICAgVU5VU0VEKHdyYXBwZWRLZXkpOworICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1QbHVnaW4pOworCisgICAgU2Vzc2lvbkxpYnJhcnkqIG1TZXNzaW9uTGlicmFyeTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZDczYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK25hbWVzcGFjZSB7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBjb25zdCBzaXplX3Qga1N5c3RlbUlkU2l6ZSA9IDE2OworfQorCithbmRyb2lkOjpzdGF0dXNfdCBJbml0RGF0YVBhcnNlcjo6cGFyc2UoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICBWZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CisgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBrZXkgSURzCisgICAgVmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CisgICAgaWYgKGluaXREYXRhVHlwZSA9PSAiY2VuYyIpIHsKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzID0gcGFyc2VQc3NoKGluaXREYXRhLCAma2V5SWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaW5pdERhdGFUeXBlID09ICJ3ZWJtIikgeworICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECisgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICB9CisgICAgICAgIGtleUlkcy5wdXNoKGluaXREYXRhLmFycmF5KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdAorICAgIFN0cmluZzggcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBsaWNlbnNlUmVxdWVzdC0+Y2xlYXIoKTsKKyAgICBsaWNlbnNlUmVxdWVzdC0+YXBwZW5kQXJyYXkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyZXF1ZXN0SnNvbi5zdHJpbmcoKSksCisgICAgICAgICAgICByZXF1ZXN0SnNvbi5zaXplKCkpOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgSW5pdERhdGFQYXJzZXI6OnBhcnNlUHNzaChjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBWZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpIHsKKyAgICBzaXplX3QgcmVhZFBvc2l0aW9uID0gMDsKKworICAgIC8vIFZhbGlkYXRlIHNpemUgZmllbGQKKyAgICB1aW50MzJfdCBleHBlY3RlZFNpemUgPSBpbml0RGF0YS5zaXplKCk7CisgICAgZXhwZWN0ZWRTaXplID0gaHRvbmwoZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCAmZXhwZWN0ZWRTaXplLAorICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkU2l6ZSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGV4cGVjdGVkU2l6ZSk7CisKKyAgICAvLyBWYWxpZGF0ZSBQU1NIIGJveCBpZGVudGlmaWVyCisgICAgY29uc3QgY2hhciBwc3NoSWRlbnRpZmllcls0XSA9IHsncCcsICdzJywgJ3MnLCAnaCd9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgc2l6ZW9mKHBzc2hJZGVudGlmaWVyKSkgIT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2YocHNzaElkZW50aWZpZXIpOworCisgICAgLy8gVmFsaWRhdGUgRU1FIHZlcnNpb24gbnVtYmVyCisgICAgY29uc3QgdWludDhfdCBwc3NoVmVyc2lvbjFbNF0gPSB7MSwgMCwgMCwgMH07CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaFZlcnNpb24xLAorICAgICAgICAgICAgICAgc2l6ZW9mKHBzc2hWZXJzaW9uMSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hWZXJzaW9uMSk7CisKKyAgICAvLyBWYWxpZGF0ZSBzeXN0ZW0gSUQKKyAgICBpZiAoIWlzQ2xlYXJLZXlVVUlEKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dKSkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBrU3lzdGVtSWRTaXplOworCisgICAgLy8gUmVhZCBrZXkgSUQgY291bnQKKyAgICB1aW50MzJfdCBrZXlJZENvdW50OworICAgIG1lbWNweSgma2V5SWRDb3VudCwgJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHNpemVvZihrZXlJZENvdW50KSk7CisgICAga2V5SWRDb3VudCA9IG50b2hsKGtleUlkQ291bnQpOworICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2Yoa2V5SWRDb3VudCk7CisgICAgaWYgKHJlYWRQb3NpdGlvbiArIChrZXlJZENvdW50ICoga0tleUlkU2l6ZSkgIT0KKyAgICAgICAgICAgIGluaXREYXRhLnNpemUoKSAtIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUga2V5IElEIG9mZnNldHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5SWRDb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBrZXlJZFBvc2l0aW9uID0gcmVhZFBvc2l0aW9uICsgKGkgKiBrS2V5SWRTaXplKTsKKyAgICAgICAga2V5SWRzLT5wdXNoKCZpbml0RGF0YVtrZXlJZFBvc2l0aW9uXSk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworU3RyaW5nOCBJbml0RGF0YVBhcnNlcjo6Z2VuZXJhdGVSZXF1ZXN0KGNvbnN0IFZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgeworICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgY29uc3QgU3RyaW5nOCBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IFN0cmluZzgga0Jhc2U2NFBhZGRpbmcoIj0iKTsKKworICAgIFN0cmluZzggcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CisgICAgQVN0cmluZyBlbmNvZGVkSWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlJZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZW5jb2RlZElkLmNsZWFyKCk7CisgICAgICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NChrZXlJZHNbaV0sIGtLZXlJZFNpemUsICZlbmNvZGVkSWQpOworICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiLCIpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuYXBwZW5kRm9ybWF0KCJcIiVzXCIiLCBlbmNvZGVkSWQuY19zdHIoKSk7CisgICAgfQorICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKworICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgorICAgIHJlcXVlc3QucmVtb3ZlQWxsKGtCYXNlNjRQYWRkaW5nKTsKKyAgICByZXR1cm4gcmVxdWVzdDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDVkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgSW5pdERhdGFQYXJzZXIgeworcHVibGljOgorICAgIEluaXREYXRhUGFyc2VyKCkge30KKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHBhcnNlKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbml0RGF0YVBhcnNlcik7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZVBzc2goY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcyk7CisKKyAgICBhbmRyb2lkOjpTdHJpbmc4IGdlbmVyYXRlUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2ZmYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJKc29uV2ViS2V5IgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleXNUYWcoImtleXMiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleVR5cGVUYWcoImt0eSIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5VGFnKCJrIik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlJZFRhZygia2lkIik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OkFCdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpBU3RyaW5nOworCitKc29uV2ViS2V5OjpKc29uV2ViS2V5KCkgeworfQorCitKc29uV2ViS2V5Ojp+SnNvbldlYktleSgpIHsKK30KKworLyoKKyAqIFBhcnNlcyBhIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nLCBpbml0aWFsaXplcyBhIEtleU1hcCB3aXRoIGtleSBpZDprZXkKKyAqIHBhaXJzIGZyb20gdGhlIEpTT04gV2ViIEtleSBTZXQuIEJvdGgga2V5IGlkcyBhbmQga2V5cyBhcmUgYmFzZTY0dXJsCisgKiBlbmNvZGVkLiBUaGUgS2V5TWFwIGNvbnRhaW5zIGJhc2U2NHVybCBkZWNvZGVkIGtleSBpZDprZXkgcGFpcnMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LAorICAgICAgICBLZXlNYXAqIGtleXMpIHsKKworICAgIGtleXMtPmNsZWFyKCk7CisgICAgaWYgKCFwYXJzZUpzb25XZWJLZXlTZXQoanNvbldlYktleVNldCwgJm1Kc29uT2JqZWN0cykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG1Kc29uT2JqZWN0c1swXSBjb250YWlucyB0aGUgZW50aXJlIEpTT04gV2ViIEtleSBTZXQsIGluY2x1ZGluZworICAgIC8vIGFsbCB0aGUgYmFzZTY0IGVuY29kZWQga2V5cy4gRWFjaCBrZXkgaXMgYWxzbyBzdG9yZWQgc2VwYXJhdGVseSBhcworICAgIC8vIGEgSlNPTiBvYmplY3QgaW4gbUpzb25PYmplY3RzWzEuLm5dIHdoZXJlIG4gaXMgdGhlIHRvdGFsCisgICAgLy8gbnVtYmVyIG9mIGtleXMgaW4gdGhlIHNldC4KKyAgICBpZiAoIWlzSnNvbldlYktleVNldChtSnNvbk9iamVjdHNbMF0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IGVuY29kZWRLZXksIGVuY29kZWRLZXlJZDsKKyAgICBWZWN0b3I8dWludDhfdD4gZGVjb2RlZEtleSwgZGVjb2RlZEtleUlkOworCisgICAgLy8gbUpzb25PYmplY3RzWzFdIGNvbnRhaW5zIHRoZSBmaXJzdCBKU09OIFdlYiBLZXkgaW4gdGhlIHNldAorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUpzb25PYmplY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRLZXlJZC5jbGVhcigpOworICAgICAgICBlbmNvZGVkS2V5LmNsZWFyKCk7CisKKyAgICAgICAgaWYgKCFwYXJzZUpzb25PYmplY3QobUpzb25PYmplY3RzW2ldLCAmbVRva2VucykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKGZpbmRLZXkobUpzb25PYmplY3RzW2ldLCAmZW5jb2RlZEtleUlkLCAmZW5jb2RlZEtleSkpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkS2V5SWQuaXNFbXB0eSgpIHx8IGVuY29kZWRLZXkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11c3QgaGF2ZSBib3RoIGtleSBpZCBhbmQga2V5IGluIHRoZSBKc29uV2ViS2V5IHNldC4iKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkZWNvZGVCYXNlNjRTdHJpbmcoZW5jb2RlZEtleUlkLCAmZGVjb2RlZEtleUlkKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVjb2RlIGtleSBpZCglcykiLCBlbmNvZGVkS2V5SWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5LCAmZGVjb2RlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkoJXMpIiwgZW5jb2RlZEtleS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtleXMtPmFkZChkZWNvZGVkS2V5SWQsIGRlY29kZWRLZXkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBTdHJpbmc4JiBlbmNvZGVkVGV4dCwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCkgeworCisgICAgZGVjb2RlZFRleHQtPmNsZWFyKCk7CisKKyAgICAvLyBlbmNvZGVkVGV4dCBzaG91bGQgbm90IGNvbnRhaW4gcGFkZGluZyBjaGFyYWN0ZXJzIGFzIHBlciBFTUUgc3BlYy4KKyAgICBpZiAoZW5jb2RlZFRleHQuZmluZChrQmFzZTY0UGFkZGluZykgIT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNpbmNlIGFuZHJvaWQ6OmRlY29kZUJhc2U2NCgpIHJlcXVpcmVzIHBhZGRpbmcgY2hhcmFjdGVycywKKyAgICAvLyBhZGQgdGhlbSBzbyBsZW5ndGggb2YgZW5jb2RlZFRleHQgaXMgZXhhY3RseSBhIG11bHRpcGxlIG9mIDQuCisgICAgaW50IHJlbWFpbmRlciA9IGVuY29kZWRUZXh0Lmxlbmd0aCgpICUgNDsKKyAgICBTdHJpbmc4IHBhZGRlZFRleHQoZW5jb2RlZFRleHQpOworICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNCAtIHJlbWFpbmRlcjsgKytpKSB7CisgICAgICAgICAgICBwYWRkZWRUZXh0LmFwcGVuZChrQmFzZTY0UGFkZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmRyb2lkOjpzcDxBQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgYW5kcm9pZDo6ZGVjb2RlQmFzZTY0KEFTdHJpbmcocGFkZGVkVGV4dC5zdHJpbmcoKSkpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWNvZGVkVGV4dC0+YXBwZW5kQXJyYXkoYnVmZmVyLT5iYXNlKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpmaW5kS2V5KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsIFN0cmluZzgqIGtleUlkLAorICAgICAgICBTdHJpbmc4KiBlbmNvZGVkS2V5KSB7CisKKyAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisKKyAgICAvLyBPbmx5IGFsbG93IHN5bW1ldHJpYyBrZXksIGkuZS4gImt0eSI6Im9jdCIgcGFpci4KKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUeXBlVGFnKSA+PSAwKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VHlwZVRhZywgJnZhbHVlKTsKKyAgICAgICAgaWYgKDAgIT0gdmFsdWUuY29tcGFyZShrU3ltbWV0cmljS2V5VmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleUlkVGFnKSA+PSAwKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5SWRUYWcsIGtleUlkKTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUYWcpID49IDApIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlUYWcsIGVuY29kZWRLZXkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKc29uV2ViS2V5OjpmaW5kVmFsdWUoY29uc3QgU3RyaW5nOCAma2V5LCBTdHJpbmc4KiB2YWx1ZSkgeworICAgIHZhbHVlLT5jbGVhcigpOworICAgIGNvbnN0IGNoYXIqIHZhbHVlVG9rZW47CisgICAgZm9yIChWZWN0b3I8U3RyaW5nOD46OmNvbnN0X2l0ZXJhdG9yIG5leHRUb2tlbiA9IG1Ub2tlbnMuYmVnaW4oKTsKKyAgICAgICAgbmV4dFRva2VuICE9IG1Ub2tlbnMuZW5kKCk7ICsrbmV4dFRva2VuKSB7CisgICAgICAgIGlmICgwID09ICgqbmV4dFRva2VuKS5jb21wYXJlKGtleSkpIHsKKyAgICAgICAgICAgIGlmIChuZXh0VG9rZW4gKyAxID09IG1Ub2tlbnMuZW5kKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZVRva2VuID0gKCoobmV4dFRva2VuICsgMSkpLnN0cmluZygpOworICAgICAgICAgICAgdmFsdWUtPnNldFRvKHZhbHVlVG9rZW4pOworICAgICAgICAgICAgbmV4dFRva2VuKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBKc29uV2ViS2V5Ojppc0pzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCkgY29uc3QgeworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleXNUYWcpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJKU09OIFdlYiBLZXkgZG9lcyBub3QgY29udGFpbiBrZXlzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBvYmplY3RzIHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgdG9rZW5zLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbk9iamVjdChjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LAorICAgICAgICBWZWN0b3I8U3RyaW5nOD4qIHRva2VucykgeworICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIGpzbW5faW5pdCgmcGFyc2VyKTsKKyAgICBpbnQgbnVtVG9rZW5zID0ganNtbl9wYXJzZSgmcGFyc2VyLAorICAgICAgICBqc29uT2JqZWN0LnN0cmluZygpLCBqc29uT2JqZWN0LnNpemUoKSwgTlVMTCwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuY2xlYXIoKTsKKyAgICBtSnNtblRva2Vucy5zZXRDYXBhY2l0eShqc21uVG9rZW5zU2l6ZSk7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IHN0YXR1cyA9IGpzbW5fcGFyc2UoJnBhcnNlciwganNvbk9iamVjdC5zdHJpbmcoKSwKKyAgICAgICAganNvbk9iamVjdC5zaXplKCksIG1Kc21uVG9rZW5zLmVkaXRBcnJheSgpLCBudW1Ub2tlbnMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2Vucy0+Y2xlYXIoKTsKKyAgICBTdHJpbmc4IHRva2VuOworICAgIGNvbnN0IGNoYXIgKnBqczsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVRva2VuczsgKytqKSB7CisgICAgICAgIHBqcyA9IGpzb25PYmplY3Quc3RyaW5nKCkgKyBtSnNtblRva2Vuc1tqXS5zdGFydDsKKyAgICAgICAgaWYgKG1Kc21uVG9rZW5zW2pdLnR5cGUgPT0gSlNNTl9TVFJJTkcgfHwKKyAgICAgICAgICAgICAgICBtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fUFJJTUlUSVZFKSB7CisgICAgICAgICAgICB0b2tlbi5zZXRUbyhwanMsIG1Kc21uVG9rZW5zW2pdLmVuZCAtIG1Kc21uVG9rZW5zW2pdLnN0YXJ0KTsKKyAgICAgICAgICAgIHRva2Vucy0+YWRkKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBKU09OIFdlYiBLZXkgU2V0IHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgSlNPTiBvYmplY3RzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LAorICAgICAgICBWZWN0b3I8U3RyaW5nOD4qIGpzb25PYmplY3RzKSB7CisgICAgaWYgKGpzb25XZWJLZXlTZXQuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJFbXB0eSBKU09OIFdlYiBLZXkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRoZSBqc21uIHBhcnNlciBvbmx5IHN1cHBvcnRzIHVuaWNvZGUgZW5jb2RpbmcuCisgICAganNtbl9wYXJzZXIgcGFyc2VyOworCisgICAgLy8gQ29tcHV0ZXMgbnVtYmVyIG9mIHRva2Vucy4gQSB0b2tlbiBtYXJrcyB0aGUgdHlwZSwgb2Zmc2V0IGluCisgICAgLy8gdGhlIG9yaWdpbmFsIHN0cmluZy4KKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAgICAgIGpzb25XZWJLZXlTZXQuc3RyaW5nKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBOVUxMLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5zZXRDYXBhY2l0eShqc21uVG9rZW5zU2l6ZSk7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IHN0YXR1cyA9IGpzbW5fcGFyc2UoJnBhcnNlciwganNvbldlYktleVNldC5zdHJpbmcoKSwKKyAgICAgICAgICAgIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBtSnNtblRva2Vucy5lZGl0QXJyYXkoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IHRva2VuOworICAgIGNvbnN0IGNoYXIgKnBqczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRva2VuczsgKytpKSB7CisgICAgICAgIHBqcyA9IGpzb25XZWJLZXlTZXQuc3RyaW5nKCkgKyBtSnNtblRva2Vuc1tpXS5zdGFydDsKKyAgICAgICAgaWYgKG1Kc21uVG9rZW5zW2ldLnR5cGUgPT0gSlNNTl9PQkpFQ1QpIHsKKyAgICAgICAgICAgIHRva2VuLnNldFRvKHBqcywgbUpzbW5Ub2tlbnNbaV0uZW5kIC0gbUpzbW5Ub2tlbnNbaV0uc3RhcnQpOworICAgICAgICAgICAganNvbk9iamVjdHMtPmFkZCh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNTBlZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQ0xFQVJLRVlfSlNPTl9XRUJfS0VZX0hfCisjZGVmaW5lIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgImpzbW4uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK2NsYXNzIEpzb25XZWJLZXkgeworIHB1YmxpYzoKKyAgICBKc29uV2ViS2V5KCk7CisgICAgdmlydHVhbCB+SnNvbldlYktleSgpOworCisgICAgYm9vbCBleHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsCisgICAgICAgICAgICBLZXlNYXAqIGtleXMpOworCisgcHJpdmF0ZToKKyAgICBWZWN0b3I8anNtbnRva190PiBtSnNtblRva2VuczsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbUpzb25PYmplY3RzOworICAgIFZlY3RvcjxTdHJpbmc4PiBtVG9rZW5zOworCisgICAgYm9vbCBkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3QgU3RyaW5nOCYgZW5jb2RlZFRleHQsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4qIGRlY29kZWRUZXh0KTsKKyAgICBib29sIGZpbmRLZXkoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwgU3RyaW5nOCoga2V5SWQsCisgICAgICAgICAgICBTdHJpbmc4KiBlbmNvZGVkS2V5KTsKKyAgICB2b2lkIGZpbmRWYWx1ZShjb25zdCBTdHJpbmc4ICZrZXksIFN0cmluZzgqIHZhbHVlKTsKKyAgICBib29sIGlzSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0KSBjb25zdDsKKyAgICBib29sIHBhcnNlSnNvbk9iamVjdChjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LCBWZWN0b3I8U3RyaW5nOD4qIHRva2Vucyk7CisgICAgYm9vbCBwYXJzZUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwgVmVjdG9yPFN0cmluZzg+KiBqc29uT2JqZWN0cyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKc29uV2ViS2V5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgIC8vIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTAxNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpNdXRleDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKKworc3RhdHVzX3QgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICBWZWN0b3I8dWludDhfdD4qIGtleVJlcXVlc3QpIGNvbnN0IHsKKyAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBTdHJpbmc4IHJlc3BvbnNlU3RyaW5nKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVzcG9uc2UuYXJyYXkoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OmtleV90eXBlJiBrZXlJZCA9IGtleXMua2V5QXQoaSk7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OnZhbHVlX3R5cGUmIGtleSA9IGtleXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIG1LZXlNYXAuYWRkKGtleUlkLCBrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1VOS05PV047CisgICAgfQorfQorCitzdGF0dXNfdCBTZXNzaW9uOjpkZWNyeXB0KAorICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgdm9pZCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CisgICAga2V5SWRWZWN0b3IuYXBwZW5kQXJyYXkoa2V5SWQsIGtCbG9ja1NpemUpOworICAgIGlmIChtS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWRWZWN0b3IpIDwgMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXkgPSBtS2V5TWFwLnZhbHVlRm9yKGtleUlkVmVjdG9yKTsKKyAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICAgICAgICAgIGtleSwgaXYsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzb3VyY2UpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGVzdGluYXRpb24pLCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywgYnl0ZXNEZWNyeXB0ZWRPdXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjBkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9IXworI2RlZmluZSBDTEVBUktFWV9TRVNTSU9OX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIFNlc3Npb24gOiBwdWJsaWMgYW5kcm9pZDo6UmVmQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2Vzc2lvbihjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkKKyAgICAgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpIHt9CisgICAgdmlydHVhbCB+U2Vzc2lvbigpIHt9CisKKyAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOworCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3Qgdm9pZCogc291cmNlLAorICAgICAgICAgICAgdm9pZCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOworCisgICAgYW5kcm9pZDo6TXV0ZXggbU1hcExvY2s7CisgICAgS2V5TWFwIG1LZXlNYXA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfU0VTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDdjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpNdXRleDsKK3VzaW5nIGFuZHJvaWQ6OnNwOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworTXV0ZXggU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b25Mb2NrOworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uID0gTlVMTDsKKworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpnZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1NpbmdsZXRvbkxvY2spOworCisgICAgaWYgKHNTaW5nbGV0b24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBTZXNzaW9uIExpYnJhcnkgU2luZ2xldG9uLiIpOworICAgICAgICBzU2luZ2xldG9uID0gbmV3IFNlc3Npb25MaWJyYXJ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNTaW5nbGV0b247Cit9CisKK2NvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6Y3JlYXRlU2Vzc2lvbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKworICAgIFN0cmluZzggc2Vzc2lvbklkU3RyaW5nID0gU3RyaW5nODo6Zm9ybWF0KCIldSIsIG1OZXh0U2Vzc2lvbklkKTsKKyAgICBtTmV4dFNlc3Npb25JZCArPSAxOworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc2Vzc2lvbklkU3RyaW5nLnN0cmluZygpKSwKKyAgICAgICAgICAgIHNlc3Npb25JZFN0cmluZy5zaXplKCkpOworCisgICAgbVNlc3Npb25zLmFkZChzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpOworICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVGb3Ioc2Vzc2lvbklkKTsKK30KKworY29uc3Qgc3A8U2Vzc2lvbj4mIFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK2NvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBzZXNzaW9uSWQuYXBwZW5kQXJyYXkocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksIHNpemUpOworICAgIHJldHVybiBmaW5kU2Vzc2lvbihzZXNzaW9uSWQpOworfQorCit2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spO1wKKyAgICBtU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM4ODI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIFNlc3Npb25MaWJyYXJ5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIGdldCgpOworCisgICAgY29uc3QgYW5kcm9pZDo6c3A8U2Vzc2lvbj4mIGNyZWF0ZVNlc3Npb24oKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBmaW5kU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBmaW5kU2Vzc2lvbihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGRlc3Ryb3lTZXNzaW9uKGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXNzaW9uTGlicmFyeSk7CisKKyAgICBTZXNzaW9uTGlicmFyeSgpIDogbU5leHRTZXNzaW9uSWQoMSkge30KKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzU2luZ2xldG9uTG9jazsKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIHNTaW5nbGV0b247CisKKyAgICBhbmRyb2lkOjpNdXRleCBtU2Vzc2lvbnNMb2NrOworICAgIHVpbnQzMl90IG1OZXh0U2Vzc2lvbklkOworICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiwgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gPgorICAgICAgICAgICAgbVNlc3Npb25zOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1NFU1NJT05fTElCUkFSWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzY0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocykgeworICAgIGlmIChsaHMuc2l6ZSgpIDwgcmhzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGxocy5zaXplKCkgPiByaHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1lbWNtcCgodm9pZCAqKWxocy5hcnJheSgpLCAodm9pZCAqKXJocy5hcnJheSgpLCByaHMuc2l6ZSgpKSA8IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDMxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1VUSUxTX0hfCisjZGVmaW5lIENMRUFSS0VZX1VUSUxTX0hfCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworLy8gQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgdGhpcyBWZWN0b3Igc3BlY2lhbGl6YXRpb24gc28gdGhhdCBpdCBjYW4gYmUKKy8vIHVzZWQgYXMgYSBrZXkgaW4gYSBLZXllZFZlY3Rvci4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCk7CisKKyNlbmRpZiAvLyBDTEVBUktFWV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWU0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAKQEAgLTAsMCArMSw0MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgQWVzQ3RyRGVjcnlwdG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdHlwZWRlZiB1aW50OF90IEtleVtrQmxvY2tTaXplXTsKKworICAgIHN0YXR1c190IGF0dGVtcHREZWNyeXB0KGNvbnN0IEtleSYga2V5LCBjb25zdCBJdiYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0aW5hdGlvbiwgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlWZWN0b3I7CisgICAgICAgIGtleVZlY3Rvci5hcHBlbmRBcnJheShrZXksIGtCbG9ja1NpemUpOworCisgICAgICAgIEFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7CisgICAgICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdChrZXlWZWN0b3IsIGl2LCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywgYnl0ZXNEZWNyeXB0ZWRPdXQpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxzaXplX3QgdG90YWxTaXplPgorICAgIHZvaWQgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzKGNvbnN0IEtleSYga2V5LCBjb25zdCBJdiYgaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZW5jcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMpIHsKKyAgICAgICAgdWludDhfdCBvdXRwdXRCdWZmZXJbdG90YWxTaXplXSA9IHt9OworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQgPSAwOworICAgICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6T0ssIGF0dGVtcHREZWNyeXB0KGtleSwgaXYsIGVuY3J5cHRlZCwgb3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzRGVjcnlwdGVkKSk7CisgICAgICAgIEVYUEVDVF9FUSh0b3RhbFNpemUsIGJ5dGVzRGVjcnlwdGVkKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChvdXRwdXRCdWZmZXIsIGRlY3J5cHRlZCwgdG90YWxTaXplKSk7CisgICAgfQorfTsKKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzQ29udGlndW91c0VuY3J5cHRlZEJsb2NrKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAxOworCisgICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHswLCA2NH0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0FsaWduZWRCaWZ1cmNhdGVkRW5jcnlwdGVkQmxvY2spIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDY0OworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDI7CisKKyAgICAvLyBUZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLCAweGZkLCAweGZmLAorICAgICAgICAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LCAweGQzLCAweDVlLAorICAgICAgICAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLCAweDNlLCAweGFiLAorICAgICAgICAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLCAweDAzLCAweGQxLAorICAgICAgICAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLCAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDhlLCAweDUxLAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezAsIDMyfSwKKyAgICAgICAgezAsIDMyfQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzVW5hbGlnbmVkQmlmdXJjYXRlZEVuY3J5cHRlZEJsb2NrKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHswLCAyOX0sCisgICAgICAgIHswLCAzNX0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c09uZU1peGVkU3ViU2FtcGxlKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA3MjsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAxOworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAvLyA2NCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs4LCA2NH0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0FsaWduZWRNaXhlZFN1YlNhbXBsZXMpIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDgwOworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDI7CisKKyAgICAvLyBCYXNlZCBvbiB0ZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIC8vIDMyIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LCAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LAorICAgICAgICAweDFiLCAweGVmLCAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLCAweGZkLCAweGZmLAorICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4OTQsIDB4YmEsIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsCisgICAgICAgIC8vIDMyIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LCAweGQzLCAweDVlLAorICAgICAgICAweDViLCAweDRmLCAweDA5LCAweDAyLCAweDBkLCAweGIwLCAweDNlLCAweGFiLAorICAgICAgICAweDFlLCAweDAzLCAweDFkLCAweGRhLCAweDJmLCAweGJlLCAweDAzLCAweGQxLAorICAgICAgICAweDc5LCAweDIxLCAweDcwLCAweGEwLCAweGYzLCAweDAwLCAweDljLCAweGVlCisgICAgfTsKKworICAgIHVpbnQ4X3QgZGVjcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAweDZiLCAweGMxLCAweGJlLCAweGUyLCAweDJlLCAweDQwLCAweDlmLCAweDk2LAorICAgICAgICAweGU5LCAweDNkLCAweDdlLCAweDExLCAweDczLCAweDkzLCAweDE3LCAweDJhLAorICAgICAgICAweGFlLCAweDJkLCAweDhhLCAweDU3LCAweDFlLCAweDAzLCAweGFjLCAweDljLAorICAgICAgICAweDllLCAweGI3LCAweDZmLCAweGFjLCAweDQ1LCAweGFmLCAweDhlLCAweDUxLAorICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAweDMwLCAweGM4LCAweDFjLCAweDQ2LCAweGEzLCAweDVjLCAweGU0LCAweDExLAorICAgICAgICAweGU1LCAweGZiLCAweGMxLCAweDE5LCAweDFhLCAweDBhLCAweDUyLCAweGVmLAorICAgICAgICAweGY2LCAweDlmLCAweDI0LCAweDQ1LCAweGRmLCAweDRmLCAweDliLCAweDE3LAorICAgICAgICAweGFkLCAweDJiLCAweDQxLCAweDdiLCAweGU2LCAweDZjLCAweDM3LCAweDEwCisgICAgfTsKKworICAgIFN1YlNhbXBsZSBzdWJTYW1wbGVzW2tOdW1TdWJzYW1wbGVzXSA9IHsKKyAgICAgICAgezgsIDMyfSwKKyAgICAgICAgezgsIDMyfQorICAgIH07CisKKyAgICBhdHRlbXB0RGVjcnlwdEV4cGVjdGluZ1N1Y2Nlc3M8a1RvdGFsU2l6ZT4oa2V5LCBpdiwgZW5jcnlwdGVkLCBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIGtOdW1TdWJzYW1wbGVzKTsKK30KKworVEVTVF9GKEFlc0N0ckRlY3J5cHRvclRlc3QsIERlY3J5cHRzVW5hbGlnbmVkTWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA4MDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAvLyAzMCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzNCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHhmZCwgMHhmZiwgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwKKyAgICAgICAgMHhkMywgMHg1ZSwgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwKKyAgICAgICAgMHgzZSwgMHhhYiwgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwKKyAgICAgICAgMHgwMywgMHhkMSwgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwKKyAgICAgICAgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg5NCwgMHhiYSwKKyAgICAgICAgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs4LCAzMH0sCisgICAgICAgIHs4LCAzNH0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0NvbXBsZXhNaXhlZFN1YlNhbXBsZXMpIHsKKyAgICBjb25zdCBzaXplX3Qga1RvdGFsU2l6ZSA9IDcyOworICAgIGNvbnN0IHNpemVfdCBrTnVtU3Vic2FtcGxlcyA9IDY7CisKKyAgICAvLyBCYXNlZCBvbiB0ZXN0IHZlY3RvcnMgZnJvbSBOSVNULTgwMC0zOEEKKyAgICBLZXkga2V5ID0geworICAgICAgICAweDJiLCAweDdlLCAweDE1LCAweDE2LCAweDI4LCAweGFlLCAweGQyLCAweGE2LAorICAgICAgICAweGFiLCAweGY3LCAweDE1LCAweDg4LCAweDA5LCAweGNmLCAweDRmLCAweDNjCisgICAgfTsKKworICAgIEl2IGl2ID0geworICAgICAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorICAgICAgICAweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCisgICAgfTsKKworICAgIHVpbnQ4X3QgZW5jcnlwdGVkW2tUb3RhbFNpemVdID0geworICAgICAgICAvLyA0IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsCisgICAgICAgIC8vIDEgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsCisgICAgICAgIC8vIDkgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsIDB4MWIsCisgICAgICAgIDB4ZWYsCisgICAgICAgIC8vIDExIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4ODEsIDB4NGYsIDB4MjQsIDB4ODcsIDB4MGUsIDB4ZGUsIDB4YmEsIDB4YWQsCisgICAgICAgIDB4MTEsIDB4OWIsIDB4NDYsCisgICAgICAgIC8vIDIwIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDY4LCAweDY0LCAweDk5LCAweDBkLCAweGI2LCAweGNlLAorICAgICAgICAweDk4LCAweDA2LCAweGY2LCAweDZiLCAweDc5LCAweDcwLCAweGZkLCAweGZmLAorICAgICAgICAweDg2LCAweDE3LCAweDE4LCAweDdiLCAweGI5LCAweGZmLAorICAgICAgICAvLyA4IGNsZWFyIGJ5dGVzCisgICAgICAgIDB4OTQsIDB4YmEsIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsCisgICAgICAgIC8vIDMgY2xlYXIgYnl0ZXMKKyAgICAgICAgMHgxMCwgMHhmNSwgMHgyMiwKKyAgICAgICAgLy8gMTQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ZmQsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsCisgICAgICAgIDB4ZDMsIDB4NWUsIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsCisgICAgICAgIC8vIDIgY2xlYXIgYnl0ZXMKKyAgICAgICAgMHgwMiwgMHgwMQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwKKyAgICAgICAgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwgMHhlOSwgMHgzZCwgMHg4MSwgMHg0ZiwKKyAgICAgICAgMHgyNCwgMHg4NywgMHgwZSwgMHhkZSwgMHhiYSwgMHhhZCwgMHgxMSwgMHg5YiwKKyAgICAgICAgMHg0NiwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwgMHhhZSwKKyAgICAgICAgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywgMHg5ZSwKKyAgICAgICAgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg5NCwgMHhiYSwgMHg4OCwKKyAgICAgICAgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwgMHgxMCwgMHhmNSwgMHgyMiwKKyAgICAgICAgMHg4ZSwgMHg1MSwgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywKKyAgICAgICAgMHhlNCwgMHgxMSwgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgwMiwgMHgwMQorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs0LCAxfSwKKyAgICAgICAgezAsIDl9LAorICAgICAgICB7MTEsIDIwfSwKKyAgICAgICAgezgsIDB9LAorICAgICAgICB7MywgMTR9LAorICAgICAgICB7MiwgMH0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1YmIyMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZHMgQ2xlYXJLZXkgRHJtIFRlc3RzCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IENsZWFyS2V5RHJtVW5pdFRlc3QKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwIFwKKyAgICBJbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBcCisgICAgSnNvbldlYktleVVuaXR0ZXN0LmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGJpb25pYyBcCisgICAgZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvanNtbiBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorICAgIGZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkgXAorICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZSBcCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmd0ZXN0IFwKKyAgICBsaWJndGVzdF9tYWluIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3J5cHRvIFwKKyAgICBsaWJkcm1jbGVhcmtleXBsdWdpbiBcCisgICAgbGlibG9nIFwKKyAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICBsaWJzdGxwb3J0IFwKKyAgICBsaWJ1dGlscyBcCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3QgU3RyaW5nOCBrQ2VuY1R5cGUoImNlbmMiKTsKKyAgICBjb25zdCBTdHJpbmc4IGtXZWJNVHlwZSgid2VibSIpOworICAgIGNvbnN0IFN0cmluZzgga0Jhc2U2NFBhZGRpbmcoIj0iKTsKK30KKworY2xhc3MgSW5pdERhdGFQYXJzZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBhdHRlbXB0UGFyc2UoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CisgICAgICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCBsaWNlbnNlUmVxdWVzdCk7CisgICAgfQorCisgICAgdm9pZCBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzg+JiBleHBlY3RlZEtleXMpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgICAgICBWZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6Ok9LLCBhdHRlbXB0UGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgJnJlcXVlc3QpKTsKKworICAgICAgICBTdHJpbmc4IHJlcXVlc3RTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVxdWVzdC5hcnJheSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHJlcXVlc3RTdHJpbmcuZmluZChrUmVxdWVzdFByZWZpeCkpOworICAgICAgICBFWFBFQ1RfRVEocmVxdWVzdFN0cmluZy5zaXplKCkgLSBrUmVxdWVzdFN1ZmZpeC5zaXplKCksCisgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyaW5nLmZpbmQoa1JlcXVlc3RTdWZmaXgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHBlY3RlZEtleXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgZW5jb2RlZElkQVN0cmluZzsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmVuY29kZUJhc2U2NChleHBlY3RlZEtleXNbaV0sIGtLZXlJZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kZWRJZEFTdHJpbmcpOworICAgICAgICAgICAgU3RyaW5nOCBlbmNvZGVkSWQoZW5jb2RlZElkQVN0cmluZy5jX3N0cigpKTsKKyAgICAgICAgICAgIGVuY29kZWRJZC5yZW1vdmVBbGwoa0Jhc2U2NFBhZGRpbmcpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocmVxdWVzdFN0cmluZy5jb250YWlucyhlbmNvZGVkSWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUpIHsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgICAgIEFTU0VSVF9ORShhbmRyb2lkOjpPSywgYXR0ZW1wdFBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCByZXF1ZXN0LnNpemUoKSk7CisgICAgfQorfTsKKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgUGFyc2VzU2luZ2xlS2V5UHNzaCkgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgVmVjdG9yPFN0cmluZzg+IGV4cGVjdGVkS2V5czsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCIwMTIzNDU2Nzg5MEFCQ0RFIikpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhpbml0RGF0YSwga0NlbmNUeXBlLCBleHBlY3RlZEtleXMpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBQYXJzZXNNdWx0aXBsZUtleVBzc2gpIHsKKyAgICB1aW50OF90IHBzc2hbODRdID0geworICAgICAgICAwLCAwLCAwLCA4NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAweDQzLCAweDZjLCAweDY1LCAweDYxLCAweDcyLCAweDRiLCAweDY1LCAweDc5LCAvLyBLZXkgSUQgIzIKKyAgICAgICAgMHg0MywgMHg2YywgMHg2NSwgMHg2MSwgMHg3MiwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gICAiQ2xlYXJLZXlDbGVhcktleSIKKyAgICAgICAgMHgyMCwgMHg0NywgMHg0ZiwgMHg0ZiwgMHg0NywgMHg0YywgMHg0NSwgMHgyMCwgLy8gS2V5IElEICMzCisgICAgICAgIDB4MjAsIDB4NDcsIDB4NGYsIDB4NGYsIDB4NDcsIDB4NGMsIDB4NDUsIDB4MjAsIC8vICAgIiBHT09HTEUgIEdPT0dMRSAiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgODQpOworCisgICAgVmVjdG9yPFN0cmluZzg+IGV4cGVjdGVkS2V5czsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCIwMTIzNDU2Nzg5MEFCQ0RFIikpOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIkNsZWFyS2V5Q2xlYXJLZXkiKSk7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiIEdPT0dMRSAgR09PR0xFICIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtDZW5jVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgUGFyc2VzV2ViTSkgeworICAgIHVpbnQ4X3QgaW5pdERhdGFSYXdbMTZdID0geworICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShpbml0RGF0YVJhdywgMTYpOworCisgICAgVmVjdG9yPFN0cmluZzg+IGV4cGVjdGVkS2V5czsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCIwMTIzNDU2Nzg5MEFCQ0RFIikpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhpbml0RGF0YSwga1dlYk1UeXBlLCBleHBlY3RlZEtleXMpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvclBzc2hUb29TbWFsbCkgeworICAgIHVpbnQ4X3QgcHNzaFsxNl0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLAorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsCisgICAgICAgIDEsIDAsIDAsIDAsCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCAxNik7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrQ2VuY1R5cGUpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvcldlYk1Ub29TbWFsbCkgeworICAgIHVpbnQ4X3QgaW5pdERhdGFSYXdbOF0gPSB7CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShpbml0RGF0YVJhdywgOCk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrV2ViTVR5cGUpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvclBzc2hCYWRTeXN0ZW1JZCkgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkU2l6ZSkgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDcwLCAyMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoV3JvbmdWZXJzaW9uKSB7CisgICAgdWludDhfdCBwc3NoWzUyXSA9IHsKKyAgICAgICAgMCwgMCwgMCwgNTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGF0YSBTaXplIChhbHdheXMgMCkKKyAgICB9OworICAgIFZlY3Rvcjx1aW50OF90PiBpbml0RGF0YTsKKyAgICBpbml0RGF0YS5hcHBlbmRBcnJheShwc3NoLCA1Mik7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdGYWlsdXJlKGluaXREYXRhLCBrQ2VuY1R5cGUpOworfQorCitURVNUX0YoSW5pdERhdGFQYXJzZXJUZXN0LCBGYWlsc0ZvclBzc2hCYWRLZXlDb3VudCkgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2IwZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBKc29uV2ViS2V5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgICBKc29uV2ViS2V5KiBqd2s7CisKKyAgICBKc29uV2ViS2V5VGVzdCgpIHsKKyAgICAgICAgandrID0gbmV3IEpzb25XZWJLZXk7CisgICAgfQorCisgICAgdmlydHVhbCB+SnNvbldlYktleVRlc3QoKSB7CisgICAgICAgIGlmIChqd2spCisgICAgICAgICAgICBkZWxldGUgandrOworICAgIH0KK307CisKK3ZvaWQgc3RyaW5nRnJvbVZlY3Rvcihjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAorICAgICAgICBTdHJpbmc4KiBjb252ZXJ0ZWQpIHsKKyAgICBjb252ZXJ0ZWQtPmNsZWFyKCk7CisgICAgaWYgKGlucHV0LmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7ICsraSkgeworICAgICAgICBjb252ZXJ0ZWQtPmFwcGVuZEZvcm1hdCgiJWMiLCBpbnB1dC5pdGVtQXQoaSkpOworICAgIH0KK30KKwordm9pZCB2ZXJpZnlLZXlzKGNvbnN0IEtleU1hcCYga2V5cywgY29uc3QgU3RyaW5nOCogY2xlYXJLZXlzKSB7CisgICAgaWYgKGtleXMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmc4IGtleVN0cmluZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RyaW5nRnJvbVZlY3RvcihrZXlzLnZhbHVlQXQoaSksICZrZXlTdHJpbmcpOworICAgICAgICBFWFBFQ1RfRVEoa2V5U3RyaW5nLCBjbGVhcktleXNbaV0pOworICAgIH0KK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb1N5bW1ldHJpY0tleSkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwicnNhXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIjEtR2F3Z2d1RnlHcldLYXY3QVg0VktVZ1wiIgorICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9LZXlzVGFnKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiMS1HYXdnZ3VGeUdyV0thdjdBWDRWS1VnXCIiCisgICAgICAgICAgICAgICAgIn0sIgorICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9LZXlJZCkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVNFPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9UUlVFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAxKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzKCJHb29kIGRheSEiKTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsICZjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiYFwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9UUlVFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAxKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzKCJHb29kIGRheSEiKTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsICZjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE1hbGZvcm1lZEtleSkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIkdhd2dndUZ5R3JXS2F2N0FYNFY/Pz9cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIjpcIkdhd2dndUZ5R3JXS2F2N0FYNFY/Pz9cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBFbXB0eUpzb25XZWJLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzOworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE1hbGZvcm1lZEpzb25XZWJLZXkpIHsKKyAgICAvLyBNaXNzaW5nIGJlZ2luIGFycmF5ICdbJworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIkdhd2dndUZ5R3JXS2F2N0FYNFZLVWdcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAiXSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBTYW1lS2V5SWQpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lTRVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAyKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIEV4dHJhY3RXZWxsRm9ybWVkS2V5cykgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJUVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDIpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXNbXSA9CisgICAgICAgICAgICB7IFN0cmluZzgoIkhlbGxvIEZyaWVuZCEiKSwgU3RyaW5nOCgiR29vZCBkYXkhIikgfTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgRXh0cmFjdEtleXMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBeFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lTRVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJyc2FcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXLXJzYVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcInJzYS02N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDMpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXNbXSA9CisgICAgICAgICAgICB7IFN0cmluZzgoIkhlbGxvIEZyaWVuZCEhIiksIFN0cmluZzgoIkhlbGxvIEZyaWVuZCEiKSwKKyAgICAgICAgICAgICAgU3RyaW5nOCgiR29vZCBkYXkhIikgfTsKKyAgICB2ZXJpZnlLZXlzKGtleXMsIGNsZWFyS2V5cyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKaW5kZXggNmVmYzcxMi4uMmVhNTU0YiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCkBAIC0yOTksNiArMjk5LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBNb2NrRHJtUGx1Z2luOjp1bnByb3Zpc2lvbkRldmljZSgpCisgICAgeworICAgICAgICBBTE9HRCgiTW9ja0RybVBsdWdpbjo6dW5wcm92aXNpb25EZXZpY2UoKSIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgc3RhdHVzX3QgTW9ja0RybVBsdWdpbjo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCmluZGV4IDk3ZDcwNTIuLjRiNjMyOTkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oCkBAIC04NSw2ICs4NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKIAorICAgICAgICBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpOworCiAgICAgICAgIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKICAgICAgICAgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCA3OTY4MmI4Li4yYjYwODQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaApAQCAtNzQsNiArNzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkKTsKIAorICAgIHN0YXRpYyAgc3RhdHVzX3QgIGNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgc3A8Q2FtZXJhPiYgY2FtZXJhKTsKKwogICAgICAgICAgICAgdmlydHVhbCAgICAgfkNhbWVyYSgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICByZWNvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBkNTIxNTQzLi5jNjA3NGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0xMDIsNiArMTAyLDEyIEBACiAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBjb250YWluaW5nIHRoZSBzdXBwb3J0ZWQgcHJldmlldyBmb3JtYXRzCisgICAgICogYXMgZW51bXMgZ2l2ZW4gaW4gZ3JhcGhpY3MuaC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFN1cHBvcnRlZFByZXZpZXdGb3JtYXRzKFZlY3RvcjxpbnQ+JiBmb3JtYXRzKSBjb25zdDsKKwogICAgIC8vIFBhcmFtZXRlciBrZXlzIHRvIGNvbW11bmljYXRlIGJldHdlZW4gY2FtZXJhIGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIuCiAgICAgLy8gVGhlIGFjY2VzcyAocmVhZC93cml0ZSwgcmVhZCBvbmx5LCBvciB3cml0ZSBvbmx5KSBpcyB2aWV3ZWQgZnJvbSB0aGUKICAgICAvLyBwZXJzcGVjdGl2ZSBvZiBhcHBsaWNhdGlvbnMsIG5vdCBkcml2ZXIuCkBAIC02NzQsNiArNjgwLDEzIEBACiAgICAgLy8gSGlnaC1keW5hbWljIHJhbmdlIG1vZGUKICAgICBzdGF0aWMgY29uc3QgY2hhciBMSUdIVEZYX0hEUltdOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMgYXMgYW4gZW51bSBnaXZlbiBpbiBncmFwaGljcy5oCisgICAgICogY29ycnNwb25kaW5nIHRvIHRoZSBmb3JtYXQgZ2l2ZW4gaW4gdGhlIGlucHV0IHN0cmluZyBvciAtMSBpZiBubyBzdWNoCisgICAgICogY29udmVyc2lvbiBleGlzdHMuCisgICAgICovCisgICAgc3RhdGljIGludCBwcmV2aWV3Rm9ybWF0VG9FbnVtKGNvbnN0IGNoYXIqIGZvcm1hdCk7CisKIHByaXZhdGU6CiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsU3RyaW5nOD4gICAgbU1hcDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZmMDVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENhbWVyYVV0aWxzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgbmF0aXZlCisgKiBjYW1lcmEgY2xpZW50LCBhbmQgdGhlIGNhbWVyYSBzZXJ2aWNlLgorICovCitjbGFzcyBDYW1lcmFVdGlscyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBBTmF0aXZlV2luZG93IHRyYW5zZm9ybSBmcm9tIHRoZSBzdGF0aWMgY2FtZXJhCisgICAgICAgICAqIG1ldGFkYXRhLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIGFuZCBsZW5zIGZhY2luZworICAgICAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBjYW1lcmEgZGV2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDYW1lcmFVdGlscygpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZW5kaWYgLyogQU5EUk9JRF9DQU1FUkFfQ0xJRU5UX0NBTUVSQVVUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTdkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENhcHR1cmVSZXN1bHRFeHRyYXMgaXMgYSBzdHJ1Y3R1cmUgdG8gZW5jYXBzdWxhdGUgdmFyaW91cyBpbmRpY2VzIGZvciBhIGNhcHR1cmUgcmVzdWx0LgorICogVGhlc2UgaW5kaWNlcyBhcmUgZnJhbWV3b3JrLWludGVybmFsIGFuZCBub3Qgc2VudCB0byB0aGUgSEFMLgorICovCitzdHJ1Y3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyB7CisgICAgLyoqCisgICAgICogQW4gaW50ZWdlciB0byBpbmRleCB0aGUgcmVxdWVzdCBzZXF1ZW5jZSB0aGF0IHRoaXMgcmVzdWx0IGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgaW50MzJfdCByZXF1ZXN0SWQ7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoaXMgcmVzdWx0IGluc2lkZSBhIHJlcXVlc3Qgc2VxdWVuY2UsIHN0YXJ0aW5nIGZyb20gMC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGJ1cnN0SWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGFmVHJpZ2dlcklkOworCisgICAgLyoqCisgICAgICogVE9ETzogQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZmllbGQuCisgICAgICovCisgICAgaW50MzJfdCBwcmVjYXB0dXJlVHJpZ2dlcklkOworCisgICAgLyoqCisgICAgICogQSA2NGJpdCBpbnRlZ2VyIHRvIGluZGV4IHRoZSBmcmFtZSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzdWx0LgorICAgICAqLworICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFydGlhbCByZXN1bHQgY291bnQgKGluZGV4KSBmb3IgdGhpcyBjYXB0dXJlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHBhcnRpYWxSZXN1bHRDb3VudDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIG9iamVjdCBhcyBpbnZhbGlkIGJ5IHNldHRpbmcgcmVxdWVzdElkIHRvIGJlIC0xLgorICAgICAqLworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKQorICAgICAgICA6IHJlcXVlc3RJZCgtMSksCisgICAgICAgICAgYnVyc3RJZCgwKSwKKyAgICAgICAgICBhZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgICBwcmVjYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICAgIGZyYW1lTnVtYmVyKDApLAorICAgICAgICAgIHBhcnRpYWxSZXN1bHRDb3VudCgwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaXQncyBhIHZhbGlkIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0LgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4gSXQgaXMgdmFsaWQgb25seSB3aGVuIHJlcXVlc3RJZCBpcyBub24tbmVnYXRpdmUuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChQYXJjZWwqIHBhcmNlbCk7CisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Q7Cit9OworCitzdHJ1Y3QgQ2FwdHVyZVJlc3VsdCA6IHB1YmxpYyB2aXJ0dWFsIExpZ2h0UmVmQmFzZTxDYXB0dXJlUmVzdWx0PiB7CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgbU1ldGFkYXRhOworICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgICAgIG1SZXN1bHRFeHRyYXM7CisKKyAgICBDYXB0dXJlUmVzdWx0KCk7CisKKyAgICBDYXB0dXJlUmVzdWx0KGNvbnN0IENhcHR1cmVSZXN1bHQmIG90aGVyUmVzdWx0KTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK30KKworI2VuZGlmIC8qIEFORFJPSURfSEFSRFdBUkVfQ0FQVFVSRVJFU1VMVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAppbmRleCBmMzQyMTIyLi5mN2YwNmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKQEAgLTMxLDYgKzMxLDggQEAKIGNsYXNzIElDYW1lcmFEZXZpY2VVc2VyOwogY2xhc3MgSUNhbWVyYURldmljZUNhbGxiYWNrczsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgVmVuZG9yVGFnRGVzY3JpcHRvcjsKK2NsYXNzIFN0cmluZzE2OwogCiBjbGFzcyBJQ2FtZXJhU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CkBAIC00NywyMSArNDksNDAgQEAKICAgICAgICAgQUREX0xJU1RFTkVSLAogICAgICAgICBSRU1PVkVfTElTVEVORVIsCiAgICAgICAgIEdFVF9DQU1FUkFfQ0hBUkFDVEVSSVNUSUNTLAorICAgICAgICBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUiwKKyAgICAgICAgR0VUX0xFR0FDWV9QQVJBTUVURVJTLAorICAgICAgICBTVVBQT1JUU19DQU1FUkFfQVBJLAorICAgICAgICBDT05ORUNUX0xFR0FDWSwKICAgICB9OwogCiAgICAgZW51bSB7CiAgICAgICAgIFVTRV9DQUxMSU5HX1VJRCA9IC0xCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBBUElfVkVSU0lPTl8xID0gMSwKKyAgICAgICAgQVBJX1ZFUlNJT05fMiA9IDIsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEID0gLTEKKyAgICAgIH07CisKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVNlcnZpY2UpOwogCiAgICAgdmlydHVhbCBpbnQzMl90ICBnZXROdW1iZXJPZkNhbWVyYXMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpID0gMDsKIAogICAgIC8vIFJldHVybnMgJ09LJyBpZiBvcGVyYXRpb24gc3VjY2VlZGVkCiAgICAgLy8gLSBFcnJvcnM6IEFMUkVBRFlfRVhJU1RTIGlmIHRoZSBsaXN0ZW5lciB3YXMgYWxyZWFkeSBhZGRlZApAQCAtOTcsNiArMTE4LDMwIEBACiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVVzZXI+JiBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE9LIGlmIGRldmljZSBzdXBwb3J0cyBjYW1lcmEyIGFwaSwKKyAgICAgKiByZXR1cm5zIC1FT1BOT1RTVVBQIGlmIGl0IGRvZXNuJ3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0NhbWVyYUFwaSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGhlIGRldmljZSBhcyBhIGxlZ2FjeSBkZXZpY2UgZm9yIGEgZ2l2ZW4gSEFMIHZlcnNpb24uCisgICAgICogRm9yIGhhbFZlcnNpb24sIHVzZSBDQU1FUkFfQVBJX0RFVklDRV9WRVJTSU9OXyogZm9yIGEgcGFydGljdWxhcgorICAgICAqIHZlcnNpb24sIG9yIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgZm9yIGEgc2VydmljZS1zZWxlY3RlZCB2ZXJzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdExlZ2FjeShjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmggYi9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1OGFjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVkVORE9SX1RBR19ERVNDUklQVE9SX0gKKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX3ZlbmRvcl90YWdzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXJjZWw7CisKKy8qKgorICogVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3RzIGFyZSBwYXJjZWxhYmxlIGNvbnRhaW5lcnMgZm9yIHRoZSB2ZW5kb3IgdGFnCisgKiBkZWZpbml0aW9ucyBwcm92aWRlZCwgYW5kIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwYXNzIHRoZSB2ZW5kb3IgdGFnCisgKiBpbmZvcm1hdGlvbiBlbnVtZXJhdGVkIGJ5IHRoZSBIQUwgdG8gY2xpZW50cyBvZiB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIFZlbmRvclRhZ0Rlc2NyaXB0b3IKKyAgICAgICAgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyAnZ2V0KicgbWV0aG9kcyBpbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICogZnVuY3Rpb25zIGRlZmluZWQgaW4KKyAgICAgICAgICogc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlL3N5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaAorICAgICAgICAgKi8KKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgaW50IGdldFRhZ0NvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBpZCdzIG9mIHZlbmRvciB0YWdzIGRlZmluZWQuCisgICAgICAgIHZvaWQgZ2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBzZWN0aW9uIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFNlY3Rpb25OYW1lKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgdGFnIG5hbWUgc3RyaW5nIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGNvbnN0IGNoYXIqIGdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgdHlwZSBmb3IgYSBnaXZlbiB2ZW5kb3IgdGFnIGlkLgorICAgICAgICBpbnQgZ2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgaW50byB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIFBhcmNlbCogcGFyY2VsKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhIHZlY3RvciBjb250YWluaW5nIGFsbCB2ZW5kb3IgdGFnCisgICAgICAgICAqIHNlY3Rpb25zLCBvciBhbiBlbXB0eSB2ZWN0b3IgaWYgbm9uZSBhcmUgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBnZXRBbGxTZWN0aW9uTmFtZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9va3VwIHRoZSB0YWcgaWQgZm9yIGEgZ2l2ZW4gdGFnIG5hbWUgYW5kIHNlY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgbG9va3VwVGFnKFN0cmluZzggbmFtZSwgU3RyaW5nOCBzZWN0aW9uLCAvKm91dCovdWludDMyX3QqIHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1bXAgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZlbmRvciB0YWdzIHRvIGEgZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdDsKKworICAgICAgICAvLyBTdGF0aWMgbWV0aG9kczoKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcGFyY2VsLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHZlbmRvcl90YWdfb3BzX3QKKyAgICAgICAgICogc3RydWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyhjb25zdCB2ZW5kb3JfdGFnX29wc190KiB2T3BzLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdG8gdXNlIGZvciB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIENhbWVyYSBtZXRhZGF0YSBvcGVyYXRpb25zIHRoYXQgYWNjZXNzIHZlbmRvciB0YWdzIHdpbGwgdXNlIHRoZQorICAgICAgICAgKiB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIHNldCB0aGlzIHdheS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGNvbnN0IHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIHRoZSBnbG9iYWwgdmVuZG9yIHRhZyBkZXNjcmlwdG9yIHVzZWQgYnkgdGhpcyBwcm9jZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHZvaWQgY2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqIFRoaXMgd2lsbCBjb250YWluIE5VTEwgaWYgbm8gdmVuZG9yIHRhZ3MgYXJlIGRlZmluZWQuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZ2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qPiBtUmV2ZXJzZU1hcHBpbmc7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiBtVGFnVG9OYW1lTWFwOworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG1UYWdUb1NlY3Rpb25NYXA7IC8vIFZhbHVlIGlzIG9mZnNldCBpbiBtU2VjdGlvbnMKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIGludDMyX3Q+IG1UYWdUb1R5cGVNYXA7CisgICAgICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBtU2VjdGlvbnM7CisgICAgICAgIC8vIG11c3QgYmUgaW50MzJfdCB0byBiZSBjb21wYXRpYmxlIHdpdGggUGFyY2VsOjp3cml0ZUludDMyCisgICAgICAgIGludDMyX3QgbVRhZ0NvdW50OworICAgIHByaXZhdGU6CisgICAgICAgIHZlbmRvcl90YWdfb3BzIG1WZW5kb3JPcHM7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNkZWZpbmUgVkVORE9SX1RBR19ERVNDUklQVE9SX0gKKyNlbmRpZiAvKiBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAppbmRleCA4ZGFjNGYyLi42NzA0ODBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtMjQsOSArMjQsMTIgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBDYW1lcmFNZXRhZGF0YTsKIAorCiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIDogcHVibGljIElJbnRlcmZhY2UKIHsKICAgICAvKioKQEAgLTM5LDI0ICs0MiwyOSBAQAogICAgICAqIEVycm9yIGNvZGVzIGZvciBDQU1FUkFfTVNHX0VSUk9SCiAgICAgICovCiAgICAgZW51bSBDYW1lcmFFcnJvckNvZGUgeworICAgICAgICBFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUiA9IC0xLCAvLyBUbyBpbmRpY2F0ZSBhbGwgaW52YWxpZCBlcnJvciBjb2RlcwogICAgICAgICBFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEID0gMCwKICAgICAgICAgRVJST1JfQ0FNRVJBX0RFVklDRSA9IDEsCi0gICAgICAgIEVSUk9SX0NBTUVSQV9TRVJWSUNFID0gMgorICAgICAgICBFUlJPUl9DQU1FUkFfU0VSVklDRSA9IDIsCisgICAgICAgIEVSUk9SX0NBTUVSQV9SRVFVRVNUID0gMywKKyAgICAgICAgRVJST1JfQ0FNRVJBX1JFU1VMVCA9IDQsCisgICAgICAgIEVSUk9SX0NBTUVSQV9CVUZGRVIgPSA1LAogICAgIH07CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VFcnJvcihDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VFcnJvcihDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25EZXZpY2VJZGxlKCkgPSAwOwogCiAgICAgLy8gT25lIHdheQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQoaW50MzJfdCByZXF1ZXN0SWQsCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCkgPSAwOwogCiAgICAgLy8gT25lIHdheQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uUmVzdWx0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAppbmRleCBmNzFmMzAyLi4zNTQ4OGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIHN0cnVjdCBjYW1lcmFfbWV0YWRhdGE7CiAKQEAgLTMwLDYgKzMxLDEwIEBACiBjbGFzcyBDYXB0dXJlUmVxdWVzdDsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOwogCitlbnVtIHsKKyAgICBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUyA9IC0xLAorfTsKKwogY2xhc3MgSUNhbWVyYURldmljZVVzZXIgOiBwdWJsaWMgSUludGVyZmFjZQogewogICAgIC8qKgpAQCAtNDQsOSArNDksNTUgQEAKICAgICAgKiBSZXF1ZXN0IEhhbmRsaW5nCiAgICAgICoqLwogCisgICAgLyoqCisgICAgICogRm9yIHN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICogRm9yIG5vbi1zdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QKKyAgICAgKiBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIEZvciBzdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyCisgICAgICogb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqIEZvciBub24tc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0CisgICAgICogZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogQmVnaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogYmVnaW5Db25maWd1cmUgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBjYWxsIHRvIGRlbGV0ZVN0cmVhbSwgY3JlYXRlU3RyZWFtLAorICAgICAqIG9yIGVuZENvbmZpZ3VyZS4gIEl0IGlzIG5vdCB2YWxpZCB0byBjYWxsIHRoaXMgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBpZGxlLgorICAgICAqIDxwPgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGJlZ2luQ29uZmlndXJlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRW5kIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIGVuZENvbmZpZ3VyZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBzdHJlYW0gY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZSAoaS5lLiBhZnRlcgorICAgICAqIGEgY2FsbCB0byBiZWdpbkNvbmZpZ3VyZSBhbmQgc3Vic2VxdWVudCBjcmVhdGVTdHJlYW0vZGVsZXRlU3RyZWFtIGNhbGxzKS4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlcXVlc3RzIGNhbiBiZSBzdWJtaXR0ZWQuCisgICAgICogPHA+CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZW5kQ29uZmlndXJlKCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNyZWF0ZVN0cmVhbSgKQEAgLTY0LDggKzExNSwxMiBAQAogICAgIC8vIFdhaXQgdW50aWwgYWxsIHRoZSBzdWJtaXR0ZWQgcmVxdWVzdHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgd2FpdFVudGlsSWRsZSgpID0gIDA7CiAKLSAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tcHJvZ3Jlc3Mgd29yayBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKCkgPSAwOworICAgIC8qKgorICAgICAqIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHJlcGVhdGluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGVmMzkyZjAuLjdiZTQ0OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC02MSw2ICs2MSwxNyBAQAogICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIDAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzID0ga0ludmFsaWRQVFMpID0gMDsKIAorICAgIC8vIFJlbGVhc2UgKGEgcG9ydGlvbiBvZikgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGdldE5leHRCdWZmZXIoKS4KKyAgICAvLyBJdCBpcyBwZXJtaXNzaWJsZSB0byBjYWxsIHJlbGVhc2VCdWZmZXIoKSBtdWx0aXBsZSB0aW1lcyBwZXIgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIE9uIGVudHJ5OgorICAgIC8vICBidWZmZXItPmZyYW1lQ291bnQgIG51bWJlciBvZiBmcmFtZXMgdG8gcmVsZWFzZSwgbXVzdCBiZSA8PSBudW1iZXIgb2YgZnJhbWVzCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQKKyAgICAvLyAgYnVmZmVyLT5yYXcgICAgICAgICB1bnVzZWQKKyAgICAvLyBPbiByZXR1cm46CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMDsgaW1wbGVtZW50YXRpb24gTVVTVCBzZXQgdG8gemVybworICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVuZGVmaW5lZDsgaW1wbGVtZW50YXRpb24gaXMgUEVSTUlUVEVEIHRvIHNldCB0byBhbnkgdmFsdWUsCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgc28gaWYgY2FsbGVyIG5lZWRzIHRvIGNvbnRpbnVlIHVzaW5nIHRoaXMgYnVmZmVyIGl0IG11c3QKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBrZWVwIHRyYWNrIG9mIHRoZSBwb2ludGVyIGl0c2VsZgogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggMDVkODM0ZC4uNDkzMmQ0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtMzYsNyArMzYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgZWZmZWN0X3BhcmFtX2NibGtfdDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yMTcsOCArMjE3LDkgQEAKICAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCiAgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCiAgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLiBJZiAwLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCi0gICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gSWYgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCisgICAgICogc2Vzc2lvbklEOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiAgICAgIElmIGVxdWFsIHRvIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgdGhlIGVmZmVjdCB3aWxsIGJlIGdsb2JhbCB0bworICAgICAqICAgICAgdGhlIG91dHB1dCBtaXguICBPdGhlcndpc2UsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCiAgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCiAgICAgICogaW86ICBIQUwgYXVkaW8gb3V0cHV0IG9yIGlucHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIGVmZmVjdCBtdXN0IGJlIGF0dGFjaGVkLiBMZWF2ZSBhdCAwIGZvcgogICAgICAqICAgICAgYXV0b21hdGljIG91dHB1dCBzZWxlY3Rpb24gYnkgQXVkaW9GbGluZ2VyLgpAQCAtMjI5LDggKzIzMCw4IEBACiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIENvbnN0cnVjdG9yLgpAQCAtMjQxLDggKzI0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCkBAIC0yNjMsOCArMjY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKQEAgLTQ0OCw2ICs0NDksNyBAQAogICAgIHNwPEVmZmVjdENsaWVudD4gICAgICAgIG1JRWZmZWN0Q2xpZW50OyAgICAgLy8gSUVmZmVjdENsaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKICAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YWZkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFVRElPX1BPTElDWV9IRUxQRVJfSF8KKyNkZWZpbmUgQVVESU9fUE9MSUNZX0hFTFBFUl9IXworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworI2VuZGlmIC8vQVVESU9fUE9MSUNZX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDA1MjA2NGQuLjRlZGMxYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBhdWRpb190cmFja19jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190OwogY2xhc3MgQXVkaW9SZWNvcmRDbGllbnRQcm94eTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzksOCArMzksMTIgQEAKICAgICAgKiBLZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEgTkFUSVZFX0VWRU5UXyouCiAgICAgICovCiAgICAgZW51bSBldmVudF90eXBlIHsKLSAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gcmVhZCBtb3JlIGRhdGEgZnJvbSBQQ00gYnVmZmVyLgotICAgICAgICBFVkVOVF9PVkVSUlVOID0gMSwgICAgICAgICAgLy8gUENNIGJ1ZmZlciBvdmVycnVuIG9jY3VycmVkLgorICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byByZWFkIGF2YWlsYWJsZSBkYXRhIGZyb20gYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBldmVudCBpcyBkZWxpdmVyZWQgYnV0IHRoZSBjYWxsYmFjayBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3YW50IHRvIHJlYWQgdGhlIGF2YWlsYWJsZSBkYXRhLCB0aGUgaGFuZGxlciBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIGV2ZW50IGJ5IHNldHRpbmcgZnJhbWVDb3VudCB0byB6ZXJvLgorICAgICAgICBFVkVOVF9PVkVSUlVOID0gMSwgICAgICAgICAgLy8gQnVmZmVyIG92ZXJydW4gb2NjdXJyZWQuCiAgICAgICAgIEVWRU5UX01BUktFUiA9IDIsICAgICAgICAgICAvLyBSZWNvcmQgaGVhZCBpcyBhdCB0aGUgc3BlY2lmaWVkIG1hcmtlciBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFNlZSBzZXRNYXJrZXJQb3NpdGlvbigpKS4KICAgICAgICAgRVZFTlRfTkVXX1BPUyA9IDMsICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IGEgbmV3IHBvc2l0aW9uCkBAIC02MCw5ICs2NCwxMCBAQAogICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50OyAgICAgLy8gbnVtYmVyIG9mIHNhbXBsZSBmcmFtZXMgY29ycmVzcG9uZGluZyB0byBzaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gaW5wdXQgaXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gb3V0cHV0IGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IGRyYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoY3VycmVudGx5IGlnbm9yZWQgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAgIC8vIGlucHV0L291dHB1dCBpbiBieXRlcyA9PSBmcmFtZUNvdW50ICogZnJhbWVTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBkcmFpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIHJlZHVuZGFudCB3aXRoIHJlc3BlY3QgdG8gZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGRlZmluZSB0aGUgZnJhbWUgZm9ybWF0CkBAIC03Niw3ICs4MSw3IEBACiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCiAgICAgICogaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHByaW9yaXR5LiBUaGlzIHRocmVhZAotICAgICAqIGludm9rZXMgdGhlIGNhbGxiYWNrIHdoZW4gYSBuZXcgYnVmZmVyIGJlY29tZXMgcmVhZHkgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgorICAgICAqIGludm9rZXMgdGhlIGNhbGxiYWNrIHdoZW4gYSBuZXcgYnVmZmVyIGJlY29tZXMgYXZhaWxhYmxlIG9yIHZhcmlvdXMgY29uZGl0aW9ucyBvY2N1ci4KICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqCiAgICAgICogZXZlbnQ6ICAgdHlwZSBvZiBldmVudCBub3RpZmllZCAoc2VlIGVudW0gQXVkaW9SZWNvcmQ6OmV2ZW50X3R5cGUpLgpAQCAtOTksNiArMTA0LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluRnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAvKiBIb3cgZGF0YSBpcyB0cmFuc2ZlcnJlZCBmcm9tIEF1ZGlvUmVjb3JkCiAgICAgICovCiAgICAgZW51bSB0cmFuc2Zlcl90eXBlIHsKLSAgICAgICAgVFJBTlNGRVJfREVGQVVMVCwgICAvLyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHk7IGRldGVybWluZSBmcm9tIG90aGVyIHBhcmFtZXRlcnMKKyAgICAgICAgVFJBTlNGRVJfREVGQVVMVCwgICAvLyBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHk7IGRldGVybWluZSBmcm9tIHRoZSBvdGhlciBwYXJhbWV0ZXJzCiAgICAgICAgIFRSQU5TRkVSX0NBTExCQUNLLCAgLy8gY2FsbGJhY2sgRVZFTlRfTU9SRV9EQVRBCiAgICAgICAgIFRSQU5TRkVSX09CVEFJTiwgICAgLy8gRklYTUUgZGVwcmVjYXRlZDogY2FsbCBvYnRhaW5CdWZmZXIoKSBhbmQgcmVsZWFzZUJ1ZmZlcigpCiAgICAgICAgIFRSQU5TRkVSX1NZTkMsICAgICAgLy8gc3luY2hyb25vdXMgcmVhZCgpCkBAIC0xMzcsNyArMTQ0LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGJlIGxhcmdlciBpZiB0aGUgcmVxdWVzdGVkIHNpemUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBjdXJyZW50IGF1ZGlvIEhBTAogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeS4gIFplcm8gbWVhbnMgdG8gdXNlIGEgZGVmYXVsdCB2YWx1ZS4KICAgICAgKiBjYmY6ICAgICAgICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uLiBJZiBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICB0byBjb25zdW1lIG5ldyBQQ00gZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gY29uc3VtZSBuZXcgZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgogICAgICAqIHVzZXI6ICAgICAgICAgICAgICAgQ29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KICAgICAgKiBub3RpZmljYXRpb25GcmFtZXM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIG5vdGlmaWNhdGlvbkZyYW1lcyBQQ00KICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBhcmUgcmVhZHkgaW4gcmVjb3JkIHRyYWNrIG91dHB1dCBidWZmZXIuCkBAIC0xNTEsMTEgKzE1OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FKTsKIApAQCAtMTcxLDkgKzE3OCwxMCBAQAogICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIGludGlhbGl6YXRpb24KICAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9SZWNvcmQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBvciByZWNvcmQgZGV2aWNlIGlzIGFscmVhZHkgaW4gdXNlCi0gICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciAoY2hhbm5lbHMsIGZvcm1hdCwgc2FtcGxlUmF0ZS4uLikKKyAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyIChjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlLi4uKQogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBQRVJNSVNTSU9OX0RFTklFRDogcmVjb3JkaW5nIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgcmVxdWVzdGluZyBwcm9jZXNzCisgICAgICogSWYgc3RhdHVzIGlzIG5vdCBlcXVhbCB0byBOT19FUlJPUiwgZG9uJ3QgY2FsbCBhbnkgb3RoZXIgQVBJcyBvbiB0aGlzIEF1ZGlvUmVjb3JkLgogICAgICAqCiAgICAgICogUGFyYW1ldGVycyBub3QgbGlzdGVkIGluIHRoZSBBdWRpb1JlY29yZCBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKQEAgLTE4MywxNiArMTkxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CiAKLSAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKKyAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvUmVjb3JkIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKICAgICAgKiBhbiB1bmluaXRpYWxpemVkIEF1ZGlvUmVjb3JkIHByb2R1Y2VzIHVuZGVmaW5lZCByZXN1bHRzLgogICAgICAqIFNlZSBzZXQoKSBtZXRob2QgYWJvdmUgZm9yIHBvc3NpYmxlIHJldHVybiBjb2Rlcy4KQEAgLTIyMSw3ICsyMjksNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24gPSAwKTsKIAotICAgIC8qIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQuICBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwKKyAgICAvKiBTdG9wIGEgdHJhY2suICBUaGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQuICBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwKICAgICAgKiB3b3JrcyBhbmQgd2lsbCBkcmFpbiBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZCwgYW5kIHRoZW4gd2lsbCByZXR1cm4gV09VTERfQkxPQ0suCiAgICAgICovCiAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wKCk7CkBAIC0yMzIsMTEgKzI0MCwxNiBAQAogICAgICAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ICAgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAorICAgIC8qIFJldHVybiB0aGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50LgorICAgICAqIFRoaXMgaXMgYXBwcm94aW1hdGVseSBob3cgb2Z0ZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQsIGZvciB0cmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLLgorICAgICAqLworICAgICAgICAgICAgc2l6ZV90ICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKCkgY29uc3QgIHsgcmV0dXJuIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IH0KKwogICAgIC8qIFNldHMgbWFya2VyIHBvc2l0aW9uLiBXaGVuIHJlY29yZCByZWFjaGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHNwZWNpZmllZCwKICAgICAgKiBhIGNhbGxiYWNrIHdpdGggZXZlbnQgdHlwZSBFVkVOVF9NQVJLRVIgaXMgY2FsbGVkLiBDYWxsaW5nIHNldE1hcmtlclBvc2l0aW9uCiAgICAgICogd2l0aCBtYXJrZXIgPT0gMCBjYW5jZWxzIG1hcmtlciBub3RpZmljYXRpb24gY2FsbGJhY2suCiAgICAgICogVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvUmVjb3JkIGhhcyBiZWVuIG9wZW5lZCB3aXRoIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIGFzc29jaWF0ZWQsCiAgICAgICogdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwuCiAgICAgICoKQEAgLTM3OCw4ICszOTEsMTAgQEAKICAgICAgKiByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdmFsdWUgYnkgdGhpcyBmdW5jdGlvbiBjYWxsLiAgU3VjaCBsb3NzIHR5cGljYWxseSBvY2N1cnMgd2hlbiB0aGUKICAgICAgKiB1c2VyIHNwYWNlIHByb2Nlc3MgaXMgYmxvY2tlZCBsb25nZXIgdGhhbiB0aGUgY2FwYWNpdHkgb2YgYXVkaW8gZHJpdmVyIGJ1ZmZlcnMuCiAgICAgICogVW5pdHM6IHRoZSBudW1iZXIgb2YgaW5wdXQgYXVkaW8gZnJhbWVzLgorICAgICAqIEZJWE1FIFRoZSBzaWRlLWVmZmVjdCBvZiByZXNldHRpbmcgdGhlIGNvdW50ZXIgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIG11bHRpLWNsaWVudC4KKyAgICAgKiBDb25zaWRlciBtYWtpbmcgaXQgbW9yZSBsaWtlIEF1ZGlvVHJhY2s6OmdldFVuZGVycnVuRnJhbWVzIHdoaWNoIGRvZXNuJ3QgaGF2ZSBzaWRlIGVmZmVjdHMuCiAgICAgICovCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0OworICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgLyogY29weWluZyBhdWRpbyByZWNvcmQgb2JqZWN0cyBpcyBub3QgYWxsb3dlZCAqLwpAQCAtNDEyLDYgKzQyNyw3IEBACiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsgICAgLy8gd2hldGhlciB0aHJlYWQgaXMgcmVxdWVzdGVkIHRvIHBhdXNlIGF0IG5leHQgbG9vcCBlbnRyeQogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1QYXVzZWRJbnQ7IC8vIHdoZXRoZXIgdGhyZWFkIGludGVybmFsbHkgcmVxdWVzdHMgcGF1c2UKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICBtUGF1c2VkTnM7ICAvLyBpZiBtUGF1c2VkSW50IHRoZW4gYXNzb2NpYXRlZCB0aW1lb3V0LCBvdGhlcndpc2UgaWdub3JlZAorICAgICAgICBib29sICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50OyAgIC8vIHdoZXRoZXIgdG8gaWdub3JlIG5leHQgbVBhdXNlZEludCByZXF1ZXN0CiAgICAgfTsKIAogICAgICAgICAgICAgLy8gYm9keSBvZiBBdWRpb1JlY29yZFRocmVhZDo6dGhyZWFkTG9vcCgpCkBAIC00MjIsOSArNDM4LDEwIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOworICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoKTsKIAogICAgICAgICAgICAgLy8gY2FsbGVyIG11c3QgaG9sZCBsb2NrIG9uIG1Mb2NrIGZvciBhbGwgX2wgbWV0aG9kcworCiAgICAgICAgICAgICBzdGF0dXNfdCBvcGVuUmVjb3JkX2woc2l6ZV90IGVwb2NoKTsKIAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwpAQCAtNDQ0LDE0ICs0NjEsMTYgQEAKICAgICAvLyBmb3Igbm90aWZpY2F0aW9uIEFQSXMKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOyAvLyByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OyAvLyBhY3R1YWwgbnVtYmVyIG9mIGZyYW1lcyBiZXR3ZWVuIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gY2FsbGJhY2sKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVmcmVzaFJlbWFpbmluZzsgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoIG5leHQgMgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgICAgIC8vIHByb2Nlc3NBdWRpb0J1ZmZlcigpIHNob3VsZCByZWZyZXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJlbWFpbmluZ0ZyYW1lcyBhbmQgbVJldHJ5T25QYXJ0aWFsQnVmZmVyCiAKICAgICAvLyBUaGVzZSBhcmUgcHJpdmF0ZSB0byBwcm9jZXNzQXVkaW9CdWZmZXIoKSwgYW5kIGFyZSBub3QgcHJvdGVjdGVkIGJ5IGEgbG9jawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXM7ICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgdG8gcmVxdWVzdCBpbiBvYnRhaW5CdWZmZXIoKQogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlcjsgIC8vIHNsZWVwIGFuZCByZXRyeSBhZnRlciBwYXJ0aWFsIG9idGFpbkJ1ZmZlcigpCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2U7ICAgICAgLy8gbGFzdCBvYnNlcnZlZCB2YWx1ZSBvZiBtU2VxdWVuY2UKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAvLyBpbiB3cmFwcGluZyAob3ZlcmZsb3cpIGZyYW1lIHVuaXRzCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbU1hcmtlclJlYWNoZWQ7CkBAIC00NjAsOSArNDc5LDEzIEBACiAKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOwogCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gY3VycmVudCBJQXVkaW9SZWNvcmQsIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1JlY29yZCBpcyBuZWVkZWQsIG5vbi1kZWNyZWFzaW5nCisKICAgICAvLyBjb25zdGFudCBhZnRlciBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOyAgICAgICAgIC8vIGFwcC1sZXZlbCBmcmFtZSBzaXplID09IEF1ZGlvRmxpbmdlciBmcmFtZSBzaXplCkBAIC00NzMsMTIgKzQ5NiwxMyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OyAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoKQotCi0gICAgLy8gbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvUmVjb3JkIG9iamVjdCBpcyByZS1jcmVhdGVkCisgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgLy8gcHJvdmlkZWQgdGhlIGluaXRpYWwgc2V0KCkgd2FzIHN1Y2Nlc3NmdWwKICAgICBzcDxJQXVkaW9SZWNvcmQ+ICAgICAgICBtQXVkaW9SZWNvcmQ7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCisgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgIC8vIGJlZm9yZSBzdGFydCgpCiAgICAgU2NoZWRQb2xpY3kgICAgICAgICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODQ3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfUFVCTElDX0gKKworLy8gQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYIGlzIHRoZSBtYXhpbXVtIHJhdGlvIGJldHdlZW4gdGhlIG9yaWdpbmFsCisvLyBhdWRpbyBzYW1wbGUgcmF0ZSBhbmQgdGhlIHRhcmdldCByYXRlIHdoZW4gZG93bnNhbXBsaW5nLAorLy8gYXMgcGVybWl0dGVkIGluIHRoZSBhdWRpbyBmcmFtZXdvcmssIGUuZy4gQXVkaW9UcmFjayBhbmQgQXVkaW9GbGluZ2VyLgorLy8gSW4gcHJhY3RpY2UsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBkb3duc2FtcGxlIG1vcmUgdGhhbiA2OjEKKy8vIGZvciBiZXN0IGF1ZGlvIHF1YWxpdHksIGV2ZW4gdGhvdWdoIHRoZSBhdWRpbyBmcmFtZXdvcmsgcGVybWl0cyBhIGxhcmdlcgorLy8gZG93bnNhbXBsaW5nIHJhdGlvLgorLy8gVE9ETzogcmVwbGFjZSB3aXRoIGFuIEFQSQorI2RlZmluZSBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggMjU2CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDRjMjI0MTIuLmY4YzAxOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNjcsMjAgKzY4LDI0IEBACiAKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIHRyYWNrcyBhcmUgYWN0aXZlIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhdmUgYmVlbiBhY3RpdmUKICAgICAvLyBpbiB0aGUgcGFzdCBpblBhc3RNcyBtaWxsaXNlY29uZHMKLSAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgKnN0YXRlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApOworICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zKTsKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIHRyYWNrcyBhcmUgYWN0aXZlIGZvciB3aGF0IHF1YWxpZmllcyBhcyByZW1vdGUgcGxheWJhY2sKICAgICAvLyBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBvciBoYXZlIGJlZW4gYWN0aXZlIGluIHRoZSBwYXN0IGluUGFzdE1zIG1pbGxpc2Vjb25kcy4gUmVtb3RlCiAgICAgLy8gcGxheWJhY2sgaXNuJ3QgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggbG9jYWwgcGxheWJhY2suCiAgICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgKnN0YXRlLAotICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKTsKICAgICAvLyByZXR1cm5zIHRydWUgaW4gKnN0YXRlIGlmIGEgcmVjb3JkZXIgaXMgY3VycmVudGx5IHJlY29yZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCiAgICAgc3RhdGljIHN0YXR1c190IGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwgYm9vbCAqc3RhdGUpOwogCiAgICAgLy8gc2V0L2dldCBhdWRpbyBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIGxpc3Qgb2YgcGFyYW1ldGVycwogICAgIC8vIGtleSB2YWx1ZSBwYWlycyBpbiB0aGUgZm9ybToga2V5MT12YWx1ZTE7a2V5Mj12YWx1ZTI7Li4uCiAgICAgLy8gU29tZSBrZXlzIGFyZSByZXNlcnZlZCBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycyAoU2VlIEF1ZGlvUGFyYW1ldGVyIGNsYXNzKS4KKyAgICAvLyBUaGUgdmVyc2lvbnMgd2l0aCBhdWRpb19pb19oYW5kbGVfdCBhcmUgaW50ZW5kZWQgZm9yIGludGVybmFsIG1lZGlhIGZyYW1ld29yayB1c2Ugb25seS4KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgc3RhdGljIFN0cmluZzggIGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOworICAgIC8vIFRoZSB2ZXJzaW9ucyB3aXRob3V0IGF1ZGlvX2lvX2hhbmRsZV90IGFyZSBpbnRlbmRlZCBmb3IgSk5JLgorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgIHN0YXRpYyBTdHJpbmc4ICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwogCiAgICAgc3RhdGljIHZvaWQgc2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYik7CiAKQEAgLTkwLDM2ICs5NSwzNyBAQAogICAgIHN0YXRpYyBmbG9hdCBsaW5lYXJUb0xvZyhpbnQgdm9sdW1lKTsKICAgICBzdGF0aWMgaW50IGxvZ1RvTGluZWFyKGZsb2F0IHZvbHVtZSk7CiAKKyAgICAvLyBSZXR1cm5lZCBzYW1wbGluZ1JhdGUgYW5kIGZyYW1lQ291bnQgb3V0cHV0IHZhbHVlcyBhcmUgZ3VhcmFudGVlZAorICAgIC8vIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyA9PSBOT19FUlJPUgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRTYW1wbGluZ1JhdGVGb3JBdHRyKHVpbnQzMl90KiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0RnJhbWVDb3VudChzaXplX3QqIGZyYW1lQ291bnQsCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0TGF0ZW5jeSh1aW50MzJfdCogbGF0ZW5jeSwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGluZ1JhdGUoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNhbXBsaW5nUmF0ZSk7CiAgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBwZXIgYXVkaW8gSEFMIHdyaXRlIGJ1ZmZlci4gQ29ycmVzcG9uZHMgdG8KLSAgICAvLyBhdWRpb19zdHJlYW0tPmdldF9idWZmZXJfc2l6ZSgpL2F1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCkKKyAgICAvLyBhdWRpb19zdHJlYW0tPmdldF9idWZmZXJfc2l6ZSgpL2F1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZSgpCiAgICAgc3RhdGljIHN0YXR1c190IGdldEZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCk7CiAgICAgLy8gcmV0dXJucyB0aGUgYXVkaW8gb3V0cHV0IHN0cmVhbSBsYXRlbmN5IGluIG1zLiBDb3JyZXNwb25kcyB0bwogICAgIC8vIGF1ZGlvX3N0cmVhbV9vdXQtPmdldF9sYXRlbmN5KCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGxhdGVuY3kpOwogCiAgICAgc3RhdGljIGJvb2wgcm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAKKyAgICAvLyByZXR1cm4gc3RhdHVzIE5PX0VSUk9SIGltcGxpZXMgKmJ1ZmZTaXplID4gMAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgc2l6ZV90KiBidWZmU2l6ZSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IEF1ZGlvRmxpbmdlciB0byBhdWRpbyBIQUwgYW5kCi0gICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgb3V0cHV0IG9uIHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGlzIHBsYXlpbmcKLSAgICAvLyBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgLy8gYXVkaW8gZHNwIHRvIERBQyBzaW5jZSB0aGUgc3BlY2lmaWVkIG91dHB1dCBJL08gaGFuZGxlIGhhcyBleGl0ZWQgc3RhbmRieS4KICAgICAvLyByZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAvLyAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbiwgaGFsRnJhbWVzIGFuZCBkc3BGcmFtZXMgcG9pbnQgdG8gdmFsaWQgZGF0YQogICAgIC8vIC0gSU5WQUxJRF9PUEVSQVRJT046IE5vdCBzdXBwb3J0ZWQgb24gY3VycmVudCBoYXJkd2FyZSBwbGF0Zm9ybQpAQCAtMTI4LDE1ICsxMzQsMjUgQEAKICAgICAvLyBuZWNlc3NhcnkgdG8gY2hlY2sgcmV0dXJuZWQgc3RhdHVzIGJlZm9yZSB1c2luZyB0aGUgcmV0dXJuZWQgdmFsdWVzLgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpoYWxGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkc3BGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBsb3N0IGJ5IEhBTCBpbXBsZW1lbnRhdGlvbiwgb3IgMCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQKLSAgICBzdGF0aWMgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgc3RhdGljIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CiAKLSAgICBzdGF0aWMgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgc3RhdGljIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyB1bmlxdWUgSUQgZm9yIHVzZSBhcyBhbiBhdWRpbyBzZXNzaW9uIElEIG9yIEkvTyBoYW5kbGUuCisgICAgLy8gSWYgdW5hYmxlIHRvIGNvbnRhY3QgQXVkaW9GbGluZ2VyLCByZXR1cm5zIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSBpbnN0ZWFkLgorICAgIC8vIEZJWE1FIElmIEF1ZGlvRmxpbmdlciB3ZXJlIHRvIGV2ZXIgZXhoYXVzdCB0aGUgdW5pcXVlIElEIG5hbWVzcGFjZSwKKyAgICAvLyAgICAgICB0aGlzIG1ldGhvZCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBlaXRoZXIgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFCisgICAgLy8gICAgICAgb3IgYW4gdW5zcGVjaWZpZWQgZXhpc3RpbmcgdW5pcXVlIElELgorICAgIHN0YXRpYyBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICBzdGF0aWMgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKworICAgIC8vIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uLgorICAgIC8vIFJldHVybiBhIHZhbGlkIHNvdXJjZSBvciBBVURJT19IV19TWU5DX0lOVkFMSUQgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgLy8gb3Igbm8gSFcgc3luYyBzb3VyY2UgaXMgdXNlZC4KKyAgICBzdGF0aWMgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMTU1LDcgKzE3MSw4IEBACiAgICAgY2xhc3MgT3V0cHV0RGVzY3JpcHRvciB7CiAgICAgcHVibGljOgogICAgICAgICBPdXRwdXREZXNjcmlwdG9yKCkKLSAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApICB7fQorICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKKyAgICAgICAgICAgIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CkBAIC0xOTMsMjcgKzIxMCw0NCBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisKKyAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgb3BlblJlY29yZCgpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QpOworCisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKQEAgLTI1NSw4ICsyODksNTYgQEAKICAgICAvLyBjaGVjayBwcmVzZW5jZSBvZiBhdWRpbyBmbGluZ2VyIHNlcnZpY2UuCiAgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiBiaW5kaW5nIHRvIHNlcnZpY2Ugc3VjY2VlZHMsIERFQURfT0JKRUNUIG90aGVyd2lzZQogICAgIHN0YXRpYyBzdGF0dXNfdCBjaGVja0F1ZGlvRmxpbmdlcigpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworCisgICAgc3RhdGljIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBzdGF0aWMgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgICAgICAgQXVkaW9Qb3J0Q2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDYWxsYmFjaygpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrKHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBjYWxsQmFjayk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC0yNzUsNyArMzU3LDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogICAgIH07CiAKLSAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewpAQCAtMjgzLDYgKzM2NiwxMCBAQAogCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH07CiAKICAgICBzdGF0aWMgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnQXVkaW9GbGluZ2VyQ2xpZW50OwpAQCAtMzAyLDExICszODksMTEgQEAKIAogICAgIHN0YXRpYyBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogCi0gICAgLy8gbWFwcGluZyBiZXR3ZWVuIHN0cmVhbSB0eXBlcyBhbmQgb3V0cHV0cwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9faW9faGFuZGxlX3Q+IGdTdHJlYW1PdXRwdXRNYXA7CiAgICAgLy8gbGlzdCBvZiBvdXRwdXQgZGVzY3JpcHRvcnMgY29udGFpbmluZyBjYWNoZWQgcGFyYW1ldGVycwogICAgIC8vIChzYW1wbGluZyByYXRlLCBmcmFtZWNvdW50LCBjaGFubmVsIGNvdW50Li4uKQogICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIE91dHB1dERlc2NyaXB0b3IgKj4gZ091dHB1dHM7CisKKyAgICBzdGF0aWMgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGdBdWRpb1BvcnRDYWxsYmFjazsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IGMyOWM3ZTUuLjk5ZTljM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHRpbWUuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCiBjbGFzcyBBdWRpb1RpbWVzdGFtcCB7CiBwdWJsaWM6CiAgICAgQXVkaW9UaW1lc3RhbXAoKSA6IG1Qb3NpdGlvbigwKSB7CkBAIC0zMCw0ICszMiw2IEBACiAgICAgc3RydWN0IHRpbWVzcGVjIG1UaW1lOyAgICAgLy8gY29ycmVzcG9uZGluZyBDTE9DS19NT05PVE9OSUMgd2hlbiBmcmFtZSBpcyBleHBlY3RlZCB0byBwcmVzZW50CiB9OwogCit9ICAgLy8gbmFtZXNwYWNlCisKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19USU1FU1RBTVBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA0NzM2MzY5Li5iNTI1NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjcsNyArMjcsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiBjbGFzcyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiAKQEAgLTM2LDExICszNiw2IEBACiBjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBlbnVtIGNoYW5uZWxfaW5kZXggewotICAgICAgICBNT05PICAgPSAwLAotICAgICAgICBMRUZUICAgPSAwLAotICAgICAgICBSSUdIVCAgPSAxCi0gICAgfTsKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhIE5BVElWRV9FVkVOVF8qLgpAQCAtODIsNiArNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IGl0IGlzIHVudXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGZpbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKQEAgLTkxLDcgKzg3LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIHJhdzsKICAgICAgICAgICAgIHNob3J0KiAgICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCi0gICAgICAgIH07CisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xMjMsNiArMTE5LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTE1Niw5ICsxNTQsMTAgQEAKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLgorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0LiAgRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSworICAgICAqICAgICAgICAgICAgICAgICAgICAgb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCB3aGljaCBpcyBoYW5kbGVkIG9uIGNsaWVudCBzaWRlLiAgRm9yIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IHNpbmsuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2ssIHN1Y2ggdGhhdCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgaXMgdHJ1ZS4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4gVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBBdWRpb1RyYWNrIGNvdWxkIGJlCkBAIC0xODAsMTUgKzE3OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0yMDksMTEgKzIxMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9UcmFjayBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9UcmFjay4KQEAgLTI0MSwxNyArMjQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvVHJhY2suIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1RyYWNrIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTI3OSw3ICsyODQsNyBAQAogICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVTaXplKCkgY29uc3QgICB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KIAogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CkBAIC0zMzYsNyArMzQxLDcgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKLSAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHosIG9yIDAgaWYgdW5rbm93biAqLworICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogCiAgICAgLyogRW5hYmxlcyBsb29waW5nIGFuZCBzZXRzIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBsb29waW5nLgpAQCAtMzYxLDcgKzM2Niw3IEBACiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcGxheWJhY2sgcmVhY2hlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQsIGEgY2FsbGJhY2sgd2l0aAogICAgICAqIGV2ZW50IHR5cGUgRVZFTlRfTUFSS0VSIGlzIGNhbGxlZC4gQ2FsbGluZyBzZXRNYXJrZXJQb3NpdGlvbiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyCiAgICAgICogbm90aWZpY2F0aW9uIGNhbGxiYWNrLiAgVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvVHJhY2sgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwgdGhlIG9wZXJhdGlvbiB3aWxsCiAgICAgICogZmFpbC4KICAgICAgKgpAQCAtNDI1LDcgKzQzMCw3IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gQkFEX1ZBTFVFOiAgcG9zaXRpb24gaXMgTlVMTAogICAgICAqLwotICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CiAKICAgICAvKiBGb3Igc3RhdGljIGJ1ZmZlciBtb2RlIG9ubHksIHRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBmcmFtZXMKICAgICAgKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIuICBJdCBpcyBhbmFsb2dvdXMgdG8gdGhlIHBvc2l0aW9uIHVuaXRzIHVzZWQgYnkKQEAgLTQ1MCw5ICs0NTUsMTAgQEAKICAgICAgKiAgbm9uZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgotICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQorICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNTI4LDE1ICs1MzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLS8vRUxfRklYTUUgdG8gYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIoKSByZXR1cm4gY29kZXMgYW5kIGNvbnRyb2wgYmxvY2sgcHJveHkKLS8vICAgICAgICAgICAgZW51bSB7Ci0vLyAgICAgICAgICAgIE5PX01PUkVfQlVGRkVSUyA9IDB4ODAwMDAwMDEsICAgLy8gc2FtZSBuYW1lIGluIEF1ZGlvRmxpbmdlci5oLCBvayB0byBiZSBkaWZmZXJlbnQgdmFsdWUKLS8vICAgICAgICAgICAgVEVBUl9ET1dOICAgICAgID0gMHg4MDAwMDAwMiwKLS8vICAgICAgICAgICAgU1RPUFBFRCA9IDEsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkRfV0FJVCwKLS8vICAgICAgICAgICAgU1RSRUFNX0VORAotLy8gICAgICAgIH07Ci0KICAgICAvKiBSZWxlYXNlIGEgZmlsbGVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb2Nlc3MuICovCiAgICAgLy8gRklYTUUgbWFrZSBwcml2YXRlIHdoZW4gb2J0YWluQnVmZmVyKCkgZm9yIFRSQU5TRkVSX09CVEFJTiBpcyByZW1vdmVkCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpOwpAQCAtNTUxLDggKzU0OCwxMSBAQAogICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCiAgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0OwogCiAgICAgLyogR2V0IHRoZSBmbGFncyAqLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICAvKiBTZXQgcGFyYW1ldGVycyAtIG9ubHkgcG9zc2libGUgd2hlbiB1c2luZyBkaXJlY3Qgb3V0cHV0ICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwpAQCAtNTgwLDcgKzU4MCwxNSBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLIGlmIGNhbGxlZCBpbiBTVE9QUEVEIG9yIEZMVVNIRUQgc3RhdGUsIG9yIGlmIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgc3RhcnQvQUNUSVZFLCB3aGVuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgaGFyZHdhcmUgbGF0ZW5jeSB0byBwaHlzaWNhbCBvdXRwdXQuIEluIFdPVUxEX0JMT0NLIGNhc2VzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IHBvbGwgYWdhaW4sIG9yIHVzZSBnZXRQb3NpdGlvbigpLCBvciB1c2UgMCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZSBmb3IgdGhlIHRpbWVzdGFtcC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBGYXN0VHJhY2ssIHdyb25nIHN0YXRlLCBvciBzb21lIG90aGVyIGVycm9yLgorICAgICAqCisgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgc3RhdHVzIGlzIG5vdCBOT19FUlJPUi4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIApAQCAtNTg5LDYgKzU5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpOworICAgIC8qIHBhYSBpcyBndWFyYW50ZWVkIG5vbi1OVUxMICovCisgICAgICAgICAgICBib29sICAgICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CisKICAgICAvKiBhIHNtYWxsIGludGVybmFsIGNsYXNzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2sgKi8KICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKQEAgLTYyNiw1MyArNjM5LDYzIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4mIHRocmVhZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBwcm9jZXNzU3RyZWFtRW5kKGludDMyX3Qgd2FpdENvdW50KTsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgICAgICAgICBib29sICAgICBpc0RpcmVjdCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVwb2NoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gbVN0YXRlICE9IFNUQVRFX0FDVElWRQogICAgICAgICAgICAgdm9pZCBmbHVzaF9sKCk7CiAKICAgICAgICAgICAgIHZvaWQgc2V0TG9vcF9sKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRfbCgpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKTsKIAotICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRfbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KIAotICAgIC8vIE5leHQgMyBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSBjb25zdAorICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3RfbCgpIGNvbnN0CisgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorCisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVBvc2l0aW9uIGJ5IHRoZSBkZWx0YSBvZiBtU2VydmVyLCBhbmQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBtUG9zaXRpb24KKyAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKworICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CisKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lWzJdOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0LgotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2sKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBuZXh0IHRpbWUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQXVkaW9UcmFjayBpcyBuZWVkZWQKLQorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgICAgICAgLy8gYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCwgbm90IGZvcmNlZCB0byAxNi1iaXQKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OworICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CisgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKICAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKICAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KQEAgLTcwNSwyMSArNzI4LDM5IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGluaXRpYWwgc291cmNlIHNhbXBsZSByYXRlCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAorCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcnZlcjsgICAgICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCBsYXN0IGtub3duIG1Qcm94eS0+Z2V0UG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvdW50IG9mIGZyYW1lcyBjb25zdW1lZCBieSBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgYnkgbmV3IElBdWRpb1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgaXQgaXMgcmVzZXQgYnkgc3RvcCgpIGlzIFRCRAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Qb3NpdGlvbjsgICAgICAgICAgICAgIC8vIGluIGZyYW1lcywgbGlrZSBtU2VydmVyIGV4Y2VwdCBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb25vdG9uaWNhbGx5IGFmdGVyIG5ldyBJQXVkaW9UcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY291bGQgYmUgZWFzaWx5IHdpZGVuZWQgdG8gdWludDY0X3QKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVsZWFzZWQ7ICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGNvdW50IG9mIGZyYW1lcyByZWxlYXNlZCB0byBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm90IG5lY2Vzc2FyaWx5IGNvbnN1bWVkIGJ5IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBzdG9wKCkgYnV0IGNvbnRpbnVlcyBtb25vdG9uaWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbmV3IElBdWRpb1RyYWNrIHRvIHJlc3RvcmUgbVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VsZCBiZSBlYXNpbHkgd2lkZW5lZCB0byB1aW50NjRfdAorICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KKyAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03MzksNyArNzgwLDYgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsgICAgICAgICAvLyBwcmltYXJ5IG93bmVyIG9mIHRoZSBtZW1vcnkKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1JblVuZGVycnVuOyAgICAgICAgICAgIC8vIHdoZXRoZXIgdHJhY2sgaXMgY3VycmVudGx5IGluIHVuZGVycnVuIHN0YXRlCi0gICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgICAgICAgICAgICAgLy8gc2VydmVyJ3MgbmFtZSBmb3IgdGhpcyBJQXVkaW9UcmFjawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1QYXVzZWRQb3NpdGlvbjsKIAogcHJpdmF0ZToKQEAgLTc1NCw4ICs3OTQsOCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyBjYWNoZWQgb3V0cHV0IGlvIGhhbmRsZQogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIGNsYXNzIFRpbWVkQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1RyYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWEzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hBUkFDVEVSX0VOQ09ESU5HX0RFVEVDVE9SX0gKKyNkZWZpbmUgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKworI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgeworCisgICAgcHVibGljOgorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgfkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKworICAgICAgICB2b2lkIGFkZFRhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHNpemVfdCBzaXplKCk7CisKKyAgICAgICAgdm9pZCBkZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgICAgIHN0YXR1c190IGdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoICpnZXRQcmVmZXJyZWQoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEsIHNpemVfdCBtYXRjaGVzLAorICAgICAgICAgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpOworCisgICAgICAgIGJvb2wgaXNGcmVxdWVudChjb25zdCB1aW50MTZfdCAqdmFsdWVzLCB1aW50MzJfdCBjKTsKKworICAgICAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgorICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYnl0ZSBibG9iIGFycmF5cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgLy8gc2luZ2xlbnVsbGJ5dGUtdGVybWluYXRlZAorICAgICAgICBTdHJpbmdBcnJheSAgICAgbU5hbWVzOworICAgICAgICBTdHJpbmdBcnJheSAgICAgbVZhbHVlczsKKworICAgICAgICBVQ29udmVydGVyKiAgICAgbVV0ZjhDb252OworfTsKKworCisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggMjgyZjI3NS4uMzFhMTRmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgVFJBQ0tfVElNRUQgICA9IDEsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBUaW1lZEF1ZGlvVHJhY2sKICAgICAgICAgVFJBQ0tfRkFTVCAgICA9IDIsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBmYXN0IEF1ZGlvVHJhY2sgb3IgQXVkaW9SZWNvcmQKICAgICAgICAgVFJBQ0tfT0ZGTE9BRCA9IDQsICAvLyBjbGllbnQgcmVxdWVzdHMgb2ZmbG9hZCB0byBodyBjb2RlYworICAgICAgICBUUkFDS19ESVJFQ1QgPSA4LCAgIC8vIGNsaWVudCByZXF1ZXN0cyBhIGRpcmVjdCBvdXRwdXQKICAgICB9OwogICAgIHR5cGVkZWYgdWludDMyX3QgdHJhY2tfZmxhZ3NfdDsKIApAQCAtNjQsMzcgKzY1LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0OiBzZXJ2ZXIncyBkZXNjcmlwdGlvbiBvZiBJQXVkaW9UcmFjayBmb3IgZGlzcGxheSBpbiBsb2dzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHBhcnNlLCBhcyB0aGUgZm9ybWF0IGNvdWxkIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsICAvLyAtMSBtZWFucyB1bnVzZWQsIG90aGVyd2lzZSBtdXN0IGJlIHZhbGlkIG5vbi0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLCAgIC8vIHJldHVybiB2YWx1ZSAwIG1lYW5zIGl0IGZvbGxvd3MgY2JsawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKICAgICAvKiBxdWVyeSB0aGUgYXVkaW8gaGFyZHdhcmUgc3RhdGUuIFRoaXMgc3RhdGUgbmV2ZXIgY2hhbmdlcywKICAgICAgKiBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCiAgICAgICovCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKLSNpZiAwCi0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwotI2VuZGlmCiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKQEAgLTE0MiwyOCArMTQ1LDI5IEBACiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwogCkBAIC0xNzIsMTAgKzE3NiwxMCBAQAogCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSBjb25zdCA9IDA7CiAKQEAgLTE4OCw2ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBkb2Vzbid0IHRha2Ugb3ZlciBoYW5kbGUgcmVmZXJlbmNlIGZyb20gY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKQEAgLTIwOSw2ICsyMTQsMjkgQEAKICAgICAvLyBhbmQgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UuICBGb3IgYSBkZWZpbml0aW9uIG9mIHdoYXQgImxvdyBSQU0iIG1lYW5zLCBzZWUKICAgICAvLyBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuaXNMb3dSYW1EZXZpY2UoKS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKSA9IDA7CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpID0gMDsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgPSAwOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworCisgICAgLyogR2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIHVzZWQgZm9yIGFuIGF1ZGlvIHNlc3Npb24gKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDA5YjllYTYuLjE2ZmU5Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIApAQCAtNTUsNiArNTYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CkBAIC02MywxMyArNzAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSAwKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgPSAwOwpAQCAtOTksNiArMTEwLDQwIEBACiAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykgPSAwOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKworICAgIC8qIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0lBVURJT1BPTElDWVNFUlZJQ0VDTElFTlRfSAorCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KTsKKworICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgPSAwOworICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBhdGNoIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaAppbmRleCBlY2NjMmNhLi4yMDAzOTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKQEAgLTM0LDkgKzM0LDYgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUmVjb3JkKTsKIAotICAgIC8qIGdldCB0aGlzIHRyYWNrcyBjb250cm9sIGJsb2NrICovCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOwotCiAgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KICAgICAgKiBtYWtlIGl0IGFjdGl2ZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCA1YzhhNDg0Li42MTlhYzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC04OCw3ICs4OCw3IEBACiAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CiAKLSAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkICovCisgICAgLyogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gIHRpbWVzdGFtcCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLiAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApID0gMDsKIAogICAgIC8qIFNpZ25hbCB0aGUgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lEcm0uaCBiL2luY2x1ZGUvbWVkaWEvSURybS5oCmluZGV4IDMyYWUyOGUuLjY4ZGU4N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSURybS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSURybS5oCkBAIC03MCw2ICs3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZWE4YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNMaXN0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9JTUVESUFDT0RFQ0xJU1RfSAorI2RlZmluZSBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworY2xhc3MgSU1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY0xpc3QpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0ID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5NZWRpYUNvZGVjTGlzdDogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2M2ViNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXworCisjZGVmaW5lIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworLyoqIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggSU1lZGlhSFRUUENvbm5lY3Rpb24uYWlkbCAqLworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgSUludGVyZmFjZSB7CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUhUVFBDb25uZWN0aW9uKTsKKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJX01FRElBX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmQ2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2RlZmluZSBJX01FRElBX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCisvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQU2VydmljZS5haWRsICovCisKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhSFRUUFNlcnZpY2UpOworCisgICAgdmlydHVhbCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElNZWRpYUhUVFBTZXJ2aWNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA2ZGJiMmQ3Li4yNTI5ODAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjogcHVibGljIElJbnRlcmZhY2UKIHsKIHB1YmxpYzoKQEAgLTMzLDYgKzM1LDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKaW5kZXggMGNiZDI2OS4uZGI2MmNkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCkBAIC0zMyw2ICszMyw3IEBACiBjbGFzcyBTdXJmYWNlOwogY2xhc3MgSVN0cmVhbVNvdXJjZTsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiAKIGNsYXNzIElNZWRpYVBsYXllcjogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQxLDggKzQyLDExIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4qIGhlYWRlcnMpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+JiBzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyOTk4YjM3Li5kN2U1ODRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzQsNiArMzQsOCBAQAogc3RydWN0IElDcnlwdG87CiBzdHJ1Y3QgSURybTsKIHN0cnVjdCBJSERDUDsKK3N0cnVjdCBJTWVkaWFDb2RlY0xpc3Q7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKIGNsYXNzIElPTVg7CiBjbGFzcyBJUmVtb3RlRGlzcGxheTsKQEAgLTQ5LDkgKzUxLDE0IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOwpAQCAtNTksNiArNjYsNyBAQAogICAgIHZpcnR1YWwgc3A8SUNyeXB0bz4gICAgICAgICBtYWtlQ3J5cHRvKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SUhEQ1A+ICAgICAgICAgICBtYWtlSERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3QgPSAwOwogCiAgICAgLy8gQ29ubmVjdHMgdG8gYSByZW1vdGUgZGlzcGxheS4KICAgICAvLyAnaWZhY2UnIHNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYWwgaW50ZXJmYWNlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IKQEAgLTkzLDkgKzEwMSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkQmF0dGVyeURhdGEodWludDMyX3QgcGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwdWxsQmF0dGVyeURhdGEoUGFyY2VsKiByZXBseSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JT01YLmggYi9pbmNsdWRlL21lZGlhL0lPTVguaAppbmRleCBiNzRhMmM3Li42MjdmMjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lPTVguaAorKysgYi9pbmNsdWRlL21lZGlhL0lPTVguaApAQCAtODcsNiArODcsMTAgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgPSAwOwogCisgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CiAKQEAgLTE0Myw2ICsxNDcsOCBAQAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1VTUEVORCwgIC8vIGRhdGEgaXMgYSBib29sCiAgICAgICAgIElOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVksICAvLyBkYXRhIGlzIGFuIGludDY0X3QKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQLCAvLyBkYXRhIGlzIGludDY0X3QKKyAgICAgICAgSU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsIC8vIGRhdGEgaXMgYW4gaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90WzJdCiAgICAgfTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLApAQCAtMTgyLDggKzE4OCw2IEBACiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX2xlbmd0aDsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3M7CiAgICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wOwotICAgICAgICAgICAgT01YX1BUUiBwbGF0Zm9ybV9wcml2YXRlOwotICAgICAgICAgICAgT01YX1BUUiBkYXRhX3B0cjsKICAgICAgICAgfSBleHRlbmRlZF9idWZmZXJfZGF0YTsKIAogICAgIH0gdTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU2YWRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0NPREVDX0lORk9fSF8KKworI2RlZmluZSBNRURJQV9DT0RFQ19JTkZPX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBQYXJjZWw7CitzdHJ1Y3QgQ29kZWNDYXBhYmlsaXRpZXM7CisKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbyA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKKyAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7CisgICAgICAgIHVpbnQzMl90IG1MZXZlbDsKKyAgICB9OworCisgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdDsKKyAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzOworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CisgICAgICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1EZXRhaWxzOworCisgICAgICAgIENhcGFiaWxpdGllcygpOworCisgICAgICAgIC8vIHJlYWQgb2JqZWN0IGZyb20gcGFyY2VsIGV2ZW4gaWYgb2JqZWN0IGNyZWF0aW9uIGZhaWxzCisgICAgICAgIHN0YXRpYyBzcDxDYXBhYmlsaXRpZXM+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDYXBhYmlsaXRpZXMpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjSW5mbzsKKyAgICB9OworCisgICAgYm9vbCBpc0VuY29kZXIoKSBjb25zdDsKKyAgICBib29sIGhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3Q7CisgICAgY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiBnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemF0aW9uIG92ZXIgQmluZGVyCisgICAgICovCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNJbmZvPiBGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB2YXJpYWJsZSBzZXQgb25seSBpbiBjb25zdHJ1Y3RvciAtIHRoZXNlIGFyZSBhY2Nlc3NlZCBieSBNZWRpYUNvZGVjTGlzdAorICAgIC8vIHRvIGF2b2lkIGR1cGxpY2F0aW9uIG9mIHNhbWUgdmFyaWFibGVzCisgICAgQVN0cmluZyBtTmFtZTsKKyAgICBib29sIG1Jc0VuY29kZXI7CisgICAgYm9vbCBtSGFzU29sZU1pbWU7IC8vIHdhcyBpbml0aWFsaXplZCB3aXRoIG1pbWUKKworICAgIFZlY3RvcjxBU3RyaW5nPiBtUXVpcmtzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKKworICAgIHNwPENhcGFiaWxpdGllcz4gbUN1cnJlbnRDYXBzOyAvLyBjdXJyZW50bHkgaW5pdGFsaXplZCBjYXBhYmlsaXRpZXMKKworICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworCisgICAgLyogTWV0aG9kcyB1c2VkIGJ5IE1lZGlhQ29kZWNMaXN0IHRvIGNvbnN0cnVjdCB0aGUgaW5mbworICAgICAqIG9iamVjdCBmcm9tIFhNTC4KKyAgICAgKgorICAgICAqIEFmdGVyIGluZm8gb2JqZWN0IGlzIGNyZWF0ZWQ6CisgICAgICogLSBhZGRpdGlvbmFsIHF1aXJrcyBjYW4gYmUgYWRkZWQKKyAgICAgKiAtIGFkZGl0aW9uYWwgbWltZXMgY2FuIGJlIGFkZGVkCisgICAgICogICAtIE9NWCBjb2RlYyBjYXBhYmlsaXRpZXMgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCisgICAgICogICAtIGEgY2FwYWJpbGl0eSBkZXRhaWwgY2FuIGJlIHNldCBmb3IgdGhlIGN1cnJlbnQgbWltZS10eXBlCisgICAgICogICAtIGEgZmVhdHVyZSBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gaW5mbyBvYmplY3QgY2FuIGJlIGNvbXBsZXRlZCB3aGVuIHBhcnNpbmcgb2YgYSBtaW1lLXR5cGUgaXMgZG9uZQorICAgICAqLworICAgIE1lZGlhQ29kZWNJbmZvKEFTdHJpbmcgbmFtZSwgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKKyAgICB2b2lkIGFkZFF1aXJrKGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHN0YXR1c190IGFkZE1pbWUoY29uc3QgY2hhciAqbWltZSk7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBDb2RlY0NhcGFiaWxpdGllcyAmY2Fwcyk7CisgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSk7CisgICAgdm9pZCBhZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCBhZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIHZvaWQgcmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICB2b2lkIGNvbXBsZXRlKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjSW5mbyk7CisKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFDb2RlY0xpc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0NPREVDX0lORk9fSF8KKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCmluZGV4IGNkNWJmODguLjM4ZGJiMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCkBAIC0yNSw2ICsyNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworCiAvLyBBYnN0cmFjdCBiYXNlIGNsYXNzCiBjbGFzcyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlCiB7CkBAIC0zMyw2ICszNSw3IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2UoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggMjZkODcyOS4uY2YxOGE0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KIAogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKQEAgLTk3LDYgKzk4LDcgQEAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CkBAIC0xMzcsNiArMTM5LDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKQEAgLTIxMywxMSArMjE2LDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXJTZXJ2aWNlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDlmYzk2MmMuLmYwNjFkMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0zMyw3ICszMyw4IEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfNzIwUCA9IDUsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFAgPSA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1FWR0EgPSA3LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV8yMTYwUCA9IDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA4LAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX1NUQVJUID0gMTAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLApAQCAtNDQsNyArNDUsMTcgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzcyMFAgPSAxMDA1LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFAgPSAxMDA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQSA9IDEwMDcsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDcsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yMTYwUCA9IDEwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMDgsCisKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfU1RBUlQgPSAyMDAwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTE9XICA9IDIwMDAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIID0gMjAwMSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzQ4MFAgPSAyMDAyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUCA9IDIwMDMsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUCA9IDIwMDQsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUCA9IDIwMDUsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDUsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmggYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCmluZGV4IDJkZDc4Y2MuLjU4MzA0NzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgZnJpZW5kIGNsYXNzIFNvdW5kUG9vbFRocmVhZDsKICAgICBmcmllbmQgY2xhc3MgU291bmRDaGFubmVsOwogcHVibGljOgotICAgIFNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgaW50IHNyY1F1YWxpdHkpOworICAgIFNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpOwogICAgIH5Tb3VuZFBvb2woKTsKICAgICBpbnQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGludCBwcmlvcml0eSk7CiAgICAgaW50IGxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSk7CkBAIC0xODMsOCArMTgzLDcgQEAKICAgICB2b2lkIHNldFByaW9yaXR5KGludCBjaGFubmVsSUQsIGludCBwcmlvcml0eSk7CiAgICAgdm9pZCBzZXRMb29wKGludCBjaGFubmVsSUQsIGludCBsb29wKTsKICAgICB2b2lkIHNldFJhdGUoaW50IGNoYW5uZWxJRCwgZmxvYXQgcmF0ZSk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KLSAgICBpbnQgc3JjUXVhbGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1TcmNRdWFsaXR5OyB9CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyaWJ1dGVzKCkgeyByZXR1cm4gJm1BdHRyaWJ1dGVzOyB9CiAKICAgICAvLyBjYWxsZWQgZnJvbSBTb3VuZFBvb2xUaHJlYWQKICAgICB2b2lkIHNhbXBsZUxvYWRlZChpbnQgc2FtcGxlSUQpOwpAQCAtMjI1LDggKzIyNCw3IEBACiAgICAgTGlzdDxTb3VuZENoYW5uZWwqPiAgICAgbVN0b3A7CiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQsIHNwPFNhbXBsZT4gPiAgIG1TYW1wbGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1NYXhDaGFubmVsczsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU3JjUXVhbGl0eTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cmlidXRlczsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdGVkOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2FtcGxlSUQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRDaGFubmVsSUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5oIGIvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9TdHJpbmdBcnJheS5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggMGRmNzdjMS4uYjM1Y2YzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFQbGF5ZXJTZXJ2aWNlOwogY2xhc3MgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CiAKQEAgLTY4LDYgKzY5LDcgQEAKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YVNvdXJjZVVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA0YzA1ZmMzLi45Y2MyMDhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0xNjAsNiArMTYwLDkgQEAKICAgICAvLyBQbGF5YmFjayByYXRlIGV4cHJlc3NlZCBpbiBwZXJtaWxsZSAoMTAwMCBpcyBub3JtYWwgc3BlZWQpLCBzYXZlZCBhcyBpbnQzMl90LCB3aXRoIG5lZ2F0aXZlCiAgICAgLy8gdmFsdWVzIHVzZWQgZm9yIHJld2luZGluZyBvciByZXZlcnNlIHBsYXliYWNrLgogICAgIEtFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CisKKyAgICAvLyBTZXQgYSBQYXJjZWwgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBwYXJjZWxsZWQgSmF2YSBBdWRpb0F0dHJpYnV0ZSBpbnN0YW5jZQorICAgIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUyA9IDE0MDAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CiB9OwogCiAvLyBLZWVwIElOVk9LRV9JRF8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgpAQCAtMTcwLDYgKzE3Myw3IEBACiAgICAgSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyA9IDQsCiAgICAgSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLID0gNSwKICAgICBJTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERSA9IDYsCisgICAgSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSyA9IDcKIH07CiAKIC8vIEtlZXAgTUVESUFfVFJBQ0tfVFlQRV8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgpAQCAtMTg5LDYgKzE5Myw4IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7CiB9OwogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIGNsYXNzIE1lZGlhUGxheWVyIDogcHVibGljIEJuTWVkaWFQbGF5ZXJDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElNZWRpYURlYXRoTm90aWZpZXIKIHsKQEAgLTE5OSw2ICsyMDUsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC0yMjAsMTMgKzIyNywxOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCB0eXBlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TG9vcGluZyhpbnQgbG9vcCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNMb29waW5nKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaiA9IE5VTEwpOwotICAgIHN0YXRpYyAgc3RhdHVzX3QgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHN0YXRpYyAgc3RhdHVzX3QgICAgICAgIGRlY29kZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSk7CiAgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKTsKQEAgLTI0Miw5ICsyNTUsNiBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBjaGFyKiBhZGRyU3RyaW5nLCB1aW50MTZfdCBwb3J0KTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXROZXh0TWVkaWFQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCi0gICAgICAgICAgICBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhcl9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2Vla1RvX2woaW50IG1zZWMpOwpAQCAtMjUzLDYgKzI2Myw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoTmV3UGxheWVyKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXRfbCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIHBsYXllcik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOwogCiAgICAgc3A8SU1lZGlhUGxheWVyPiAgICAgICAgICAgIG1QbGF5ZXI7CiAgICAgdGhyZWFkX2lkX3QgICAgICAgICAgICAgICAgIG1Mb2NrVGhyZWFkSWQ7CkBAIC0yNjcsNiArMjc4LDcgQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVByZXBhcmVTeW5jOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN0YXR1czsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CisgICAgUGFyY2VsKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbHVtZTsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCA4OGE0MmEwLi5iMGE2MmE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtMzksNyArMzksNyBAQAogZW51bSB2aWRlb19zb3VyY2UgewogICAgIFZJREVPX1NPVVJDRV9ERUZBVUxUID0gMCwKICAgICBWSURFT19TT1VSQ0VfQ0FNRVJBID0gMSwKLSAgICBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIgPSAyLAorICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFID0gMiwKIAogICAgIFZJREVPX1NPVVJDRV9MSVNUX0VORCAgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBhdWRpbyBzb3VyY2UgdHlwZQogfTsKQEAgLTYxLDEyICs2MSwxOCBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FESUYgPSA1LAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCisgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LAogCiAgICAgLyogSC4yNjQvQUFDIGRhdGEgZW5jYXBzdWxhdGVkIGluIE1QRUcyL1RTICovCiAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTID0gOCwKIAorICAgIC8qIFZQOC9WT1JCSVMgZGF0YSBpbiBhIFdFQk0gY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9XRUJNID0gOSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtNzcsNiArODMsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfQUFDID0gMywKICAgICBBVURJT19FTkNPREVSX0hFX0FBQyA9IDQsCiAgICAgQVVESU9fRU5DT0RFUl9BQUNfRUxEID0gNSwKKyAgICBBVURJT19FTkNPREVSX1ZPUkJJUyA9IDYsCiAKICAgICBBVURJT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBhdWRpbyBlbmNvZGVyIHR5cGUKIH07CkBAIC04Niw2ICs5Myw3IEBACiAgICAgVklERU9fRU5DT0RFUl9IMjYzID0gMSwKICAgICBWSURFT19FTkNPREVSX0gyNjQgPSAyLAogICAgIFZJREVPX0VOQ09ERVJfTVBFR180X1NQID0gMywKKyAgICBWSURFT19FTkNPREVSX1ZQOCA9IDQsCiAKICAgICBWSURFT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB2aWRlbyBlbmNvZGVyIHR5cGUKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAppbmRleCAzN2E4M2M2Li5kNTU1Mjc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKIHN0cnVjdCBkaXJlbnQ7CkBAIC0yOSw2ICszMCw3IEBACiAKIGNsYXNzIE1lZGlhU2Nhbm5lckNsaWVudDsKIGNsYXNzIFN0cmluZ0FycmF5OworY2xhc3MgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcjsKIAogZW51bSBNZWRpYVNjYW5SZXN1bHQgewogICAgIC8vIFRoaXMgZmlsZSBvciBkaXJlY3Rvcnkgd2FzIHNjYW5uZWQgc3VjY2Vzc2Z1bGx5LgpAQCAtMTE4LDE1ICsxMjAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpID0gMDsKIAogcHJvdGVjdGVkOgotICAgIHZvaWQgY29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZyk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgotICAgIFN0cmluZ0FycmF5KiAgICBtTmFtZXM7Ci0gICAgU3RyaW5nQXJyYXkqICAgIG1WYWx1ZXM7Ci0KLSAgICAvLyBkZWZhdWx0IGVuY29kaW5nIGJhc2VkIG9uIE1lZGlhU2Nhbm5lcjo6bUxvY2FsZSBzdHJpbmcKLSAgICB1aW50MzJfdCAgICAgICAgbUxvY2FsZUVuY29kaW5nOworICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcgZnJvbSBNZWRpYVNjYW5uZXI6Om1Mb2NhbGUKKyAgICBTdHJpbmc4IG1Mb2NhbGU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAppbmRleCAyYzRhYWZmLi5iMTZlMjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSA6IHB1YmxpYyBOQkFJT19Tb3VyY2UgewogCiBwdWJsaWM6Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogICAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDA3ZDhjODkuLjUxNjlmMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC00Myw5ICs0Myw5IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyByZWFkKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIHdoZW4gaXQncyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyk7CiAKICAgICAvLyBOQkFJT19TaW5rIGVuZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA3OTQ4ZDQwLi45OTQ5Yjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHdyaXRlKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGVtcHR5aW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA+PiBtQml0U2hpZnQ7IH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggZDM4MDJmZS4uYjA5YjM1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE5vdGU6IHdoYXRldmVyIHNoYXJlcyB0aGlzIG9iamVjdCB3aXRoIGFub3RoZXIgdGhyZWFkIG5lZWRzIHRvIGRvIHNvIGluIGFuIFNNUC1zYWZlIHdheSAobGlrZQogICAgIC8vIGNyZWF0aW5nIGl0IHRoZSBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIHRoZSBvdGhlciB0aHJlYWQsIG9yIHN0b3JpbmcgdGhlIG9iamVjdCB3aXRoIGEKICAgICAvLyByZWxlYXNlX3N0b3JlKS4gT3RoZXJ3aXNlIHRoZSBvdGhlciB0aHJlYWQgY291bGQgc2VlIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkIG9iamVjdC4KLSAgICBNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CisgICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jayA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5Nb25vUGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaAppbmRleCAxZGEwYzczLi5kNDIyNTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTIsMzEgKzUzLDQxIEBACiAvLyB0aGUgY29tYmluYXRpb25zIHRoYXQgYXJlIGFjdHVhbGx5IG5lZWRlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLiAgSWYgdGhlIGxpc3Qgb2YgY29tYmluYXRpb25zIGdyb3dzCiAvLyB0b28gbGFyZ2UsIHRoZW4gdGhpcyBkZWNpc2lvbiBzaG91bGQgYmUgcmUtdmlzaXRlZC4KIC8vIFNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGFyZSBleHBsaWNpdCwgUENNIGludGVybGVhdmVkIDE2LWJpdCBpcyBhc3N1bWVkLgotdHlwZWRlZiB1bnNpZ25lZCBOQkFJT19Gb3JtYXQ7Ci1lbnVtIHsKLSAgICBGb3JtYXRfSW52YWxpZAorc3RydWN0IE5CQUlPX0Zvcm1hdCB7CisvLyBGSVhNRSBtYWtlIHRoaXMgYSBjbGFzcywgYW5kIGNoYW5nZSBGb3JtYXRfLi4uIGdsb2JhbCBtZXRob2RzIHRvIGNsYXNzIG1ldGhvZHMKKy8vcHJpdmF0ZToKKyAgICB1bnNpZ25lZCAgICBtU2FtcGxlUmF0ZTsKKyAgICB1bnNpZ25lZCAgICBtQ2hhbm5lbENvdW50OworICAgIGF1ZGlvX2Zvcm1hdF90ICBtRm9ybWF0OworICAgIHNpemVfdCAgICAgIG1GcmFtZVNpemU7CiB9OwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCi1zaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShOQkFJT19Gb3JtYXQgZm9ybWF0KTsKK2V4dGVybiBjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQ7CiAKLS8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgYXMgYSBiaXQgc2hpZnQKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKy8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgaW4gYnl0ZXMKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ29udmVydCBhIHNhbXBsZSByYXRlIGluIEh6IGFuZCBjaGFubmVsIGNvdW50IHRvIGFuIE5CQUlPX0Zvcm1hdAotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KTsKKy8vIEZJWE1FIHJlbmFtZQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIHNhbXBsZSByYXRlIGluIEh6IG9mIGFuIE5CQUlPX0Zvcm1hdAotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIFJldHVybiB0aGUgY2hhbm5lbCBjb3VudCBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ2FsbGJhY2tzIHVzZWQgYnkgTkJBSU9fU2luazo6d3JpdGVWaWEoKSBhbmQgTkJBSU9fU291cmNlOjpyZWFkVmlhKCkgYmVsb3cuCiB0eXBlZGVmIHNzaXplX3QgKCp3cml0ZVZpYV90KSh2b2lkICp1c2VyLCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CiB0eXBlZGVmIHNzaXplX3QgKCpyZWFkVmlhX3QpKHZvaWQgKnVzZXIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpOwogCisvLyBDaGVjayB3aGV0aGVyIGFuIE5CQUlPX0Zvcm1hdCBpcyB2YWxpZAorYm9vbCBGb3JtYXRfaXNWYWxpZChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CisKKy8vIENvbXBhcmUgdHdvIE5CQUlPX0Zvcm1hdCB2YWx1ZXMKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpOworCiAvLyBBYnN0cmFjdCBjbGFzcyAoaW50ZXJmYWNlKSByZXByZXNlbnRpbmcgYSBkYXRhIHBvcnQuCiBjbGFzcyBOQkFJT19Qb3J0IDogcHVibGljIFJlZkJhc2UgewogCkBAIC0xMTUsMTUgKzEyNiwxNSBAQAogICAgIHZpcnR1YWwgTkJBSU9fRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1OZWdvdGlhdGVkID8gbUZvcm1hdCA6IEZvcm1hdF9JbnZhbGlkOyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Qb3J0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDogbU5lZ290aWF0ZWQoZmFsc2UpLCBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRTaGlmdChGb3JtYXRfZnJhbWVCaXRTaGlmdChmb3JtYXQpKSB7IH0KKyAgICBOQkFJT19Qb3J0KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZShGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpIHsgfQogICAgIHZpcnR1YWwgfk5CQUlPX1BvcnQoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KIAogICAgIGJvb2wgICAgICAgICAgICBtTmVnb3RpYXRlZDsgICAgLy8gbU5lZ290aWF0ZWQgaW1wbGllcyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsgICAgICAgIC8vIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSBkb2VzIG5vdCBpbXBseSBtTmVnb3RpYXRlZAotICAgIHNpemVfdCAgICAgICAgICBtQml0U2hpZnQ7ICAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVTaXplOyAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAogfTsKIAogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgbm9uLWJsb2NraW5nIGRhdGEgc2luaywgZm9yIHVzZSBieSBhIGRhdGEgcHJvdmlkZXIuCkBAIC0yMTYsMTEgKzIyNywxMSBAQAogCiAgICAgLy8gUmV0dXJucyBOT19FUlJPUiBpZiBhIHRpbWVzdGFtcCBpcyBhdmFpbGFibGUuICBUaGUgdGltZXN0YW1wIGluY2x1ZGVzIHRoZSB0b3RhbCBudW1iZXIKICAgICAvLyBvZiBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLCB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZSBvZiBDTE9DS19NT05PVE9OSUMKLSAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4KKyAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4gIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBpZiBlcnJvciBpcyByZXR1cm5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU2luayhOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KKyAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19TaW5rKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCkBAIC0zMTEsNyArMzIyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgb25UaW1lc3RhbXAoY29uc3QgQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Tb3VyY2UoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CisgICAgTkJBSU9fU291cmNlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzUmVhZCgwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Tb3VyY2UoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKaW5kZXggNzlhNGVlZS4uZWJhMzdiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTMwLDcgKzMwLDExIEBACiAKIHB1YmxpYzoKICAgICAvLyBtYXhGcmFtZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIGEgcG93ZXIgb2YgMiwgYW5kIGFsbCBzbG90cyBhcmUgYXZhaWxhYmxlLiBNdXN0IGJlID49IDIuCi0gICAgUGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKyAgICAvLyBidWZmZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcGlwZSBidWZmZXIsCisgICAgLy8gd2hpY2ggbXVzdCBiZSBvZiBzaXplIHJvdW5kdXAobWF4RnJhbWVzKSAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KSBieXRlcy4KKyAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCB2b2lkICpidWZmZXIgPSBOVUxMKTsKKworICAgIC8vIElmIGEgYnVmZmVyIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCBpdCBpcyBub3QgYXV0b21hdGljYWxseSBmcmVlZCBieSBkZXN0cnVjdG9yLgogICAgIHZpcnR1YWwgflBpcGUoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCkBAIC01Nyw2ICs2MSw3IEBACiAgICAgdm9pZCAqIGNvbnN0ICAgIG1CdWZmZXI7CiAgICAgdm9sYXRpbGUgaW50MzJfdCBtUmVhcjsgICAgICAgICAvLyB3cml0dGVuIGJ5IGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUKICAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFkZXJzOyAgICAgIC8vIG51bWJlciBvZiBQaXBlUmVhZGVyIGNsaWVudHMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgUGlwZQorICAgIGNvbnN0IGJvb2wgICAgICBtRnJlZUJ1ZmZlckluRGVzdHJ1Y3RvcjsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAppbmRleCBjZGZiNmZlLi5kYWY2YmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiBwcml2YXRlOgogICAgIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4gbVNvdXJjZTsgICAgIC8vIHRoZSB3cmFwcGVkIHNvdXJjZQotICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lQml0U2hpZnQ7IC8vIGxvZzIoZnJhbWUgc2l6ZSBpbiBieXRlcykKKyAgICAvKmNvbnN0Ki8gc2l6ZV90ICAgIG1GcmFtZVNpemU7IC8vIGZyYW1lIHNpemUgaW4gYnl0ZXMKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7IC8vIHBvaW50ZXIgdG8gYmFzZSBvZiBhbGxvY2F0ZWQgbWVtb3J5CiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsgICAgICAvLyBzaXplIG9mIG1BbGxvY2F0ZWQgaW4gZnJhbWVzCiAgICAgc2l6ZV90ICAgICAgICAgICAgICBtT2Zmc2V0OyAgICAvLyBmcmFtZSBvZmZzZXQgd2l0aGluIG1BbGxvY2F0ZWQgb2YgdmFsaWQgZGF0YQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggN2JhNWFjYy4uZmNjY2M2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KIApAQCAtMzEsNDUgKzMyLDM0IEBACiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IE1lbW9yeURlYWxlcjsKK3N0cnVjdCBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zOwogCi1zdHJ1Y3QgQUNvZGVjIDogcHVibGljIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewotICAgIGVudW0gewotICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyICAgICAgPSAnZmlsbCcsCi0gICAgICAgIGtXaGF0RHJhaW5UaGlzQnVmZmVyICAgICA9ICdkcmFpJywKLSAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAotICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2NvbScsCi0gICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmY29tJywKLSAgICAgICAga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ291dEMnLAotICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJybycsCi0gICAgICAgIGtXaGF0Q29tcG9uZW50QWxsb2NhdGVkICA9ICdjQWxsJywKLSAgICAgICAga1doYXRDb21wb25lbnRDb25maWd1cmVkID0gJ2NDb24nLAotICAgICAgICBrV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQgPSAnaXNmYycsCi0gICAgICAgIGtXaGF0U2lnbmFsZWRJbnB1dEVPUyAgICA9ICdzZW9zJywKLSAgICAgICAga1doYXRCdWZmZXJzQWxsb2NhdGVkICAgID0gJ2FsbGMnLAotICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgPSAnT01YZCcsCi0gICAgfTsKLQorc3RydWN0IEFDb2RlYyA6IHB1YmxpYyBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLCBwdWJsaWMgQ29kZWNCYXNlIHsKICAgICBBQ29kZWMoKTsKIAotICAgIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCiAgICAgdm9pZCBpbml0aWF0ZVNldHVwKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHNpZ25hbEZsdXNoKCk7Ci0gICAgdm9pZCBzaWduYWxSZXN1bWUoKTsKLSAgICB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCi0gICAgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKTsKIAotICAgIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKIAotICAgIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpOwogCi0gICAgYm9vbCBpc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrKCkgeyByZXR1cm4gbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2s7IH0KKyAgICAvLyBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lIGltcGxlbWVudHMgdGhlIG1lc3NhZ2UgaGFuZGxpbmcKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaGFuZGxlTWVzc2FnZShtc2cpOworICAgIH0KIAotICAgIHN0cnVjdCBQb3J0RGVzY3JpcHRpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbiB7CiAgICAgICAgIHNpemVfdCBjb3VudEJ1ZmZlcnMoKTsKICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKQEAgLTg2LDYgKzc2LDE2IEBACiAgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBvcnREZXNjcmlwdGlvbik7CiAgICAgfTsKIAorICAgIHN0YXRpYyBib29sIGlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yRm9ybWF0LCBPTVhfVTMyICpmbGV4aWJsZUVxdWl2YWxlbnQpOworCisgICAgLy8gUmV0dXJucyAwIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIE5PVEU6IHRoaXMgaXMgdHJlYXRlZCBieQorICAgIC8vIHNvbWUgT01YIGNvbXBvbmVudHMgYXMgYXV0byBsZXZlbCwgYW5kIGJ5IG90aGVycyBhcyBpbnZhbGlkIGxldmVsLgorICAgIHN0YXRpYyBpbnQgLyogT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqLyBnZXRBVkNMZXZlbEZvcigKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJhdGUsIGludCBiaXRyYXRlLAorICAgICAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFDb2RlYygpOwogCkBAIC0xMTksNiArMTE5LDggQEAKICAgICAgICAga1doYXRSZXF1ZXN0SURSRnJhbWUgICAgICAgICA9ICdyaWRyJywKICAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgICAgICA9ICdzZXRQJywKICAgICAgICAga1doYXRTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TID0gJ3N1Ym0nLAorICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAorICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTE3OCw2ICsxODAsOCBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlclsyXTsKIAogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVyc1syXTsKICAgICBib29sIG1Qb3J0RU9TWzJdOwpAQCAtMTg5LDcgKzE5Myw3IEBACiAgICAgYm9vbCBtSXNFbmNvZGVyOwogICAgIGJvb2wgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0OwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKLSAgICBib29sIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrOworICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtMTk3LDE2ICsyMDEsMjUgQEAKIAogICAgIGludDMyX3QgbUVuY29kZXJEZWxheTsKICAgICBpbnQzMl90IG1FbmNvZGVyUGFkZGluZzsKKyAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CiAKICAgICBib29sIG1DaGFubmVsTWFza1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CiAgICAgdW5zaWduZWQgbURlcXVldWVDb3VudGVyOwogICAgIGJvb2wgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnM7CiAgICAgaW50MzJfdCBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CisgICAgc2l6ZV90IG1OdW1VbmRlcXVldWVkQnVmZmVyczsKIAogICAgIGludDY0X3QgbVJlcGVhdEZyYW1lRGVsYXlVczsKICAgICBpbnQ2NF90IG1NYXhQdHNHYXBVczsKIAorICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisKKyAgICBib29sIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQ7CisKKyAgICBib29sIG1UdW5uZWxlZDsKKwogICAgIHN0YXR1c190IHNldEN5Y2xpY0ludHJhTWFjcm9ibG9ja1JlZnJlc2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CkBAIC0yMzAsNiArMjQzLDkgQEAKICAgICBzdGF0dXNfdCBzZXRDb21wb25lbnRSb2xlKGJvb2wgaXNFbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb2RlYyhjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soaW50MzJfdCBhdWRpb0h3U3luYywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0yMzgsNyArMjU0LDcgQEAKICAgICBzdGF0dXNfdCBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKIAogICAgIHN0YXR1c190IHNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yNDgsMTAgKzI2NCwyMCBAQAogICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb21wcmVzc2lvbkZvcm1hdCk7CiAKKyAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgeworICAgICAgICBpbnQzMl90IGRyY0N1dDsKKyAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKKyAgICAgICAgaW50MzJfdCBoZWF2eUNvbXByZXNzaW9uOworICAgICAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsOworICAgICAgICBpbnQzMl90IGVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICB9IGRyY1BhcmFtc190OworCiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBiaXRSYXRlLAotICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUyk7CisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudCwgY29uc3QgZHJjUGFyYW1zX3QmIGRyYywKKyAgICAgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZSk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIApAQCAtMjcyLDYgKzI5OCw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOwpAQCAtMzAwLDExICszMjcsMTcgQEAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBzaWduYWxFcnJvcigKICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQsCiAgICAgICAgICAgICBzdGF0dXNfdCBpbnRlcm5hbEVycm9yID0gVU5LTk9XTl9FUlJPUik7CiAKKyAgICBzdGF0aWMgYm9vbCBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisgICAgc3RhdGljIGJvb2wgZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisKICAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggYTgyOTkxNi4uZGQwYTEwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgpAQCAtMTg1LDYgKzE4NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CiAKKyAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CiAKQEAgLTIzMyw3ICsyMzUsNiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSk7CiAKICAgICB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKLSAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKICAgICBzdGF0dXNfdCByZXNldCgpOwogCiAgICAgQ2FtZXJhU291cmNlKGNvbnN0IENhbWVyYVNvdXJjZSAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjI3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDX0JBU0VfSF8KKworI2RlZmluZSBDT0RFQ19CQVNFX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGVudW0geworICAgICAgICBrV2hhdEZpbGxUaGlzQnVmZmVyICAgICAgPSAnZmlsbCcsCisgICAgICAgIGtXaGF0RHJhaW5UaGlzQnVmZmVyICAgICA9ICdkcmFpJywKKyAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2NvbScsCisgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmY29tJywKKyAgICAgICAga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkID0gJ291dEMnLAorICAgICAgICBrV2hhdEVycm9yICAgICAgICAgICAgICAgPSAnZXJybycsCisgICAgICAgIGtXaGF0Q29tcG9uZW50QWxsb2NhdGVkICA9ICdjQWxsJywKKyAgICAgICAga1doYXRDb21wb25lbnRDb25maWd1cmVkID0gJ2NDb24nLAorICAgICAgICBrV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQgPSAnaXNmYycsCisgICAgICAgIGtXaGF0U2lnbmFsZWRJbnB1dEVPUyAgICA9ICdzZW9zJywKKyAgICAgICAga1doYXRCdWZmZXJzQWxsb2NhdGVkICAgID0gJ2FsbGMnLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpID0gMDsKKworICAgIC8vIHJlcXVpcmUgYW4gZXhwbGljaXQgbWVzc2FnZSBoYW5kbGVyCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpID0gMDsKKworICAgIHN0cnVjdCBQb3J0RGVzY3JpcHRpb24gOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50QnVmZmVycygpID0gMDsKKyAgICAgICAgdmlydHVhbCBJT01YOjpidWZmZXJfaWQgYnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzcDxBQnVmZmVyPiBidWZmZXJBdChzaXplX3QgaW5kZXgpIGNvbnN0ID0gMDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgUG9ydERlc2NyaXB0aW9uKCk7CisgICAgICAgIHZpcnR1YWwgflBvcnREZXNjcmlwdGlvbigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9ydERlc2NyaXB0aW9uKTsKKyAgICB9OworCitwcm90ZWN0ZWQ6CisgICAgQ29kZWNCYXNlKCk7CisgICAgdmlydHVhbCB+Q29kZWNCYXNlKCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWNCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUNfQkFTRV9IXworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IDE1N2IxYWEuLjM2MzAyNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0zMSw3ICszMSwxMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQVN0cmluZzsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIFN0cmluZzg7CitzdHJ1Y3QgSFRUUEJhc2U7CiAKIGNsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CkBAIC00Myw4ICs0NiwxMyBAQAogICAgIH07CiAKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOworICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUgPSBOVUxMLAorICAgICAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UgPSBOVUxMKTsKKworICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICBEYXRhU291cmNlKCkge30KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM1NjJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9VUklfU09VUkNFX0hfCisKKyNkZWZpbmUgREFUQV9VUklfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworCitzdHJ1Y3QgRGF0YVVSSVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBzdGF0aWMgc3A8RGF0YVVSSVNvdXJjZT4gQ3JlYXRlKGNvbnN0IGNoYXIgKnVyaSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhVVJJU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKworICAgIERhdGFVUklTb3VyY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEYXRhVVJJU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9VUklfU09VUkNFX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKaW5kZXggYmUxNTJlNy4uYTk4MWQxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKQEAgLTMwLDYgKzMwLDcgQEAKIGNsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCiAgICAgRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDNlZjZiOWEuLjI2Y2U1ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTYzLDggKzYzLDggQEAKICAgICBpbnQzMl90IGdldFRpbWVTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lU2NhbGU7IH0KIAogICAgIHN0YXR1c190IHNldEdlb0RhdGEoaW50IGxhdGl0dWRleDEwMDAwLCBpbnQgbG9uZ2l0dWRleDEwMDAwKTsKLSAgICB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQotICAgIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9CisgICAgdmlydHVhbCBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDNkNzk1OTYuLmM4YTUwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+CisKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKIH07CiAKLWNsYXNzIE1lZGlhQnVmZmVyIHsKK2NsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7CiBwdWJsaWM6CiAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQogICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKQEAgLTU2LDEwICs1OCwxMCBAQAogCiAgICAgLy8gRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm5zIHRoZSBidWZmZXIgdG8gaXRzCiAgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwIGlmIHRoZSByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMC4KLSAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgLy8gSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgIHZvaWQgYWRkX3JlZigpOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7CiAKICAgICB2b2lkICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKaW5kZXggMDQ4ODI5Mi4uYTAwNmY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTM0LDkgKzM0LDEyIEBACiAKICAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKLSAgICAvLyBCbG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZCByZXR1cm5zIGl0IHRvIHRoZSBjYWxsZXIsCi0gICAgLy8gdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCisgICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgorICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDFmMTdlZmUuLjU0YTRlOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNiwxMCArMjYsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQUNvZGVjOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgQ29kZWNCYXNlOwogc3RydWN0IElDcnlwdG87CitzdHJ1Y3QgSUJhdHRlcnlTdGF0czsKIHN0cnVjdCBTb2Z0d2FyZVJlbmRlcmVyOwogc3RydWN0IFN1cmZhY2U7CiAKQEAgLTQ0LDExICs0NSwyMCBAQAogICAgICAgICBCVUZGRVJfRkxBR19FT1MgICAgICAgICA9IDQsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBDQl9JTlBVVF9BVkFJTEFCTEUgPSAxLAorICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKKyAgICAgICAgQ0JfRVJST1IgPSAzLAorICAgICAgICBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgQmF0dGVyeU5vdGlmaWVyOworCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlcik7CisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LApAQCAtNTYsNiArNjYsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgIHN0YXR1c190IHNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spOworCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KiBidWZmZXJQcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNjQsNiArNzYsMTAgQEAKICAgICAvLyB1bmNvbmZpZ3VyZWQuCiAgICAgc3RhdHVzX3Qgc3RvcCgpOwogCisgICAgLy8gUmVzZXRzIHRoZSBjb2RlYyB0byB0aGUgSU5JVElBTElaRUQgc3RhdGUuICBDYW4gYmUgY2FsbGVkIGFmdGVyIGFuIGVycm9yCisgICAgLy8gaGFzIG9jY3VyZWQgdG8gbWFrZSB0aGUgY29kZWMgdXNhYmxlLgorICAgIHN0YXR1c190IHJlc2V0KCk7CisKICAgICAvLyBDbGllbnQgTVVTVCBjYWxsIHJlbGVhc2UgYmVmb3JlIHJlbGVhc2luZyBmaW5hbCByZWZlcmVuY2UgdG8gdGhpcwogICAgIC8vIG9iamVjdC4KICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CkBAIC0xMDAsMTYgKzExNiwyMiBAQAogICAgICAgICAgICAgdWludDMyX3QgKmZsYWdzLAogICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMgPSAwbGwpOwogCisgICAgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpOwogICAgIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4KTsKICAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCk7CiAKICAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHdpbGwgYmUgcG9zdGVkIG9uY2UgdGhlcmUgImlzIHNvbWV0aGluZyB0byBkbyIsIGkuZS4KQEAgLTEzNSw2ICsxNTcsNyBAQAogICAgICAgICBTVEFSVElORywKICAgICAgICAgU1RBUlRFRCwKICAgICAgICAgRkxVU0hJTkcsCisgICAgICAgIEZMVVNIRUQsCiAgICAgICAgIFNUT1BQSU5HLAogICAgICAgICBSRUxFQVNJTkcsCiAgICAgfTsKQEAgLTE1OSw2ICsxODIsNyBAQAogICAgICAgICBrV2hhdEdldEJ1ZmZlcnMgICAgICAgICAgICAgICAgICAgICA9ICdnZXRCJywKICAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZmx1cycsCiAgICAgICAgIGtXaGF0R2V0T3V0cHV0Rm9ybWF0ICAgICAgICAgICAgICAgID0gJ2dldE8nLAorICAgICAgICBrV2hhdEdldElucHV0Rm9ybWF0ICAgICAgICAgICAgICAgICA9ICdnZXRJJywKICAgICAgICAga1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCAgICAgICAgICAgPSAnZElUTycsCiAgICAgICAgIGtXaGF0RGVxdWV1ZU91dHB1dFRpbWVkT3V0ICAgICAgICAgID0gJ2RPVE8nLAogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICAgICAgICAgICAgICA9ICdjb2RjJywKQEAgLTE2Niw2ICsxOTAsNyBAQAogICAgICAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbiAgICA9ICdyYWNOJywKICAgICAgICAga1doYXRHZXROYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0TicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAorICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xNzksNiArMjA0LDggQEAKICAgICAgICAga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSAgICAgICAgICA9IDEyOCwKICAgICAgICAga0ZsYWdJc0VuY29kZXIgICAgICAgICAgICAgICAgICA9IDI1NiwKICAgICAgICAga0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YSAgICA9IDUxMiwKKyAgICAgICAga0ZsYWdJc0FzeW5jICAgICAgICAgICAgICAgICAgICA9IDEwMjQsCisgICAgICAgIGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQgICAgICAgPSAyMDQ4LAogICAgIH07CiAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CkBAIC0xODYsMTkgKzIxMywzNyBAQAogICAgICAgICBzcDxBQnVmZmVyPiBtRGF0YTsKICAgICAgICAgc3A8QUJ1ZmZlcj4gbUVuY3J5cHRlZERhdGE7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgICAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKICAgICAgICAgYm9vbCBtT3duZWRCeUNsaWVudDsKICAgICB9OwogCiAgICAgU3RhdGUgbVN0YXRlOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOwotICAgIHNwPEFDb2RlYz4gbUNvZGVjOworICAgIHNwPENvZGVjQmFzZT4gbUNvZGVjOwogICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAgICAgdWludDMyX3QgbVJlcGx5SUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOworICAgIHN0YXR1c190IG1TdGlja3lFcnJvcjsKICAgICBzcDxTdXJmYWNlPiBtTmF0aXZlV2luZG93OwogICAgIFNvZnR3YXJlUmVuZGVyZXIgKm1Tb2Z0UmVuZGVyZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbUNhbGxiYWNrOworCisgICAgYm9vbCBtQmF0dGVyeVN0YXROb3RpZmllZDsKKyAgICBib29sIG1Jc1ZpZGVvOworCisgICAgLy8gaW5pdGlhbCBjcmVhdGUgcGFyYW1ldGVycworICAgIEFTdHJpbmcgbUluaXROYW1lOworICAgIGJvb2wgbUluaXROYW1lSXNUeXBlOworICAgIGJvb2wgbUluaXRJc0VuY29kZXI7CisKKyAgICAvLyBVc2VkIG9ubHkgdG8gc3luY2hyb25pemUgYXN5bmNocm9ub3VzIGdldEJ1ZmZlckFuZEZvcm1hdAorICAgIC8vIGFjcm9zcyBhbGwgdGhlIG90aGVyIChzeW5jaHJvbm91cykgYnVmZmVyIHN0YXRlIGNoYW5nZQorICAgIC8vIG9wZXJhdGlvbnMsIHN1Y2ggYXMgZGUvcXVldWVJbi9PdXRwdXRCdWZmZXIsIHN0YXJ0IGFuZAorICAgIC8vIHN0b3AvZmx1c2gvcmVzZXQvcmVsZWFzZS4KKyAgICBNdXRleCBtQnVmZmVyTG9jazsKIAogICAgIExpc3Q8c2l6ZV90PiBtQXZhaWxQb3J0QnVmZmVyc1syXTsKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gbVBvcnRCdWZmZXJzWzJdOwpAQCAtMjIyLDcgKzI2Nyw5IEBACiAgICAgc3RhdGljIHN0YXR1c190IFBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpOwogCi0gICAgc3RhdHVzX3QgaW5pdChjb25zdCBjaGFyICpuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2Rlcik7CisgICAgc3RhdGljIHZvaWQgUG9zdFJlcGx5V2l0aEVycm9yKGludDMyX3QgcmVwbHlJRCwgaW50MzJfdCBlcnIpOworCisgICAgc3RhdHVzX3QgaW5pdChjb25zdCBBU3RyaW5nICZuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2Rlcik7CiAKICAgICB2b2lkIHNldFN0YXRlKFN0YXRlIG5ld1N0YXRlKTsKICAgICB2b2lkIHJldHVybkJ1ZmZlcnNUb0NvZGVjKCk7CkBAIC0yMzIsNiArMjc5LDEwIEBACiAgICAgc3RhdHVzX3Qgb25SZWxlYXNlT3V0cHV0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzc2l6ZV90IGRlcXVldWVQb3J0QnVmZmVyKGludDMyX3QgcG9ydEluZGV4KTsKIAorICAgIHN0YXR1c190IGdldEJ1ZmZlckFuZEZvcm1hdCgKKyAgICAgICAgICAgIHNpemVfdCBwb3J0SW5kZXgsIHNpemVfdCBpbmRleCwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpidWZmZXIsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKKwogICAgIGJvb2wgaGFuZGxlRGVxdWV1ZUlucHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCA9IGZhbHNlKTsKICAgICBib29sIGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwogICAgIHZvaWQgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CkBAIC0yNDQsOSArMjk1LDI4IEBACiAKICAgICB2b2lkIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKIAorICAgIHZvaWQgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgIHZvaWQgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBpbnQzMl90IGFjdGlvbkNvZGUsIGNvbnN0IGNoYXIgKmRldGFpbCA9IE5VTEwpOworICAgIHZvaWQgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CisKICAgICBzdGF0dXNfdCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCiAgICAgc3RhdHVzX3QgYW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCB1cGRhdGVCYXR0ZXJ5U3RhdCgpOworICAgIGJvb2wgaXNFeGVjdXRpbmcoKSBjb25zdDsKKworICAgIC8qIGNhbGxlZCB0byBnZXQgdGhlIGxhc3QgY29kZWMgZXJyb3Igd2hlbiB0aGUgc3RpY2t5IGZsYWcgaXMgc2V0LgorICAgICAqIGlmIG5vIHN1Y2ggY29kZWMgZXJyb3IgaXMgZm91bmQsIHJldHVybnMgVU5LTk9XTl9FUlJPUi4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdHVzX3QgZ2V0U3RpY2t5RXJyb3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RpY2t5RXJyb3IgIT0gMCA/IG1TdGlja3lFcnJvciA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgc2V0U3RpY2t5RXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICBtU3RpY2t5RXJyb3IgPSBlcnI7CisgICAgfQogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFDb2RlYyk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCmluZGV4IDU5MDYyM2IuLjg2MDVkOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKQEAgLTIwLDcwICsyMCw2OCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1lZGlhQ29kZWNMaXN0IHsKLSAgICBzdGF0aWMgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmdldEluc3RhbmNlKCk7CitzdHJ1Y3QgQU1lc3NhZ2U7CiAKLSAgICBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdCA6IHB1YmxpYyBCbk1lZGlhQ29kZWNMaXN0IHsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRJbnN0YW5jZSgpOworCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdDsKIAotICAgIHNzaXplX3QgZmluZENvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CiAKLSAgICBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdDsKLSAgICBjb25zdCBjaGFyICpnZXRDb2RlY05hbWUoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICBib29sIGlzRW5jb2RlcihzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIGJvb2wgY29kZWNIYXNRdWlyayhzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnF1aXJrTmFtZSkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdDsKIAotICAgIHN0YXR1c190IGdldFN1cHBvcnRlZFR5cGVzKHNpemVfdCBpbmRleCwgVmVjdG9yPEFTdHJpbmc+ICp0eXBlcykgY29uc3Q7CisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKKyAgICB9CiAKLSAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKLSAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7Ci0gICAgICAgIHVpbnQzMl90IG1MZXZlbDsKLSAgICB9OwotICAgIHN0YXR1c190IGdldENvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICp0eXBlLAotICAgICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMsCi0gICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMsCi0gICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MpIGNvbnN0OworICAgIC8vIHRvIGJlIHVzZWQgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlIGFsb25lCisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0TG9jYWxJbnN0YW5jZSgpOwogCiBwcml2YXRlOgogICAgIGVudW0gU2VjdGlvbiB7CiAgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKKyAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKICAgICB9OwogCi0gICAgc3RydWN0IENvZGVjSW5mbyB7Ci0gICAgICAgIEFTdHJpbmcgbU5hbWU7Ci0gICAgICAgIGJvb2wgbUlzRW5jb2RlcjsKLSAgICAgICAgdWludDMyX3QgbVR5cGVzOwotICAgICAgICB1aW50MzJfdCBtUXVpcmtzOwotICAgIH07Ci0KLSAgICBzdGF0aWMgTWVkaWFDb2RlY0xpc3QgKnNDb2RlY0xpc3Q7CisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247CisgICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7CiAgICAgaW50MzJfdCBtRGVwdGg7CisgICAgQVN0cmluZyBtSHJlZkJhc2U7CiAKLSAgICBWZWN0b3I8Q29kZWNJbmZvPiBtQ29kZWNJbmZvczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1Db2RlY1F1aXJrczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1UeXBlczsKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IG1DdXJyZW50SW5mbzsKKyAgICBzcDxJT01YPiBtT01YOwogCiAgICAgTWVkaWFDb2RlY0xpc3QoKTsKICAgICB+TWVkaWFDb2RlY0xpc3QoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgcGFyc2VYTUxGaWxlKEZJTEUgKmZpbGUpOworICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHZvaWQgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAKICAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKICAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwpAQCAtOTMsMTMgKzkxLDE4IEBACiAgICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlID0gTlVMTCk7CiAKICAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHN0YXR1c190IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjTGlzdCk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjljOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTWVkaWFDb2RlY1NvdXJjZV9IXworI2RlZmluZSBNZWRpYUNvZGVjU291cmNlX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUxvb3BlcjsKK2NsYXNzIEFNZXNzYWdlOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIE1lZGlhQ29kZWM7CitjbGFzcyBNZXRhRGF0YTsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBlbnVtIEZsYWdCaXRzIHsKKyAgICAgICAgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCAgICAgID0gMSwKKyAgICAgICAgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQgICAgID0gMiwKKyAgICB9OworCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNTb3VyY2U+IENyZWF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIGJvb2wgaXNWaWRlbygpIGNvbnN0IHsgcmV0dXJuIG1Jc1ZpZGVvOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSB7IHJldHVybiBtTWV0YTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIC8vIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHVsbGVyOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHVsbGVyTm90aWZ5LAorICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgIH07CisKKyAgICBNZWRpYUNvZGVjU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgc3RhdHVzX3Qgb25TdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB2b2lkIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIHN0YXR1c190IGRvTW9yZVdvcmsoaW50MzJfdCBudW1JbnB1dCwgaW50MzJfdCBudW1PdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZCgpOworICAgIHZvaWQgcmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gLTFsbCk7CisgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPiA+IG1SZWZsZWN0b3I7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIHNwPFB1bGxlcj4gbVB1bGxlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBtRW5jb2RlcjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgTGlzdDx1aW50MzJfdD4gbVN0b3BSZXBseUlEUXVldWU7CisgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVN0b3BwaW5nOworICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOworICAgIHNwPEFNZXNzYWdlPiBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOworICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUlucHV0QnVmZmVyUXVldWU7CisgICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7CisgICAgTGlzdDxpbnQ2NF90PiBtRGVjb2RpbmdUaW1lUXVldWU7IC8vIGRlY29kaW5nIHRpbWUgKHVzKSBmb3IgdmlkZW8KKworICAgIC8vIGF1ZGlvIGRyaWZ0IHRpbWUKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICBMaXN0PGludDY0X3Q+IG1EcmlmdFRpbWVRdWV1ZTsKKworICAgIC8vIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByb3RlY3RlZCBieSBtT3V0cHV0QnVmZmVyTG9jaworICAgIE11dGV4IG1PdXRwdXRCdWZmZXJMb2NrOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyQ29uZDsKKyAgICBMaXN0PE1lZGlhQnVmZmVyKj4gbU91dHB1dEJ1ZmZlclF1ZXVlOworICAgIGJvb2wgbUVuY29kZXJSZWFjaGVkRU9TOworICAgIHN0YXR1c190IG1FcnJvckNvZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjU291cmNlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIE1lZGlhQ29kZWNTb3VyY2VfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCmluZGV4IGNmNWJlZGEuLmU2N2Q0ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKQEAgLTM4LDYgKzM5LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CkBAIC01OCw2ICs2MCw4IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggNjg2ZjI4Ni4uMmU2NjNlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMjMsNiArMjMsMTggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CisgICAgLy8gc3RhdHVzX3QgbWFwIGZvciBlcnJvcnMgaW4gdGhlIG1lZGlhIGZyYW1ld29yaworICAgIC8vIE9LIG9yIE5PX0VSUk9SIG9yIDAgcmVwcmVzZW50cyBubyBlcnJvci4KKworICAgIC8vIFNlZSBzeXN0ZW0vY29yZS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCisgICAgLy8gU3lzdGVtIHN0YW5kYXJkIGVycm9ycyBmcm9tIC0xIHRocm91Z2ggKHBvc3NpYmx5KSAtMTMzCisgICAgLy8KKyAgICAvLyBFcnJvcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzIGFuZCBzaWRlIGVmZmVjdHMuCisgICAgLy8gSU5WQUxJRF9PUEVSQVRJT046ICBPcGVyYXRpb24gYXR0ZW1wdGVkIGluIGFuIGlsbGVnYWwgc3RhdGUgKHdpbGwgdHJ5IHRvIHNpZ25hbCB0byBhcHApLgorICAgIC8vIERFQURfT0JKRUNUOiAgICAgICAgU2lnbmFsIGZyb20gQ29kZWNCYXNlIHRvIE1lZGlhQ29kZWMgdGhhdCBNZWRpYVNlcnZlciBoYXMgZGllZC4KKyAgICAvLyBOQU1FX05PVF9GT1VORDogICAgIFNpZ25hbCBmcm9tIENvZGVjQmFzZSB0byBNZWRpYUNvZGVjIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kLgorCisgICAgLy8gTWVkaWEgZXJyb3JzCiAgICAgTUVESUFfRVJST1JfQkFTRSAgICAgICAgPSAtMTAwMCwKIAogICAgIEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEID0gTUVESUFfRVJST1JfQkFTRSwKQEAgLTQ2LDI2ICs1OCw1NCBAQAogICAgIC8vIGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCiAgICAgRFJNX0VSUk9SX0JBU0UgPSAtMjAwMCwKIAotICAgIEVSUk9SX0RSTV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAotICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMSwKLSAgICBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDIsCi0gICAgRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAotICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gNCwKLSAgICBFUlJPUl9EUk1fREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUsCi0gICAgRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAotICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNywKLSAgICBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDgsCi0gICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAotICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfRFJNX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAorICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfRFJNX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBEUk1fRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDExLAogCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCisgICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0RSTV9WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKIAogICAgIC8vIEhlYXJ0YmVhdCBFcnJvciBDb2RlcwogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAorCisgICAgLy8gTkRLIEVycm9yIGNvZGVzCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKKyAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCisgICAgLy8gZnJvbSAtMjAwMDAgKDB4RkZGRkIxRTAgLSAweEZGRkZCMUQ3KQorCisgICAgLy8gQ29kZWMgZXJyb3JzIGFyZSBwZXJtaXR0ZWQgZnJvbSAweDgwMDAxMDAwIHRocm91Z2ggMHg5MDAwRkZGRgorICAgIEVSUk9SX0NPREVDX01BWCAgICA9IChzaWduZWQpMHg5MDAwRkZGRiwKKyAgICBFUlJPUl9DT0RFQ19NSU4gICAgPSAoc2lnbmVkKTB4ODAwMDEwMDAsCisKKyAgICAvLyBTeXN0ZW0gdW5rbm93biBlcnJvcnMgZnJvbSAweDgwMDAwMDAwIC0gMHg4MDAwMDAwNyAoSU5UMzJfTUlOICsgNykKKyAgICAvLyBTZWUgc3lzdGVtL2NvcmUvaW5jbHVkZS91dGlscy9FcnJvcnMuaAogfTsKIAorLy8gYWN0aW9uIGNvZGVzIGZvciBNZWRpYUNvZGVjcyB0aGF0IHRlbGwgdGhlIHVwcGVyIGxheWVyIGFuZCBhcHBsaWNhdGlvbgorLy8gdGhlIHNldmVyaXR5IG9mIGFueSBlcnJvci4KK2VudW0gQWN0aW9uQ29kZSB7CisgICAgQUNUSU9OX0NPREVfRkFUQUwsCisgICAgQUNUSU9OX0NPREVfVFJBTlNJRU5ULAorICAgIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFLAorfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGVyciBpcyBhIHJlY29nbml6ZWQgRFJNIGVycm9yIGNvZGUKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NyeXB0b0Vycm9yKHN0YXR1c190IGVycikgeworICAgIHJldHVybiAoRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgPD0gZXJyICYmIGVyciA8PSBFUlJPUl9EUk1fVU5LTk9XTikKKyAgICAgICAgICAgIHx8IChFUlJPUl9EUk1fVkVORE9SX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRURJQV9FUlJPUlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAzMDc2YTk2Li4xODM5MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC02NSw2ICs2NSw4IEBACiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgeworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkgOiBtSXNEcm0oZmFsc2UpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggZmY2YTY2ZS4uYmJlNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZXRhRGF0YTsKLXN0cnVjdCBNUEVHNFdyaXRlcjsKK3N0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKIC8vIHN1cHBvcnQgYSBtcDQgZmlsZSBhcyB0aGUgb3V0cHV0LgpAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgogICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgdWludDMyX3QgZmxhZ3MpIDsKIAogcHJpdmF0ZToKLSAgICBzcDxNUEVHNFdyaXRlcj4gbVdyaXRlcjsKKyAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggMjA0ZDFjNi4uYTY1M2RiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtODIsNiArODIsMTAgQEAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBPcHRpb25zIHsKICAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLApAQCAtOTEsNiArOTUsNyBAQAogICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwogICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIGludDY0X3QgbUxhdGVuZXNzVXM7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwogICAgIH07CiAKICAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggNWNjOGRjZi4uZTI3ZWExZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtNDgsNiArNDgsOSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykge30KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYVdyaXRlcigpIHt9CiAgICAgaW50NjRfdCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IGRiODIxNmIuLjA4N2QwMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTUzLDkgKzUzLDEzIEBACiAgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKQEAgLTE2MiwxMSArMTY2LDE5IEBACiAgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CiAKICAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KKyAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KKyAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KKyAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCiB9OwogCiBlbnVtIHsKICAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAogICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1YWU2ZjZiLi40MDJlN2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggNTEyMWMxNy4uZTM0MTE2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIGNsYXNzIE1lbW9yeURlYWxlcjsKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyOwogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsOwpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICBWZWN0b3I8Q29kZWNOYW1lQW5kUXVpcmtzPiAqbWF0Y2hpbmdDb2RlY05hbWVzQW5kUXVpcmtzKTsKIAogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmbGlzdCk7CiAKICAgICBzdGF0aWMgYm9vbCBmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcyk7CiAKQEAgLTM1Miw2ICszNTIsOSBAQAogCiAgICAgaW50NjRfdCBnZXREZWNvZGluZ1RpbWVVcygpOwogCisgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwogICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAppbmRleCAyNjUzYjUzLi4wOThhYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaApAQCAtNDcsNiArNDcsNyBAQAogIHByaXZhdGU6CiAgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOwogICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgaW50MzJfdCBtU2tpcDsKICAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CiAgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CiAgICAgaW50MzJfdCBtV3JpdGVIZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKaW5kZXggZGI1Zjk0Ny4uNDNiNzVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKICAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgc3A8QnVmZmVyUXVldWU+IGdldEJ1ZmZlclF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KIAogICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKQEAgLTEzOSwxMiArMTM5LDE3IEBACiAgICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCisgICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyUXVldWUgaXMgdGhlIGV4Y2hhbmdlIHBvaW50IGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZAotICAgIC8vIHRoaXMgY29uc3VtZXIKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIEEgQnVmZmVyUXVldWUsIHJlcHJlc2VudGVkIGJ5IHRoZXNlIGludGVyZmFjZXMsIGlzIHRoZSBleGNoYW5nZSBwb2ludAorICAgIC8vIGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZCB0aGlzIGNvbnN1bWVyCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIHN0cnVjdCBTbG90RGF0YSB7CiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGJiYWQyNzEuLmE3OTVjODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTUzLDYgKzUzLDkgQEAKIC8vIENvbnZlcnQgYSBNSU1FIHR5cGUgdG8gYSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0CiBzdGF0dXNfdCBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCBjb25zdCBjaGFyKiBtaW1lKTsKIAorLy8gQ29udmVydCBhIGFhYyBwcm9maWxlIHRvIGEgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdAordm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSk7CisKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIApAQCAtNjAsNiArNjMsOCBAQAogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwogCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8gPSBmYWxzZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKaW5kZXggOWVjZWVhMy4uNzJlM2Q4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKQEAgLTE4LDggKzE4LDM3IEBACiAKICNkZWZpbmUgQV9CQVNFX0hfCiAKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQorCiAjZGVmaW5lIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKG5hbWUpIFwKICAgICBuYW1lKGNvbnN0IG5hbWUgJik7IFwKICAgICBuYW1lICZvcGVyYXRvcj0oY29uc3QgbmFtZSAmKQogCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgcGFyYW1ldGVyIGlzIHNhZmUgZm9yIG5ldyBhcnJheSBhbGxvY2F0aW9uICgzMi1iaXQpCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBpZiAoIWlzU2FmZUFycmF5U2l6ZTx1aW50MzJfdD4oYXJyYXlTaXplKSkgeworICogICAgIHJldHVybiBCQURfVkFMVUU7CisgKiB9CisgKiAuLi4KKyAqIHVpbnQzMl90ICpteUFycmF5ID0gbmV3IHVpbnQzMl90W2FycmF5U2l6ZV07CisgKgorICogVGhlcmUgaXMgYSBidWcgaW4gZ2NjIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA0Ljggd2hlcmUgdGhlIG5ld1tdIGFycmF5IGFsbG9jYXRpb24KKyAqIHdpbGwgb3ZlcmZsb3cgaW4gdGhlIGludGVybmFsIDMyIGJpdCBoZWFwIGFsbG9jYXRpb24sIHJlc3VsdGluZyBpbiBhbgorICogdW5kZXJhbGxvY2F0ZWQgYXJyYXkuIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSB0aGF0IGFsbG93cyBwb3RlbnRpYWwgb3ZlcndyaXRpbmcKKyAqIG9mIG90aGVyIGhlYXAgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB0byBjaGVja2luZyBpcyB0byBjcmVhdGUgYSBzYWZlIG5ldyBhcnJheSB0ZW1wbGF0ZSBmdW5jdGlvbiB3aGljaAorICogZWl0aGVyIHRocm93cyBhIHN0ZDo6YmFkX2FsbG9jIGV4Y2VwdGlvbiBvciByZXR1cm5zIE5VTEwvbnVsbHB0cl90OyBOVUxMIGNvbnNpZGVyZWQKKyAqIHNhZmUgc2luY2Ugbm9ybWFsIGFjY2VzcyBvZiBOVUxMIHRocm93cyBhbiBleGNlcHRpb24uCisgKgorICogaHR0cHM6Ly9zZWN1cml0eWJsb2cucmVkaGF0LmNvbS8yMDEyLzEwLzMxL2FycmF5LWFsbG9jYXRpb24taW4tY3h4LworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2Jvb2wgaXNTYWZlQXJyYXlTaXplKFMgc2l6ZSkgeworICAgIHJldHVybiBzaXplID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBTIGlzIHNpZ25lZCwgaWdub3JlZCBpZiBub3QuCisgICAgICAgICAgICAmJiBzaXplIDw9IDB4ZmZmZmZmZmYgLyBzaXplb2YoVCk7ICAvLyBtYXgtdW5zaWduZWQtMzItYml0LWludCAvIGVsZW1lbnQtc2l6ZS4KK30KKwogI2VuZGlmICAvLyBBX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oCmluZGV4IDU1MTBiMTIuLmMzYmYwZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApAQCAtMjUsOCArMjUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlciB7CitjbGFzcyBBQml0UmVhZGVyIHsKK3B1YmxpYzoKICAgICBBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5BQml0UmVhZGVyKCk7CiAKICAgICB1aW50MzJfdCBnZXRCaXRzKHNpemVfdCBuKTsKICAgICB2b2lkIHNraXBCaXRzKHNpemVfdCBuKTsKQEAgLTM3LDE4ICszOSwzMiBAQAogCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OwogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZTsKIAogICAgIHVpbnQzMl90IG1SZXNlcnZvaXI7ICAvLyBsZWZ0LWFsaWduZWQgYml0cwogICAgIHNpemVfdCBtTnVtQml0c0xlZnQ7CiAKLSAgICB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmlsbFJlc2Vydm9pcigpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJpdFJlYWRlcik7CiB9OwogCitjbGFzcyBOQUxCaXRSZWFkZXIgOiBwdWJsaWMgQUJpdFJlYWRlciB7CitwdWJsaWM6CisgICAgTkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgYXRMZWFzdE51bUJpdHNMZWZ0KHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1aZXJvczsKKworICAgIHZpcnR1YWwgdm9pZCBmaWxsUmVzZXJ2b2lyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOQUxCaXRSZWFkZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBX0JJVF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCmluZGV4IDI4ZjBhZWQuLjYyOTRlZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApAQCAtMjcsNiArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CiAKIHN0cnVjdCBBQnVmZmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKQEAgLTQyLDExICs0MywxNyBAQAogCiAgICAgdm9pZCBzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZyb20gZHVwIG9mIHNvbWUgbWVtb3J5IGJsb2NrCisgICAgc3RhdGljIHNwPEFCdWZmZXI+IENyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpOworCiAgICAgdm9pZCBzZXRJbnQzMkRhdGEoaW50MzJfdCBkYXRhKSB7IG1JbnQzMkRhdGEgPSBkYXRhOyB9CiAgICAgaW50MzJfdCBpbnQzMkRhdGEoKSBjb25zdCB7IHJldHVybiBtSW50MzJEYXRhOyB9CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKKyAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKIApAQCAtNTQsNiArNjEsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtRmFyZXdlbGw7CiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICptTWVkaWFCdWZmZXJCYXNlOworCiAgICAgdm9pZCAqbURhdGE7CiAgICAgc2l6ZV90IG1DYXBhY2l0eTsKICAgICBzaXplX3QgbVJhbmdlT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKaW5kZXggZDJlNmIyOC4uM2JiN2Q3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCkBAIC00MywxMyArNDMsMTMgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBU3RhdGUpOwogfTsKIAotc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgQUhhbmRsZXIgeworc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewogICAgIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgLy8gT25seSB0byBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlLgogICAgIHZvaWQgY2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKaW5kZXggOTQwZmM1NS4uNGQ3NmI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC01Niw4ICs1Niw2IEBACiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgc3A8QU1lc3NhZ2U+ID4gbVJlcGxpZXM7CiAKLSAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZV9sKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3BlclJvc3Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDdlODIzZWIuLmE5ZTIzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgdm9pZCBzZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIHZhbHVlKTsKICAgICB2b2lkIHNldFBvaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUpOwogICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbGVuID0gLTEpOworICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFTdHJpbmcgJnMpOwogICAgIHZvaWQgc2V0T2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmopOwogICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2V0TWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm9iaik7CkBAIC01OCw2ICs1OSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwogCisgICAgYm9vbCBjb250YWlucyhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKwogICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKICAgICBib29sIGZpbmRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CiAgICAgYm9vbCBmaW5kU2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKnZhbHVlKSBjb25zdDsKQEAgLTEzNCw3ICsxMzcsOSBAQAogICAgICAgICAgICAgUmVjdCByZWN0VmFsdWU7CiAgICAgICAgIH0gdTsKICAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNpemVfdCAgICAgIG1OYW1lTGVuZ3RoOwogICAgICAgICBUeXBlIG1UeXBlOworICAgICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTQ0LDEyICsxNDksMTQgQEAKICAgICBzaXplX3QgbU51bUl0ZW1zOwogCiAgICAgSXRlbSAqYWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHZvaWQgZnJlZUl0ZW0oSXRlbSAqaXRlbSk7CisgICAgdm9pZCBmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pOwogICAgIGNvbnN0IEl0ZW0gKmZpbmRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICB2b2lkIHNldE9iamVjdEludGVybmFsKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKTsKIAorICAgIHNpemVfdCBmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lc3NhZ2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggMGY4ZjFlMS4uN2M5ODY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0xOCwxNCArMTgsMTkgQEAKIAogI2RlZmluZSBBX1NUUklOR19IXwogCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IFN0cmluZzg7CitzdHJ1Y3QgUGFyY2VsOworCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwogICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKTsKICAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOwogICAgIH5BU3RyaW5nKCk7CkBAIC02NywxNiArNzIsMjYgQEAKICAgICBzaXplX3QgaGFzaCgpIGNvbnN0OwogCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKIAogICAgIGludCBjb21wYXJlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBlcXVhbHNJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKICAgICBib29sIHN0YXJ0c1dpdGgoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKICAgICBib29sIGVuZHNXaXRoKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CisgICAgYm9vbCBzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIGJvb2wgZW5kc1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CiAKICAgICB2b2lkIHRvbG93ZXIoKTsKIAorICAgIHN0YXRpYyBBU3RyaW5nIEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTczYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9VVElMU19IXworCisjZGVmaW5lIEFfVVRJTFNfSF8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBtYXRoIHRlbXBsYXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIGRlbiBtdXN0IG5vdCBiZSAwICovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBjb25zdCBUIGRpdlJvdW5kKGNvbnN0IFQgJm5vbSwgY29uc3QgVCAmZGVuKSB7CisgICAgaWYgKChub20gPj0gMCkgXiAoZGVuID49IDApKSB7CisgICAgICAgIHJldHVybiAobm9tIC0gZGVuIC8gMikgLyBkZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChub20gKyBkZW4gLyAyKSAvIGRlbjsKKyAgICB9Cit9CisKKy8qID09IGNlaWwobm9tIC8gZGVuKS4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2VXAoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKKyAgICBpZiAoZGVuIDwgMCkgeworICAgICAgICByZXR1cm4gKG5vbSA8IDAgPyBub20gKyBkZW4gKyAxIDogbm9tKSAvIGRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG5vbSA8IDAgPyBub20gOiBub20gKyBkZW4gLSAxKSAvIGRlbjsKKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIFQgYWJzKGNvbnN0IFQgJmEpIHsKKyAgICByZXR1cm4gYSA8IDAgPyAtYSA6IGE7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgJm1pbihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgJm1heChjb25zdCBUICZhLCBjb25zdCBUICZiKSB7CisgICAgcmV0dXJuIGEgPiBiID8gYSA6IGI7Cit9CisKKy8qIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlICovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW5saW5lIHN0YXRpYyBUIHBlcmlvZGljRXJyb3IoY29uc3QgVCAmdmFsLCBjb25zdCBUICZwZXJpb2QpIHsKKyAgICBUIGVyciA9IGFicyh2YWwpICUgcGVyaW9kOworICAgIHJldHVybiAoZXJyIDwgKHBlcmlvZCAvIDIpKSA/IGVyciA6IChwZXJpb2QgLSBlcnIpOworfQorCisjZW5kaWYgIC8vIEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQxOGZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZSB7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJCYXNlKCkge30KKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlckJhc2UoY29uc3QgTWVkaWFCdWZmZXJCYXNlICYpOworICAgIE1lZGlhQnVmZmVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKaW5kZXggZjIzYzMzNy4uMzdlZjY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQUxvb3BlcjsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIE1lZGlhUGxheWVyQmFzZTsKIGNsYXNzIE1lZGlhU291cmNlOwogY2xhc3MgUGFyY2VsOwpAQCAtMzQsNyArMzUsOSBAQAogCiBjbGFzcyBUaW1lZFRleHREcml2ZXIgewogcHVibGljOgotICAgIFRpbWVkVGV4dERyaXZlcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7CisgICAgVGltZWRUZXh0RHJpdmVyKAorICAgICAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIH5UaW1lZFRleHREcml2ZXIoKTsKIApAQCAtNzcsNiArODAsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8VGltZWRUZXh0UGxheWVyPiBtUGxheWVyOwogICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOworICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAKICAgICAvLyBWYXJpYWJsZXMgdG8gYmUgZ3VhcmRlZCBieSBtTG9jay4KICAgICBTdGF0ZSBtU3RhdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3ZjRjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ29kZWMuaApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0NPREVDX0gKKyNkZWZpbmUgX05ES19NRURJQV9DT0RFQ19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitzdHJ1Y3QgQU1lZGlhQ29kZWM7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlYyBBTWVkaWFDb2RlYzsKKworc3RydWN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyB7CisgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgaW50MzJfdCBzaXplOworICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworfTsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyBBTWVkaWFDb2RlY0J1ZmZlckluZm87Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm8gQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworCitlbnVtIHsKKyAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNID0gNCwKKyAgICBBTUVESUFDT0RFQ19DT05GSUdVUkVfRkxBR19FTkNPREUgPSAxLAorICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCA9IC0zLAorICAgIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEID0gLTIsCisgICAgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIgPSAtMQorfTsKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbmFtZS4gVXNlIHRoaXMgaWYgeW91IGtub3cgdGhlIGV4YWN0IGNvZGVjIHlvdSB3YW50IHRvIHVzZS4KKyAqIFdoZW4gY29uZmlndXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRvIHVzZSB0aGUgY29kZWMgYXMgYW4KKyAqIGVuY29kZXIgb3IgZGVjb2Rlci4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKioKKyAqIENyZWF0ZSBjb2RlYyBieSBtaW1lIHR5cGUuIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgdXNlIHRoaXMsIHNwZWNpZnlpbmcgYQorICogbWltZSB0eXBlIG9idGFpbmVkIGZyb20gbWVkaWEgZXh0cmFjdG9yLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCisvKioKKyAqIENyZWF0ZSBlbmNvZGVyIGJ5IG5hbWUuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSk7CisKKy8qKgorICogZGVsZXRlIHRoZSBjb2RlYyBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyopOworCisvKioKKyAqIENvbmZpZ3VyZSB0aGUgY29kZWMuIEZvciBkZWNvZGluZyB5b3Ugd291bGQgdHlwaWNhbGx5IGdldCB0aGUgZm9ybWF0IGZyb20gYW4gZXh0cmFjdG9yLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19jb25maWd1cmUoCisgICAgICAgIEFNZWRpYUNvZGVjKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHN1cmZhY2UsCisgICAgICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvLAorICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogU3RhcnQgdGhlIGNvZGVjLiBBIGNvZGVjIG11c3QgYmUgY29uZmlndXJlZCBiZWZvcmUgaXQgY2FuIGJlIHN0YXJ0ZWQsIGFuZCBtdXN0IGJlIHN0YXJ0ZWQKKyAqIGJlZm9yZSBidWZmZXJzIGNhbiBiZSBzZW50IHRvIGl0LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdGFydChBTWVkaWFDb2RlYyopOworCisvKioKKyAqIFN0b3AgdGhlIGNvZGVjLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdG9wKEFNZWRpYUNvZGVjKik7CisKKy8qCisgKiBGbHVzaCB0aGUgY29kZWMncyBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgaW5kaWNlcyBwcmV2aW91c2x5IHJldHVybmVkIGZyb20gY2FsbHMgdG8KKyAqIEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlciBhbmQgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlciBiZWNvbWUgaW52YWxpZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZmx1c2goQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBHZXQgYW4gaW5wdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVJbnB1dEJ1ZmZlciwgYW5kIG5vdCB5ZXQgcXVldWVkLgorICovCit1aW50OF90KiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisvKioKKyAqIEdldCBhbiBvdXRwdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVPdXRwdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqLwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisKKy8qKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgaW5wdXQgYnVmZmVyLiBBbiBhcHAgd2lsbCB0eXBpY2FsbHkgdXNlIHRoaXMgd2l0aAorICogZ2V0SW5wdXRCdWZmZXIoKSB0byBnZXQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIsIHRoZW4gY29weSB0aGUgZGF0YSB0byBiZSBlbmNvZGVkIG9yIGRlY29kZWQKKyAqIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgY29kZWMuCisgKi8KK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgaW50NjRfdCB0aW1lb3V0VXMpOworCisvKioKKyAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogR2V0IHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYnVmZmVyIG9mIHByb2Nlc3NlZCBkYXRhLgorICovCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sIGludDY0X3QgdGltZW91dFVzKTsKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogSWYgeW91IGFyZSBkb25lIHdpdGggYSBidWZmZXIsIHVzZSB0aGlzIGNhbGwgdG8gcmV0dXJuIHRoZSBidWZmZXIgdG8KKyAqIHRoZSBjb2RlYy4gSWYgeW91IHByZXZpb3VzbHkgc3BlY2lmaWVkIGEgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMKKyAqIHZpZGVvIGRlY29kZXIgeW91IGNhbiBvcHRpb25hbGx5IHJlbmRlciB0aGUgYnVmZmVyLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpOworCisvKioKKyAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHVwZGF0ZSBpdHMgc3VyZmFjZSB0aW1lc3RhbXAKKyAqIGFuZCByZXR1cm4gaXQgdG8gdGhlIGNvZGVjIHRvIHJlbmRlciBpdCBvbiB0aGUgb3V0cHV0IHN1cmZhY2UuIElmIHlvdQorICogaGF2ZSBub3Qgc3BlY2lmaWVkIGFuIG91dHB1dCBzdXJmYWNlIHdoZW4gY29uZmlndXJpbmcgdGhpcyB2aWRlbyBjb2RlYywKKyAqIHRoaXMgY2FsbCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY29kZWMuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMucmVsZWFzZU91dHB1dEJ1ZmZlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKTsKKworCit0eXBlZGVmIGVudW0geworICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVIgPSAwLAorICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUiA9IDEKK30gY3J5cHRvaW5mb19tb2RlX3Q7CisKKy8qKgorICogQ3JlYXRlIGFuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBmcm9tIHNjcmF0Y2guIFVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIHVzZSBjdXN0b20KKyAqIGNyeXB0byBpbmZvLCByYXRoZXIgdGhhbiBvbmUgb2J0YWluZWQgZnJvbSBBTWVkaWFFeHRyYWN0b3IuCisgKgorICogQU1lZGlhQ29kZWNDcnlwdG9JbmZvIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIGFuIChhdCBsZWFzdAorICogcGFydGlhbGx5KSBlbmNyeXB0ZWQgaW5wdXQgc2FtcGxlLgorICogQSBidWZmZXIncyBkYXRhIGlzIGNvbnNpZGVyZWQgdG8gYmUgcGFydGl0aW9uZWQgaW50byAic3Vic2FtcGxlcyIsCisgKiBlYWNoIHN1YnNhbXBsZSBzdGFydHMgd2l0aCBhIChwb3RlbnRpYWxseSBlbXB0eSkgcnVuIG9mIHBsYWluLAorICogdW5lbmNyeXB0ZWQgYnl0ZXMgZm9sbG93ZWQgYnkgYSAoYWxzbyBwb3RlbnRpYWxseSBlbXB0eSkgcnVuIG9mCisgKiBlbmNyeXB0ZWQgYnl0ZXMuCisgKiBudW1CeXRlc09mQ2xlYXJEYXRhIGNhbiBiZSBudWxsIHRvIGluZGljYXRlIHRoYXQgYWxsIGRhdGEgaXMgZW5jcnlwdGVkLgorICogVGhpcyBpbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZXMgcGVyLXNhbXBsZSBtZXRhZGF0YSBhcyBvdXRsaW5lZCBpbgorICogSVNPL0lFQyBGRElTIDIzMDAxLTc6MjAxMSAiQ29tbW9uIGVuY3J5cHRpb24gaW4gSVNPIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQgZmlsZXMiLgorICovCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcoCisgICAgICAgIGludCBudW1zdWJzYW1wbGVzLAorICAgICAgICB1aW50OF90IGtleVsxNl0sCisgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICBjcnlwdG9pbmZvX21vZGVfdCBtb2RlLAorICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCisgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpOworCisvKioKKyAqIGRlbGV0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gY3JlYXRlZCBwcmV2aW91c2x5IHdpdGggQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldywgb3IKKyAqIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogVGhlIG51bWJlciBvZiBzdWJzYW1wbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVmZmVyJ3MgY29udGVudHMuCisgKi8KK3NpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qKTsKKworLyoqCisgKiBBIDE2LWJ5dGUgb3BhcXVlIGtleQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0S2V5KEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogQSAxNi1ieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KTsKKworLyoqCisgKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uIHRoYXQgaGFzIGJlZW4gYXBwbGllZCwKKyAqIG9uZSBvZiBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSIG9yIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUi4KKyAqLworY3J5cHRvaW5mb19tb2RlX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogVGhlIG51bWJlciBvZiBsZWFkaW5nIHVuZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCk7CisKKy8qKgorICogVGhlIG51bWJlciBvZiB0cmFpbGluZyBlbmNyeXB0ZWQgYnl0ZXMgaW4gZWFjaCBzdWJzYW1wbGUuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vX05ES19NRURJQV9DT0RFQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUNyeXB0by5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM3NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DUllQVE9fSAorI2RlZmluZSBfTkRLX01FRElBX0NSWVBUT19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUNyeXB0bzsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUNyeXB0byBBTWVkaWFDcnlwdG87CisKK3R5cGVkZWYgdWludDhfdCBBTWVkaWFVVUlEWzE2XTsKKworYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKTsKKworYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpOworCitBTWVkaWFDcnlwdG8qIEFNZWRpYUNyeXB0b19uZXcoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IGluaXREYXRhU2l6ZSk7CisKK3ZvaWQgQU1lZGlhQ3J5cHRvX2RlbGV0ZShBTWVkaWFDcnlwdG8qIGNyeXB0byk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFEcm0uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhZmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmgKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9EUk1fSAorI2RlZmluZSBfTkRLX01FRElBX0RSTV9ICisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworc3RydWN0IEFNZWRpYURybTsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybSBBTWVkaWFEcm07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7CisgICAgc2l6ZV90IGxlbmd0aDsKK30gQU1lZGlhRHJtQnl0ZUFycmF5OworCit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TZXNzaW9uSWQ7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TY29wZTsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybUtleVNldElkOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2VjdXJlU3RvcDsKKworCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtRXZlbnRUeXBlIHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBuZWVkcyB0byByZXF1ZXN0IGEgY2VydGlmaWNhdGUgZnJvbQorICAgICAqIHRoZSBwcm92aXNpb25pbmcgc2VydmVyLiAgVGhlIHJlcXVlc3QgbWVzc2FnZSBkYXRhIGlzIG9idGFpbmVkIHVzaW5nCisgICAgICogQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3QuCisgICAgICovCisgICAgRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwIG5lZWRzIHRvIHJlcXVlc3Qga2V5cyBmcm9tIGEgbGljZW5zZQorICAgICAqIHNlcnZlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YSBpcyBvYnRhaW5lZCB1c2luZyBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdC4KKyAgICAgKi8KKyAgICBFVkVOVF9LRVlfUkVRVUlSRUQgPSAyLAorCisgICAgLyoqCisgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBsaWNlbnNlZCB1c2FnZSBkdXJhdGlvbiBmb3Iga2V5cyBpbiBhIHNlc3Npb24KKyAgICAgKiBoYXMgZXhwaXJlZC4gIFRoZSBrZXlzIGFyZSBubyBsb25nZXIgdmFsaWQuCisgICAgICovCisgICAgRVZFTlRfS0VZX0VYUElSRUQgPSAzLAorCisgICAgLyoqCisgICAgICogVGhpcyBldmVudCBtYXkgaW5kaWNhdGUgc29tZSBzcGVjaWZpYyB2ZW5kb3ItZGVmaW5lZCBjb25kaXRpb24sIHNlZSB5b3VyCisgICAgICogRFJNIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMKKyAgICAgKi8KKyAgICBFVkVOVF9WRU5ET1JfREVGSU5FRCA9IDQKK30gQU1lZGlhRHJtRXZlbnRUeXBlOworCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFEcm1FdmVudExpc3RlbmVyKShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIEFNZWRpYURybUV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFTaXplKTsKKworCisvKioKKyAqIFF1ZXJ5IGlmIHRoZSBnaXZlbiBzY2hlbWUgaWRlbnRpZmllZCBieSBpdHMgVVVJRCBpcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UsIGFuZAorICogd2hldGhlciB0aGUgZHJtIHBsdWdpbiBpcyBhYmxlIHRvIGhhbmRsZSB0aGUgbWVkaWEgY29udGFpbmVyIGZvcm1hdCBzcGVjaWZpZWQgYnkgbWltZVR5cGUuCisgKgorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKiBtaW1lVHlwZSBpcyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtZWRpYSBjb250YWluZXIsIGUuZy4gInZpZGVvL21wNCIuICBJZiBtaW1lVHlwZQorICogaXMgbm90IGtub3duIG9yIHJlcXVpcmVkLCBpdCBjYW4gYmUgcHJvdmlkZWQgYXMgTlVMTC4KKyAqLworYm9vbCBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCAqdXVpZCwgY29uc3QgY2hhciAqbWltZVR5cGUpOworCisvKioKKyAqIENyZWF0ZSBhIE1lZGlhRHJtIGluc3RhbmNlIGZyb20gYSBVVUlECisgKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KKyAqLworQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IHVpbnQ4X3QgKnV1aWQpOworCisvKioKKyAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QKKyAqLwordm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKik7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXZlbnQgb2NjdXJzCisgKgorICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtICosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpOworCisvKioKKyAqIE9wZW4gYSBuZXcgc2Vzc2lvbiB3aXRoIHRoZSBNZWRpYURybSBvYmplY3QuICBBIHNlc3Npb24gSUQgaXMgcmV0dXJuZWQuCisgKgorICogcmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcHJvdmlzaW9uaW5nIGlzIG5lZWRlZAorICogcmV0dXJucyBNRURJQURSTV9SRVNPVVJDRV9CVVNZX0VSUk9SIGlmIHJlcXVpcmVkIHJlc291cmNlcyBhcmUgaW4gdXNlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9vcGVuU2Vzc2lvbihBTWVkaWFEcm0gKiwgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOworCisvKioKKyAqIENsb3NlIGEgc2Vzc2lvbiBvbiB0aGUgTWVkaWFEcm0gb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkCisgKiB3aXRoIEFNZWRpYURybV9vcGVuU2Vzc2lvbi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpOworCit0eXBlZGVmIGVudW0gQU1lZGlhRHJtS2V5VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvbmxpbmUgdXNlLCB0aGV5IHdpbGwKKyAgICAgKiBub3QgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3Igc3Vic2VxdWVudCB1c2Ugd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKKyAgICAgKiB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfU1RSRUFNSU5HID0gMSwKKworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUga2V5cyB3aWxsIGJlIGZvciBvZmZsaW5lIHVzZSwgdGhleQorICAgICAqIHdpbGwgYmUgc2F2ZWQgdG8gdGhlIGRldmljZSBmb3IgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAgICAgKi8KKyAgICBLRVlfVFlQRV9PRkZMSU5FID0gMiwKKworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWZpZXMgdGhhdCBwcmV2aW91c2x5IHNhdmVkIG9mZmxpbmUga2V5cyBzaG91bGQgYmUgcmVsZWFzZWQuCisgICAgICovCisgICAgS0VZX1RZUEVfUkVMRUFTRSA9IDMKK30gQU1lZGlhRHJtS2V5VHlwZTsKKworLyoqCisgKiAgRGF0YSB0eXBlIGNvbnRhaW5pbmcge2tleSwgdmFsdWV9IHBhaXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5VmFsdWVQYWlyIHsKKyAgICBjb25zdCBjaGFyICptS2V5OworICAgIGNvbnN0IGNoYXIgKm1WYWx1ZTsKK30gQU1lZGlhRHJtS2V5VmFsdWU7CisKKy8qKgorICogQSBrZXkgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIGxpY2Vuc2Ugc2VydmVyCisgKiB0byBvYnRhaW4gb3IgcmVsZWFzZSBrZXlzIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgY29udGVudC4KKyAqIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IGlzIHVzZWQgdG8gb2J0YWluIGFuIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIGlzIGRlbGl2ZXJlZCB0byB0aGUgbGljZW5zZSBzZXJ2ZXIuICBUaGUgb3BhcXVlIGtleSByZXF1ZXN0IGJ5dGUgYXJyYXkgaXMKKyAqIHJldHVybmVkIGluIEtleVJlcXVlc3QuZGF0YS4gIFRoZSByZWNvbW1lbmRlZCBVUkwgdG8gZGVsaXZlciB0aGUga2V5IHJlcXVlc3QgdG8KKyAqIGlzIHJldHVybmVkIGluIEtleVJlcXVlc3QuZGVmYXVsdFVybC4KKyAqCisgKiBBZnRlciB0aGUgYXBwIGhhcyByZWNlaXZlZCB0aGUga2V5IHJlcXVlc3QgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLAorICogaXQgc2hvdWxkIGRlbGl2ZXIgdG8gdGhlIHJlc3BvbnNlIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyB0aGUgbWV0aG9kCisgKiBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNjb3BlIG1heSBiZSBhIHNlc3Npb25JZCBvciBhIGtleVNldElkLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBrZXlUeXBlLgorICogV2hlbiB0aGUga2V5VHlwZSBpcyBLRVlfVFlQRV9TVFJFQU1JTkcgb3IgS0VZX1RZUEVfT0ZGTElORSwgc2NvcGUgc2hvdWxkIGJlIHNldAorICogdG8gdGhlIHNlc3Npb25JZCB0aGUga2V5cyB3aWxsIGJlIHByb3ZpZGVkIHRvLiAgV2hlbiB0aGUga2V5VHlwZSBpcworICogS0VZX1RZUEVfUkVMRUFTRSwgc2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgb2YgdGhlIGtleXMgYmVpbmcgcmVsZWFzZWQuCisgKiBSZWxlYXNpbmcga2V5cyBmcm9tIGEgZGV2aWNlIGludmFsaWRhdGVzIHRoZW0gZm9yIGFsbCBzZXNzaW9ucy4KKyAqCisgKiBpbml0IGNvbnRhaW5lci1zcGVjaWZpYyBkYXRhLCBpdHMgbWVhbmluZyBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgbWltZSB0eXBlCisgKiBwcm92aWRlZCBpbiB0aGUgbWltZVR5cGUgcGFyYW1ldGVyLiAgSXQgY291bGQgY29udGFpbiwgZm9yIGV4YW1wbGUsIHRoZSBjb250ZW50CisgKiBJRCwga2V5IElEIG9yIG90aGVyIGRhdGEgb2J0YWluZWQgZnJvbSB0aGUgY29udGVudCBtZXRhZGF0YSB0aGF0IGlzIHJlcXVpcmVkIGluCisgKiBnZW5lcmF0aW5nIHRoZSBrZXkgcmVxdWVzdC4gaW5pdCBtYXkgYmUgbnVsbCB3aGVuIGtleVR5cGUgaXMgS0VZX1RZUEVfUkVMRUFTRS4KKyAqCisgKiBpbml0U2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGluaXREYXRhCisgKgorICogbWltZVR5cGUgaWRlbnRpZmllcyB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LgorICoKKyAqIGtleVR5cGUgc3BlY2lmZXMgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QuIFRoZSByZXF1ZXN0IG1heSBiZSB0byBhY3F1aXJlIGtleXMgZm9yCisgKiAgIHN0cmVhbWluZyBvciBvZmZsaW5lIGNvbnRlbnQsIG9yIHRvIHJlbGVhc2UgcHJldmlvdXNseSBhY3F1aXJlZCBrZXlzLCB3aGljaCBhcmUKKyAqICAgaWRlbnRpZmllZCBieSBhIGtleVNldElkLgorICoKKyAqIG9wdGlvbmFsUGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGtleSByZXF1ZXN0IG1lc3NhZ2UgdG8gYWxsb3cgYSBjbGllbnQKKyAqICAgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBhZGRpdGlvbmFsIG1lc3NhZ2UgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyLgorICoKKyAqIG51bU9wdGlvbmFsUGFyYW1ldGVycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIHByb3ZpZGVkCisgKiAgIGJ5IHRoZSBjYWxsZXIKKyAqCisgKiBPbiBleGl0OgorICogICAxLiBUaGUga2V5UmVxdWVzdCBwb2ludGVyIHdpbGwgcmVmZXJlbmNlIHRoZSBvcGFxdWUga2V5IHJlcXVlc3QgZGF0YS4gIEl0CisgKiAgICAgICB3aWxsIHJlc2lkZSBpbiBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QsIGFuZCB3aWxsIHJlbWFpbgorICogICAgICAgYWNjZXNzaWJsZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0IG9yIHVudGlsIHRoZQorICogICAgICAgTWVkaWFEcm0gb2JqZWN0IGlzIHJlbGVhc2VkLgorICogICAyLiBrZXlSZXF1ZXN0U2l6ZSB3aWxsIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdAorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHJlcHJvdmlzaW9uaW5nIGlzIG5lZWRlZCwgZHVlIHRvIGEKKyAqIHByb2JsZW0gd2l0aCB0aGUgZGV2aWNlIGNlcnRpZmljYXRlLgorKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpOworCisvKioKKyAqIEEga2V5IHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIGxpY2Vuc2Ugc2VydmVyIGJ5IHRoZSBhcHAsIHRoZW4gaXQgaXMKKyAqIHByb3ZpZGVkIHRvIHRoZSBEUk0gZW5naW5lIHBsdWdpbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuICBXaGVuIHRoZQorICogcmVzcG9uc2UgaXMgZm9yIGFuIG9mZmxpbmUga2V5IHJlcXVlc3QsIGEga2V5U2V0SWQgaXMgcmV0dXJuZWQgdGhhdCBjYW4gYmUKKyAqIHVzZWQgdG8gbGF0ZXIgcmVzdG9yZSB0aGUga2V5cyB0byBhIG5ldyBzZXNzaW9uIHdpdGggQU1lZGlhRHJtX3Jlc3RvcmVLZXlzLgorICogV2hlbiB0aGUgcmVzcG9uc2UgaXMgZm9yIGEgc3RyZWFtaW5nIG9yIHJlbGVhc2UgcmVxdWVzdCwgYSBudWxsIGtleVNldElkIGlzCisgKiByZXR1cm5lZC4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3Iga2V5U2V0SWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZQorICogcmVzcG9uc2UuICBTY29wZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBzZXNzaW9uSWQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgZm9yIGVpdGhlcgorICogc3RyZWFtaW5nIG9yIG9mZmxpbmUga2V5IHJlcXVlc3RzLiAgU2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUga2V5U2V0SWQgd2hlbgorICogdGhlIHJlc3BvbnNlIGlzIGZvciBhIHJlbGVhc2UgcmVxdWVzdC4KKyAqCisgKiByZXNwb25zZSBwb2ludHMgdG8gdGhlIG9wYXF1ZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIKKyAqIHJlc3BvbnNlU2l6ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXNwb25zZSBpbiBieXRlcworICovCisKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUsIEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCk7CisKKy8qKgorICogUmVzdG9yZSBwZXJzaXN0ZWQgb2ZmbGluZSBrZXlzIGludG8gYSBuZXcgc2Vzc2lvbi4gIGtleVNldElkIGlkZW50aWZpZXMgdGhlCisgKiBrZXlzIHRvIGxvYWQsIG9idGFpbmVkIGZyb20gYSBwcmlvciBjYWxsIHRvIEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UuCisgKgorICogc2Vzc2lvbklkIGlzIHRoZSBzZXNzaW9uIElEIGZvciB0aGUgRFJNIHNlc3Npb24KKyAqIGtleVNldElkIGlkZW50aWZpZXMgdGhlIHNhdmVkIGtleSBzZXQgdG8gcmVzdG9yZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVzdG9yZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlbW92ZSB0aGUgY3VycmVudCBrZXlzIGZyb20gYSBzZXNzaW9uLgorICoKKyAqIGtleVNldElkIGlkZW50aWZpZXMga2V5cyB0byByZW1vdmUKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3JlbW92ZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlcXVlc3QgYW4gaW5mb3JtYXRpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGtleSBzdGF0dXMgZm9yIHRoZSBzZXNzaW9uLiAgVGhlIHN0YXR1cyBpcworICogaW4gdGhlIGZvcm0gb2Yge2tleSwgdmFsdWV9IHBhaXJzLiAgU2luY2UgRFJNIGxpY2Vuc2UgcG9saWNpZXMgdmFyeSBieSB2ZW5kb3IsCisgKiB0aGUgc3BlY2lmaWMgc3RhdHVzIGZpZWxkIG5hbWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGVhY2ggRFJNIHZlbmRvci4gIFJlZmVyIHRvIHlvdXIKKyAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZWZpbml0aW9ucyBvZiB0aGUgZmllbGQgbmFtZXMgZm9yIGEgcGFydGljdWxhcgorICogRFJNIGVuZ2luZSBwbHVnaW4uCisgKgorICogT24gZW50cnksIG51bVBhaXJzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlciB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFpcnMKKyAqIHRoYXQgY2FuIGJlIHJldHVybmVkICh0aGUgc2l6ZSBvZiB0aGUgYXJyYXkpLiAgT24gZXhpdCwgbnVtUGFpcnMgd2lsbCBiZSBzZXQKKyAqIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyB3cml0dGVuIHRvIHRoZSBhcnJheS4gIElmIHRoZSBudW1iZXIgb2Yge2tleSwgdmFsdWV9IHBhaXJzCisgKiB0byBiZSByZXR1cm5lZCBpcyBncmVhdGVyIHRoYW4gKm51bVBhaXJzLCBNRURJQURSTV9TSE9SVF9CVUZGRVIgd2lsbCBiZSByZXR1cm5lZAorICogYW5kIG51bVBhaXJzIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgcGFpcnMgYXZhaWxhYmxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcXVlcnlLZXlTdGF0dXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1LZXlWYWx1ZSAqa2V5VmFsdWVQYWlycywgc2l6ZV90ICpudW1QYWlycyk7CisKKworLyoqCisgKiBBIHByb3Zpc2lvbiByZXF1ZXN0L3Jlc3BvbnNlIGV4Y2hhbmdlIG9jY3VycyBiZXR3ZWVuIHRoZSBhcHAgYW5kIGEgcHJvdmlzaW9uaW5nCisgKiBzZXJ2ZXIgdG8gcmV0cmlldmUgYSBkZXZpY2UgY2VydGlmaWNhdGUuICBJZiBwcm92aXNpb25pbmluZyBpcyByZXF1aXJlZCwgdGhlCisgKiBFVkVOVF9QUk9WSVNJT05fUkVRVUlSRUQgZXZlbnQgd2lsbCBiZSBzZW50IHRvIHRoZSBldmVudCBoYW5kbGVyLgorICogZ2V0UHJvdmlzaW9uUmVxdWVzdCBpcyB1c2VkIHRvIG9idGFpbiB0aGUgb3BhcXVlIHByb3Zpc2lvbiByZXF1ZXN0IGJ5dGUgYXJyYXkgdGhhdAorICogc2hvdWxkIGJlIGRlbGl2ZXJlZCB0byB0aGUgcHJvdmlzaW9uaW5nIHNlcnZlci4KKyAqIE9uIGV4aXQ6CisgKiAgICAxLiBUaGUgcHJvdmlzaW9uIHJlcXVlc3QgZGF0YSB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgcHJvdmlzaW9uUmVxdWVzdCwgaW4KKyAqICAgICAgICBtZW1vcnkgb3duZWQgYnkgdGhlIEFNZWRpYURybSBvYmplY3QuICBJdCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHRoZQorICogICAgICAgIG5leHQgY2FsbCB0byBnZXRQcm92aXNpb25SZXF1ZXN0LgorICogICAgMi4gcHJvdmlzaW9uUmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgZGF0YS4KKyAqICAgIDMuIHNlcnZlclVybCB3aWxsIHJlZmVyZW5jZSBhIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMCisgKiAgICAgICB0aGUgcHJvdmlzaW9uaW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8uICBJdCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsCisgKiAgICAgICB0aGUgbmV4dCBjYWxsIHRvIGdldFByb3Zpc2lvblJlcXVlc3QuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCB1aW50OF90ICoqcHJvdmlzaW9uUmVxdWVzdCwKKyAgICAgICAgc2l6ZV90ICpwcm92aXNpb25SZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKnNlcnZlclVybCk7CisKKworLyoqCisgKiBBZnRlciBhIHByb3Zpc2lvbiByZXNwb25zZSBpcyByZWNlaXZlZCBieSB0aGUgYXBwLCBpdCBpcyBwcm92aWRlZCB0byB0aGUgRFJNCisgKiBlbmdpbmUgcGx1Z2luIHVzaW5nIHRoaXMgbWV0aG9kLgorICoKKyAqIHJlc3BvbnNlIGlzIHRoZSBvcGFxdWUgcHJvdmlzaW9uaW5nIHJlc3BvbnNlIGJ5dGUgYXJyYXkgdG8gcHJvdmlkZSB0byB0aGUKKyAqICAgRFJNIGVuZ2luZSBwbHVnaW4uCisgKiByZXNwb25zZVNpemUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcHJvdmlzaW9uaW5nIHJlc3BvbnNlIGluIGJ5dGVzLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fREVWSUNFX1JFVk9LRURfRVJST1IgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZQorICogc2VydmVyIHJlamVjdGVkIHRoZSByZXF1ZXN0CisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKTsKKworCisvKioKKyAqIEEgbWVhbnMgb2YgZW5mb3JjaW5nIGxpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgc3RyZWFtcyBwZXIgc3Vic2NyaWJlcgorICogYWNyb3NzIGRldmljZXMgaXMgcHJvdmlkZWQgdmlhIFNlY3VyZVN0b3AuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc2VjdXJlbHkKKyAqIG1vbml0b3JpbmcgdGhlIGxpZmV0aW1lIG9mIHNlc3Npb25zLgorICoKKyAqIEluZm9ybWF0aW9uIGZyb20gdGhlIHNlcnZlciByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHBsYXliYWNrIHNlc3Npb24gaXMgd3JpdHRlbgorICogdG8gcGVyc2lzdGVudCBzdG9yYWdlIG9uIHRoZSBkZXZpY2Ugd2hlbiBlYWNoIE1lZGlhQ3J5cHRvIG9iamVjdCBpcyBjcmVhdGVkLgorICoKKyAqIEluIHRoZSBub3JtYWwgY2FzZSwgcGxheWJhY2sgd2lsbCBiZSBjb21wbGV0ZWQsIHRoZSBzZXNzaW9uIGRlc3Ryb3llZCBhbmQgdGhlCisgKiBTZWN1cmUgU3RvcHMgd2lsbCBiZSBxdWVyaWVkLiBUaGUgYXBwIHF1ZXJpZXMgc2VjdXJlIHN0b3BzIGFuZCBmb3J3YXJkcyB0aGUKKyAqIHNlY3VyZSBzdG9wIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB3aGljaCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIGFuZCBub3RpZmllcyB0aGUKKyAqIHNlcnZlciBzaWRlIGRhdGFiYXNlIHRoYXQgdGhlIHNlc3Npb24gZGVzdHJ1Y3Rpb24gaGFzIGJlZW4gY29uZmlybWVkLiBUaGUgcGVyc2lzdGVkCisgKiByZWNvcmQgb24gdGhlIGNsaWVudCBpcyBvbmx5IHJlbW92ZWQgYWZ0ZXIgcG9zaXRpdmUgY29uZmlybWF0aW9uIHRoYXQgdGhlIHNlcnZlcgorICogcmVjZWl2ZWQgdGhlIG1lc3NhZ2UgdXNpbmcgcmVsZWFzZVNlY3VyZVN0b3BzKCkuCisgKgorICogbnVtU2VjdXJlU3RvcHMgaXMgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlY3VyZSBzdG9wcyB0bworICogcmV0dXJuLiAgT24gZXhpdCwgKm51bVNlY3VyZVN0b3BzIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgYWN0dWFsbHkgcmV0dXJuZWQuCisgKiBJZiAqbnVtU2VjdXJlU3RvcHMgaXMgdG9vIHNtYWxsIGZvciB0aGUgbnVtYmVyIG9mIHNlY3VyZSBzdG9wcyBhdmFpbGFibGUsCisgKiBNRURJQURSTV9TSE9SVF9CVUZGRVIgd2lsbCBiZSByZXR1cm5lZCBhbmQgKm51bVNlY3VyZVN0b3BzIHdpbGwgYmUgc2V0IHRvIHRoZQorICogbnVtYmVyIHJlcXVpcmVkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0U2VjdXJlU3RvcHMoQU1lZGlhRHJtICosCisgICAgICAgIEFNZWRpYURybVNlY3VyZVN0b3AgKnNlY3VyZVN0b3BzLCBzaXplX3QgKm51bVNlY3VyZVN0b3BzKTsKKworLyoqCisgKiBQcm9jZXNzIHRoZSBTZWN1cmVTdG9wIHNlcnZlciByZXNwb25zZSBtZXNzYWdlIHNzUmVsZWFzZS4gIEFmdGVyIGF1dGhlbnRpY2F0aW5nCisgKiB0aGUgbWVzc2FnZSwgcmVtb3ZlIHRoZSBTZWN1cmVTdG9wcyBpZGVudGlmaWVkIGluIHRoZSByZXNwb25zZS4KKyAqCisgKiBzc1JlbGVhc2UgaXMgdGhlIHNlcnZlciByZXNwb25zZSBpbmRpY2F0aW5nIHdoaWNoIHNlY3VyZSBzdG9wcyB0byByZWxlYXNlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZWxlYXNlU2VjdXJlU3RvcHMoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlY3VyZVN0b3AgKnNzUmVsZWFzZSk7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIG1ha2VyIG9mIHRoZSBEUk0gZW5naW5lIHBsdWdpbgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9WRU5ET1IgPSAidmVuZG9yIjsKKworLyoqCisgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogaWRlbnRpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKworLyoqCisgKiBTdHJpbmcgcHJvcGVydHkgbmFtZTogZGVzY3JpYmVzIHRoZSBEUk0gZW5naW5lIHBsdWdpbgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2lwaGVyIGFuZCBtYWMgYWxnb3JpdGhtcworICogc3VwcG9ydGVkIGJ5IENyeXB0b1Nlc3Npb24uICBUaGUgbGlzdCBtYXkgYmUgZW1wdHkgaWYgdGhlIERSTSBlbmdpbmUKKyAqIHBsdWdpbiBkb2VzIG5vdCBzdXBwb3J0IENyeXB0b1Nlc3Npb24gb3BlcmF0aW9ucy4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfQUxHT1JJVEhNUyA9ICJhbGdvcml0aG1zIjsKKworLyoqCisgKiBSZWFkIGEgRFJNIGVuZ2luZSBwbHVnaW4gU3RyaW5nIHByb3BlcnR5IHZhbHVlLCBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSBzdHJpbmcuCisgKgorICogcHJvcGVydHlOYW1lIGlkZW50aWZpZXMgdGhlIHByb3BlcnR5IHRvIHF1ZXJ5CisgKiBPbiByZXR1cm4sIHByb3BlcnR5VmFsdWUgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHByb3BlcnR5IHZhbHVlLiAgVGhlCisgKiBtZW1vcnkgdGhhdCB0aGUgdmFsdWUgcmVzaWRlcyBpbiBpcyBvd25lZCBieSB0aGUgTkRLIE1lZGlhRHJtIEFQSSBhbmQKKyAqIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqKnByb3BlcnR5VmFsdWUpOworCisvKioKKyAqIEJ5dGUgYXJyYXkgcHJvcGVydHkgbmFtZTogdGhlIGRldmljZSB1bmlxdWUgaWRlbnRpZmllciBpcyBlc3RhYmxpc2hlZCBkdXJpbmcKKyAqIGRldmljZSBwcm92aXNpb25pbmcgYW5kIHByb3ZpZGVzIGEgbWVhbnMgb2YgdW5pcXVlbHkgaWRlbnRpZnlpbmcgZWFjaCBkZXZpY2UuCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX0RFVklDRV9VTklRVUVfSUQgPSAiZGV2aWNlVW5pcXVlSWQiOworCisvKioKKyAqIFJlYWQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLCBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZSBzdHJpbmcuCisgKiBPbiByZXR1cm4sICpwcm9wZXJ0eVZhbHVlIHdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoZQorICogbWVtb3J5IHRoYXQgdGhlIHZhbHVlIHJlc2lkZXMgaW4gaXMgb3duZWQgYnkgdGhlIE5ESyBNZWRpYURybSBBUEkgYW5kCisgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSk7CisKKy8qKgorICogU2V0IGEgRFJNIGVuZ2luZSBwbHVnaW4gU3RyaW5nIHByb3BlcnR5IHZhbHVlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpOworCisvKioKKyAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIGJ5dGUgYXJyYXkgcHJvcGVydHkgdmFsdWUuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBjb25zdCB1aW50OF90ICp2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSk7CisKKy8qKgorICogSW4gYWRkaXRpb24gdG8gc3VwcG9ydGluZyBkZWNyeXB0aW9uIG9mIERBU0ggQ29tbW9uIEVuY3J5cHRlZCBNZWRpYSwgdGhlCisgKiBNZWRpYURybSBBUElzIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gc2VjdXJlbHkgZGVsaXZlciBzZXNzaW9uIGtleXMgZnJvbQorICogYW4gb3BlcmF0b3IncyBzZXNzaW9uIGtleSBzZXJ2ZXIgdG8gYSBjbGllbnQgZGV2aWNlLCBiYXNlZCBvbiB0aGUgZmFjdG9yeS1pbnN0YWxsZWQKKyAqIHJvb3Qgb2YgdHJ1c3QsIGFuZCB0aGVuIHBlcmZvcm0gZW5jcnlwdCwgZGVjcnlwdCwgc2lnbiBhbmQgdmVyaWZ5IG9wZXJhdGlvbnMKKyAqIHdpdGggdGhlIHNlc3Npb24ga2V5IG9uIGFyYml0cmFyeSB1c2VyIGRhdGEuCisgKgorICogT3BlcmF0b3JzIGNyZWF0ZSBzZXNzaW9uIGtleSBzZXJ2ZXJzIHRoYXQgcmVjZWl2ZSBzZXNzaW9uIGtleSByZXF1ZXN0cyBhbmQgcHJvdmlkZQorICogZW5jcnlwdGVkIHNlc3Npb24ga2V5cyB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIGNyeXB0byBvcGVyYXRpb25zLgorICoKKyAqIEdlbmVyaWMgZW5jcnlwdC9kZWNyeXB0L3NpZ24vdmVyaWZ5IG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBlc3RhYmxpc2hlZCBzZXNzaW9uCisgKiBrZXlzLiAgVGhlc2Uga2V5cyBhcmUgZXhjaGFuZ2VkIHVzaW5nIHRoZSBnZXRLZXlSZXF1ZXN0L3Byb3ZpZGVLZXlSZXNwb25zZSBtZXRob2RzLgorICoKKyAqIEFwcGxpY2F0aW9ucyBvZiB0aGlzIGNhcGFiaWxpdHkgaW5jbHVkZSBzZWN1cmluZyB2YXJpb3VzIHR5cGVzIG9mIHB1cmNoYXNlZCBvcgorICogcHJpdmF0ZSBjb250ZW50LCBzdWNoIGFzIGFwcGxpY2F0aW9ucywgYm9va3MgYW5kIG90aGVyIG1lZGlhLCBwaG90b3Mgb3IgbWVkaWEKKyAqIGRlbGl2ZXJ5IHByb3RvY29scy4KKyAqLworCisvKgorICogRW5jcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCisgKiBieSBjaXBoZXJBbGdvcml0aG0sIGFuZCB3cml0ZSB0aGUgZW5jcnlwdGVkIHJlc3VsdCBpbnRvIG91dHB1dC4gIFRoZSBjYWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gVGhlIGtleQorICogdG8gdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvCisgKiB0aGUgc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9lbmNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisKKy8qCisgKiBEZWNyeXB0IHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgaW5wdXQgb2YgbGVuZ3RoIGRhdGFTaXplIHVzaW5nIGFsZ29yaXRobSBzcGVjaWZpZWQKKyAqIGJ5IGNpcGhlckFsZ29yaXRobSwgYW5kIHdyaXRlIHRoZSBkZWNyeXB0ZWQgcmVzdWx0IGludG8gb3V0cHV0LiAgVGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gYWNjZXB0IGRhdGFTaXplIGJ5dGVzLiAgVGhlIGtleQorICogdG8gdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvCisgKiB0aGUgc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9kZWNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisKKy8qCisgKiBHZW5lcmF0ZSBhIHNpZ25hdHVyZSB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlIGRhdGEKKyAqIHJlZmVyZW5jZWQgYnkgbWVzc2FnZSBvZiBzaXplIG1lc3NhZ2VTaXplIGFuZCBzdG9yZSB0aGUgc2lnbmF0dXJlIGluIHRoZQorICogYnVmZmVyIHJlZmVyZW5jZWQgc2lnbmF0dXJlIG9mIG1heCBzaXplICpzaWduYXR1cmVTaXplLiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QKKyAqIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzaWduYXR1cmUsIE1FRElBRFJNX1NIT1JUX0JVRkZFUiBpcyByZXR1cm5lZCBhbmQKKyAqICpzaWduYXR1cmVTaXplIGlzIHNldCB0byB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuICBUaGUga2V5IHRvIHVzZSBpcyBpZGVudGlmaWVkCisgKiBieSB0aGUgMTYgYnl0ZSBrZXlJZC4gIFRoZSBrZXkgbXVzdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHNlc3Npb24gdXNpbmcKKyAqIHByb3ZpZGVLZXlSZXNwb25zZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NpZ24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKTsKKworLyoKKyAqIFBlcmZvcm0gYSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWFjQWxnb3JpdGhtIG92ZXIgdGhlIG1lc3NhZ2UKKyAqIGRhdGEgcmVmZXJlbmNlZCBieSB0aGUgbWVzc2FnZSBwYXJhbWV0ZXIgb2Ygc2l6ZSBtZXNzYWdlU2l6ZS4gUmV0dXJucyBNRURJQURSTV9PSworICogaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLCBvdGhlcndpc2UgTUVEQUlEUk1fVkVSSUZZX0ZBSUxFRCBpcyByZXR1cm5lZC4gVGhlIGtleSB0bworICogdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZQorICogc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV92ZXJpZnkoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvL19OREtfTUVESUFfRFJNX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYxM2ViCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFcnJvci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VSUk9SX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFfT0sgPSAwLAorCisgICAgQU1FRElBX0VSUk9SX0JBU0UgICAgICAgICAgICAgICAgICA9IC0xMDAwMCwKKyAgICBBTUVESUFfRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UsCisgICAgQU1FRElBX0VSUk9SX01BTEZPUk1FRCAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMSwKKyAgICBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAyLAorICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVCAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDMsCisgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNCwKKworICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCisgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCisgICAgQU1FRElBX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDIsCisgICAgQU1FRElBX0RSTV9ERVZJQ0VfUkVWT0tFRCAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDMsCisgICAgQU1FRElBX0RSTV9TSE9SVF9CVUZGRVIgICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDQsCisgICAgQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDUsCisgICAgQU1FRElBX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDYsCisgICAgQU1FRElBX0RSTV9WRVJJRllfRkFJTEVEICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0RSTV9ORUVEX0tFWSAgICAgICAgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDgsCisgICAgQU1FRElBX0RSTV9MSUNFTlNFX0VYUElSRUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDksCisKK30gbWVkaWFfc3RhdHVzX3Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRlNzAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKyNkZWZpbmUgX05ES19NRURJQV9FWFRSQUNUT1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgQU1lZGlhRXh0cmFjdG9yOworCisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBleHRyYWN0b3IKKyAqLworQU1lZGlhRXh0cmFjdG9yKiBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisKKy8qKgorICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGV4dHJhY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqICBTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciosIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKworLyoqCisgKiBTZXQgdGhlIFVSSSBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLCBjb25zdCBjaGFyICpsb2NhdGlvbik7IC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdHJhY2tzIGluIHRoZSBwcmV2aW91c2x5IHNwZWNpZmllZCBtZWRpYSBmaWxlCisgKi8KK3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIHRyYWNrLiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0CisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAorICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4KKyAqIFNlbGVjdGluZyB0aGUgc2FtZSB0cmFjayBtdWx0aXBsZSB0aW1lcyBoYXMgbm8gZWZmZWN0LCB0aGUgdHJhY2sgaXMKKyAqIG9ubHkgc2VsZWN0ZWQgb25jZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFVuc2VsZWN0IHRoZSBzcGVjaWZpZWQgdHJhY2suIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZFNhbXBsZURhdGEsIGdldFNhbXBsZVRyYWNrSW5kZXggYW5kCisgKiBnZXRTYW1wbGVUaW1lIG9ubHkgcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWJzZXQgb2YgdHJhY2tzIHNlbGVjdGVkLi4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCk7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUuCisgKi8KK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKEFNZWRpYUV4dHJhY3RvciosIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGNhcGFjaXR5KTsKKworLyoqCisgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZSdzIGZsYWdzLgorICovCit1aW50MzJfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoQU1lZGlhRXh0cmFjdG9yKik7IC8vIHNlZSBkZWZpbml0aW9ucyBiZWxvdworCisvKioKKyAqIFJldHVybnMgdGhlIHRyYWNrIGluZGV4IHRoZSBjdXJyZW50IHNhbXBsZSBvcmlnaW5hdGVzIGZyb20gKG9yIC0xCisgKiBpZiBubyBtb3JlIHNhbXBsZXMgYXJlIGF2YWlsYWJsZSkKKyAqLworaW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2FtcGxlJ3MgcHJlc2VudGF0aW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLgorICogb3IgLTEgaWYgbm8gbW9yZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUuCisgKi8KK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogQWR2YW5jZSB0byB0aGUgbmV4dCBzYW1wbGUuIFJldHVybnMgZmFsc2UgaWYgbm8gbW9yZSBzYW1wbGUgZGF0YQorICogaXMgYXZhaWxhYmxlIChlbmQgb2Ygc3RyZWFtKS4KKyAqLworYm9vbCBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShBTWVkaWFFeHRyYWN0b3IqKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DLAorICAgIEFNRURJQUVYVFJBQ1RPUl9TRUVLX05FWFRfU1lOQywKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkMKK30gU2Vla01vZGU7CisKKy8qKgorICoKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhBTWVkaWFFeHRyYWN0b3IqLCBpbnQ2NF90IHNlZWtQb3NVcywgU2Vla01vZGUgbW9kZSk7CisKKy8qKgorICogbWFwcGluZyBvZiBjcnlwdG8gc2NoZW1lIHV1aWQgdG8gdGhlIHNjaGVtZSBzcGVjaWZpYyBkYXRhIGZvciB0aGF0IHNjaGVtZQorICovCit0eXBlZGVmIHN0cnVjdCBQc3NoRW50cnkgeworICAgIEFNZWRpYVVVSUQgdXVpZDsKKyAgICBzaXplX3QgZGF0YWxlbjsKKyAgICB2b2lkICpkYXRhOworfSBQc3NoRW50cnk7CisKKy8qKgorICogbGlzdCBvZiBjcnlwdG8gc2NoZW1lcyBhbmQgdGhlaXIgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBQc3NoSW5mbyB7CisgICAgc2l6ZV90IG51bWVudHJpZXM7CisgICAgUHNzaEVudHJ5IGVudHJpZXNbMF07Cit9IFBzc2hJbmZvOworCisvKioKKyAqIEdldCB0aGUgUFNTSCBpbmZvIGlmIHByZXNlbnQuCisgKi8KK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yKik7CisKKworQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhBTWVkaWFFeHRyYWN0b3IgKik7CisKKworZW51bSB7CisgICAgQU1FRElBRVhUUkFDVE9SX1NBTVBMRV9GTEFHX1NZTkMgPSAxLAorICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQgPSAyLAorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9FWFRSQUNUT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFGb3JtYXQuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyOTc5MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfSAorI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRm9ybWF0IEFNZWRpYUZvcm1hdDsKKworQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRfbmV3KCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCopOworCisvKioKKyAqIEh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtYXQuIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwKKyAqIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdG9TdHJpbmcsIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KKyAqLworY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCopOworCitib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpOworLyoqCisgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvd25lZCBieSB0aGUgZm9ybWF0IGFuZCByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIG5hbWVkIGVudHJ5CisgKiBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQuCisgKi8KK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpzaXplKTsKKy8qKgorICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSB0aGUgZm9ybWF0LCBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGdldFN0cmluZywKKyAqIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KKyAqLworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipvdXQpOworCisKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDMyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSk7CisvKioKKyAqIFRoZSBwcm92aWRlZCBzdHJpbmcgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKy8qKgorICogVGhlIHByb3ZpZGVkIGRhdGEgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworCisKKy8qKgorICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KKyAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDk0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYU11eGVyLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX01VWEVSX0gKKyNkZWZpbmUgX05ES19NRURJQV9NVVhFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhTXV4ZXI7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFNdXhlciBBTWVkaWFNdXhlcjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCA9IDAsCisgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9XRUJNICAgPSAxLAorfSBPdXRwdXRGb3JtYXQ7CisKKy8qKgorICogQ3JlYXRlIG5ldyBtZWRpYSBtdXhlcgorICovCitBTWVkaWFNdXhlciogQU1lZGlhTXV4ZXJfbmV3KGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCk7CisKKy8qKgorICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIG11eGVyCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciopOworCisvKioKKyAqIFNldCBhbmQgc3RvcmUgdGhlIGdlb2RhdGEgKGxhdGl0dWRlIGFuZCBsb25naXR1ZGUpIGluIHRoZSBvdXRwdXQgZmlsZS4KKyAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEFNZWRpYU11eGVyX3N0YXJ0LiBUaGUgZ2VvZGF0YSBpcyBzdG9yZWQKKyAqIGluIHVkdGEgYm94IGlmIHRoZSBvdXRwdXQgZm9ybWF0IGlzIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfTVBFR180LCBhbmQgaXMKKyAqIGlnbm9yZWQgZm9yIG90aGVyIG91dHB1dCBmb3JtYXRzLgorICogVGhlIGdlb2RhdGEgaXMgc3RvcmVkIGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KKyAqCisgKiBCb3RoIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIGRlZ3JlZXMuCisgKiBMYXRpdHVkZSBtdXN0IGJlIGluIHRoZSByYW5nZSBbLTkwLCA5MF0uCisgKiBMb25naXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy0xODAsIDE4MF0uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyKiwgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmdpdHVkZSk7CisKKy8qKgorICogU2V0cyB0aGUgb3JpZW50YXRpb24gaGludCBmb3Igb3V0cHV0IHZpZGVvIHBsYXliYWNrLgorICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgQU1lZGlhTXV4ZXJfc3RhcnQuIENhbGxpbmcgdGhpcworICogbWV0aG9kIHdpbGwgbm90IHJvdGF0ZSB0aGUgdmlkZW8gZnJhbWUgd2hlbiBtdXhlciBpcyBnZW5lcmF0aW5nIHRoZSBmaWxlLAorICogYnV0IGFkZCBhIGNvbXBvc2l0aW9uIG1hdHJpeCBjb250YWluaW5nIHRoZSByb3RhdGlvbiBhbmdsZSBpbiB0aGUgb3V0cHV0CisgKiB2aWRlbyBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCwgc28gdGhhdCBhCisgKiB2aWRlbyBwbGF5ZXIgY2FuIGNob29zZSB0aGUgcHJvcGVyIG9yaWVudGF0aW9uIGZvciBwbGF5YmFjay4KKyAqIE5vdGUgdGhhdCBzb21lIHZpZGVvIHBsYXllcnMgbWF5IGNob29zZSB0byBpZ25vcmUgdGhlIGNvbXBvc2l0aW9uIG1hdHJpeAorICogZHVyaW5nIHBsYXliYWNrLgorICogVGhlIGFuZ2xlIGlzIHNwZWNpZmllZCBpbiBkZWdyZWVzLCBjbG9ja3dpc2UuCisgKiBUaGUgc3VwcG9ydGVkIGFuZ2xlcyBhcmUgMCwgOTAsIDE4MCwgYW5kIDI3MCBkZWdyZWVzLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIqLCBpbnQgZGVncmVlcyk7CisKKy8qKgorICogQWRkcyBhIHRyYWNrIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQuCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV3IHRyYWNrIG9yIGEgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBmYWlsdXJlLAorICogd2hpY2ggY2FuIGJlIGludGVycHJldGVkIGFzIGEgbWVkaWFfc3RhdHVzX3QuCisgKi8KK3NzaXplX3QgQU1lZGlhTXV4ZXJfYWRkVHJhY2soQU1lZGlhTXV4ZXIqLCBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCk7CisKKy8qKgorICogU3RhcnQgdGhlIG11eGVyLiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIEFNZWRpYU11eGVyX2FkZFRyYWNrIGFuZAorICogYmVmb3JlIEFNZWRpYU11eGVyX3dyaXRlU2FtcGxlRGF0YS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBTdG9wcyB0aGUgbXV4ZXIuCisgKiBPbmNlIHRoZSBtdXhlciBzdG9wcywgaXQgY2FuIG5vdCBiZSByZXN0YXJ0ZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0b3AoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBXcml0ZXMgYW4gZW5jb2RlZCBzYW1wbGUgaW50byB0aGUgbXV4ZXIuCisgKiBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNhbXBsZXMgYXJlIHdyaXR0ZW4gaW50bworICogdGhlIHJpZ2h0IHRyYWNrcy4gQWxzbywgaXQgbmVlZHMgdG8gbWFrZSBzdXJlIHRoZSBzYW1wbGVzIGZvciBlYWNoIHRyYWNrCisgKiBhcmUgd3JpdHRlbiBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChlLmcuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBwcm92aWRlZAorICogYnkgdGhlIGVuY29kZXIuKQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEoQU1lZGlhTXV4ZXIgKm11eGVyLAorICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfTVVYRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggMmQwMzNlNi4uZmExYjIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtNDgsNyArNDksNyBAQAogI2RlZmluZSBDQkxLX1NUUkVBTV9FTkRfRE9ORSAweDQwMCAvLyBzZXQgYnkgc2VydmVyIG9uIHJlbmRlciBjb21wbGV0aW9uLCBjbGVhcmVkIGJ5IGNsaWVudAogCiAvL0VMX0ZJWE1FIDIwIHNlY29uZHMgbWF5IG5vdCBiZSBlbm91Z2ggYW5kIG11c3QgYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIgaW1wbGVtZW50YXRpb24KLSNkZWZpbmUgTUFYX1JVTl9PRkZMT0FERURfVElNRU9VVF9NUyAyMDAwMCAvL2Fzc3VtaW5nIHVwdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgb2Ygb2ZmbG9hZGVkCisjZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy8gYXNzdW1pbmcgdXAgdG8gYSBtYXhpbXVtIG9mIDIwIHNlY29uZHMgb2Ygb2ZmbG9hZGVkCiAKIHN0cnVjdCBBdWRpb1RyYWNrU2hhcmVkU3RyZWFtaW5nIHsKICAgICAvLyBzaW1pbGFyIHRvIE5CQUlPIE1vbm9QaXBlCkBAIC05OCwxMSArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgdXNlZCAiZm9yIGVudGVydGFpbm1lbnQgcHVycG9zZXMgb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgZG9uJ3QgbWFrZSBpbXBvcnRhbnQgZGVjaXNpb25zIGJhc2VkIG9uIGl0LgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudF87ICAgIC8vIHVzZWQgZHVyaW5nIGNyZWF0aW9uIHRvIHBhc3MgYWN0dWFsIHRyYWNrIGJ1ZmZlciBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gQXVkaW9GbGluZ2VyIHRvIGNsaWVudCwgYW5kIG5vdCByZWZlcmVuY2VkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbW92ZSBoZXJlIGFuZCByZXBsYWNlIGJ5IGNyZWF0ZVRyYWNrKCkgaW4vb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWVkIHRvICJfIiB0byBkZXRlY3QgaW5jb3JyZWN0IHVzZQorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1QYWQxOyAgICAgIC8vIHVudXNlZAogCiAgICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgbUZ1dGV4OyAgICAgLy8gZXZlbnQgZmxhZzogZG93biAoUCkgYnkgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIChWKSBieSBzZXJ2ZXIgb3IgYmluZGVyRGllZCgpIG9yIGludGVycnVwdCgpCkBAIC0xMTQsMTEgKzExMSw4IEBACiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgdG8gMzItYml0LiAgVGhlIGNsaWVudCBhbmQgc2VydmVyIG1heSBoYXZlIGRpZmZlcmVudCB0eXBlZGVmcyBmb3Igc2l6ZV90LgogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1NaW5pbXVtOyAgICAgICAvLyBzZXJ2ZXIgd2FrZXMgdXAgY2xpZW50IGlmIGF2YWlsYWJsZSA+PSBtTWluaW11bQogCi0gICAgICAgICAgICAgICAgLy8gQ2hhbm5lbCB2b2x1bWVzIGFyZSBmaXhlZCBwb2ludCBVNC4xMiwgc28gMHgxMDAwIG1lYW5zIDEuMC4KLSAgICAgICAgICAgICAgICAvLyBMZWZ0IGNoYW5uZWwgaXMgaW4gWzA6MTVdLCByaWdodCBjaGFubmVsIGlzIGluIFsxNjozMV0uCi0gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHJlYWQgYW5kIHdyaXRlIHRoZSBjb21iaW5lZCBwYWlyIGF0b21pY2FsbHkuCi0gICAgICAgICAgICAgICAgLy8gRm9yIEF1ZGlvVHJhY2sgb25seSwgbm90IHVzZWQgYnkgQXVkaW9SZWNvcmQuCi0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVZvbHVtZUxSOworICAgICAgICAgICAgICAgIC8vIFN0ZXJlbyBnYWlucyBmb3IgQXVkaW9UcmFjayBvbmx5LCBub3QgdXNlZCBieSBBdWRpb1JlY29yZC4KKyAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBtVm9sdW1lTFI7CiAKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtU2FtcGxlUmF0ZTsgICAgLy8gQXVkaW9UcmFjayBvbmx5OiBjbGllbnQncyByZXF1ZXN0ZWQgc2FtcGxlIHJhdGUgaW4gSHoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgMCA9PSBkZWZhdWx0LiBXcml0ZS1vbmx5IGNsaWVudCwgcmVhZC1vbmx5IHNlcnZlci4KQEAgLTE4MSwxMiArMTc1LDExIEBACiAKIC8vIFByb3h5IHNlZW4gYnkgQXVkaW9UcmFjayBjbGllbnQgYW5kIEF1ZGlvUmVjb3JkIGNsaWVudAogY2xhc3MgQ2xpZW50UHJveHkgOiBwdWJsaWMgUHJveHkgewotcHJvdGVjdGVkOgorcHVibGljOgogICAgIENsaWVudFByb3h5KGF1ZGlvX3RyYWNrX2NibGtfdCogY2Jsaywgdm9pZCAqYnVmZmVycywgc2l6ZV90IGZyYW1lQ291bnQsIHNpemVfdCBmcmFtZVNpemUsCiAgICAgICAgICAgICBib29sIGlzT3V0LCBib29sIGNsaWVudEluU2VydmVyKTsKICAgICB2aXJ0dWFsIH5DbGllbnRQcm94eSgpIHsgfQogCi1wdWJsaWM6CiAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBrRm9yZXZlcjsKICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWVzcGVjIGtOb25CbG9ja2luZzsKIApAQCAtMjg5LDggKzI4Miw4IEBACiAgICAgICAgIG1DYmxrLT5tU2VuZExldmVsID0gdWludDE2X3Qoc2VuZExldmVsICogMHgxMDAwKTsKICAgICB9CiAKLSAgICAvLyBjYWxsZXIgbXVzdCBsaW1pdCB0byAwIDw9IHZvbHVtZUxSIDw9IDB4MTAwMDEwMDAKLSAgICB2b2lkICAgICAgICBzZXRWb2x1bWVMUih1aW50MzJfdCB2b2x1bWVMUikgeworICAgIC8vIHNldCBzdGVyZW8gZ2FpbnMKKyAgICB2b2lkICAgICAgICBzZXRWb2x1bWVMUihnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2b2x1bWVMUikgewogICAgICAgICBtQ2Jsay0+bVZvbHVtZUxSID0gdm9sdW1lTFI7CiAgICAgfQogCkBAIC00MDAsOCArMzkzLDEwIEBACiBjbGFzcyBBdWRpb1RyYWNrU2VydmVyUHJveHkgOiBwdWJsaWMgU2VydmVyUHJveHkgewogcHVibGljOgogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgYm9vbCBjbGllbnRJblNlcnZlciA9IGZhbHNlKQotICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSwgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDApCisgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCB0cnVlIC8qaXNPdXQqLywgY2xpZW50SW5TZXJ2ZXIpIHsKKyAgICAgICAgbUNibGstPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9UcmFja1NlcnZlclByb3h5KCkgeyB9CiAKQEAgLTQwOSw3ICs0MDQsNyBAQAogICAgIC8vIHJldHVybiB2YWx1ZSBvZiB0aGVzZSBtZXRob2RzIG11c3QgYmUgdmFsaWRhdGVkIGJ5IHRoZSBjYWxsZXIKICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNibGstPm1TYW1wbGVSYXRlOyB9CiAgICAgdWludDE2X3QgICAgZ2V0U2VuZExldmVsX1U0XzEyKCkgY29uc3QgeyByZXR1cm4gbUNibGstPm1TZW5kTGV2ZWw7IH0KLSAgICB1aW50MzJfdCAgICBnZXRWb2x1bWVMUigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tVm9sdW1lTFI7IH0KKyAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBnZXRWb2x1bWVMUigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tVm9sdW1lTFI7IH0KIAogICAgIC8vIGVzdGltYXRlZCB0b3RhbCBudW1iZXIgb2YgZmlsbGVkIGZyYW1lcyBhdmFpbGFibGUgdG8gc2VydmVyIHRvIHJlYWQsCiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCkBAIC00NjQsOSArNDU5LDggQEAKIGNsYXNzIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkgOiBwdWJsaWMgU2VydmVyUHJveHkgewogcHVibGljOgogICAgIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUpCi0gICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sCi0gICAgICAgICAgICBmYWxzZSAvKmNsaWVudEluU2VydmVyKi8pIHsgfQorICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgYm9vbCBjbGllbnRJblNlcnZlcikKKyAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIGZhbHNlIC8qaXNPdXQqLywgY2xpZW50SW5TZXJ2ZXIpIHsgfQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUmVjb3JkU2VydmVyUHJveHkoKSB7IH0KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCA1ZGQ0MjViLi41MTkzZDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTYzLDggKzYzLDExIEBACiAgICAgdWludDMyX3QgbURpc3BsYXlXaWR0aDsKICAgICB1aW50MzJfdCBtRGlzcGxheUhlaWdodDsKICAgICB1aW50MzJfdCBtU2l6ZTsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbURhdGEKKyAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyByb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKKyAgICAvLyBtRGF0YSBzaG91bGQgYmUgNjQgYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKICAgICB1aW50OF90KiBtRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKLSAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyByb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlCisgICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQgYml0IGFuZCAzMiBiaXQKKyAgICBjaGFyICAgICBtUGFkZGluZ1s4IC0gc2l6ZW9mKG1EYXRhKV07CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDhlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlciA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIpOworCisgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCblNvdW5kVHJpZ2dlcjogcHVibGljIEJuSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0NMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9DTElFTlRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElTb3VuZFRyaWdnZXJDbGllbnQgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJDbGllbnQpOworCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNvdW5kTW9kZWxFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpID0gMDsKKworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCblNvdW5kVHJpZ2dlckNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJU291bmRUcmlnZ2VyQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwY2IwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElTb3VuZFRyaWdnZXI7CitjbGFzcyBJU291bmRUcmlnZ2VyQ2xpZW50OworCitjbGFzcyBJU291bmRUcmlnZ2VySHdTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VySHdTZXJ2aWNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCblNvdW5kVHJpZ2dlckh3U2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0gKKworI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5RGVhbGVyOworCitjbGFzcyBTb3VuZFRyaWdnZXIgOiBwdWJsaWMgQm5Tb3VuZFRyaWdnZXJDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3sKK3B1YmxpYzoKKworICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlcigpOworCisgICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKKyAgICBzdGF0aWMgIHNwPFNvdW5kVHJpZ2dlcj4gYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spOworCisgICAgc3RhdGljICBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpOworCisgICAgICAgICAgICB2b2lkIGRldGFjaCgpOworCisgICAgICAgICAgICBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICAgICAgLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblNvdW5kTW9kZWxFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CisKKyAgICAgICAgICAgIC8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RyaW5nVG9HdWlkKGNvbnN0IGNoYXIgKnN0ciwgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQpOworICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IGd1aWRUb1N0cmluZyhjb25zdCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+Jik7CisgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4mIGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworCisgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+ICAgICAgICAgICAgICAgICAgIG1JU291bmRUcmlnZ2VyOworICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbU1vZHVsZTsKKyAgICAgICAgICAgIHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiAgICAgICAgICAgIG1DYWxsYmFjazsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Mjc3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0NBTExCQUNLX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfQ0FMTEJBQ0tfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU291bmRUcmlnZ2VyQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorCisgICAgICAgICAgICBTb3VuZFRyaWdnZXJDYWxsYmFjaygpIHt9CisgICAgdmlydHVhbCB+U291bmRUcmlnZ2VyQ2FsbGJhY2soKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNvdW5kTW9kZWxFdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VTdGF0ZUNoYW5nZShzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZURpZWQoKSA9IDA7CisKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0NBTExCQUNLX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg0ZGRhZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3JwbGF5ZXIKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9ycGxheWVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBWaWRlb0VkaXRvclRvb2xzLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIFwKLSAgICBQcmV2aWV3UGxheWVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclNSQy5jcHAgXAotICAgIER1bW15QXVkaW9Tb3VyY2UuY3BwIFwKLSAgICBEdW1teVZpZGVvU291cmNlLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgXAotICAgIFByZXZpZXdSZW5kZXJlci5jcHAgXAotICAgIEk0MjBDb2xvckNvbnZlcnRlci5jcHAgXAotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCi0KLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICBcCi0gICAgbGliYXVkaW91dGlscyAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICBcCi0gICAgbGlibG9nICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliRUdMICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliR0xFU3YyICAgICAgICAgICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZHJtZnJhbWV3b3JrICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICBcCi0gICAgbGlic3luYyAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidWkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgICAgICBcCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9lZGl0b3IgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAgLURNNF9FTkFCTEVfUkVOREVSSU5HTU9ERSBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQ09ERUNTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfUkVBREVSUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfM0dQUF9SRUFERVIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiY2FiNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRHVtbXlBdWRpb1NvdXJjZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSAiRHVtbXlBdWRpb1NvdXJjZS5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy9zdGF0aWMKLXNwPER1bW15QXVkaW9Tb3VyY2U+IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUsIGludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpIHsKLQotICAgIEFMT0dWKCJDcmVhdGUgIik7Ci0gICAgcmV0dXJuIG5ldyBEdW1teUF1ZGlvU291cmNlKHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uVXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRHVyYXRpb25Vcyk7Ci0KLX0KLQotRHVtbXlBdWRpb1NvdXJjZTo6RHVtbXlBdWRpb1NvdXJjZSgKLSAgICAgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUsIGludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpCi0gICAgOiBtU2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSksCi0gICAgICBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCksCi0gICAgICBtRnJhbWVEdXJhdGlvblVzKGZyYW1lRHVyYXRpb25VcyksCi0gICAgICBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSgwKSwKLSAgICAgIG1BdWRpb0R1cmF0aW9uVXMoYXVkaW9EdXJhdGlvblVzKSwKLSAgICAgIG1UaW1lU3RhbXBVcygwKSwKLSAgICAgIG1CdWZmZXJHcm91cChOVUxMKSB7Ci0KLSAgICBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA9IChpbnQzMl90KQotICAgICAgICAgICAgKCgxTCAqIG1TYW1wbGluZ1JhdGUgKiBtRnJhbWVEdXJhdGlvblVzKS8xMDAwMDAwKTsKLSAgICBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA9IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lICAqIG1DaGFubmVsQ291bnQ7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IEUiKTsKLSAgICBBTE9HVigic2FtcGxpbmdSYXRlID0gJWQiLCBzYW1wbGluZ1JhdGUpOwotICAgIEFMT0dWKCJjaGFubmVsQ291bnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7Ci0gICAgQUxPR1YoImZyYW1lRHVyYXRpb25VcyA9ICVsbGQiLCBmcmFtZUR1cmF0aW9uVXMpOwotICAgIEFMT0dWKCJhdWRpb0R1cmF0aW9uVXMgPSAlbGxkIiwgYXVkaW9EdXJhdGlvblVzKTsKLSAgICBBTE9HVigibU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSAlZCIsIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lKTsKLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IFgiKTsKLX0KLQotRHVtbXlBdWRpb1NvdXJjZTo6fkR1bW15QXVkaW9Tb3VyY2UoKSB7Ci0gICAgLyogRG8gbm90aGluZyBoZXJlPyAqLwotICAgIEFMT0dWKCJ+RHVtbXlBdWRpb1NvdXJjZSIpOwotfQotCi12b2lkIER1bW15QXVkaW9Tb3VyY2U6OnNldER1cmF0aW9uKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKSB7Ci0gICAgQUxPR1YoInNldER1cmF0aW9uOiAlbGxkIHVzIGFkZGVkIHRvICVsbGQgdXMiLAotICAgICAgICBhdWRpb0R1cmF0aW9uVXMsIG1BdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtQXVkaW9EdXJhdGlvblVzICs9IGF1ZGlvRHVyYXRpb25VczsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydDogRSIpOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgbVRpbWVTdGFtcFVzID0gMDsKLQotICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigKLSAgICAgICAgICAgIG5ldyBNZWRpYUJ1ZmZlcihtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSkpOwotCi0gICAgQUxPR1YoInN0YXJ0OiBYIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0KLSAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOwotICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3A8TWV0YURhdGE+IER1bW15QXVkaW9Tb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBtRnJhbWVEdXJhdGlvblVzKTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlBdWRpb1NvdXJjZSIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJyZWFkOiBFIik7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0KLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwotICAgICAgICBtVGltZVN0YW1wVXMgPSBzZWVrVGltZVVzOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1UaW1lU3RhbXBVcyA+PSBtQXVkaW9EdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICBBTE9HSSgicmVhZDogRU9TIHJlYWNoZWQgJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBVcywgbUF1ZGlvRHVyYXRpb25Vcyk7Ci0KLSAgICAgICAgICAgICpvdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFjcXVpcmUgYnVmZmVyIGZyb20gbUJ1ZmZlckdyb3VwOiAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh1aW50OF90ICopIGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIDAsIG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lIDw8IDEpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIChtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKSk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1UaW1lU3RhbXBVcyk7Ci0KLSAgICBBTE9HVigicmVhZDogb2Zmc2V0ICA9ICVkLCBzaXplID0gJWQsIG1UaW1lU3RhbXBVcyA9ICVsbGQiLAotICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpLCBtVGltZVN0YW1wVXMpOwotCi0gICAgbVRpbWVTdGFtcFVzID0gbVRpbWVTdGFtcFVzICsgbUZyYW1lRHVyYXRpb25VczsKLSAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmMjVhOGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teUF1ZGlvU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEVU1NWV9BVURJT1NPVVJDRV9IXwotI2RlZmluZSBEVU1NWV9BVURJT1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldGFEYXRhOwotc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLXN0cnVjdCBEdW1teUF1ZGlvU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLQotcHVibGljOgotICAgIHN0YXRpYyBzcDxEdW1teUF1ZGlvU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUsIGludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25Vcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHZvaWQgc2V0RHVyYXRpb24oaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RHVtbXlBdWRpb1NvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKLSAgICBpbnQzMl90IG1DaGFubmVsQ291bnQ7Ci0gICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwotICAgIGludDMyX3QgbU51bWJlck9mU2FtcGxlUGVyRnJhbWU7Ci0gICAgaW50NjRfdCBtQXVkaW9EdXJhdGlvblVzOwotICAgIGludDY0X3QgbVRpbWVTdGFtcFVzOwotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOwotCi0gICAgRHVtbXlBdWRpb1NvdXJjZSgKLSAgICAgICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgIGludDY0X3QgZnJhbWVEdXJhdGlvblVzLCBpbnQ2NF90IGF1ZGlvRHVyYXRpb25Vcyk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgRHVtbXlBdWRpb1NvdXJjZShjb25zdCBEdW1teUF1ZGlvU291cmNlICYpOwotICAgIER1bW15QXVkaW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teUF1ZGlvU291cmNlICYpOwotCi19OwotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvL0RVTU1ZX0FVRElPU09VUkNFX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGJjZjJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRHVtbXlWaWRlb1NvdXJjZSIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJEdW1teVZpZGVvU291cmNlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxEdW1teVZpZGVvU291cmNlPiBEdW1teVZpZGVvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpIHsKLQotICAgIEFMT0dWKCJDcmVhdGUiKTsKLSAgICByZXR1cm4gbmV3IER1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsaXBEdXJhdGlvbiwgaW1hZ2VVcmkpOwotCi19Ci0KLQotRHVtbXlWaWRlb1NvdXJjZTo6RHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0KLSAgICBtRnJhbWVXaWR0aCA9IHdpZHRoOwotICAgIG1GcmFtZUhlaWdodCA9IGhlaWdodDsKLSAgICBtSW1hZ2VDbGlwRHVyYXRpb24gPSBjbGlwRHVyYXRpb247Ci0gICAgbVVyaSA9IGltYWdlVXJpOwotICAgIG1JbWFnZUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiJXMiLCBtVXJpKTsKLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IFgiKTsKLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjp+RHVtbXlWaWRlb1NvdXJjZSgpIHsKLSAgICAvKiBEbyBub3RoaW5nIGhlcmU/ICovCi0gICAgQUxPR1YoIn5EdW1teVZpZGVvU291cmNlIik7Ci19Ci0KLQotCi1zdGF0dXNfdCBEdW1teVZpZGVvU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgQUxPR1YoInN0YXJ0OiBFIik7Ci0KLSAgICAvLyBHZXQgdGhlIGZyYW1lIGJ1ZmZlciBmcm9tIHRoZSByZ2IgZmlsZSwgbVVyaSwKLSAgICAvLyBhbmQgc3RvcmUgaXRzIGNvbnRlbnQgaW50byBhIE1lZGlhQnVmZmVyCi0gICAgc3RhdHVzX3QgZXJyID0gTHZHZXRJbWFnZVRodW1iTmFpbCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltVXJpLAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVIZWlnaHQsIG1GcmFtZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKikgJm1JbWFnZUJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiTHZHZXRJbWFnZVRodW1iTmFpbCBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtSXNGaXJzdEltYWdlRnJhbWUgPSB0cnVlOwotICAgIG1JbWFnZVNlZWtUaW1lID0gMDsKLSAgICBtSW1hZ2VQbGF5U3RhcnRUaW1lID0gMDsKLSAgICBtRnJhbWVUaW1lVXMgPSAwOwotCi0gICAgQUxPR1YoInN0YXJ0OiBYIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChtSW1hZ2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1JbWFnZUJ1ZmZlcik7Ci0gICAgICAgIG1JbWFnZUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1zcDxNZXRhRGF0YT4gRHVtbXlWaWRlb1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcik7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtRnJhbWVXaWR0aCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgbUZyYW1lSGVpZ2h0KTsKLSAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIG1JbWFnZUNsaXBEdXJhdGlvbik7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15VmlkZW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teVZpZGVvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwKLSAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgY29uc3QgaW50MzJfdCBrVGltZVNjYWxlID0gMTAwMDsgIC8qIHRpbWUgc2NhbGUgaW4gbXMgKi8KLSAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewotICAgICAgICBzZWVraW5nID0gdHJ1ZTsKLSAgICAgICAgbUltYWdlU2Vla1RpbWUgPSBzZWVrVGltZVVzOwotICAgICAgICBNNE9TQV9jbG9ja0dldFRpbWUoJm1JbWFnZVBsYXlTdGFydFRpbWUsIGtUaW1lU2NhbGUpOwotICAgIH0KLQotICAgIGlmICgobUltYWdlU2Vla1RpbWUgPT0gbUltYWdlQ2xpcER1cmF0aW9uKSB8fAotICAgICAgICAobUZyYW1lVGltZVVzID09IChpbnQ2NF90KW1JbWFnZUNsaXBEdXJhdGlvbikpIHsKLSAgICAgICAgQUxPR1YoInJlYWQ6IEVPUyByZWFjaGVkIik7Ci0gICAgICAgICpvdXQgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKAotICAgICAgICAgICAgbUltYWdlQnVmZmVyLCAobUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAxLjUpKTsKLQotICAgIC8vIFNldCB0aW1lc3RhbXAgb2YgYnVmZmVyCi0gICAgaWYgKG1Jc0ZpcnN0SW1hZ2VGcmFtZSkgewotICAgICAgICBNNE9TQV9jbG9ja0dldFRpbWUoJm1JbWFnZVBsYXlTdGFydFRpbWUsIGtUaW1lU2NhbGUpOwotICAgICAgICBtRnJhbWVUaW1lVXMgPSAgKG1JbWFnZVNlZWtUaW1lICsgMSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgMXN0IGZyYW1lIHRpbWVVcyA9ICVsbGQsIGJlZ2luIGN1dCB0aW1lID0gJSIgUFJJdTMyLAotICAgICAgICAgICAgbUZyYW1lVGltZVVzLCBtSW1hZ2VTZWVrVGltZSk7Ci0KLSAgICAgICAgbUlzRmlyc3RJbWFnZUZyYW1lID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTTRPU0FfVGltZSAgY3VycmVudFRpbWVNczsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZjdXJyZW50VGltZU1zLCBrVGltZVNjYWxlKTsKLQotICAgICAgICBtRnJhbWVUaW1lVXMgPSBtSW1hZ2VTZWVrVGltZSArCi0gICAgICAgICAgICAoY3VycmVudFRpbWVNcyAtIG1JbWFnZVBsYXlTdGFydFRpbWUpICogMTAwMExMOwotCi0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgZnJhbWUgdGltZVVzID0gJWxsZCIsIG1GcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1GcmFtZVRpbWVVcyk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSk7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY1MTRmMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0jZGVmaW5lIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgIE1lZGlhQnVmZmVyOwotY2xhc3MgIE1ldGFEYXRhOwotCi1zdHJ1Y3QgRHVtbXlWaWRlb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlWaWRlb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15VmlkZW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtRnJhbWVXaWR0aDsKLSAgICB1aW50MzJfdCBtRnJhbWVIZWlnaHQ7Ci0gICAgdWludDY0X3QgbUltYWdlQ2xpcER1cmF0aW9uOwotICAgIGNvbnN0IGNoYXIgKm1Vcmk7Ci0gICAgaW50NjRfdCBtRnJhbWVUaW1lVXM7Ci0gICAgYm9vbCBtSXNGaXJzdEltYWdlRnJhbWU7Ci0gICAgdm9pZCAqbUltYWdlQnVmZmVyOwotICAgIE00T1NBX1RpbWUgbUltYWdlUGxheVN0YXJ0VGltZTsKLSAgICB1aW50MzJfdCBtSW1hZ2VTZWVrVGltZTsKLQotICAgIER1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgRHVtbXlWaWRlb1NvdXJjZShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotICAgIER1bW15VmlkZW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotCi19OwotCi0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vRFVNTVlfVklERU9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjFkM2ZlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLUk0MjBDb2xvckNvbnZlcnRlcjo6STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIC8vIE9wZW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gICAgbUhhbmRsZSA9IGRsb3BlbigibGliSTQyMGNvbG9yY29udmVydC5zbyIsIFJUTERfTk9XKTsKLQotICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkk0MjBDb2xvckNvbnZlcnRlcjogY2Fubm90IGxvYWQgbGliSTQyMGNvbG9yY29udmVydC5zbyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgZW50cnkgcG9pbnQKLSAgICB2b2lkICgqZ2V0STQyMENvbG9yQ29udmVydGVyKShJNDIwQ29sb3JDb252ZXJ0ZXIgKmNvbnZlcnRlcikgPQotICAgICAgICAodm9pZCAoKikoSTQyMENvbG9yQ29udmVydGVyKikpIGRsc3ltKG1IYW5kbGUsICJnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLQotICAgIGlmIChnZXRJNDIwQ29sb3JDb252ZXJ0ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiSTQyMENvbG9yQ29udmVydGVyOiBjYW5ub3QgbG9hZCBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLSAgICAgICAgZGxjbG9zZShtSGFuZGxlKTsKLSAgICAgICAgbUhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGaWxsIHRoZSBmdW5jdGlvbiBwb2ludGVycy4KLSAgICBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIodGhpcyk7Ci0KLSAgICBBTE9HSSgiSTQyMENvbG9yQ29udmVydGVyOiBsaWJJNDIwY29sb3Jjb252ZXJ0LnNvIGxvYWRlZCIpOwotfQotCi1ib29sIEk0MjBDb2xvckNvbnZlcnRlcjo6aXNMb2FkZWQoKSB7Ci0gICAgcmV0dXJuIG1IYW5kbGUgIT0gTlVMTDsKLX0KLQotSTQyMENvbG9yQ29udmVydGVyOjp+STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIGlmIChtSGFuZGxlKSB7Ci0gICAgICAgIGRsY2xvc2UobUhhbmRsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNDhlNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0gKLSNkZWZpbmUgSTQyMF9DT0xPUl9DT05WRVJURVJfSAotCi0jaW5jbHVkZSA8SUk0MjBDb2xvckNvbnZlcnRlci5oPgotCi0vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIEk0MjAgY29sb3IgY29udmVydGVyIGZ1bmN0aW9ucyBpbgotLy8gSUk0MjBDb2xvckNvbnZlcnRlciwgd2hpY2ggaXMgbG9hZGVkIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KLWNsYXNzIEk0MjBDb2xvckNvbnZlcnRlcjogcHVibGljIElJNDIwQ29sb3JDb252ZXJ0ZXIgewotcHVibGljOgotICAgIEk0MjBDb2xvckNvbnZlcnRlcigpOwotICAgIH5JNDIwQ29sb3JDb252ZXJ0ZXIoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGZ1bmN0aW9ucyBhcmUgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4KLSAgICBib29sIGlzTG9hZGVkKCk7Ci1wcml2YXRlOgotICAgIHZvaWQqIG1IYW5kbGU7Ci19OwotCi0jZW5kaWYgLyogSTQyMF9DT0xPUl9DT05WRVJURVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjM2MmVmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyIgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLQotI2RlZmluZSBDSEVDS19FR0xfRVJST1IgQ0hFQ0soRUdMX1NVQ0NFU1MgPT0gZWdsR2V0RXJyb3IoKSkKLSNkZWZpbmUgQ0hFQ0tfR0xfRVJST1IgQ0hFQ0soR0xlbnVtKEdMX05PX0VSUk9SKSA9PSBnbEdldEVycm9yKCkpCi0KLS8vCi0vLyBWZXJ0ZXggYW5kIGZyYWdtZW50IHByb2dyYW1zCi0vLwotCi0vLyBUaGUgbWF0cml4IGlzIGRlcml2ZWQgZnJvbQotLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKLS8vCi0vLyBSICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSArIDEuNTk2ICogKFYgLSAxMjgpCi0vLyBHICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSAtIDAuODEzICogKFYgLSAxMjgpIC0gMC4zOTEgKiAoVSAtIDEyOCkKLS8vIEIgKiAyNTUgPSAxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCkKLS8vCi0vLyBIZXJlIHdlIGFzc3VtZSBZVVYgYXJlIGluIHRoZSByYW5nZSBvZiBbMCwyNTVdLCBSR0IgYXJlIGluIHRoZSByYW5nZSBvZgotLy8gWzAsIDFdCi0jZGVmaW5lIFJHQjJZVVZfTUFUUklYIFwKLSJjb25zdCBtYXQ0IHJnYjJ5dXYgPSBtYXQ0KCJcCi0iICAgIDY1LjUyMjU1LCAgIC0zNy43OTM5OCwgICAxMTEuOTg3MzIsICAgICAwLjAwMDAwLCJcCi0iICAgMTI4LjYyNzI5LCAgIC03NC4xOTMzNCwgICAtOTMuODEwODgsICAgICAwLjAwMDAwLCJcCi0iICAgIDI0LjkyMjMzLCAgIDExMS45ODczMiwgICAtMTguMTc2NDQsICAgICAwLjAwMDAwLCJcCi0iICAgIDE2LjAwMDAwLCAgIDEyOC4wMDAwMCwgICAxMjguMDAwMDAsICAgICAxLjAwMDAwKTtcbiIKLQotI2RlZmluZSBZVVYyUkdCX01BVFJJWCBcCi0iY29uc3QgbWF0NCB5dXYycmdiID0gbWF0NCgiXAotIiAgIDAuMDA0NTYsICAgMC4wMDQ1NiwgICAwLjAwNDU2LCAgIDAuMDAwMDAsIlwKLSIgICAwLjAwMDAwLCAgLTAuMDAxNTMsICAgMC4wMDc5MSwgICAwLjAwMDAwLCJcCi0iICAgMC4wMDYyNiwgIC0wLjAwMzE5LCAgIDAuMDAwMDAsICAgMC4wMDAwMCwiXAotIiAgLTAuODc0MTYsICAgMC41MzEzMywgIC0xLjA4NTk5LCAgIDEuMDAwMDApO1xuIgotCi1zdGF0aWMgY29uc3QgY2hhciB2U3JjTm9ybWFsW10gPQotICAgICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWMyIHZUZXhQb3M7XG4iCi0gICAgInVuaWZvcm0gbWF0NCB0ZXhNYXRyaXg7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICIgIHRleENvb3JkcyA9ICh0ZXhNYXRyaXggKiB2ZWM0KHZUZXhQb3MsIDAuMCwgMS4wKSkueHk7XG4iCi0gICAgIiAgdG9wRG93biA9IHZUZXhQb3MueTtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY05vcm1hbFtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjU2VwaWFbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgMTE3LjAsIDEzOS4wLCAxLjApO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNOZWdhdGl2ZVtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB5dXYgPSB2ZWM0KDI1NS4wIC0geXV2LngsIHl1di55LCB5dXYueiwgMS4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjR3JhZGllbnRbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB2ZWM0IG1peGluID0gdmVjNCgxNS4wLzMxLjAsIDU5LjAvNjMuMCwgMzEuMC8zMS4wLCAxLjApO1xuIgotICAgICIgIHZlYzQgeXV2MiA9IHJnYjJ5dXYgKiB2ZWM0KChtaXhpbi54eXogKiB0b3BEb3duKSwgMSk7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgeXV2Mi55LCB5dXYyLnosIDEpO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTmF0aXZlV2luZG93UmVuZGVyZXI6Ok5hdGl2ZVdpbmRvd1JlbmRlcmVyKHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdywKLSAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgIDogbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpCi0gICAgLCBtRHN0V2lkdGgod2lkdGgpCi0gICAgLCBtRHN0SGVpZ2h0KGhlaWdodCkKLSAgICAsIG1MYXN0VmlkZW9FZmZlY3QoLTEpCi0gICAgLCBtTmV4dFRleHR1cmVJZCgxMDApCi0gICAgLCBtQWN0aXZlSW5wdXRzKDApCi0gICAgLCBtVGhyZWFkQ21kKENNRF9JRExFKSB7Ci0gICAgY3JlYXRlVGhyZWFkKHRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyBydW4gaW4gdGhlIEdMIHRocmVhZC4KLS8vCi0vLyBBbGwgR0wtcmVsYXRlZCB3b3JrIGlzIGRvbmUgaW4gdGhpcyB0aHJlYWQsIGFuZCBvdGhlciB0aHJlYWRzIHNlbmQKLS8vIHJlcXVlc3RzIHRvIHRoaXMgdGhyZWFkIHVzaW5nIGEgY29tbWFuZCBjb2RlLiBXZSBleHBlY3QgbW9zdCBvZiB0aGUKLS8vIHRpbWUgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0aHJlYWQgc2VuZGluZyBpbiByZXF1ZXN0cywgc28gd2UgbGV0Ci0vLyBvdGhlciB0aHJlYWRzIHdhaXQgdW50aWwgdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQgYnkgR0wgdGhyZWFkLgotCi1pbnQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnRocmVhZFN0YXJ0KHZvaWQqIHNlbGYpIHsKLSAgICBBTE9HRCgiY3JlYXRlIHRocmVhZCIpOwotICAgICgoTmF0aXZlV2luZG93UmVuZGVyZXIqKXNlbGYpLT5nbFRocmVhZCgpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpnbFRocmVhZCgpIHsKLSAgICBpbml0aWFsaXplRUdMKCk7Ci0gICAgY3JlYXRlUHJvZ3JhbXMoKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgYm9vbCBxdWl0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFxdWl0KSB7Ci0gICAgICAgIHN3aXRjaCAobVRocmVhZENtZCkgewotICAgICAgICAgICAgY2FzZSBDTURfSURMRToKLSAgICAgICAgICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFTkRFUl9JTlBVVDoKLSAgICAgICAgICAgICAgICByZW5kZXIobVRocmVhZFJlbmRlcklucHV0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFU0VSVkVfVEVYVFVSRToKLSAgICAgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBtVGhyZWFkVGV4dHVyZUlkKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HTF9FUlJPUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX0RFTEVURV9URVhUVVJFOgotICAgICAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UaHJlYWRUZXh0dXJlSWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDTURfUVVJVDoKLSAgICAgICAgICAgICAgICB0ZXJtaW5hdGVFR0woKTsKLSAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBUZWxsIHRoZSByZXF1ZXN0ZXIgdGhhdCB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4KLSAgICAgICAgbVRocmVhZENtZCA9IENNRF9JRExFOwotICAgICAgICBtQ29uZC5icm9hZGNhc3QoKTsKLSAgICB9Ci0gICAgQUxPR0QoInF1aXQiKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6aW5pdGlhbGl6ZUVHTCgpIHsKLSAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0gICAgZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5VTEwpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTGludCBjb250ZXh0QXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgIGNvbnRleHRBdHRyaWJzKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBtRWdsQ29udGV4dCk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp0ZXJtaW5hdGVFR0woKSB7Ci0gICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVQcm9ncmFtcygpIHsKLSAgICBHTHVpbnQgdlNoYWRlcjsKLSAgICBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHZTcmNOb3JtYWwsICZ2U2hhZGVyKTsKLQotICAgIGNvbnN0IGNoYXIqIGZTcmNbTlVNQkVSX09GX0VGRkVDVFNdID0gewotICAgICAgICBmU3JjTm9ybWFsLCBmU3JjU2VwaWEsIGZTcmNOZWdhdGl2ZSwgZlNyY0dyYWRpZW50Ci0gICAgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNQkVSX09GX0VGRkVDVFM7IGkrKykgewotICAgICAgICBHTHVpbnQgZlNoYWRlcjsKLSAgICAgICAgbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGZTcmNbaV0sICZmU2hhZGVyKTsKLSAgICAgICAgY3JlYXRlUHJvZ3JhbSh2U2hhZGVyLCBmU2hhZGVyLCAmbVByb2dyYW1baV0pOwotICAgICAgICBnbERlbGV0ZVNoYWRlcihmU2hhZGVyKTsKLSAgICAgICAgQ0hFQ0tfR0xfRVJST1I7Ci0gICAgfQotCi0gICAgZ2xEZWxldGVTaGFkZXIodlNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVByb2dyYW0oCi0gICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSkgewotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlByb2dyYW0gbGluayBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBwcm9ncmFtID0gMDsKLSAgICB9Ci0KLSAgICAqb3V0UGdtID0gcHJvZ3JhbTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6bG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwKLSAgICAgICAgR0x1aW50KiBvdXRTaGFkZXIpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgQUxPR0UoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIHNoYWRlciA9IDA7Ci0gICAgfQotICAgICpvdXRTaGFkZXIgPSBzaGFkZXI7Ci19Ci0KLU5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp+TmF0aXZlV2luZG93UmVuZGVyZXIoKSB7Ci0gICAgQ0hFQ0sobUFjdGl2ZUlucHV0cyA9PSAwKTsKLSAgICBzdGFydFJlcXVlc3QoQ01EX1FVSVQpOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnJlbmRlcihSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBzcDxHTENvbnN1bWVyPiBTVCA9IGlucHV0LT5tU1Q7Ci0gICAgc3A8U3VyZmFjZT4gU1RDID0gaW5wdXQtPm1TVEM7Ci0KLSAgICBpZiAoaW5wdXQtPm1Jc0V4dGVybmFsQnVmZmVyKSB7Ci0gICAgICAgIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoU1RDLmdldCgpLCBpbnB1dC0+bUJ1ZmZlciwKLSAgICAgICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBxdWV1ZUludGVybmFsQnVmZmVyKFNUQy5nZXQoKSwgaW5wdXQtPm1CdWZmZXIpOwotICAgIH0KLQotICAgIFNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgIGdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhpbnB1dC0+bVJlbmRlcmluZ01vZGUsCi0gICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLQotICAgIGNvbnN0IEdMZmxvYXQgdGV4dHVyZUNvb3JkaW5hdGVzW10gPSB7Ci0gICAgICAgICAwLjBmLCAgMS4wZiwKLSAgICAgICAgIDAuMGYsICAwLjBmLAotICAgICAgICAgMS4wZiwgIDAuMGYsCi0gICAgICAgICAxLjBmLCAgMS4wZiwKLSAgICB9OwotCi0gICAgdXBkYXRlUHJvZ3JhbUFuZEhhbmRsZShpbnB1dC0+bVZpZGVvRWZmZWN0KTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtUG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXMpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtUG9zaXRpb25IYW5kbGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1UZXhQb3NIYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVRleFBvc0hhbmRsZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBHTGZsb2F0IHRleE1hdHJpeFsxNl07Ci0gICAgU1QtPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXhNYXRyaXgpOwotICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtVGV4TWF0cml4SGFuZGxlLCAxLCBHTF9GQUxTRSwgdGV4TWF0cml4KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIGlucHV0LT5tVGV4dHVyZUlkKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaSgKLSAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyAqYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhbncsIHRpbWVVcyAqIDEwMDApOwotICAgIHN0YXR1c190IGVyciA9IGFudy0+cXVldWVCdWZmZXIoYW53LCBidWZmZXItPmdyYXBoaWNCdWZmZXIoKS5nZXQoKSwgLTEpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgicXVldWVCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgbWV0YURhdGEtPnNldEludDMyKGtLZXlSZW5kZXJlZCwgMSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShhbncsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIENIRUNLKE5PX0VSUk9SID09IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYW53LCAmYW5iKSk7Ci0gICAgQ0hFQ0soYW5iICE9IE5VTEwpOwotCi0gICAgLy8gQ29weSB0aGUgYnVmZmVyCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgY29weUk0MjBCdWZmZXIoYnVmZmVyLCBpbWcsIHdpZHRoLCBoZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQ0hFQ0soTk9fRVJST1IgPT0gYW53LT5xdWV1ZUJ1ZmZlcihhbncsIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3RyaWRlKSB7Ci0gICAgaW50IHN0cmlkZVVWID0gKHN0cmlkZSAvIDIgKyAweGYpICYgfjB4ZjsKLSAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXNyYy0+ZGF0YSgpICsgc3JjLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAvLyBZCi0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodDsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCk7Ci0gICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGg7Ci0gICAgfQotICAgIC8vIFRoZSBzcmMgaXMgSTQyMCwgdGhlIGRzdCBpcyBZVjEyLgotICAgIC8vIFUKLSAgICBwICs9IHNyY1dpZHRoICogc3JjSGVpZ2h0IC8gNDsKLSAgICBmb3IgKGludCBpID0gc3JjSGVpZ2h0IC8gMjsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCAvIDIpOwotICAgICAgICBkc3QgKz0gc3RyaWRlVVY7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGggLyAyOwotICAgIH0KLSAgICAvLyBWCi0gICAgcCAtPSBzcmNXaWR0aCAqIHNyY0hlaWdodCAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodCAvIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGggLyAyKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZVVWOwotICAgICAgICBwICs9IHNyY1dpZHRoIC8gMjsKLSAgICB9Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnVwZGF0ZVByb2dyYW1BbmRIYW5kbGUodWludDMyX3QgdmlkZW9FZmZlY3QpIHsKLSAgICBpZiAobUxhc3RWaWRlb0VmZmVjdCA9PSB2aWRlb0VmZmVjdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxhc3RWaWRlb0VmZmVjdCA9IHZpZGVvRWZmZWN0OwotICAgIGludCBpOwotICAgIHN3aXRjaCAobUxhc3RWaWRlb0VmZmVjdCkgewotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9OT05FOgotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfU0VQSUE6Ci0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9ORUdBVElWRToKLSAgICAgICAgICAgIGkgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX0dSQURJRU5UOgotICAgICAgICAgICAgaSA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbVtpXSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBtUG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidlBvc2l0aW9uIik7Ci0gICAgbVRleFBvc0hhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW1baV0sICJ2VGV4UG9zIik7Ci0gICAgbVRleE1hdHJpeEhhbmRsZSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidGV4TWF0cml4Iik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpIHsKLSAgICBmbG9hdCB4LCB5OwotICAgIHN3aXRjaCAocmVuZGVyaW5nTW9kZSkgewotICAgICAgICBjYXNlIE00eFZTU19rUmVzaXppbmc6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBzbWFsbGVyIHNpZGUgMQotICAgICAgICAgICAgaWYgKHggPiB5KSB7Ci0gICAgICAgICAgICAgICAgeCAvPSB5OwotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa0JsYWNrQm9yZGVyczoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBsYXJnZXIgc2lkZSAxCi0gICAgICAgICAgICBpZiAoeCA+IHkpIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHggLz0geTsKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzBdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbMV0gPSB5OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzJdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbM10gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s0XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNV0gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s2XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbN10gPSB5OwotfQotCi0vLwotLy8gIFRoZSBmdW5jdGlvbnMgYmVsb3cgcnVuIGluIG90aGVyIHRocmVhZHMuCi0vLwotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpzdGFydFJlcXVlc3QoaW50IGNtZCkgewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAobVRocmVhZENtZCAhPSBDTURfSURMRSkgewotICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgbVRocmVhZENtZCA9IGNtZDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6c2VuZFJlcXVlc3QoKSB7Ci0gICAgbUNvbmQuYnJvYWRjYXN0KCk7Ci0gICAgd2hpbGUgKG1UaHJlYWRDbWQgIT0gQ01EX0lETEUpIHsKLSAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi1SZW5kZXJJbnB1dCogTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVJlbmRlcklucHV0KCkgewotICAgIEFMT0dEKCJuZXcgcmVuZGVyIGlucHV0ICVkIiwgbU5leHRUZXh0dXJlSWQpOwotICAgIFJlbmRlcklucHV0KiBpbnB1dCA9IG5ldyBSZW5kZXJJbnB1dCh0aGlzLCBtTmV4dFRleHR1cmVJZCk7Ci0KLSAgICBzdGFydFJlcXVlc3QoQ01EX1JFU0VSVkVfVEVYVFVSRSk7Ci0gICAgbVRocmVhZFRleHR1cmVJZCA9IG1OZXh0VGV4dHVyZUlkOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBtTmV4dFRleHR1cmVJZCsrOwotICAgIG1BY3RpdmVJbnB1dHMrKzsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmRlc3Ryb3lSZW5kZXJJbnB1dChSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBBTE9HRCgiZGVzdHJveSByZW5kZXIgaW5wdXQgJWQiLCBpbnB1dC0+bVRleHR1cmVJZCk7Ci0gICAgR0x1aW50IHRleHR1cmVJZCA9IGlucHV0LT5tVGV4dHVyZUlkOwotICAgIGRlbGV0ZSBpbnB1dDsKLQotICAgIHN0YXJ0UmVxdWVzdChDTURfREVMRVRFX1RFWFRVUkUpOwotICAgIG1UaHJlYWRUZXh0dXJlSWQgPSB0ZXh0dXJlSWQ7Ci0gICAgc2VuZFJlcXVlc3QoKTsKLQotICAgIG1BY3RpdmVJbnB1dHMtLTsKLX0KLQotLy8KLS8vICBSZW5kZXJJbnB1dAotLy8KLQotUmVuZGVySW5wdXQ6OlJlbmRlcklucHV0KE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlciwgR0x1aW50IHRleHR1cmVJZCkKLSAgICA6IG1SZW5kZXJlcihyZW5kZXJlcikKLSAgICAsIG1UZXh0dXJlSWQodGV4dHVyZUlkKSB7Ci0gICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbVNUID0gbmV3IEdMQ29uc3VtZXIoYnEsIG1UZXh0dXJlSWQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShicSk7Ci0gICAgbmF0aXZlX3dpbmRvd19jb25uZWN0KG1TVEMuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLX0KLQotUmVuZGVySW5wdXQ6On5SZW5kZXJJbnB1dCgpIHsKLX0KLQotQU5hdGl2ZVdpbmRvdyogUmVuZGVySW5wdXQ6OmdldFRhcmdldFdpbmRvdygpIHsKLSAgICByZXR1cm4gbVNUQy5nZXQoKTsKLX0KLQotdm9pZCBSZW5kZXJJbnB1dDo6dXBkYXRlVmlkZW9TaXplKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOwotCi0gICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgewotICAgICAgICBtV2lkdGggPSByaWdodCAtIGxlZnQgKyAxOwotICAgICAgICBtSGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKLSAgICB9Ci0KLSAgICAvLyBJZiByb3RhdGlvbiBkZWdyZWVzIGlzIDkwIG9yIDI3MCwgc3dhcCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgLy8gKG1XaWR0aCBhbmQgbUhlaWdodCBhcmUgdGhlIF9yb3RhdGVkXyBzb3VyY2UgcmVjdGFuZ2xlKS4KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7Ci0gICAgICAgIGludCB0bXAgPSBtV2lkdGg7Ci0gICAgICAgIG1XaWR0aCA9IG1IZWlnaHQ7Ci0gICAgICAgIG1IZWlnaHQgPSB0bXA7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklucHV0OjpyZW5kZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlciwgdWludDMyX3QgdmlkZW9FZmZlY3QsCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBib29sIGlzRXh0ZXJuYWxCdWZmZXIpIHsKLSAgICBtVmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7Ci0gICAgbUlzRXh0ZXJuYWxCdWZmZXIgPSBpc0V4dGVybmFsQnVmZmVyOwotICAgIG1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtUmVuZGVyZXItPnN0YXJ0UmVxdWVzdChOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Q01EX1JFTkRFUl9JTlBVVCk7Ci0gICAgbVJlbmRlcmVyLT5tVGhyZWFkUmVuZGVySW5wdXQgPSB0aGlzOwotICAgIG1SZW5kZXJlci0+c2VuZFJlcXVlc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZiNGNiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwotI2RlZmluZSBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0KLS8vIFRoZSBOYXRpdmVXaW5kb3dSZW5kZXJlciBkcmF3cyB2aWRlbyBmcmFtZXMgc3RvcmVkIGluIE1lZGlhQnVmZmVycyB0bwotLy8gYW4gQU5hdGl2ZVdpbmRvdy4gIEl0IGNhbiBhcHBseSAicmVuZGVyaW5nIG1vZGUiIGFuZCBjb2xvciBlZmZlY3RzIHRvCi0vLyB0aGUgZnJhbWVzLiAiUmVuZGVyaW5nIG1vZGUiIGlzIHRoZSBvcHRpb24gdG8gZG8gcmVzaXppbmcsIGNyb3BwaW5nLAotLy8gb3IgYmxhY2stYm9yZGVyaW5nIHdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvIGFyZQotLy8gZGlmZmVyZW50LiBDb2xvciBlZmZlY3RzIGluY2x1ZGUgc2VwaWEsIG5lZ2F0aXZlLCBhbmQgZ3JhZGllbnQuCi0vLwotLy8gVGhlIGlucHV0IHRvIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBSZW5kZXJJbnB1dCBjbGFzcywKLS8vIGFuZCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgYWN0aXZlIFJlbmRlcklucHV0IGF0IHRoZSBzYW1lIHRpbWUuIEFsdGhvdWdoCi0vLyB3ZSBvbmx5IGV4cGVjdCB0aGF0IGhhcHBlbnMgYnJpZWZseSB3aGVuIG9uZSBjbGlwIGlzIGFib3V0IHRvIGZpbmlzaAotLy8gYW5kIHRoZSBuZXh0IGNsaXAgaXMgYWJvdXQgdG8gc3RhcnQuCi0vLwotLy8gV2UgYWxsb2NhdGUgYSBTdXJmYWNlIGZvciBlYWNoIFJlbmRlcklucHV0IGFuZCB0aGUgdXNlciBjYW4gdXNlCi0vLyB0aGUgZ2V0VGFyZ2V0V2luZG93KCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIEFOYXRpdmVXaW5kb3cKLS8vIGZvciB0aGF0IFN1cmZhY2UuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGUgdXNlciBjYW4gcGFzcyB0aGF0Ci0vLyBBTmF0aXZlV2luZG93IHRvIE9NWENvZGVjOjpDcmVhdGUoKSBzbyB0aGUgY29kZWMgY2FuIGRlY29kZSBkaXJlY3RseQotLy8gdG8gYnVmZmVycyBwcm92aWRlZCBieSB0aGUgdGV4dHVyZS4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTENvbnN1bWVyOwotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIFJlbmRlcklucHV0OwotCi1jbGFzcyBOYXRpdmVXaW5kb3dSZW5kZXJlciB7Ci1wdWJsaWM6Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIH5OYXRpdmVXaW5kb3dSZW5kZXJlcigpOwotCi0gICAgUmVuZGVySW5wdXQqIGNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgdm9pZCBkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KTsKLQotcHJpdmF0ZToKLSAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoY29uc3QgTmF0aXZlV2luZG93UmVuZGVyZXIgJik7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKLQotICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCBmaW5pYWxpemF0aW9uCi0gICAgdm9pZCBpbml0aWFsaXplRUdMKCk7Ci0gICAgdm9pZCB0ZXJtaW5hdGVFR0woKTsKLSAgICB2b2lkIGNyZWF0ZVByb2dyYW1zKCk7Ci0gICAgdm9pZCBjcmVhdGVQcm9ncmFtKAotICAgICAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSk7Ci0gICAgdm9pZCBsb2FkU2hhZGVyKAotICAgICAgICAgICAgR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsIEdMdWludCogb3V0U2hhZGVyKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgZXZlcnkgZnJhbWUuCi0gICAgdm9pZCByZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KTsKLSAgICB2b2lkIHF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLSAgICB2b2lkIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIGNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSk7Ci0gICAgdm9pZCB1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KTsKLSAgICB2b2lkIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsCi0gICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBvbmNlIGFuZCBkb2Vzbid0IGNoYW5nZSBhZnRlcndhcmRzLgotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50IG1Ec3RXaWR0aCwgbURzdEhlaWdodDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBlbnVtIHsKLSAgICAgICAgRUZGRUNUX05PUk1BTCwKLSAgICAgICAgRUZGRUNUX1NFUElBLAotICAgICAgICBFRkZFQ1RfTkVHQVRJVkUsCi0gICAgICAgIEVGRkVDVF9HUkFESUVOVCwKLSAgICAgICAgTlVNQkVSX09GX0VGRkVDVFMKLSAgICB9OwotICAgIEdMdWludCBtUHJvZ3JhbVtOVU1CRVJfT0ZfRUZGRUNUU107Ci0KLSAgICAvLyBXZSB1c2Ugb25lIHNoYWRlciBwcm9ncmFtIGZvciBlYWNoIGVmZmVjdC4gbUxhc3RWaWRlb0VmZmVjdCByZW1lbWJlcnMKLSAgICAvLyB0aGUgcHJvZ3JhbSB1c2VkIGZvciB0aGUgbGFzdCBmcmFtZS4gd2hlbiB0aGUgZWZmZWN0IHVzZWQgY2hhbmdlcywKLSAgICAvLyB3ZSBjaGFuZ2UgdGhlIHByb2dyYW0gdXNlZCBhbmQgdXBkYXRlIHRoZSBoYW5kbGVzLgotICAgIHVpbnQzMl90IG1MYXN0VmlkZW9FZmZlY3Q7Ci0gICAgR0xpbnQgbVBvc2l0aW9uSGFuZGxlOwotICAgIEdMaW50IG1UZXhQb3NIYW5kbGU7Ci0gICAgR0xpbnQgbVRleE1hdHJpeEhhbmRsZTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIHZlcnRleCBjb29yZGluYXRlcyB1c2VkIGZvciB0aGUgZnJhbWUgdGV4dHVyZS4KLSAgICAvLyBJdCdzIGNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRoZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHRoZSBzb3VyY2UgYW5kCi0gICAgLy8gZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvLgotICAgIEdMZmxvYXQgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbOF07Ci0KLSAgICAvLyBXZSB1c2UgYSBkaWZmZXJlbnQgR0wgaWQgZm9yIGVhY2ggU3VyZmFjZS4KLSAgICBHTHVpbnQgbU5leHRUZXh0dXJlSWQ7Ci0KLSAgICAvLyBOdW1iZXIgb2YgZXhpc3RpbmcgUmVuZGVySW5wdXRzLCBqdXN0IGZvciBkZWJ1Z2dpbmcuCi0gICAgaW50IG1BY3RpdmVJbnB1dHM7Ci0KLSAgICAvLyBUaGUgR0wgdGhyZWFkIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBpbnQgdGhyZWFkU3RhcnQodm9pZCogc2VsZik7Ci0gICAgdm9pZCBnbFRocmVhZCgpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIEdMIHRocmVhZCBhbmQKLSAgICAvLyBvdGhlciB0aHJlYWRzLgotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZDsKLSAgICBlbnVtIHsKLSAgICAgICAgQ01EX0lETEUsCi0gICAgICAgIENNRF9SRU5ERVJfSU5QVVQsCi0gICAgICAgIENNRF9SRVNFUlZFX1RFWFRVUkUsCi0gICAgICAgIENNRF9ERUxFVEVfVEVYVFVSRSwKLSAgICAgICAgQ01EX1FVSVQsCi0gICAgfTsKLSAgICBpbnQgbVRocmVhZENtZDsKLSAgICBSZW5kZXJJbnB1dCogbVRocmVhZFJlbmRlcklucHV0OwotICAgIEdMdWludCBtVGhyZWFkVGV4dHVyZUlkOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIEdMIHRocmVhZC4KLSAgICAvLyBzZW5kUmVxdWVzdCgpIGFsc28gd2FpdHMgZm9yIHRoZSBHTCB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZQotICAgIC8vIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgdm9pZCBzdGFydFJlcXVlc3QoaW50IGNtZCk7Ci0gICAgdm9pZCBzZW5kUmVxdWVzdCgpOwotCi0gICAgZnJpZW5kIGNsYXNzIFJlbmRlcklucHV0OwotfTsKLQotY2xhc3MgUmVuZGVySW5wdXQgewotcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIEFOYXRpdmVXaW5kb3cgY29ycmVzcG9uZHMgdG8gdGhlIFN1cmZhY2UuCi0gICAgQU5hdGl2ZVdpbmRvdyogZ2V0VGFyZ2V0V2luZG93KCk7Ci0KLSAgICAvLyBVcGRhdGVzIHZpZGVvIGZyYW1lIHNpemUgZnJvbSB0aGUgTWVkaWFTb3VyY2UncyBtZXRhZGF0YS4gU3BlY2lmaWNhbGx5Ci0gICAgLy8gd2UgbG9vayBmb3Iga0tleVdpZHRoLCBrS2V5SGVpZ2h0LCBhbmQgKG9wdGlvbmFsbHkpIGtLZXlDcm9wUmVjdC4KLSAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZShzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICAvLyBSZW5kZXJzIHRoZSBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gdmlkZW8gZWZmZWN0IGFuZCByZW5kaW5nIG1vZGUuCi0gICAgLy8gVGhlIHZpZGVvIGVmZmV0cyBhcmUgZGVmaW5lZCBpbiBWaWRlb0VkaXRvclRvb2xzLmgKLSAgICAvLyBTZXQgaXNFeHRlcm5hbEJ1ZmZlciB0byB0cnVlIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGdpdmVuIGlzIG5vdAotICAgIC8vIHByb3ZpZGVkIGJ5IHRoZSBTdXJmYWNlLgotICAgIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQzMl90IHZpZGVvRWZmZWN0LAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgYm9vbCBpc0V4dGVybmFsQnVmZmVyKTsKLXByaXZhdGU6Ci0gICAgUmVuZGVySW5wdXQoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyLCBHTHVpbnQgdGV4dHVyZUlkKTsKLSAgICB+UmVuZGVySW5wdXQoKTsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciogbVJlbmRlcmVyOwotICAgIEdMdWludCBtVGV4dHVyZUlkOwotICAgIHNwPEdMQ29uc3VtZXI+IG1TVDsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7Ci0KLSAgICAvLyBUaGVzZSBhcmUgb25seSB2YWxpZCBkdXJpbmcgcmVuZGVyKCkgY2FsbHMKLSAgICB1aW50MzJfdCBtVmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIGJvb2wgbUlzRXh0ZXJuYWxCdWZmZXI7Ci0gICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0KLSAgICBmcmllbmQgY2xhc3MgTmF0aXZlV2luZG93UmVuZGVyZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmQ5Zjg0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEdW1teUF1ZGlvU291cmNlLmgiCi0jaW5jbHVkZSAiRHVtbXlWaWRlb1NvdXJjZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yU1JDLmgiCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpIHsKLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOwotICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOwotICAgIENIRUNLKHNlcnZpY2UuZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgICBzZXJ2aWNlLT5hZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi1zdHJ1Y3QgUHJldmlld1BsYXllckV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgewotICAgIFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIFByZXZpZXdQbGF5ZXIgKnBsYXllciwKLSAgICAgICAgICAgIHZvaWQgKFByZXZpZXdQbGF5ZXI6OiptZXRob2QpKCkpCi0gICAgICAgIDogbVBsYXllcihwbGF5ZXIpLAotICAgICAgICAgIG1NZXRob2QobWV0aG9kKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UHJldmlld1BsYXllckV2ZW50KCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7Ci0gICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgUHJldmlld1BsYXllciAqbVBsYXllcjsKLSAgICB2b2lkIChQcmV2aWV3UGxheWVyOjoqbU1ldGhvZCkoKTsKLQotICAgIFByZXZpZXdQbGF5ZXJFdmVudChjb25zdCBQcmV2aWV3UGxheWVyRXZlbnQgJik7Ci0gICAgUHJldmlld1BsYXllckV2ZW50ICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1BsYXllckV2ZW50ICYpOwotfTsKLQotUHJldmlld1BsYXllcjo6UHJldmlld1BsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpCi0gICAgOiBtUXVldWVTdGFydGVkKGZhbHNlKSwKLSAgICAgIG1UaW1lU291cmNlKE5VTEwpLAotICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcoZmFsc2UpLAotICAgICAgbUF1ZGlvUGxheWVyKE5VTEwpLAotICAgICAgbURpc3BsYXlXaWR0aCgwKSwKLSAgICAgIG1EaXNwbGF5SGVpZ2h0KDApLAotICAgICAgbUZsYWdzKDApLAotICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAotICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAotICAgICAgbUxhc3RWaWRlb1RpbWVVcygtMSksCi0gICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIocmVuZGVyZXIpLAotICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgoMCksCi0gICAgICBtRnJhbWVSR0JCdWZmZXIoTlVMTCksCi0gICAgICBtRnJhbWVZVVZCdWZmZXIoTlVMTCkgewotCi0gICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7Ci0gICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotCi0gICAgbVZpZGVvUmVuZGVyZXIgPSBOVUxMOwotICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gMDsKLSAgICBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lID0gMDsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSAwOwotICAgIG1OdW1iZXJFZmZlY3RzID0gMDsKLSAgICBtRGVjb2RlZFZpZGVvVHMgPSAwOwotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IDA7Ci0gICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSAwOwotICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKLQotICAgIG1WaWRlb0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLCAmUHJldmlld1BsYXllcjo6b25WaWRlb0V2ZW50KTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtVmlkZW9MYWdFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uQ2hlY2tBdWRpb1N0YXR1cyk7Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVN0cmVhbURvbmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25TdHJlYW1Eb25lKTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1Qcm9ncmVzc0NiRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsCi0gICAgICAgICAmUHJldmlld1BsYXllcjo6b25Qcm9ncmVzc0NiRXZlbnQpOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgJlByZXZpZXdQbGF5ZXI6Om9uVXBkYXRlT3ZlcmxheUV2ZW50KTsKLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IChNNHhWU1NfTWVkaWFSZW5kZXJpbmcpTUVESUFfUkVOREVSSU5HX0lOVkFMSUQ7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXNldCgpOwotfQotCi1QcmV2aWV3UGxheWVyOjp+UHJldmlld1BsYXllcigpIHsKLQotICAgIGlmIChtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdG9wKCk7Ci0gICAgfQotCi0gICAgcmVzZXQoKTsKLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcikgewotICAgICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXItPmRlc3Ryb3lSZW5kZXJJbnB1dChtVmlkZW9SZW5kZXJlcik7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyX2woKTsKLSAgICBtQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpjYW5jZWxQbGF5ZXJFdmVudHNfbChib29sIHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvTGFnRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgaWYgKHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICAgICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1Qcm9ncmVzc0NiRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wocGF0aCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgcmVzZXRfbCgpOwotCi0gICAgbVVyaSA9IHBhdGg7Ci0KLSAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwotICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgotICAgIC8vIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKSB7Ci0gICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKLSAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZVZpZGVvICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldFZpZGVvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKLSAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgZm9yIHZvcmJpcyBhdWRpbywgbm9uZSBvZiB0aGUgb3RoZXIgYXVkaW8KLSAgICAgICAgICAgICAgICAvLyBmb3JtYXRzIGV2ZW4gc3VwcG9ydCB0aGlzIHJpbmd0b25lIHNwZWNpZmljIGhhY2sgYW5kCi0gICAgICAgICAgICAgICAgLy8gcmV0cmlldmluZyB0aGUgbWV0YWRhdGEgb24gc29tZSBleHRyYWN0b3JzIG1heSB0dXJuIG91dAotICAgICAgICAgICAgICAgIC8vIHRvIGJlIHZlcnkgZXhwZW5zaXZlLgotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3A7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsb29wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVVE9fTE9PUElORzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBZGQgdGhlIHN1cHBvcnQgZm9yIER1bW15IGF1ZGlvKi8KLSAgICBpZiggIWhhdmVBdWRpbyApewotICAgICAgICBtQXVkaW9UcmFjayA9IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgzMjAwMCwgMiwgMjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICAgICAgaWYobUF1ZGlvVHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghaGF2ZUF1ZGlvICYmICFoYXZlVmlkZW8pIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUV4dHJhY3RvckZsYWdzID0gZXh0cmFjdG9yLT5mbGFncygpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sX2pwZygpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZV9sX2pwZyIpOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBtQXVkaW9Tb3VyY2UgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICBpZihtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzZXRBdWRpb1NvdXJjZShtQXVkaW9Tb3VyY2UpOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnJvciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkVycm9yIHN0YXJ0aW5nIGR1bW15IGF1ZGlvIHNvdXJjZSIpOwotICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IChtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSoxMDAwTEw7Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBEdW1teVZpZGVvU291cmNlOjpDcmVhdGUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMsIG1VcmkpOwotCi0gICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgIHNldFZpZGVvU291cmNlKG1WaWRlb1NvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZXJyMSA9IG1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyMSAhPSBPSykgewotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtSXNWaWRlb1NvdXJjZUpwZyA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0X2woKSB7Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKLQotICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0Ci0gICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKLSAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQotICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KLSAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCi0gICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKLSAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KLSAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgIH0KLSAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLQotICAgIG1UaW1lU291cmNlID0gTlVMTDsKLQotICAgIC8vU2luZ2xlIGF1ZGlvIHBsYXllciBpbnN0YW5jZSB1c2VkCi0gICAgLy9TbyBkb25vdCBkZWxldGUgaXQgaGVyZQotICAgIC8vSXQgaXMgZGVsZXRlZCBmcm9tIFByZXZpZXdDb250cm9sbGVyIGNsYXNzCi0gICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICBpZiAobVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAgICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQotICAgICAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICAgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKLSAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOwotICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7Ci0gICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAtMTsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgbUlzVmlkZW9Tb3VyY2VKcGcgPSBmYWxzZTsKLSAgICBtRnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIGlmKG1GcmFtZVlVVkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUZyYW1lWVVWQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lWVVWQnVmZmVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXkoKSB7Ci0gICAgQUxPR1YoInBsYXkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLSAgICBtRmxhZ3MgJj0gfklORk9STUVEX0FWX0VPUzsKLSAgICByZXR1cm4gcGxheV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnN0YXJ0QXVkaW9QbGF5ZXJfbCgpIHsKLSAgICBBTE9HVigic3RhcnRBdWRpb1BsYXllcl9sIik7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotCi0gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCi0gICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotCi0gICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllciIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBQTEFZSU5HKSk7Ci0gICAgbUF1ZGlvUGxheWVyID0gYXVkaW9QbGF5ZXI7Ci0KLSAgICBBTE9HVigiU2V0QXVkaW9QbGF5ZXIiKTsKLSAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgbmV3IGFuZCBvbGQgc291cmNlIGFyZSBkdW1teQotICAgIHNwPE1lZGlhU291cmNlPiBhbkF1ZGlvU291cmNlID0gbUF1ZGlvUGxheWVyLT5nZXRTb3VyY2UoKTsKLSAgICBpZiAoYW5BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0LgotICAgICAgICBBTE9HVigic2V0QXVkaW9QbGF5ZXI6IEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0Iik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBJZiBuZXcgdmlkZW8gc291cmNlIGlzIG5vdCBkdW1teSwgdGhlbiBhbHdheXMgY2hhbmdlIHNvdXJjZQotICAgIC8vIEVsc2UgYXVkaW8gcGxheWVyIGNvbnRpbnVlcyB1c2luZyBvbGQgYXVkaW8gc291cmNlIGFuZCB0aGVyZSBhcmUKLSAgICAvLyBmcmFtZSBkcm9wcyB0byBtYWludGFpbiBBViBzeW5jCi0gICAgc3A8TWV0YURhdGE+IG1ldGE7Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICBjb25zdCBjaGFyICpwVmlkU3JjVHlwZTsKLSAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFZpZFNyY1R5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHBWaWRTcmNUeXBlLCAiRHVtbXlWaWRlb1NvdXJjZSIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIFZpZGVvIGNsaXAgd2l0aCBzaWxlbnQgYXVkaW87IG5lZWQgdG8gY2hhbmdlIHNvdXJjZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKnBTcmNUeXBlMTsKLSAgICBjb25zdCBjaGFyICpwU3JjVHlwZTI7Ci0gICAgbWV0YSA9IGFuQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFNyY1R5cGUxKSkgewotICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMSwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhID0gbUF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBTcmNUeXBlMikpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMiwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBuZXcgcGxheSBkdXJhdGlvbiBmb3IgdGhlIGV4aXN0aW5nIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZSAqcE1lZGlhU3JjID0gYW5BdWRpb1NvdXJjZS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgRHVtbXlBdWRpb1NvdXJjZSAqcER1bW15QXVkaW9Tb3VyY2UgPSAoRHVtbXlBdWRpb1NvdXJjZSopcE1lZGlhU3JjOwotICAgICAgICAgICAgICAgICAgICAvL0luY3JlbWVudCB0aGUgZHVyYXRpb24gb2YgYXVkaW8gc291cmNlCi0gICAgICAgICAgICAgICAgICAgIHBEdW1teUF1ZGlvU291cmNlLT5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgbmV3IGF1ZGlvIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb250aW51ZSB1c2luZyBvbGQgc291cmNlCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllcjogc3RvcCBuZXcgYXVkaW8gc291cmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUoKSB7Ci0gICAgQUxPR1YoIm9uU3RyZWFtRG9uZSIpOwotICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCi0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVN0cmVhbURvbmVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKLQotICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKLQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgYm9vbCBhbGxEb25lID0KLSAgICAgICAgKG1WaWRlb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKQotICAgICAgICAgICAgJiYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpKTsKLQotICAgIGlmICghYWxsRG9uZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIChMT09QSU5HIHwgQVVUT19MT09QSU5HKSkgewotICAgICAgICBzZWVrVG9fbCgwKTsKLQotICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAvL3BhdXNlIGJlZm9yZSBzZW5kaW5nIGV2ZW50Ci0gICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwotCi0gICAgICAgIC8vVGhpcyBsb2NrIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrQ29udHJvbCk7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSBQcmV2aWV3UGxheWVyIG9ubHkgbm90aWZpZXMgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgb25jZSBmb3IgZWFjaCBjbGlwIQotICAgICAgICAgKiBJdCBoYXBwZW5zIHR3aWNlIGluIGZvbGxvd2luZyBzY2VuYXJpby4KLSAgICAgICAgICogVG8gbWFrZSB0aGUgY2xpcHMgaW4gcHJldmlldyBzdG9yeWJvYXJkIGFyZSBwbGF5ZWQgYW5kIHN3aXRjaGVkIHNtb290aGx5LAotICAgICAgICAgKiBQcmV2aWV3Q29udHJvbGxlciB1c2VzIHR3byBQcmV2aWV3UGxheWVyIGluc3RhbmNlcyBhbmQgb25lIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBUaGUgdHdvIFByZXZpZXdQbGF5ZXIgdXNlIHRoZSBzYW1lIEF1ZGlvUGxheWVyIHRvIHBsYXkgdGhlIGF1ZGlvLAotICAgICAgICAgKiBhbmQgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2Ugb2YgdGhlIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBJZiB0aGUgYXVkaW8gc291cmNlIG9mIGN1cnJlbnQgcGxheWluZyBjbGlwIGFuZCBuZXh0IGNsaXAgYXJlIGR1bW15Ci0gICAgICAgICAqIGF1ZGlvIHNvdXJjZShpbWFnZSBvciB2aWRlbyB3aXRob3V0IGF1ZGlvKSwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2UKLSAgICAgICAgICogdG8gYXZvaWQgdGhlICJhdWRpbyBnbGl0Y2giLCBhbmQga2VlcCB1c2luZyB0aGUgY3VycmVudCBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAqIFdoZW4gdGhlIHZpZGVvIG9mIGN1cnJlbnQgY2xpcCByZWFjaGVkIHRoZSBFT1MsIFByZXZpZXdQbGF5ZXIgd2lsbCBzZXQgRU9TIGZsYWcKLSAgICAgICAgICogZm9yIHZpZGVvIGFuZCBhdWRpbywgYW5kIGl0IHdpbGwgbm90aWZ5IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLgotICAgICAgICAgKiBCdXQgdGhlIGF1ZGlvKGR1bW15IGF1ZGlvIHNvdXJjZSkgaXMgc3RpbGwgcGxheWluZyhmb3IgbmV4dCBjbGlwKSwKLSAgICAgICAgICogYW5kIHdoZW4gaXQgcmVhY2hlZCB0aGUgRU9TLCBhbmQgdmlkZW8gcmVhY2hlZCBFT1MsCi0gICAgICAgICAqIFByZXZpZXdQbGF5ZXIgd2lsbCBub3RpZnkgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgYWdhaW4uICovCi0gICAgICAgIGlmICghKG1GbGFncyAmIElORk9STUVEX0FWX0VPUykpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOwotICAgICAgICAgICAgbUZsYWdzIHw9IElORk9STUVEX0FWX0VPUzsKLSAgICAgICAgfQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICBBTE9HVigib25TdHJlYW1Eb25lIGVuZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXlfbCgpIHsKLSAgICBBTE9HVigicGxheV9sIik7Ci0KLSAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLQotICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgbVN0YXJ0TmV4dFBsYXllciA9IGZhbHNlOwotCi0gICAgaWYgKCEobUZsYWdzICYgUFJFUEFSRUQpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHByZXBhcmVfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUExBWUlORzsKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0KLSAgICBib29sIGRlZmVycmVkQXVkaW9TZWVrID0gZmFsc2U7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtQXVkaW9TaW5rLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldFNvdXJjZShtQXVkaW9Tb3VyY2UpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0gICAgICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJlZmV0Y2hlciB0byByZWFkIGl0cyBkYXRhLgotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCBpc0F1ZGlvUGxheWVyU3RhcnRlZCA9IG1BdWRpb1BsYXllci0+aXNTdGFydGVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBsYXlfbDogQ2hhbmdlIGF1ZGlvIHNvdXJjZSByZXF1aXJlZCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTLCBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGxheV9sOiBObyBTb3VyY2UgY2hhbmdlIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7Ci0gICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1UaW1lU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgbVRpbWVTb3VyY2UgPSAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzZWVrIG9wdGlvbiBmb3IgSW1hZ2Ugc291cmNlIGZpbGVzIGFuZCByZWFkLgotICAgIC8vIFRoaXMgcmVzZXRzIHRoZSB0aW1lc3RhbXBpbmcgZm9yIGltYWdlIHBsYXkKLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIE1lZGlhQnVmZmVyICphTG9jYWxCdWZmZXI7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLSAgICAgICAgbVZpZGVvU291cmNlLT5yZWFkKCZhTG9jYWxCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgYUxvY2FsQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIEtpY2sgb2ZmIHZpZGVvIHBsYXliYWNrCi0gICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVmZXJyZWRBdWRpb1NlZWspIHsKLSAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgc2VlayByZXF1ZXN0IHdoaWxlIHdlIHdlcmUgcGF1c2VkCi0gICAgICAgIC8vIGFuZCB3ZSdyZSBqdXN0IHN0YXJ0aW5nIHVwIGFnYWluLCBob25vciB0aGUgcmVxdWVzdCBub3cuCi0gICAgICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgQVRfRU9TKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBiZWhhdmlvdXIsIGlmIGEgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcgYW5kIHRoZW4KLSAgICAgICAgLy8gaXMgc3RhcnRlZCBhZ2Fpbiwgd2UgcGxheSBmcm9tIHRoZSBzdGFydC4uLgotICAgICAgICBzZWVrVG9fbCgwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFJlbmRlcmVyX2woKSB7Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBtTmF0aXZlV2luZG93UmVuZGVyZXItPmNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKChtRXh0cmFjdG9yRmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspIHx8IChtSXNWaWRlb1NvdXJjZUpwZykpIHsKLSAgICAgICAgcmV0dXJuIHNlZWtUb19sKHRpbWVVcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldFZpZGVvRGltZW5zaW9ucygKLSAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgKndpZHRoID0gbVZpZGVvV2lkdGg7Ci0gICAgKmhlaWdodCA9IG1WaWRlb0hlaWdodDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0QXVkaW9EZWNvZGVyX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewotICAgICAgICBtQXVkaW9Tb3VyY2UgPSBtQXVkaW9UcmFjazsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gYVJhd1NvdXJjZTsKLSAgICAgICAgYVJhd1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBjcmVhdGVFbmNvZGVyCi0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2spOwotCi0gICAgICAgIGlmKGFSYXdTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gbmV3IFZpZGVvRWRpdG9yU1JDKGFSYXdTb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKSkgewotICAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbnMgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGlnbm9yZSB0aGUgYWJzZW5jZQotICAgICAgICAvLyBvZiBhbiBhdWRpbyBkZWNvZGVyIGZvciBRQ0VMUCBpbnN0ZWFkIG9mIGFib3J0aW5nIHBsYXliYWNrCi0gICAgICAgIC8vIGFsdG9nZXRoZXIuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUF1ZGlvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRWaWRlb0RlY29kZXJfbCh1aW50MzJfdCBmbGFncykgewotICAgIGluaXRSZW5kZXJlcl9sKCk7Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZW5kZXJlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBtVmlkZW9UcmFjaywKLSAgICAgICAgICAgIE5VTEwsIGZsYWdzLCBtVmlkZW9SZW5kZXJlci0+Z2V0VGFyZ2V0V2luZG93KCkpOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9FdmVudCgpIHsKLSAgICB1aW50MzJfdCBpPTA7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIGludDY0X3QgaW1hZ2VGcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIC8vIFRoZSBldmVudCBoYXMgYmVlbiBjYW5jZWxsZWQgaW4gcmVzZXRfbCgpIGJ1dCBoYWQgYWxyZWFkeQotICAgICAgICAvLyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGF0IHRoYXQgdGltZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpIHsKLSAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUaW1lU291cmNlICp0c19zdCA9ICAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgaW50NjRfdCB0aW1lU3RhcnRVcyA9IHRzX3N0LT5nZXRSZWFsVGltZVVzKCk7Ci0KLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotCi0gICAgICAgIGlmKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlZWsgdGhlIHZpZGVvIHNvdXJjZSBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBqdW1wcyBpbiB0aGUgRGF0YVNvdXJjZSBvZmZzZXQgY2F1c2VkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gY29kZWMgcHJlZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBvbGQgbG9jYXRpb25zCi0gICAgICAgICAgICAvLyB3aGlsZSB0aGUgdmlkZW8gY29kZWMgaXMgYWxyZWFkeSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV3Ci0gICAgICAgICAgICAvLyBsb2NhdGlvbnMsIHdlJ2xsICJwYXVzZSIgdGhlIGF1ZGlvIHNvdXJjZSwgY2F1c2luZyBpdCB0bwotICAgICAgICAgICAgLy8gc3RvcCByZWFkaW5nIGlucHV0IGRhdGEgdW50aWwgYSBzdWJzZXF1ZW50IHNlZWsuCi0KLSAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIHNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1WaWRlb0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiBWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU28gdmlkZW8gcGxheWJhY2sgaXMgY29tcGxldGUsIGJ1dCB3ZSBtYXkgc3RpbGwgaGF2ZQotICAgICAgICAgICAgICAgIC8vIGEgc2VlayByZXF1ZXN0IHBlbmRpbmcgdGhhdCBuZWVkcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBzdHJlYW0gZW5kZWQgd2hpbGUgc2Vla2luZyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KC0xKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IEVPUyByZWFjaGVkLiIpOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVmlkZW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGRlY29kZXJzLCBub3RhYmx5IHRoZSBQViBBVkMgc29mdHdhcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBzcHVyaW91cyBlbXB0eSBidWZmZXJzIHRoYXQgd2UganVzdCB3YW50IHRvIGlnbm9yZS4KLQotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdmlkZW9UaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ2aWRlb1RpbWVVcykpOwotCi0gICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgIGlmICh2aWRlb1RpbWVVcyA8IG1TZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBzZWVrIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZyYW1lcyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIERvbm90IHJlbmRlcgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtTnVtYmVyRGVjVmlkZW9GcmFtZXMrKzsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIHNldFBvc2l0aW9uX2wodGltZVVzKTsKLQotICAgIGlmICghbVN0YXJ0TmV4dFBsYXllcikgewotICAgICAgICBpbnQ2NF90IHBsYXliYWNrVGltZVJlbWFpbmluZyA9IChtUGxheUVuZFRpbWVNc2VjICogMTAwMExMKSAtIHRpbWVVczsKLSAgICAgICAgaWYgKHBsYXliYWNrVGltZVJlbWFpbmluZyA8PSAxNTAwMDAwKSB7Ci0gICAgICAgICAgICAvL1doZW4gbGVzcyB0aGFuIDEuNSBzZWMgb2YgcGxheWJhY2sgbGVmdAotICAgICAgICAgICAgLy8gc2VuZCBub3RpZmljYXRpb24gdG8gc3RhcnQgbmV4dCBwbGF5ZXIKLQotICAgICAgICAgICAgbVN0YXJ0TmV4dFBsYXllciA9IHRydWU7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QUFBQUFBQUEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2Vla1R5cGUgd2FzU2Vla2luZyA9IG1TZWVraW5nOwotICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSh0aW1lVXMpOwotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAhKG1GbGFncyAmIChBVURJT19SVU5OSU5HKSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJTdGFydGluZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwotCi0gICAgaWYodHMgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmKCFtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7Ci0KLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwotICAgICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19BVF9FT1MpICYmIG1BdWRpb1BsYXllciAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwotCi0gICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwotCi0gICAgICAgIGlmICh3YXNTZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KLSAgICAgICAgICAgIGxhdGVuZXNzVXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBdWRpbyB0aW1lIHN0YW1wID0gJWxsZCBhbmQgdmlkZW8gdGltZSBzdGFtcCA9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy0+Z2V0UmVhbFRpbWVVcygpLHRpbWVVcyk7Ci0gICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0KLSAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgd2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKLQotICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXRlbmVzc1VzIDwgLTI1MDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseS4KLSAgICAgICAgICAgIEFMT0dWKCJXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseSwgbGF0ZW5lc3MgJWxsZCIsIGxhdGVuZXNzVXMpOwotCi0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDI1MDAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcklzUHJldmlldyB8fCBtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aW1lc3RhbXAgZXhjZWVkcyBlbmRDdXRUaW1lIG9mIGNsaXAsIGRvbm90IHJlbmRlcgotICAgIGlmKCh0aW1lVXMvMTAwMCkgPiBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IHRpbWVVcyA+IG1QbGF5RW5kVGltZTsgc2VuZCBFT1MuLiIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gQ2FwdHVyZSB0aGUgZnJhbWUgdGltZXN0YW1wIHRvIGJlIHJlbmRlcmVkCi0gICAgbURlY29kZWRWaWRlb1RzID0gdGltZVVzOwotCi0gICAgLy8gUG9zdCBwcm9jZXNzaW5nIHRvIGFwcGx5IHZpZGVvIGVmZmVjdHMKLSAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGVmZmVjdCBzdGFydHRpbWUgbWF0Y2hlcyB0aGUgY2xpcCBiZWluZyBwcmV2aWV3ZWQKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCAobURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDApKSB8fAotICAgICAgICAobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PQotICAgICAgICAgKChtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCkgKyBtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGlmIGVmZmVjdCBhcHBsaWVzIHRvIHRoaXMgcGFydGljdWxhciBmcmFtZSB0aW1lc3RhbXAKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0KLSAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpICYmCi0gICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpCi0gICAgICAgICAgICAgICYmIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1Byb3ZpZGUgdGhlIG92ZXJsYXkgVXBkYXRlIGluZGljYXRpb24gd2hlbiB0aGVyZSBpcyBhbiBvdmVybGF5IGVmZmVjdAotICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+VklERU9fRUZGRUNUX0ZSQU1JTkc7IC8vbmV2ZXIgYXBwbHkgZnJhbWluZyBoZXJlLgotICAgICAgICBpZiAoIW1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4OwotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbU51bWJlckVmZmVjdHM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU1zID0gbURlY29kZWRWaWRlb1RzLzEwMDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQgPSBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMDsKLSAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2luZGV4XS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSArIDEpIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgKyB0aW1lT2Zmc2V0IC0gbVBsYXlCZWdpblRpbWVNc2VjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSAtIDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyArIHRpbWVPZmZzZXQgLSBtUGxheUJlZ2luVGltZU1zZWMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1OdW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiRnJhbWluZyBpbmRleCA9ICVsZCIsIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5vIGZyYW1pbmcgZWZmZWN0cyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgLy9Qb3N0IHRoZSBldmVudCB3aGVuIHRoZSBvdmVybGF5IGlzIG5vIG1vcmUgdmFsaWQKLSAgICAgICAgQUxPR1YoIk92ZXJsYXkgaXMgRG9uZSIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT5yZW5kZXIobVZpZGVvQnVmZmVyLCBtQ3VycmVudFZpZGVvRWZmZWN0LAotICAgICAgICAgICAgICAgIG1SZW5kZXJpbmdNb2RlLCBtSXNWaWRlb1NvdXJjZUpwZyk7Ci0gICAgfQotCi0gICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLQotICAgIC8vIFBvc3QgcHJvZ3Jlc3MgY2FsbGJhY2sgYmFzZWQgb24gY2FsbGJhY2sgaW50ZXJ2YWwgc2V0Ci0gICAgaWYobU51bWJlckRlY1ZpZGVvRnJhbWVzID49IG1Qcm9ncmVzc0NiSW50ZXJ2YWwpIHsKLSAgICAgICAgcG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCk7Ci0gICAgICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7ICAvLyByZXNldCBjb3VudGVyCi0gICAgfQotCi0gICAgLy8gaWYgcmVhY2hlZCBFbmRDdXRUaW1lIG9mIGNsaXAsIHBvc3QgRU9TIGV2ZW50Ci0gICAgaWYoKHRpbWVVcy8xMDAwKSA+PSBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TLiIpOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgJiYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIW1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgzMzAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmUoKSB7Ci0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwcmVwYXJlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZV9sKCkgewotICAgIEFMT0dWKCJwcmVwYXJlX2wiKTsKLSAgICBpZiAobUZsYWdzICYgUFJFUEFSRUQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUlzQXN5bmNQcmVwYXJlID0gZmFsc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gcHJlcGFyZUFzeW5jX2woKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVByZXBhcmVSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcHJlcGFyZUFzeW5jX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZUFzeW5jX2woKSB7Ci0gICAgQUxPR1YoInByZXBhcmVBc3luY19sIik7Ci0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIGFzeW5jIHByZXBhcmUgYWxyZWFkeSBwZW5kaW5nCi0gICAgfQotCi0gICAgaWYgKCFtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdGFydCgpOwotICAgICAgICBtUXVldWVTdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCk7Ci0KLSAgICBtUXVldWUucG9zdEV2ZW50KG1Bc3luY1ByZXBhcmVFdmVudCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmZpbmlzaFNldERhdGFTb3VyY2VfbCgpIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7Ci0KLSAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCBOVUxMKTsKLQotICAgIGlmIChkYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy9JZiBmaWxlIHR5cGUgaXMgLnJnYiwgdGhlbiBubyBuZWVkIHRvIGNoZWNrIGZvciBFeHRyYWN0b3IKLSAgICBpbnQgdXJpTGVuID0gc3RybGVuKG1VcmkpOwotICAgIGludCBzdGFydE9mZnNldCA9IHVyaUxlbiAtIDQ7Ci0gICAgaWYoIXN0cm5jYXNlY21wKG1Vcmkrc3RhcnRPZmZzZXQsICIucmdiIiwgNCkpIHsKLSAgICAgICAgZXh0cmFjdG9yID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwotICAgIH0KLQotICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZmluaXNoU2V0RGF0YVNvdXJjZV9sOiBmYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciIpOwotICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIH0KLQotICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jRXZlbnQiKTsKLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgewotICAgICAgICBBTE9HVigicHJlcGFyZSB3YXMgY2FuY2VsbGVkIGJlZm9yZSBkb2luZyBhbnl0aGluZyIpOwotICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVVyaS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFZpZGVvRGVjb2Rlcl9sKE9NWENvZGVjOjprSGFyZHdhcmVDb2RlY3NPbmx5KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRBdWRpb0RlY29kZXJfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hBc3luY1ByZXBhcmVfbCgpIHsKLSAgICBBTE9HVigiZmluaXNoQXN5bmNQcmVwYXJlX2wiKTsKLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwotICAgIH0KLQotICAgIG1QcmVwYXJlUmVzdWx0ID0gT0s7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEKTsKLSAgICBtRmxhZ3MgfD0gUFJFUEFSRUQ7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKLSAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbUxvY2tDb250cm9sLmxvY2soKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZWxlYXNlTG9jaygpIHsKLSAgICBBTE9HVigicmVsZWFzZUxvY2siKTsKLSAgICBtTG9ja0NvbnRyb2wudW5sb2NrKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpIHsKLQotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgbU51bWJlckVmZmVjdHMgPSBuRWZmZWN0czsKLSAgICBtRWZmZWN0c1NldHRpbmdzID0gcEVmZmVjdFNldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6bG9hZEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotCi0gICAgQUxPR1YoImxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSIpOwotICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgIE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlICkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtIik7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gYXVkaW9NaXhTdG9yeUJvYXJkVFM7Ci0gICAgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSA9IGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZTsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSBwcmltYXJ5VHJhY2tWb2xWYWx1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1QbGF5QmVnaW5UaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotCi0gICAgbVBsYXlFbmRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjICogMTAwMExMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpIHsKLQotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSBjYkludGVydmFsOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgcmV0dXJuIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICZtT3V0cHV0VmlkZW9XaWR0aCwgJm1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLQotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyAqIDEwMDBMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCkgewotICAgIGlmIChtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIG1RdWV1ZS5wb3N0RXZlbnQobVByb2dyZXNzQ2JFdmVudCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByb2dyZXNzQ2JFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIC8vIElmIHBsYXliYWNrIHN0YXJ0cyBmcm9tIHByZXZpb3VzIEktZnJhbWUsCi0gICAgLy8gdGhlbiBzZW5kIGZyYW1lIHN0b3J5Ym9hcmQgZHVyYXRpb24KLSAgICBpZiAoKG1EZWNvZGVkVmlkZW9Ucy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsIG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsCi0gICAgICAgICgoKG1EZWNvZGVkVmlkZW9UcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKSB7Ci0gICAgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobU92ZXJsYXlVcGRhdGVFdmVudCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25VcGRhdGVPdmVybGF5RXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50IHVwZGF0ZVN0YXRlID0gbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZD8gMTogMDsKLSAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QkJCQkJCQkIsIHVwZGF0ZVN0YXRlLCBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgdWludDMyX3QgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICAvL01hcCBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHRvIGxvY2FsIGVudW0KLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9QSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfU0VQSUE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05FR0FUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZSQU1JTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXM6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRklGVElFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JBRElFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgLy9JZiBhbHJlYWR5IHNldCwgdGhlbiBubyBuZWVkIHRvIHNldCBhZ2FpbgotICAgICAgICBpZiAoIShtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KSkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCB8PSBlZmZlY3Q7Ci0gICAgICAgICAgICBpZiAoZWZmZWN0ID09IFZJREVPX0VGRkVDVF9GSUZUSUVTKSB7Ci0gICAgICAgICAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlICB7Ci0gICAgICAgIC8vUmVzZXQgb25seSBpZiBhbHJlYWR5IHNldAotICAgICAgICBpZiAobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+ZWZmZWN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLHVpbnQzMl90IGhlaWdodCkgewotICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7Ci0gICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVhZEZpcnN0VmlkZW9GcmFtZSgpIHsKLSAgICBBTE9HVigicmVhZEZpcnN0VmlkZW9GcmFtZSIpOwotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5yZWFkKCZtVmlkZW9CdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENIRUNLKCFtVmlkZW9CdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZSBkZWNvZGVycywgbm90YWJseSB0aGUgUFYgQVZDIHNvZnR3YXJlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3B1cmlvdXMgZW1wdHkgYnVmZmVycyB0aGF0IHdlIGp1c3Qgd2FudCB0byBpZ25vcmUuCi0KLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHZpZGVvVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdmlkZW9UaW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBiZWdpbiBjdXQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBzZXRQb3NpdGlvbl9sKHRpbWVVcyk7Ci0KLSAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7Ci0KLSAgICByZXR1cm4gT0s7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpIHsKLSAgICAqbGFzdFJlbmRlcmVkVGltZU1zID0gKCgobURlY29kZWRWaWRlb1RzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6dXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgaWYgKG1WaWRlb1JlbmRlcmVyKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT51cGRhdGVWaWRlb1NpemUobWV0YSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldExpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmVzZXRfbCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmNsZWFyX2woKSB7Ci0gICAgbURpc3BsYXlXaWR0aCA9IDA7Ci0gICAgbURpc3BsYXlIZWlnaHQgPSAwOwotCi0gICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKLSAgICAgICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLQotICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZywgd2UncmUganVzdCBidWZmZXJpbmcKLSAgICAgICAgICAgIC8vIGVub3VnaCBkYXRhIHRvIHN0YXJ0IHBsYXliYWNrLCB3ZSBjYW4gc2FmZWx5IGludGVycnVwdCB0aGF0LgotICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKHRydWUpOwotCi0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICBtVmlkZW9UcmFjay5jbGVhcigpOwotCi0gICAgLy8gU2h1dGRvd24gYXVkaW8gZmlyc3QsIHNvIHRoYXQgdGhlIHJlc3BvbmUgdG8gdGhlIHJlc2V0IHJlcXVlc3QKLSAgICAvLyBhcHBlYXJzIHRvIGhhcHBlbiBpbnN0YW50YW5lb3VzbHkgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAotICAgIC8vIElmIHdlIGRpZCB0aGlzIGxhdGVyLCBhdWRpbyB3b3VsZCBjb250aW51ZSBwbGF5aW5nIHdoaWxlIHdlCi0gICAgLy8gc2h1dGRvd24gdGhlIHZpZGVvLXJlbGF0ZWQgcmVzb3VyY2VzIGFuZCB0aGUgcGxheWVyIGFwcGVhciB0bwotICAgIC8vIG5vdCBiZSBhcyByZXNwb25zaXZlIHRvIGEgcmVzZXQgcmVxdWVzdC4KLSAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gSWYgd2UgaGFkIGFuIGF1ZGlvIHBsYXllciwgaXQgd291bGQgaGF2ZSBlZmZlY3RpdmVseQotICAgICAgICAvLyB0YWtlbiBwb3NzZXNzaW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHN0b3BwZWQgaXQgd2hlbgotICAgICAgICAvLyBfaXRfIGlzIHN0b3BwZWQuIE90aGVyd2lzZSB0aGlzIGlzIHN0aWxsIG91ciByZXNwb25zaWJpbGl0eS4KLSAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgfQotICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotCi0gICAgbVRpbWVTb3VyY2UgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKLSAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IC0xOwotICAgIG1GbGFncyA9IDA7Ci0gICAgbUV4dHJhY3RvckZsYWdzID0gMDsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQml0cmF0ZSA9IC0xOwotICAgIG1MYXN0VmlkZW9UaW1lVXMgPSAtMTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewotICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLQotICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChtc2csIGV4dDEsIGV4dDIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1WaWRlb0xhZ0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50NjRfdCBhdWRpb1RpbWVVcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICBpbnQ2NF90IHZpZGVvTGF0ZUJ5VXMgPSBhdWRpb1RpbWVVcyAtIG1WaWRlb1RpbWVVczsKLQotICAgIGlmICghKG1GbGFncyAmIFZJREVPX0FUX0VPUykgJiYgdmlkZW9MYXRlQnlVcyA+IDMwMDAwMGxsKSB7Ci0gICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgbXMuIiwgdmlkZW9MYXRlQnlVcyAvIDEwMDBsbCk7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9JTkZPLAotICAgICAgICAgICAgICAgIE1FRElBX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORywKLSAgICAgICAgICAgICAgICB2aWRlb0xhdGVCeVVzIC8gMTAwMGxsKTsKLSAgICB9Ci0KLSAgICBwb3N0VmlkZW9MYWdFdmVudF9sKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6bm90aWZ5VmlkZW9TaXplX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCB2V2lkdGgsIHZIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZXaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdkhlaWdodCkpOwotCi0gICAgbUdpdmVuV2lkdGggPSB2V2lkdGg7Ci0gICAgbUdpdmVuSGVpZ2h0ID0gdkhlaWdodDsKLQotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LCAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpIHsKLQotICAgICAgICBjcm9wTGVmdCA9IGNyb3BUb3AgPSAwOwotICAgICAgICBjcm9wUmlnaHQgPSB2V2lkdGggLSAxOwotICAgICAgICBjcm9wQm90dG9tID0gdkhlaWdodCAtIDE7Ci0KLSAgICAgICAgQUxPR0QoImdvdCBkaW1lbnNpb25zIG9ubHkgJWQgeCAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIG1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgbUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIG1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIG1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgaW50MzJfdCBkaXNwbGF5V2lkdGg7Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSB3aWR0aCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGRpc3BsYXlXaWR0aDsKLSAgICB9Ci0gICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0OwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSBoZWlnaHQgY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3QgdXNhYmxlV2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaW50MzJfdCB1c2FibGVIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7Ci0gICAgaWYgKG1EaXNwbGF5V2lkdGggIT0gMCkgewotICAgICAgICB1c2FibGVXaWR0aCA9IG1EaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGlmIChtRGlzcGxheUhlaWdodCAhPSAwKSB7Ci0gICAgICAgIHVzYWJsZUhlaWdodCA9IG1EaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVIZWlnaHQsIHVzYWJsZVdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVXaWR0aCwgdXNhYmxlSGVpZ2h0KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBhdXNlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotCi0gICAgcmV0dXJuIHBhdXNlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGF1c2VfbChib29sIGF0X2VvcykgewotICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotCi0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgewotICAgICAgICBpZiAoYXRfZW9zKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBwbGF5ZWQgdGhlIGF1ZGlvIHN0cmVhbSB0byBjb21wbGV0aW9uIHdlCi0gICAgICAgICAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBzYW1wbGVzIHJlbWFpbmluZyBpbiB0aGUgYXVkaW8KLSAgICAgICAgICAgIC8vIHRyYWNrJ3MgcXVldWUgYXJlIHBsYXllZCBvdXQuCi0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKHRydWUgLyogcGxheVBlbmRpbmdTYW1wbGVzICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgJj0gflBMQVlJTkc7Ci0gICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBQcmV2aWV3UGxheWVyOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChtRmxhZ3MgJiBQTEFZSU5HKSB8fCAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHNldE5hdGl2ZVdpbmRvd19sKHN1cmZhY2UpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNldE5hdGl2ZVdpbmRvd19sKG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNodXRkb3duVmlkZW9EZWNvZGVyX2woKSB7Ci0gICAgaWYgKG1WaWRlb0J1ZmZlcikgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSkgewotICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmU7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dJKCJhdHRlbXB0aW5nIHRvIHJlY29uZmlndXJlIHRvIHVzZSBuZXcgc3VyZmFjZSIpOwotCi0gICAgYm9vbCB3YXNQbGF5aW5nID0gKG1GbGFncyAmIFBMQVlJTkcpICE9IDA7Ci0KLSAgICBwYXVzZV9sKCk7Ci0KLSAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0KLSAgICBDSEVDS19FUShpbml0VmlkZW9EZWNvZGVyX2woKSwgKHN0YXR1c190KU9LKTsKLQotICAgIGlmIChtTGFzdFZpZGVvVGltZVVzID49IDApIHsKLSAgICAgICAgbVNlZWtpbmcgPSBTRUVLOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgICAgICBtU2Vla1RpbWVVcyA9IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0gICAgfQotCi0gICAgaWYgKHdhc1BsYXlpbmcpIHsKLSAgICAgICAgcGxheV9sKCk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvU2luaygKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUF1ZGlvU2luayA9IGF1ZGlvU2luazsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzID0gbUZsYWdzICYgfkxPT1BJTkc7Ci0KLSAgICBpZiAoc2hvdWxkTG9vcCkgewotICAgICAgICBtRmxhZ3MgfD0gTE9PUElORzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpIHsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgewotICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTAotICAgICAgICAgICAgJiYgKG1BdWRpb1BsYXllciA9PSBOVUxMIHx8ICEobUZsYWdzICYgVklERU9fQVRfRU9TKSkpIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtVmlkZW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcG9zaXRpb25VcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFBvc2l0aW9uX2woaW50NjRfdCB0aW1lVXMpIHsKLSAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUb19sKGludDY0X3QgdGltZVVzKSB7Ci0gICAgQUxPR1YoInNlZWtUb19sIik7Ci0gICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47Ci0gICAgICAgIHBsYXlfbCgpOwotICAgIH0KLQotICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgbVZpZGVvU291cmNlICE9IE5VTEwgJiYgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpIHsKLSAgICAgICAgLy8gVmlkZW8gcGxheWJhY2sgY29tcGxldGVkIGJlZm9yZSwgdGhlcmUncyBubyBwZW5kaW5nCi0gICAgICAgIC8vIHZpZGVvIGV2ZW50IHJpZ2h0IG5vdy4gSW4gb3JkZXIgZm9yIHRoaXMgbmV3IHNlZWsKLSAgICAgICAgLy8gdG8gYmUgaG9ub3JlZCwgd2UgbmVlZCB0byBwb3N0IG9uZS4KLQotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgfQotCi0gICAgbVNlZWtpbmcgPSBTRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0KLSAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewotICAgICAgICBBTE9HVigic2Vla2luZyB3aGlsZSBwYXVzZWQsIHNlbmRpbmcgU0VFS19DT01QTEVURSBub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgIiBpbW1lZGlhdGVseS4iKTsKLQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotCi0gICAgICAgIGlmICgobUZsYWdzICYgUFJFUEFSRUQpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gU0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKSB7Ci0gICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUsgJiYgbVZpZGVvU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUGxheWVyLT5zZWVrVG8obVNlZWtUaW1lVXMpOwotCi0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtVmlkZW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcykgewotICAgIGlmIChtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkpIHsKLSAgICAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TZWVraW5nID09IE5PX1NFRUsgfHwgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHRpbWUsIHNlZWsgYXVkaW8gdG8gdGhlIG9yaWdpbmFsbHkKLSAgICAgICAgLy8gcmVxdWVzdGVkIHNlZWsgdGltZSBpbnN0ZWFkLgotCi0gICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKHZpZGVvVGltZVVzIDwgMCA/IG1TZWVrVGltZVVzIDogdmlkZW9UaW1lVXMpOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgLy8gSWYgd2UncmUgcGxheWluZyB2aWRlbyBvbmx5LCByZXBvcnQgc2VlayBjb21wbGV0ZSBub3csCi0gICAgICAgIC8vIG90aGVyd2lzZSBhdWRpbyBwbGF5ZXIgd2lsbCBub3RpZnkgdXMgbGF0ZXIuCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZykgewotICAgICAgICAvLyBFdmVudCB3YXMgZGlzcGF0Y2hlZCBhbmQgd2hpbGUgd2Ugd2VyZSBibG9ja2luZyBvbiB0aGUgbXV0ZXgsCi0gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgJiYgIW1BdWRpb1BsYXllci0+aXNTZWVraW5nKCkpIHsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1TZWVrTm90aWZpY2F0aW9uU2VudCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgaWYgKG1XYXRjaEZvckF1ZGlvRU9TICYmIG1BdWRpb1BsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gZmFsc2U7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGZpbmFsU3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvRXZlbnQsIGRlbGF5VXMgPCAwID8gMTAwMDAgOiBkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0U3RyZWFtRG9uZUV2ZW50X2woc3RhdHVzX3Qgc3RhdHVzKSB7Ci0gICAgaWYgKG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSB0cnVlOwotCi0gICAgbVN0cmVhbURvbmVTdGF0dXMgPSBzdGF0dXM7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudChtU3RyZWFtRG9uZUV2ZW50KTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0VmlkZW9MYWdFdmVudF9sKCkgewotICAgIGlmIChtVmlkZW9MYWdFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvTGFnRXZlbnQsIDEwMDAwMDBsbCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobUNoZWNrQXVkaW9TdGF0dXNFdmVudCwgZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWJvcnRQcmVwYXJlKHN0YXR1c190IGVycikgewotICAgIENIRUNLKGVyciAhPSBPSyk7Ci0KLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgfQotCi0gICAgbVByZXBhcmVSZXN1bHQgPSBlcnI7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7Ci0gICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi11aW50MzJfdCBQcmV2aWV3UGxheWVyOjpnZXRTb3VyY2VTZWVrRmxhZ3MoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHJldHVybiBtRXh0cmFjdG9yRmxhZ3M7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgwIC8qIGRlbGF5VXMgKi8pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnVwZGF0ZUJhdHRlcnlVc2FnZV9sKCkgewotICAgIHVpbnQzMl90IHBhcmFtcyA9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrRGVjb2RlcjsKLSAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSAmJiAobUF1ZGlvU291cmNlICE9IG1BdWRpb1RyYWNrKSkgewotICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tBdWRpbzsKLSAgICB9Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja1ZpZGVvOwotICAgIH0KLSAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWExM2I1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQUkVWSUVXX1BMQVlFUl9IXwotCi0jZGVmaW5lIFBSRVZJRVdfUExBWUVSX0hfCi0KLSNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjsKLXN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKLQotc3RydWN0IFByZXZpZXdQbGF5ZXIgewotICAgIFByZXZpZXdQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB+UHJldmlld1BsYXllcigpOwotCi0gICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgc3RhdHVzX3QgcGxheSgpOwotICAgIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICBib29sIGlzUGxheWluZygpIGNvbnN0OwotICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdm9pZCBzZXRTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwotICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBzdGF0dXNfdCBnZXRWaWRlb0RpbWVuc2lvbnMoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3Q7Ci0KLQotICAgIC8vIEZJWE1FOiBTeW5jIGJldHdlZW4gLi4uCi0gICAgdm9pZCBhY3F1aXJlTG9jaygpOwotICAgIHZvaWQgcmVsZWFzZUxvY2soKTsKLQotICAgIHN0YXR1c190IHByZXBhcmUoKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOwotICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHN0YXR1c190IGdldFBvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uVXMpOwotCi0gICAgdWludDMyX3QgZ2V0U291cmNlU2Vla0ZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMgPSAwbGwpOwotICAgIHZvaWQgcG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0KLSAgICBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5FZmZlY3RzKTsKLSAgICBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFWb2x1bWVWb2wpOwotCi0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpOwotICAgIHN0YXR1c190IHNldE1lZGlhUmVuZGVyaW5nTW9kZShNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgc3RhdHVzX3QgcmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgIHN0YXR1c190IHNldEltYWdlQ2xpcFByb3BlcnRpZXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0gICAgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHN0YXR1c190IGdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcik7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBMQVlJTkcgICAgICAgICAgICAgPSAxLAotICAgICAgICBMT09QSU5HICAgICAgICAgICAgID0gMiwKLSAgICAgICAgRklSU1RfRlJBTUUgICAgICAgICA9IDQsCi0gICAgICAgIFBSRVBBUklORyAgICAgICAgICAgPSA4LAotICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCi0gICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKLSAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAotICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAotICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAotICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAotICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKLSAgICAgICAgSU5GT1JNRURfQVZfRU9TICAgICA9IDIwNDgsCi0KLSAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZyBidXQgYXJlIGN1cnJlbnRseSBidWZmZXJpbmcKLSAgICAgICAgLy8gc3VmZmljaWVudCBkYXRhIHRvIGJlZ2luIHBsYXliYWNrIGFuZCBmaW5pc2ggdGhlIHByZXBhcmF0aW9uIHBoYXNlCi0gICAgICAgIC8vIGZvciBnb29kLgotICAgICAgICBQUkVQQVJJTkdfQ09OTkVDVEVEID0gMjA0OCwKLQotICAgICAgICAvLyBXZSdyZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIHZpZGVvIGV2ZW50IHRvIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lCi0gICAgICAgIC8vIGFmdGVyIHRoZSBzZWVrcG9pbnQuCi0gICAgICAgIFNFRUtfUFJFVklFVyAgICAgICAgPSA0MDk2LAotCi0gICAgICAgIEFVRElPX1JVTk5JTkcgICAgICAgPSA4MTkyLAotICAgICAgICBBVURJT1BMQVlFUl9TVEFSVEVEID0gMTYzODQsCi0KLSAgICAgICAgSU5DT0dOSVRPICAgICAgICAgICA9IDMyNzY4LAotICAgIH07Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotCi0gICAgT01YQ2xpZW50IG1DbGllbnQ7Ci0gICAgVGltZWRFdmVudFF1ZXVlIG1RdWV1ZTsKLSAgICBib29sIG1RdWV1ZVN0YXJ0ZWQ7Ci0gICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotCi0gICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKLSAgICBUaW1lU291cmNlICptVGltZVNvdXJjZTsKLQotICAgIFN0cmluZzggbVVyaTsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtVmlkZW9UcmFjazsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvU291cmNlOwotICAgIGJvb2wgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXc7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvVHJhY2s7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1NvdXJjZTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICptQXVkaW9QbGF5ZXI7Ci0gICAgaW50NjRfdCBtRHVyYXRpb25VczsKLQotICAgIGludDMyX3QgbURpc3BsYXlXaWR0aDsKLSAgICBpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIHVpbnQzMl90IG1FeHRyYWN0b3JGbGFnczsKLQotICAgIGludDY0X3QgbVRpbWVTb3VyY2VEZWx0YVVzOwotICAgIGludDY0X3QgbVZpZGVvVGltZVVzOwotCi0gICAgZW51bSBTZWVrVHlwZSB7Ci0gICAgICAgIE5PX1NFRUssCi0gICAgICAgIFNFRUssCi0gICAgICAgIFNFRUtfVklERU9fT05MWQotICAgIH07Ci0gICAgU2Vla1R5cGUgbVNlZWtpbmc7Ci0KLSAgICBib29sIG1TZWVrTm90aWZpY2F0aW9uU2VudDsKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotCi0gICAgaW50NjRfdCBtQml0cmF0ZTsgIC8vIHRvdGFsIGJpdHJhdGUgb2YgdGhlIGZpbGUgKGluIGJwcykgb3IgLTEgaWYgdW5rbm93bi4KLQotICAgIGJvb2wgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGU7Ci0gICAgYm9vbCBtV2F0Y2hGb3JBdWRpb0VPUzsKLQotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0V2ZW50OwotICAgIGJvb2wgbVZpZGVvRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1TdHJlYW1Eb25lRXZlbnQ7Ci0gICAgYm9vbCBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50OwotICAgIGJvb2wgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0xhZ0V2ZW50OwotICAgIGJvb2wgbVZpZGVvTGFnRXZlbnRQZW5kaW5nOwotCi0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUFzeW5jUHJlcGFyZUV2ZW50OwotICAgIENvbmRpdGlvbiBtUHJlcGFyZWRDb25kaXRpb247Ci0gICAgYm9vbCBtSXNBc3luY1ByZXBhcmU7Ci0gICAgc3RhdHVzX3QgbVByZXBhcmVSZXN1bHQ7Ci0gICAgc3RhdHVzX3QgbVN0cmVhbURvbmVTdGF0dXM7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwotICAgIGludDY0X3QgbUxhc3RWaWRlb1RpbWVVczsKLSAgICBBUmVjdCBtQ3JvcFJlY3Q7Ci0gICAgaW50MzJfdCBtR2l2ZW5XaWR0aCwgbUdpdmVuSGVpZ2h0OwotCi0KLSAgICBib29sIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkOwotCi0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgKm1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBSZW5kZXJJbnB1dCAqbVZpZGVvUmVuZGVyZXI7Ci0KLSAgICBpbnQzMl90IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7Ci0KLSAgICAvL0RhdGEgc3RydWN0dXJlcyB1c2VkIGZvciBhdWRpbyBhbmQgdmlkZW8gZWZmZWN0cwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBNNE9TQV9VSW50MzIgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWU7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4OwotCi0gICAgdWludDMyX3QgbU51bWJlckVmZmVjdHM7Ci0gICAgdWludDMyX3QgbVBsYXlCZWdpblRpbWVNc2VjOwotICAgIHVpbnQzMl90IG1QbGF5RW5kVGltZU1zZWM7Ci0gICAgdWludDY0X3QgbURlY29kZWRWaWRlb1RzOyAvLyB0aW1lc3RhbXAgb2YgY3VycmVudCBkZWNvZGVkIHZpZGVvIGZyYW1lIGJ1ZmZlcgotICAgIHVpbnQ2NF90IG1EZWNWaWRlb1RzU3RvcnlCb2FyZDsgLy8gdGltZXN0YW1wIG9mIGZyYW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQKLSAgICB1aW50MzJfdCBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIHVpbnQzMl90IG1Qcm9ncmVzc0NiSW50ZXJ2YWw7Ci0gICAgdWludDMyX3QgbU51bWJlckRlY1ZpZGVvRnJhbWVzOyAvLyBDb3VudGVyIG9mIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgZGVjb2RlZAotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Qcm9ncmVzc0NiRXZlbnQ7Ci0gICAgYm9vbCBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtT3ZlcmxheVVwZGF0ZUV2ZW50OwotICAgIGJvb2wgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmc7Ci0gICAgYm9vbCBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkOwotCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIHVpbnQzMl90IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYzsKLQotICAgIGJvb2wgbUlzVmlkZW9Tb3VyY2VKcGc7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLSAgICBpbnQ2NF90IG1JbWFnZUZyYW1lVGltZVVzOwotICAgIGJvb2wgbVN0YXJ0TmV4dFBsYXllcjsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrQ29udHJvbDsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0KLSAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50c19sKGJvb2wgdXBkYXRlUHJvZ3Jlc3NDYiA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwotICAgIHZvaWQgcmVzZXRfbCgpOwotICAgIHZvaWQgY2xlYXJfbCgpOwotICAgIHN0YXR1c190IHBsYXlfbCgpOwotICAgIHN0YXR1c190IHBhdXNlX2woYm9vbCBhdF9lb3MgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgaW5pdFJlbmRlcmVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0QXVkaW9EZWNvZGVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyX2wodWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwKTsKLSAgICB2b2lkIG9uVmlkZW9FdmVudCgpOwotICAgIHZvaWQgb25WaWRlb0xhZ1VwZGF0ZSgpOwotICAgIHZvaWQgb25TdHJlYW1Eb25lKCk7Ci0gICAgdm9pZCBvbkNoZWNrQXVkaW9TdGF0dXMoKTsKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jRXZlbnQoKTsKLQotICAgIHZvaWQgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICB2b2lkIGFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgdm9pZCBzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0KLSAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IHRpbWVVcyk7Ci0gICAgdm9pZCBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0gICAgdm9pZCBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcyk7Ci0KLSAgICB2b2lkIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpOwotICAgIHZvaWQgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOwotICAgIHZvaWQgcG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgdm9pZCBwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcyA9IC0xKTsKLSAgICB2b2lkIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKTsKLSAgICB2b2lkIHBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpOwotICAgIHZvaWQgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotICAgIHZvaWQgb25Qcm9ncmVzc0NiRXZlbnQoKTsKLQotICAgIHZvaWQgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgdm9pZCBvblVwZGF0ZU92ZXJsYXlFdmVudCgpOwotCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIHN0YXR1c190IHByZXBhcmVfbCgpOwotICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7Ci0gICAgdm9pZCB1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpOwotICAgIHZvaWQgdXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKTsKLQotICAgIHZvaWQgc2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpOwotICAgIHZvaWQgc2V0UG9zaXRpb25fbChpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBQcmV2aWV3UGxheWVyKGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci0gICAgUHJldmlld1BsYXllciAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBSRVZJRVdfUExBWUVSX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFjZmM4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiUHJldmlld1JlbmRlcmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUHJldmlld1JlbmRlcmVyKiBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlciAoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIFByZXZpZXdSZW5kZXJlciogcmVuZGVyZXIgPSBuZXcgUHJldmlld1JlbmRlcmVyKHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgaWYgKHJlbmRlcmVyLT5pbml0KCkgIT0gMCkgewotICAgICAgICBkZWxldGUgcmVuZGVyZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByZW5kZXJlcjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjpQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCi0gICAgOiBtU3VyZmFjZShzdXJmYWNlKSwKLSAgICAgIG1XaWR0aCh3aWR0aCksCi0gICAgICBtSGVpZ2h0KGhlaWdodCkgewotfQotCi1pbnQgUHJldmlld1JlbmRlcmVyOjppbml0KCkgewotICAgIGludCBlcnIgPSAwOwotICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IG1TdXJmYWNlLmdldCgpOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCi0gICAgICAgICAgICBhbncsIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhbncsIDMpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgIGFudywgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgYW53LCBtV2lkdGgsIG1IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oYW53LCAwKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLWZhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjp+UHJldmlld1JlbmRlcmVyKCkgewotICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci19Ci0KLQotLy8KLS8vIFByb3ZpZGVzIGEgYnVmZmVyIGFuZCBhc3NvY2lhdGVkIHN0cmlkZQotLy8gVGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBTdXJmYWNlRmxpbmdlcgotLy8KLS8vIEZvciBvcHRpbWFsIGRpc3BsYXkgcGVyZm9ybWFuY2VzLCB5b3Ugc2hvdWxkIDoKLS8vIDEpIGNhbGwgZ2V0QnVmZmVyWVYxMigpCi0vLyAyKSBmaWxsIHRoZSBidWZmZXIgd2l0aCB5b3VyIGRhdGEKLS8vIDMpIGNhbGwgcmVuZGVyWVYxMigpIHRvIHRha2UgdGhlc2UgY2hhbmdlcyBpbnRvIGFjY291bnQKLS8vCi0vLyBGb3IgZWFjaCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKSwgeW91IG11c3QgYWxzbyBjYWxsIHJlbmRlcllWMTIoKQotLy8gRXhwZWN0ZWQgZm9ybWF0IGluIHRoZSBidWZmZXIgaXMgWVYxMiBmb3JtYXRzIChzaW1pbGFyIHRvIFlVVjQyMCBwbGFuYXIgZnJvbWF0KQotLy8gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIFlWMTIgY2YgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZS9oYXJkd2FyZS9oYXJkd2FyZS5oCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OmdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1TdXJmYWNlLmdldCgpLAotICAgICAgICAgICAgJm1CdWYpKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0IHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwotCi0gICAgUmVjdCBib3VuZHMobVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgIHZvaWQgKmRzdDsKLSAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jayhtQnVmLT5oYW5kbGUsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgYm91bmRzLCAmZHN0KSk7Ci0KLSAgICAqZGF0YSAgID0gKHVpbnQ4X3QqKWRzdDsKLSAgICAqc3RyaWRlID0gbUJ1Zi0+c3RyaWRlOwotfQotCi0KLS8vCi0vLyBEaXNwbGF5IHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkgbGFzdCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKQotLy8KLS8vIFNlZSBnZXRCdWZmZXJZVjEyKCkgZm9yIGRldGFpbHMuCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OnJlbmRlcllWMTIoKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7Ci0KLSAgICBpZiAobUJ1ZiE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhtQnVmLT5oYW5kbGUpKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1TdXJmYWNlLT5BTmF0aXZlV2luZG93OjpxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgbUJ1ZiwgLTEpKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1CdWYgPSBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlMjgyNzYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBSRVZJRVdfUkVOREVSRVJfSF8KLQotI2RlZmluZSBQUkVWSUVXX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZTsKLQotY2xhc3MgUHJldmlld1JlbmRlcmVyIHsKLXB1YmxpYzoKLQotc3RhdGljIFByZXZpZXdSZW5kZXJlciogQ3JlYXRlUHJldmlld1JlbmRlcmVyICgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7Ci0KLSAgICB+UHJldmlld1JlbmRlcmVyKCk7Ci0KLSAgICB2b2lkIGdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKTsKLQotICAgIHZvaWQgcmVuZGVyWVYxMigpOwotCi0gICAgc3RhdGljIHNpemVfdCBBTElHTihzaXplX3QgeCwgc2l6ZV90IGFsaWdubWVudCkgewotICAgICAgICByZXR1cm4gKHggKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLQotICAgIGludCBpbml0KCk7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzaXplX3QgbVdpZHRoLCBtSGVpZ2h0OwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqbUJ1ZjsKLQotICAgIFByZXZpZXdSZW5kZXJlcihjb25zdCBQcmV2aWV3UmVuZGVyZXIgJik7Ci0gICAgUHJldmlld1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTFkYzU5MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JBdWRpb1BsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpWaWRlb0VkaXRvckF1ZGlvUGxheWVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKLSAgICAgICAgUHJldmlld1BsYXllciAqb2JzZXJ2ZXIpCi0gICAgOiBtSW5wdXRCdWZmZXIoTlVMTCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1MYXRlbmN5VXMoMCksCi0gICAgICBtRnJhbWVTaXplKDApLAotICAgICAgbU51bUZyYW1lc1BsYXllZCgwKSwKLSAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzKC0xKSwKLSAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMoLTEpLAotICAgICAgbVNlZWtpbmcoZmFsc2UpLAotICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpLAotICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0ZpcnN0QnVmZmVyKGZhbHNlKSwKLSAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdChPSyksCi0gICAgICBtRmlyc3RCdWZmZXIoTlVMTCksCi0gICAgICBtQXVkaW9TaW5rKGF1ZGlvU2luayksCi0gICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpIHsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwotICAgIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSA9IE5VTEw7Ci0gICAgbUF1ZGlvUHJvY2VzcyA9IE5VTEw7Ci0gICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IDA7Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUyA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbVNvdXJjZSA9IE5VTEw7Ci19Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6On5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCkgewotCi0gICAgQUxPR1YoIkRlc3RydWN0b3IiKTsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0gICAgaWYgKG1BdWRpb1Byb2Nlc3MgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUF1ZGlvUHJvY2VzczsKLSAgICAgICAgbUF1ZGlvUHJvY2VzcyA9IE5VTEw7Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnBhdXNlKGJvb2wgcGxheVBlbmRpbmdTYW1wbGVzKSB7Ci0gICAgQUxPR1YoInBhdXNlOiBwbGF5UGVuZGluZ1NhbXBsZXM9JWQiLCBwbGF5UGVuZGluZ1NhbXBsZXMpOwotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGlmIChwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpjbGVhcigpIHsKLSAgICBBTE9HVigiY2xlYXIiKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotCi0gICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgYW55IGJ1ZmZlciB3ZSBob2xkIG9udG8gc28gdGhhdCB0aGUKLSAgICAvLyBzb3VyY2UgaXMgYWJsZSB0byBzdG9wKCkuCi0KLSAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJBdWRpb1BsYXllckJhc2UgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1Tb3VyY2U7Ci0gICAgbVNvdXJjZS5jbGVhcigpOwotICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0KLSAgICBtTnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOwotICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSAtMTsKLSAgICBtU2Vla2luZyA9IGZhbHNlOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci0gICAgbUZpbmFsU3RhdHVzID0gT0s7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzdW1lKCkgewotICAgIEFMT0dWKCJyZXN1bWUiKTsKLQotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFNpbmdsZSBhdWRpbyBwbGF5ZXIgaXMgdXNlZDsKLSAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKLSAgICAvLyB3aGljaCBtaWdodCBoYXZlIGNoYW5nZWQgd2l0aCBuZXcgYXVkaW8gc291cmNlCi0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ190aHJlc2hvbGQgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfbG93Vm9sdW1lID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfbG93Vm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfZW5hYmxlID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJJbkR1Y2tpbmdfZW5hYmxlOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUFkZFZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlCVENoYW5uZWxDb3VudDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzOwotCi0gICAgLy8gQ2FsbCB0byBBdWRpbyBtaXggcGFyYW0gc2V0dGluZwotICAgIG1BdWRpb1Byb2Nlc3MtPnNldE1peFBhcmFtcyhhdWRpb01peFNldHRpbmdzKTsKLQotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7Ci0gICAgQUxPR1YoInNlZWtUbzogJWxsZCIsIHRpbWVfdXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU2Vla2luZyA9IHRydWU7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0KLSAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU2Vla2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgQUxPR1YoImlzU2Vla2luZzogbVNlZWtpbmc9JWQiLCBtU2Vla2luZyk7Ci0gICAgcmV0dXJuIG1TZWVraW5nOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSB7Ci0gICAgQUxPR1YoInJlYWNoZWRFT1M6IHN0YXR1cz0lZCIsIG1GaW5hbFN0YXR1cyk7Ci0gICAgKmZpbmFsU3RhdHVzID0gT0s7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKLSAgICByZXR1cm4gbVJlYWNoZWRFT1M7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0UmVhbFRpbWVVcygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRSZWFsVGltZVVzX2woKTsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzX2woKSB7Ci0gICAgcmV0dXJuIC1tTGF0ZW5jeVVzICsgKG1OdW1GcmFtZXNQbGF5ZWQgKiAxMDAwMDAwKSAvIG1TYW1wbGVSYXRlOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZVVzKCkgewotICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVVcyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVBvc2l0aW9uVGltZU1lZGlhVXMgPCAwIHx8IG1Qb3NpdGlvblRpbWVSZWFsVXMgPCAwKSB7Ci0gICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgcmV0dXJuIG1TZWVrVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50NjRfdCByZWFsVGltZU9mZnNldCA9IGdldFJlYWxUaW1lVXNfbCgpIC0gbVBvc2l0aW9uVGltZVJlYWxVczsKLSAgICBpZiAocmVhbFRpbWVPZmZzZXQgPCAwKSB7Ci0gICAgICAgIHJlYWxUaW1lT2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVBvc2l0aW9uVGltZU1lZGlhVXMgKyByZWFsVGltZU9mZnNldDsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRNZWRpYVRpbWVNYXBwaW5nKAotICAgICAgICBpbnQ2NF90ICpyZWFsdGltZV91cywgaW50NjRfdCAqbWVkaWF0aW1lX3VzKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZU1hcHBpbmciKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKnJlYWx0aW1lX3VzID0gbVBvc2l0aW9uVGltZVJlYWxVczsKLSAgICAqbWVkaWF0aW1lX3VzID0gbVBvc2l0aW9uVGltZU1lZGlhVXM7Ci0KLSAgICByZXR1cm4gbVBvc2l0aW9uVGltZVJlYWxVcyAhPSAtMSAmJiBtUG9zaXRpb25UaW1lTWVkaWFVcyAhPSAtMTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gQmVmb3JlIHNldHRpbmcgc291cmNlLCBzdG9wIGFueSBleGlzdGluZyBzb3VyY2UuCi0gICAgLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgYW55IGJ1ZmZlciB3ZSBob2xkIG9udG8gc28gdGhhdCB0aGUKLSAgICAvLyBzb3VyY2UgaXMgYWJsZSB0byBzdG9wKCkuCi0KLSAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIHJlbGVhc2luZyBpbnB1dCBidWZmZXIuIik7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU291cmNlID0gc291cmNlOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci19Ci0KLXNwPE1lZGlhU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRTb3VyY2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbVNvdXJjZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRPYnNlcnZlcihQcmV2aWV3UGxheWVyICpvYnNlcnZlcikgewotICAgIEFMT0dWKCJzZXRPYnNlcnZlciIpOwotICAgIC8vQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjppc1N0YXJ0ZWQoKSB7Ci0gICAgcmV0dXJuIG1TdGFydGVkOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pIHsKLSAgICBzdGF0aWNfY2FzdDxWaWRlb0VkaXRvckF1ZGlvUGxheWVyICo+KHVzZXIpLT5BdWRpb0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKLX0KLQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7Ci0gICAgaWYgKGV2ZW50ICE9IEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICBzaXplX3QgbnVtQnl0ZXNXcml0dGVuID0gZmlsbEJ1ZmZlcihidWZmZXItPnJhdywgYnVmZmVyLT5zaXplKTsKLQotICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBDSEVDSyhtU291cmNlICE9IE5VTEwpOwotICAgIEFMT0dWKCJTdGFydCIpOwotICAgIHN0YXR1c190IGVycjsKLSAgICBNNE9TQV9FUlIgcmVzdWx0ID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRUaW1lID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2Vla1RpbWVTdGFtcCA9IDA7Ci0gICAgTTRPU0FfQm9vbCBiU3RvcnlCb2FyZFRTQmV5b25kQlRFbmRDdXRUaW1lID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdGhlIEJHIEF1ZGlvIGhhbmRsZXIKLSAgICBtQXVkaW9Qcm9jZXNzID0gbmV3IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsKLSAgICBBdWRpb01peFNldHRpbmdzIGF1ZGlvTWl4U2V0dGluZ3M7Ci0KLSAgICAvLyBQYXNzIG9uIHRoZSBhdWRpbyBkdWNraW5nIHBhcmFtZXRlcnMKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgLy8gR2V0IHRoZSBCRyBBdWRpbyBQQ00gZmlsZSBkZXRhaWxzCi0gICAgaWYgKCBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgKSB7Ci0KLSAgICAgICAgLy8gVE9ETyA6IDMyYml0cyByZXF1aXJlZCBmb3IgT1NBTCwgdG8gYmUgdXBkYXRlZCBvbmNlIE9TQUwgaXMgdXBkYXRlZAotICAgICAgICBNNE9TQV9VSW50MzIgdG1wMzIgPSAwOwotICAgICAgICByZXN1bHQgPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbihtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKikmdG1wMzIpOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSB0bXAzMjsKLSAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9IG1CR0F1ZGlvUENNRmlsZUxlbmd0aDsKLQotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSA9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBkdXJhdGlvbiBpbiB0aW1lIG9mIHRoZSBhdWRpbyBCVAotICAgICAgICBpZiAoIHJlc3VsdCA9PSBNNE5PX0VSUk9SICkgewotICAgICAgICAgQUxPR1YoIlZFQVA6IGNoYW5uZWxzID0gJSIgUFJJdTMyICIgZnJlcSA9ICUiIFBSSXUzMiwKLSAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMsICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0KLSAgICAgICAgICAgIC8vIE5vIHRyaW0KLSAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gKCgKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUxlbmd0aC9zaXplb2YoTTRPU0FfVUludDE2KS8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykpKjEwMDAgKSAvCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6IGJlZ2luQ3V0TXMgJWQgLCBlbmRDdXRNcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRyaW0gcGFydAotICAgICAgICAgICAgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyA9PSAwKSAmJgotICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgdGltZSBpdHNlbGYgdGhlIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zID09IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zIC0KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOyAvKm1ha2UgdG8gc2VjIGZyb20gbXMqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjogZmlsZSBkdXJhdGlvbiByZWNvcmRlZCA6ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IHBsYXllZCBsb2NhdGlvbiB0byBiZSBzZWVrZWQgYXQgZm9yIG5leHQgbWVkaWEgaXRlbQotICAgICAgICBpZiAoIHJlc3VsdCA9PSBNNE5PX0VSUk9SICkgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6Om1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXApOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnVpQWRkQ3RzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKTsKLSAgICAgICAgICAgIGlmIChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID49IG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cykgewotICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wIC0KLSAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0VGltZSAlIiBQUkl1MzIsIHN0YXJ0VGltZSk7Ci0gICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gMDsKLSAgICAgICAgICAgIGlmIChzdGFydFRpbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lID49IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCRyB0cmFjayBzaG91bGQgYmUgbG9vcGVkIGFuZCBzdGFydGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBiZWdpbiBjdXQgdGltZSB0byB0aGUgbW9kIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gKChzdGFydFRpbWUlbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcGluZyBkaXNhYmxlZCwgZG9ub3QgZG8gQlQgTWl4ICwgc2V0IHRvIGZpbGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQlQgc3RpbGwgcHJlc2VudCAsIGp1c3Qgc2VlayB0byBzdG9yeSBib2FyZCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBzdGFydFRpbWUgKyBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNlZWtUaW1lU3RhbXAgdG8gZmlsZSBsb2NhdGlvbgotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQgPSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0KLSAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9ICgoaW50NjRfdCkoc2Vla1RpbWVTdGFtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDE2KSkvIDEwMDAgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2UgYWxsb3cgYW4gb3B0aW9uYWwgSU5GT19GT1JNQVRfQ0hBTkdFRCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcKLSAgICAvLyBvZiBwbGF5YmFjaywgaWYgdGhlcmUgaXMgb25lLCBnZXRGb3JtYXQgYmVsb3cgd2lsbCByZXRyaWV2ZSB0aGUKLSAgICAvLyB1cGRhdGVkIGZvcm1hdCwgaWYgdGhlcmUgaXNuJ3QsIHdlJ2xsIHN0YXNoIGF3YXkgdGhlIHZhbGlkIGJ1ZmZlcgotICAgIC8vIG9mIGRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgZmlyc3QgYXVkaW8gY2FsbGJhY2suCi0KLSAgICBDSEVDSyhtRmlyc3RCdWZmZXIgPT0gTlVMTCk7Ci0KLSAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBtU291cmNlLT5yZWFkKCZtRmlyc3RCdWZmZXIpOwotICAgIGlmIChtRmlyc3RCdWZmZXJSZXN1bHQgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICBBTE9HVigiSU5GT19GT1JNQVRfQ0hBTkdFRCEhISIpOwotCi0gICAgICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gT0s7Ci0gICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSB0cnVlOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpOwotICAgIENIRUNLKHN1Y2Nlc3MpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBudW1DaGFubmVscywgQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKLSAgICAgICAgICAgICAgICAmVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9TaW5rQ2FsbGJhY2ssIHRoaXMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhdGVuY3lVcyA9IChpbnQ2NF90KW1BdWRpb1NpbmstPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKLQotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBtU2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG51bUNoYW5uZWxzKSwKLSAgICAgICAgICAgICAgICAwLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywgMCk7Ci0KLSAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotCi0gICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhdGVuY3lVcyA9IChpbnQ2NF90KW1BdWRpb1RyYWNrLT5sYXRlbmN5KCkgKiAxMDAwOwotICAgICAgICBtRnJhbWVTaXplID0gbUF1ZGlvVHJhY2stPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlc2V0KCkgewotCi0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgY2xlYXIoKTsKLQotICAgIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgc2VlayBwb2ludAotICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9IDA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9MDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTPTA7Ci19Ci0KLXNpemVfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKLSAgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgewotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1lID0gKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKiljb29raWU7Ci0KLSAgICBpZiAoZXZlbnQgPT0gTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSICkgewotICAgICAgICByZXR1cm4gbWUtPmZpbGxCdWZmZXIoYnVmZmVyLCBzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmZpbGxCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLQotICAgIGlmIChtUmVhY2hlZEVPUykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZV9kb25lID0gMDsKLSAgICBzaXplX3Qgc2l6ZV9yZW1haW5pbmcgPSBzaXplOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBTV9CdWZmZXIxNiBiZ0ZyYW1lID0ge05VTEwsIDB9OwotICAgIE00QU1fQnVmZmVyMTYgbWl4RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBwdEZyYW1lID0ge05VTEwsIDB9OwotICAgIGludDY0X3QgY3VycmVudFN0ZWFtVFMgPSAwOwotICAgIGludDY0X3Qgc3RhcnRUaW1lRm9yQlQgPSAwOwotICAgIE00T1NBX0Zsb2F0IGZQVFZvbExldmVsID0KLSAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpLzEwMDsKLSAgICBNNE9TQV9JbnQxNiAgICAgKnBQVE1kYXRhPU5VTEw7Ci0gICAgTTRPU0FfVUludDMyICAgICB1aVBDTXNpemUgPSAwOwotCi0gICAgYm9vbCBwb3N0U2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgYm9vbCBwb3N0RU9TID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAoKHNpemVfcmVtYWluaW5nID4gMCkmJihlcnI9PU00Tk9fRVJST1IpKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpZiAobVNlZWtpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zdFNlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbUZpcnN0QnVmZmVyOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbUZpcnN0QnVmZmVyUmVzdWx0OwotCi0gICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBEYXRhIGlzIFByaW1hcnkgVHJhY2ssIG1peCB3aXRoIGJhY2tncm91bmQgdHJhY2sKLSAgICAgICAgICAgICAgICAvLyBhZnRlciByZWFkaW5nIHNhbWUgc2l6ZSBmcm9tIEJhY2tncm91bmQgdHJhY2sgUENNIGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTWl4IG9ubHkgd2hlbiBza2ltIHBvaW50IGlzIGFmdGVyIHN0YXJ0VGltZSBvZiBCVAotICAgICAgICAgICAgICAgICAgICBpZiAoKChtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKiAxMDAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChtUG9zaXRpb25UaW1lTWVkaWFVcyAtIG1TZWVrVGltZVVzKSkgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cyAqIDEwMDApKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpJTlNJREUgTUlYSU5HIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2hlY2tpbmcgJWxsZCA8PSAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQtbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVpbnRlcnByZXRfY2FzdDxNNE9TQV9Wb2lkKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihtSW5wdXRCdWZmZXItPmRhdGEoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGZwID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdWlQQ01zaXplID0gKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpLzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUFRNZGF0YSA9IChNNE9TQV9JbnQxNiopICgodWludDhfdCopIG1JbnB1dEJ1ZmZlci0+ZGF0YSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXggd2l0aCBiYWNrZ3JvdW5kIG1hbGxvYyB0byBkbyBsZW4gJWQiLCBsZW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIGxlbiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopImJnRnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJnRnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtaXhGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIm1peEZyYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXggd2l0aCBiZ20gd2l0aCBzaXplICVsbGQiLCBtQkdBdWRpb1BDTUZpbGVMZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUG9zaXRpb25UaW1lTWVkaWFVcykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQgPD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoIC0gbGVuKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNoZWNraW5nIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQkdBdWRpb1BDTUZpbGVIYW5kbGUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBzZWVraW5nIGZpbGUgdG8gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IDMyYml0cyByZXF1aXJlZCBmb3IgT1NBTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdG1wMzIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiltQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkU2VlayhtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVBvc2l0aW9uKikmdG1wMzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9IHRtcDMyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTTRPU0FfZmlsZVJlYWRTZWVrIGVyciAlZCIsKGludCllcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWREYXRhKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQ4KiliZ0ZyYW1lLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKikmbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgRW5kIG9mIGZpbGUgcmVhY2hlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gYmVnaW4gY3V0IHRpbWUgZXF1YWwgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChpbnQ2NF90KShtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgTG9vcGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiB2b2x1bWUgb2YgcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUocFBUTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVBDTXNpemUsIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGVSZWFkRGF0YSBmb3IgYXVkaW8gZXJyICVkIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlbGxkIiwgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBwdHIgZGF0YSB0byBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCB0byBtaXggYW5kIGR1Y2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Byb2Nlc3MtPm1peEFuZER1Y2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdEZyYW1lLCAmYmdGcmFtZSwgJm1peEZyYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZGVjb2RlZCBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltaXhGcmFtZS5tX2RhdGFBZGRyZXNzLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3ApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gYmVnaW4gY3V0IHRpbWUgZXF1YWwgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiB2b2x1bWUgbGV2ZWwgb2YgcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZQVFZvbExldmVsIDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUTWRhdGEsIHVpUENNc2l6ZSwgZlBUVm9sTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGJnRnJhbWUubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWl4RnJhbWUubV9kYXRhQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobWl4RnJhbWUubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIGxldmVsIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZQVFZvbExldmVsIDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKHBQVE1kYXRhLCB1aVBDTXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSygoc3RhdHVzID09IE9LICYmIG1JbnB1dEJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgIT0gT0sgJiYgbUlucHV0QnVmZmVyID09IE5VTEwpKTsKLQotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyOiBtU291cmNlLT5yZWFkIHJldHVybmVkIGVyciAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlciAmJiAhbVJlYWNoZWRFT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zdEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1GaW5hbFN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICZtUG9zaXRpb25UaW1lTWVkaWFVcykpOwotCi0gICAgICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0KLSAgICAgICAgICAgICAgICAoKG1OdW1GcmFtZXNQbGF5ZWQgKyBzaXplX2RvbmUgLyBtRnJhbWVTaXplKSAqIDEwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGU7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXItPnNpemUoKSA9ICVkLCAiCi0gICAgICAgICAgICAgICAgICAgICAibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAotICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyAvIDFFNiwgbVBvc2l0aW9uVGltZVJlYWxVcyAvIDFFNik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplX3JlbWFpbmluZzsKLSAgICAgICAgaWYgKGNvcHkgPiBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7Ci0gICAgICAgICAgICBjb3B5ID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSgoY2hhciAqKWRhdGEgKyBzaXplX2RvbmUsCi0gICAgICAgICAgIChjb25zdCBjaGFyICopbUlucHV0QnVmZmVyLT5kYXRhKCkgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UobUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGNvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIGNvcHkpOwotCi0gICAgICAgIHNpemVfZG9uZSArPSBjb3B5OwotICAgICAgICBzaXplX3JlbWFpbmluZyAtPSBjb3B5OwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgbU51bUZyYW1lc1BsYXllZCArPSBzaXplX2RvbmUgLyBtRnJhbWVTaXplOwotICAgIH0KLQotICAgIGlmIChwb3N0RU9TKSB7Ci0gICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvRU9TKCk7Ci0gICAgfQotCi0gICAgaWYgKHBvc3RTZWVrQ29tcGxldGUpIHsKLSAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9TZWVrQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2l6ZV9kb25lOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKSB7Ci0gICAgbUF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQkdBdWRpb1BDTUZpbGVIYW5kbGUpewotICAgIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSA9IHBCR0F1ZGlvUENNRmlsZUhhbmRsZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhVm9sdW1lVmFsKSB7Ci0KLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0gcEJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTID0gcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCA9IHBCR0F1ZGlvQ3VycmVudE1lZGlhVm9sdW1lVmFsOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFByaW1hcnlUcmFja1ZvbHVtZSgKLSAgICBNNE9TQV9JbnQxNiAqZGF0YSwgTTRPU0FfVUludDMyIHNpemUsIE00T1NBX0Zsb2F0IHZvbExldmVsKSB7Ci0KLSAgICB3aGlsZShzaXplLS0gPiAwKSB7Ci0gICAgICAgICpkYXRhID0gKE00T1NBX0ludDE2KSgoKmRhdGEpKnZvbExldmVsKTsKLSAgICAgICAgZGF0YSsrOwotICAgIH0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmNhZjVlOC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWRV9BVURJT19QTEFZRVJfSF8KLSNkZWZpbmUgVkVfQVVESU9fUExBWUVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1haW4uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFTb3VyY2U7Ci1jbGFzcyBBdWRpb1RyYWNrOwotY2xhc3MgUHJldmlld1BsYXllcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JBdWRpb1BsYXllciA6IHB1YmxpYyBUaW1lU291cmNlIHsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgUkVBQ0hFRF9FT1MsCi0gICAgICAgIFNFRUtfQ09NUExFVEUKLSAgICB9OwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKLSAgICAgICAgUHJldmlld1BsYXllciAqYXVkaW9PYnNlcnZlciA9IE5VTEwpOwotCi0gICAgflZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoKTsKLQotICAgIC8vIFJldHVybiB0aW1lIGluIHVzLgotICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVcygpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGJ1ZmZlciBwbGF5ZWQgKGluIHVzKS4KLSAgICBpbnQ2NF90IGdldE1lZGlhVGltZVVzKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWZmIGEgbWFwcGluZyBpcyBlc3RhYmxpc2hlZCwgaS5lLiB0aGUgQXVkaW9QbGF5ZXJCYXNlCi0gICAgLy8gaGFzIHBsYXllZCBhdCBsZWFzdCBvbmUgZnJhbWUgb2YgYXVkaW8uCi0gICAgYm9vbCBnZXRNZWRpYVRpbWVNYXBwaW5nKGludDY0X3QgKnJlYWx0aW1lX3VzLCBpbnQ2NF90ICptZWRpYXRpbWVfdXMpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCA9IGZhbHNlKTsKLSAgICB2b2lkIHBhdXNlKGJvb2wgcGxheVBlbmRpbmdTYW1wbGVzID0gZmFsc2UpOwotICAgIHN0YXR1c190IHJlc3VtZSgpOwotICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpOwotICAgIGJvb2wgaXNTZWVraW5nKCk7Ci0gICAgYm9vbCByZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cyk7Ci0KLSAgICB2b2lkIHNldEF1ZGlvTWl4U2V0dGluZ3MoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKTsKLSAgICB2b2lkIHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShNNE9TQV9Db250ZXh0IHBCR0F1ZGlvUENNRmlsZUhhbmRsZSk7Ci0gICAgdm9pZCBzZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCwKLSAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUywKLSAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhVm9sdW1lVmFsKTsKLQotICAgIHZvaWQgc2V0T2JzZXJ2ZXIoUHJldmlld1BsYXllciAqb2JzZXJ2ZXIpOwotICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLSAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKCk7Ci0KLSAgICBib29sIGlzU3RhcnRlZCgpOwotcHJpdmF0ZToKLQotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzICptQXVkaW9NaXhTZXR0aW5nczsKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nICptQXVkaW9Qcm9jZXNzOwotCi0gICAgTTRPU0FfQ29udGV4dCBtQkdBdWRpb1BDTUZpbGVIYW5kbGU7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVMZW5ndGg7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb247Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQ7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXA7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTOwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgc3A8QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOwotCi0gICAgaW50IG1TYW1wbGVSYXRlOwotICAgIGludDY0X3QgbUxhdGVuY3lVczsKLSAgICBzaXplX3QgbUZyYW1lU2l6ZTsKLQotICAgIE11dGV4IG1Mb2NrOwotICAgIGludDY0X3QgbU51bUZyYW1lc1BsYXllZDsKLQotICAgIGludDY0X3QgbVBvc2l0aW9uVGltZU1lZGlhVXM7Ci0gICAgaW50NjRfdCBtUG9zaXRpb25UaW1lUmVhbFVzOwotCi0gICAgYm9vbCBtU2Vla2luZzsKLSAgICBib29sIG1SZWFjaGVkRU9TOwotICAgIHN0YXR1c190IG1GaW5hbFN0YXR1czsKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotCi0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIGJvb2wgbUlzRmlyc3RCdWZmZXI7Ci0gICAgc3RhdHVzX3QgbUZpcnN0QnVmZmVyUmVzdWx0OwotICAgIE1lZGlhQnVmZmVyICptRmlyc3RCdWZmZXI7Ci0KLSAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICBQcmV2aWV3UGxheWVyICptT2JzZXJ2ZXI7Ci0KLSAgICBzdGF0aWMgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbyk7Ci0gICAgdm9pZCBBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbyk7Ci0gICAgc2l6ZV90IGZpbGxCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCi0gICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKm1lLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpOwotCi0gICAgdm9pZCByZXNldCgpOwotICAgIHZvaWQgY2xlYXIoKTsKLSAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXNfbCgpOwotICAgIHZvaWQgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRhdGEsIE00T1NBX1VJbnQzMiBzaXplLCBNNE9TQV9GbG9hdCB2b2xMZXZlbCk7Ci0KLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgJik7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmb3BlcmF0b3I9KGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFZFX0FVRElPX1BMQVlFUl9IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjMTJhYWMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHsKLSAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKLQotICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgbURvRHVja2luZyA9IDA7Ci0gICAgbUR1Y2tpbmdfZW5hYmxlID0gMDsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgPSAwOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgPSAwOwotCi0gICAgbUJUVm9sTGV2ZWwgPSAwOwotICAgIG1QVFZvbExldmVsID0gMDsKLQotICAgIG1Jc1NTUkNuZWVkZWQgPSAwOwotICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0KLSAgICBtQlRGb3JtYXQgPSBNT05PXzE2X0JJVDsKLQotICAgIG1JblNhbXBsZVJhdGUgPSA4MDAwOwotICAgIG1PdXRTYW1wbGVSYXRlID0gMTYwMDA7Ci0gICAgbVBUQ2hhbm5lbENvdW50ID0gMjsKLSAgICBtQlRDaGFubmVsQ291bnQgPSAxOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptaXhBbmREdWNrKAotICAgICAgICB2b2lkICpwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgIHZvaWQgKmJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqb3V0QnVmZmVyKSB7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogdHJhY2sgYnVmZmVycyAocHJpbWFyeTogJXAgYW5kIGJhY2tncm91bmQ6ICVwKSAiCi0gICAgICAgICAgICAiYW5kIG91dCBidWZmZXIgJXAiLAotICAgICAgICAgICAgcHJpbWFyeVRyYWNrQnVmZmVyLCBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsIG91dEJ1ZmZlcik7Ci0KLSAgICBNNEFNX0J1ZmZlcjE2KiBwUHJpbWFyeVRyYWNrICAgPSAoTTRBTV9CdWZmZXIxNiopcHJpbWFyeVRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBCYWNrZ3JvdW5kVHJhY2sgPSAoTTRBTV9CdWZmZXIxNiopYmFja2dyb3VuZFRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBNaXhlZE91dEJ1ZmZlciAgPSAoTTRBTV9CdWZmZXIxNiopb3V0QnVmZmVyOwotCi0gICAgLy8gT3V0cHV0IHNpemUgaWYgc2FtZSBhcyBQVCBzaXplCi0gICAgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemU7Ci0KLSAgICAvLyBCZWZvcmUgbWl4aW5nLCB3ZSBuZWVkIHRvIGhhdmUgb25seSBQVCBhcyBvdXQgYnVmZmVyCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3MsIHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLQotICAgIC8vIEluaXRpYWxpemUgZHVja2luZyB2YXJpYWJsZXMKLSAgICAvLyBJbml0aWFsbHkgY29udGFpbnMgdGhlIGlucHV0IHByaW1hcnkgdHJhY2sKLSAgICBNNE9TQV9JbnQxNiAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBDb250YWlucyBCRyB0cmFjayBwcm9jZXNzZWQgZGF0YShsaWtlIGNoYW5uZWwgY29udmVyc2lvbiBldGMuLgotICAgIE00T1NBX0ludDE2ICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYqKSBwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzOwotCi0gICAgLy8gU2luY2Ugd2UgbmVlZCB0byBnaXZlIHNhbXBsZSBjb3VudCBhbmQgbm90IGJ1ZmZlciBzaXplCi0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSA9IHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplIC8gMiA7Ci0KLSAgICBpZiAoKG1EdWNraW5nX2VuYWJsZSkgJiYgKG1QVFZvbExldmVsICE9IDAuMCkpIHsKLSAgICAgICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTTE2U2FtcGxlID0gKE00T1NBX0ludDE2KilwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBjb25zdCBzaXplX3QgbiA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZSAvIHNpemVvZihNNE9TQV9JbnQxNik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgbG9vcEluZGV4ID0gMDsgbG9vcEluZGV4IDwgbjsgKytsb29wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheVttQXVkVm9sQXJySW5kZXhdID0gZ2V0RGVjaWJlbFNvdW5kKHBlYWtEYlZhbHVlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhyZXNob2xkIGlzIGRvbmUgYWZ0ZXIga1Byb2Nlc3NpbmdXaW5kb3dTaXplIGN5Y2xlcwotICAgICAgICBpZiAobUF1ZFZvbEFyckluZGV4ID49IGtQcm9jZXNzaW5nV2luZG93U2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcgPSBpc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheSwgbUF1ZFZvbEFyckluZGV4LCBtRHVja2luZ190aHJlc2hvbGQpOwotCi0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZQotICAgICAgICAvLyBmb3IgQmFja2dyb3VuZCBhbmQgUHJpbWFyeSBUcmFja3MKLSAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMsCi0gICAgICAgIC8vIHRvIGdpdmUgZmFkZS1vdXQgZm9yIEJhY2tncm91bmQgYW5kIGZhZGUtaW4gZm9yIHByaW1hcnkKLSAgICAgICAgLy8gQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIKLSAgICAgICAgLy8gdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgIC8vIEZvciBhIHdpbmRvdyBzaXplID0gMjUKLSAgICAgICAgLy8gKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChtRG9EdWNraW5nKSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPiBtRHVja2luZ19sb3dWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvLyBGQURFIE9VVCBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3IKLSAgICAgICAgICAgICAgICAvLyBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciAtPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yIDwgMS4wICkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgSU4gQkcgVHJhY2sKLSAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZHVja2luZyBmYWN0b3IgaW4gdG90YWwgc3RlcHMgb2YKLSAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaCBvcmlnLnZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yICs9IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAtIG1EdWNraW5nX2VuYWJsZQotCi0KLSAgICAvLyBNaXhpbmcgbG9naWMKLSAgICBBTE9HVigiT3V0IG9mIER1Y2tpbmcgYW5hbHlzaXMgdWlQQ01zaXplICVkICVmICVmIiwKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcsIG1EdWNraW5nRmFjdG9yLCBtQlRWb2xMZXZlbCk7Ci0gICAgd2hpbGUgKHVpUENNc2l6ZS0tID4gMCkgewotCi0gICAgICAgIC8vIFNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQKLSAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSptQlRWb2xMZXZlbCk7Ci0gICAgICAgICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUFRNZGF0YTIqbVBUVm9sTGV2ZWwpOwotCi0gICAgICAgIC8vIE1peCB0aGUgdHdvIHNhbXBsZXMKLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLQotICAgICAgICAgICAgLy8gRHVjayB0aGUgQkcgdHJhY2sgdG8gZHVja2luZyBmYWN0b3IgdmFsdWUgYmVmb3JlIG1peGluZwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotCi0gICAgICAgICAgICAvLyBtaXggYXMgbm9ybWFsIGNhc2UKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEgLzIgKyAqcFBUTWRhdGEyIC8yKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfSW50MzIgdGVtcDsKLSAgICAgICAgaWYgKCpwQlRNZGF0YTEgPCAwKSB7Ci0gICAgICAgICAgICB0ZW1wID0gLSgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotCi0gICAgICAgICAgICBpZiAodGVtcCA+IDMyNzY3KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IC0zMjc2NjsgLy8gbGVzcyB0aGVuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKC10ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSAoKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwKLSAgICAgICAgICAgIGlmICggdGVtcCA+IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IDMyNzY3OyAvLyBsZXNzIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEJUTWRhdGExKys7Ci0gICAgICAgIHBQVE1kYXRhMisrOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQmFja2dyb3VuZFRyYWNrLT5tX2J1ZmZlclNpemUpOwotCi0gICAgQUxPR1YoIm1peEFuZER1Y2s6IFgiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Y2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCkgewotCi0gICAgLy8gVGhpcyBhbHJlYWR5IHRha2VzIGNhcmUgb2YgY2hhbm5lbCBjb3VudCBpbiBtQlRCdWZmZXIubV9idWZmZXJTaXplCi0gICAgcmV0dXJuIChtT3V0U2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGUpICogbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpzZXRNaXhQYXJhbXMoCi0gICAgICAgIGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHNldHRpbmcpIHsKLSAgICBBTE9HVigic2V0TWl4UGFyYW1zIik7Ci0KLSAgICBtRHVja2luZ19lbmFibGUgICAgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2VuYWJsZTsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBtRHVja2luZ190aHJlc2hvbGQgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBtUFRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2UFRWb2xMZXZlbDsKLSAgICBtQlRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRWb2xMZXZlbCA7Ci0gICAgbUJUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50OwotICAgIG1QVENoYW5uZWxDb3VudCAgICAgICA9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudDsKLSAgICBtQlRGb3JtYXQgICAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRGb3JtYXQ7Ci0gICAgbUluU2FtcGxlUmF0ZSAgICAgICAgID0gc2V0dGluZy5sdkluU2FtcGxlUmF0ZTsKLSAgICBtT3V0U2FtcGxlUmF0ZSAgICAgICAgPSBzZXR0aW5nLmx2T3V0U2FtcGxlUmF0ZTsKLQotICAgIC8vIFJlc2V0IHRoZSBmb2xsb3dpbmcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzCi0gICAgbUF1ZFZvbEFyckluZGV4ICAgICAgID0gMDsKLSAgICBtRG9EdWNraW5nICAgICAgICAgICAgPSAwOwotICAgIG1EdWNraW5nRmFjdG9yICAgICAgICA9IDEuMDsKLQotICAgIEFMT0dWKCJkdWNraW5nIGVuYWJsZSAweCV4IGxvd1ZvbHVtZSAlZiB0aHJlc2hvbGQgJSIgUFJJdTMyICIgIgotICAgICAgICAgICAgImZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLAotICAgICAgICAgICAgbUR1Y2tpbmdfZW5hYmxlLCBtRHVja2luZ19sb3dWb2x1bWUsIG1EdWNraW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgIG1QVFZvbExldmVsLCBtUFRWb2xMZXZlbCk7Ci0KLSAgICAvLyBEZWNpZGVzIGlmIFNTUkMgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIHRoaXMgbWl4aW5nCi0gICAgbUlzU1NSQ25lZWRlZCA9IChzZXR0aW5nLmx2SW5TYW1wbGVSYXRlICE9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlKTsKLSAgICBpZiAoc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50ICE9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudCl7Ci0gICAgICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgPT0gMil7Ci0gICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAxOyAvLyBjb252ZXJ0IHRvIE1PTk8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDI7IC8vIENvbnZlcnQgdG8gU1RFUkVPCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgIH0KLX0KLQotLy8gRmFzdCB3YXkgdG8gY29tcHV0ZSAxMCAqIGxvZyh2YWx1ZSkKLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmdldERlY2liZWxTb3VuZChNNE9TQV9VSW50MzIgdmFsdWUpIHsKLSAgICBBTE9HVigiZ2V0RGVjaWJlbFNvdW5kOiAlbGQiLCB2YWx1ZSk7Ci0KLSAgICBpZiAodmFsdWUgPD0gMCB8fCB2YWx1ZSA+IDB4ODAwMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHg0MDAwKSB7IC8vIDMyNzY4Ci0gICAgICAgIHJldHVybiA5MDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgyMDAwKSB7IC8vIDE2Mzg0Ci0gICAgICAgIHJldHVybiA4NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgxMDAwKSB7IC8vIDgxOTIKLSAgICAgICAgcmV0dXJuIDc4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDA4MDApIHsgLy8gNDAyOAotICAgICAgICByZXR1cm4gNzI7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDQwMCkgeyAvLyAyMDQ4Ci0gICAgICAgIHJldHVybiA2NjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMjAwKSB7IC8vIDEwMjQKLSAgICAgICAgcmV0dXJuIDYwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAxMDApIHsgLy8gNTEyCi0gICAgICAgIHJldHVybiA1NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDgwKSB7IC8vIDI1NgotICAgICAgICByZXR1cm4gNDg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDA0MCkgeyAvLyAxMjgKLSAgICAgICAgcmV0dXJuIDQyOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMjApIHsgLy8gNjQKLSAgICAgICAgcmV0dXJuIDM2OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMTApIHsgLy8gMzIKLSAgICAgICAgcmV0dXJuIDMwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDgpIHsgLy8gMTYKLSAgICAgICAgcmV0dXJuIDI0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDcpIHsgLy8gOAotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMykgeyAvLyA0Ci0gICAgICAgIHJldHVybiAxODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDAxKSB7IC8vIDIKLSAgICAgICAgcmV0dXJuIDEyOwotICAgIH0gZWxzZSAgeyAvLyAxCi0gICAgICAgIHJldHVybiA2OwotICAgIH0KLX0KLQotTTRPU0FfQm9vbCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjppc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICBNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LAotICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSkgewotCi0gICAgQUxPR1YoImlzVGhyZXNob2xkQnJlYWNoZWQiKTsKLQotICAgIGludCB0b3RhbFZhbHVlID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7ICsraSkgewotICAgICAgICB0b3RhbFZhbHVlICs9IGF2ZXJhZ2VWYWx1ZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuICh0b3RhbFZhbHVlIC8gc3RvcmVDb3VudCA+IHRocmVzaG9sZFZhbHVlKTsKLX0KLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiN2E2OWYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLSNkZWZpbmUgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLQotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MTYqICAgbV9kYXRhQWRkcmVzczsgLy8gQW5kcm9pZCBTUkMgbmVlZHMgYSBJbnQxNiBwb2ludGVyCi0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLX0gTTRBTV9CdWZmZXIxNjsgICAgLy8gU3RydWN0dXJlIGNvbnRhaW5zIEludDE2X3QgcG9pbnRlcgotCi1lbnVtIEF1ZGlvRm9ybWF0IHsKLSAgICBNT05PXzE2X0JJVCwKLSAgICBTVEVSRU9fMTZfQklUCi19OwotCi0vLyBGb2xsb3dpbmcgc3RydWN0IHdpbGwgYmUgdXNlZCBieSBhcHAgdG8gc3VwcGx5IHRoZSBQVCBhbmQgQlQgcHJvcGVydGllcwotLy8gYWxvbmcgd2l0aCBkdWNraW5nIHZhbHVlcwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX0ludDMyIGx2SW5TYW1wbGVSYXRlOyAvLyBTYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIE00T1NBX0ludDMyIGx2T3V0U2FtcGxlUmF0ZTsgLy9TYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIEF1ZGlvRm9ybWF0IGx2QlRGb3JtYXQ7Ci0KLSAgICBNNE9TQV9JbnQzMiBsdkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgTTRPU0FfRmxvYXQgbHZJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgbHZJbkR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0Zsb2F0IGx2UFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBsdkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfSW50MzIgbHZCVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBsdlBUQ2hhbm5lbENvdW50OwotfSBBdWRpb01peFNldHRpbmdzOwotCi0vLyBUaGlzIGNsYXNzIGlzIGRlZmluZWQgdG8gZ2V0IFNGIFNSQyBhY2Nlc3MKLWNsYXNzIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgewotcHVibGljOgotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsKLSAgICB+VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHt9Ci0KLSAgICB2b2lkIHNldE1peFBhcmFtcyhjb25zdCBBdWRpb01peFNldHRpbmdzJiBwYXJhbXMpOwotCi0gICAgTTRPU0FfSW50MzIgbWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogcHJpbWFyeVRyYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIG1peGVkT3V0cHV0QnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1Byb2Nlc3NpbmdXaW5kb3dTaXplID0gMTAsCi0gICAgfTsKLQotICAgIE00T1NBX0ludDMyIG1JblNhbXBsZVJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbU91dFNhbXBsZVJhdGU7Ci0gICAgQXVkaW9Gb3JtYXQgbUJURm9ybWF0OwotCi0gICAgTTRPU0FfQm9vbCBtSXNTU1JDbmVlZGVkOwotICAgIE00T1NBX0ludDMyIG1CVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBtUFRDaGFubmVsQ291bnQ7Ci0gICAgTTRPU0FfVUludDggbUNoYW5uZWxDb252ZXJzaW9uOwotCi0gICAgTTRPU0FfVUludDMyIG1EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfRmxvYXQgbUR1Y2tpbmdGYWN0b3IgOwotICAgIE00T1NBX0Jvb2wgbUR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0ludDMyIG1BdWRpb1ZvbHVtZUFycmF5W2tQcm9jZXNzaW5nV2luZG93U2l6ZV07Ci0gICAgTTRPU0FfSW50MzIgbUF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Jvb2wgbURvRHVja2luZzsKLSAgICBNNE9TQV9GbG9hdCBtUFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBtQlRWb2xMZXZlbDsKLQotICAgIE00QU1fQnVmZmVyMTYgbUJUQnVmZmVyOwotCi0gICAgTTRPU0FfSW50MzIgZ2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSk7Ci0gICAgTTRPU0FfQm9vbCAgaXNUaHJlc2hvbGRCcmVhY2hlZChNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LCBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSk7Ci0KLSAgICAvLyBUaGlzIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIHdoaWNoIG5lZWRzIHRvIGFsbG9jYXRlZAotICAgIC8vIGJlZm9yZSByZXNhbXBsaW5nIGlzIGNhbGxlZAotICAgIE00T1NBX0ludDMyIGNhbGN1bGF0ZU91dFJlc2FtcGxlQnVmU2l6ZSgpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKGNvbnN0IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmKTsKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJiBvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNjU2YzQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQbGF5ZXIuaCIKLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvclBsYXllcjo6VmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKQotICAgIDogbVBsYXllcihuZXcgUHJldmlld1BsYXllcihyZW5kZXJlcikpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllciIpOwotICAgIG1QbGF5ZXItPnNldExpc3RlbmVyKHRoaXMpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6flZpZGVvRWRpdG9yUGxheWVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQbGF5ZXIiKTsKLQotICAgIHJlc2V0KCk7Ci0gICAgbVZlQXVkaW9TaW5rLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgbVBsYXllcjsKLSAgICBtUGxheWVyID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmluaXRDaGVjaygpIHsKLSAgICBBTE9HVigiaW5pdENoZWNrIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb1BsYXllcihhdWRpb1BsYXllcik7Ci19Ci0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZSgnJXMnKSIsIHVybCk7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSGVhZGVycyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKTsKLX0KLQotLy9XZSBkb25vdCB1c2UgdGhpcyBpbiBwcmV2aWV3LCBkdW1teSBpbXBsaW1lbnRhdGlvbiBhcyB0aGlzIGlzIHB1cmUgdmlydHVhbAotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwKLSAgICBpbnQ2NF90IGxlbmd0aCkgewotICAgIEFMT0dFKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSBOb3Qgc3VwcG9ydGVkIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gKCFPSyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlIik7Ci0KLSAgICBtUGxheWVyLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUiKTsKLQotICAgIG1QbGF5ZXItPnNldFN1cmZhY2VUZXh0dXJlKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwcmVwYXJlKCkgewotICAgIEFMT0dWKCJwcmVwYXJlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzdGFydCgpIHsKLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cGxheSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHJldHVybiBwYXVzZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cGF1c2UoKSB7Ci0gICAgQUxPR1YoInBhdXNlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnBhdXNlKCk7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JQbGF5ZXI6OmlzUGxheWluZygpIHsKLSAgICBBTE9HVigiaXNQbGF5aW5nIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmlzUGxheWluZygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2Vla1RvKGludCBtc2VjKSB7Ci0gICAgQUxPR1YoInNlZWtUbyIpOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNlZWtUbygoaW50NjRfdCltc2VjICogMTAwMCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKLSAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7Ci0gICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldFBvc2l0aW9uKCZwb3NpdGlvblVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChwb3NpdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0RHVyYXRpb24oaW50ICptc2VjKSB7Ci0gICAgQUxPR1YoImdldER1cmF0aW9uIik7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqbXNlYyA9IDA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChkdXJhdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXQoKSB7Ci0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgbVBsYXllci0+cmVzZXQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgQUxPR1YoInNldExvb3BpbmciKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0TG9vcGluZyhsb29wKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKLSAgICBBTE9HRSgic2V0UGFyYW1ldGVyIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0UoImdldFBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXBsYXllcl90eXBlIFZpZGVvRWRpdG9yUGxheWVyOjpwbGF5ZXJUeXBlKCkgewotICAgIEFMT0dWKCJwbGF5ZXJUeXBlIik7Ci0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbVBsYXllci0+YWNxdWlyZUxvY2soKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6cmVsZWFzZUxvY2soKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VMb2NrIik7Ci0gICAgbVBsYXllci0+cmVsZWFzZUxvY2soKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNZWRpYVBsYXllckludGVyZmFjZTo6c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7Ci0KLSAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IG1QbGF5ZXItPmdldFNvdXJjZVNlZWtGbGFncygpOwotCi0gICAgTWV0YWRhdGEgbWV0YWRhdGEocmVjb3Jkcyk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9QQVVTRSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrRm9yd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLX0ZPUldBUkQpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsIGludCBuRWZmZWN0cykgewotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRFZmZlY3RzU2V0dGluZ3MocEVmZmVjdFNldHRpbmdzLCBuRWZmZWN0cyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRBdWRpb01peFNldHRpbmdzKHBBdWRpb01peFNldHRpbmdzKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgTTRPU0FfVUludDMyIGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgICBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsIHByaW1hcnlUcmFja1ZvbFZhbHVlKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tCZWdpblRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tCZWdpblRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja0VuZFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tFbmRUaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFN0b3J5Ym9hcmRTdGFydFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0U3Rvcnlib2FyZFN0YXJ0VGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKSB7Ci0gICAgQUxPR1YoInNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoY2JJbnRlcnZhbCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBBTE9HVigic2V0TWVkaWFSZW5kZXJpbmdNb2RlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldE1lZGlhUmVuZGVyaW5nTW9kZShtb2RlLCBvdXRwdXRWaWRlb1NpemUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLSAgICBBTE9HVigicmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCIpOwotICAgIHJldHVybiBtUGxheWVyLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKAotICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcyh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlYWRGaXJzdFZpZGVvRnJhbWUoKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKSB7Ci0gICAgbVBsYXllci0+Z2V0TGFzdFJlbmRlcmVkVGltZU1zKGxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1NpbmsgaW50ZXJmYWNlICovCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJWZUF1ZGlvU2luayIKLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjptTWluQnVmZmVyQ291bnQgPSA0OwotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bUlzT25FbXVsYXRvciA9IGZhbHNlOwotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6VmVBdWRpb091dHB1dCgpCi0gICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCkgewotICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwotICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKLSAgICBtTGF0ZW5jeSA9IDA7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6flZlQXVkaW9PdXRwdXQoKSB7Ci0gICAgY2xvc2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKSB7Ci0KLSAgICBtSXNPbkVtdWxhdG9yID0gZmFsc2U7Ci0gICAgbU1pbkJ1ZmZlckNvdW50ID0gNDsKLX0KLQotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkgewotCi0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICByZXR1cm4gbUlzT25FbXVsYXRvcjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpIHsKLQotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgcmV0dXJuIG1NaW5CdWZmZXJDb3VudDsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QKLXsKLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdAotewotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVTaXplKCk7Ci19Ci0KLXVpbnQzMl90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1MYXRlbmN5OwotfQotCi1mbG9hdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Nc2Vjc1BlckZyYW1lOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpvcGVuKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgewotCi0gICAgbUNhbGxiYWNrID0gY2I7Ci0gICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwotCi0gICAgLy8gQ2hlY2sgYXJndW1lbnQgImJ1ZmZlckNvdW50IiBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgIGlmIChidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpcyB0b28gc21hbGwgYW5kIGluY3JlYXNlZCB0byAlZCIsCi0gICAgICAgICAgICBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0KLSAgICB9Ci0gICAgQUxPR1YoIm9wZW4oJXUsICVkLCAlZCwgJWQpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobVRyYWNrICE9IDApIGNsb3NlKCk7Ci0gICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgaW50IGZyYW1lQ291bnQ7Ci0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9Ci0gICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0KLSAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlKmFmRnJhbWVDb3VudCpidWZmZXJDb3VudCkvYWZTYW1wbGVSYXRlOwotCi0gICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewotICAgICAgICBzd2l0Y2goY2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIH0KLQotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAxLmUzIC8gKGZsb2F0KSBzYW1wbGVSYXRlOwotICAgIG1MYXRlbmN5ID0gdC0+bGF0ZW5jeSgpOwotICAgIG1UcmFjayA9IHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RhcnQoKSB7Ci0KLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5nZXRQb3NpdGlvbigmbU51bUZyYW1lc1dyaXR0ZW4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojpzbm9vcFdyaXRlKAotICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBWaXN1YWxpemF0aW9uIGJ1ZmZlcnMgbm90IHN1cHBvcnRlZAotICAgIHJldHVybjsKLQotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojp3cml0ZSgKLSAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgTE9HX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKLQotICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBzbm9vcFdyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSByZXQgLyA0OyAvLyBhc3N1bWUgMTYgYml0IHN0ZXJlbwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RvcCgpIHsKLQotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnN0b3AoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Zmx1c2goKSB7Ci0KLSAgICBBTE9HVigiZmx1c2giKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+Zmx1c2goKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6cGF1c2UoKSB7Ci0KLSAgICBBTE9HVigiVmVBdWRpb091dHB1dDo6cGF1c2UiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2xvc2UoKSB7Ci0KLSAgICBBTE9HVigiY2xvc2UiKTsKLSAgICBtVHJhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0KLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKLSAgICAvL0FMT0dWKCJWZUF1ZGlvT3V0cHV0OjpjYWxsYmFja3dyYXBwZXIiKTsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZUF1ZGlvT3V0cHV0ICptZSA9IChWZUF1ZGlvT3V0cHV0ICopY29va2llOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0KLSAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUik7Ci0KLSAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwotCi0gICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7Ci0gICAgICAgIG1lLT5zbm9vcFdyaXRlKGJ1ZmZlci0+cmF3LCBhY3R1YWxTaXplKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHJlc3VsdC5hcHBlbmQoIiBWZUF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUtMSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRS0xLCAiICBtc2VjIHBlciBmcmFtZSglZiksIGxhdGVuY3kgKCVkKVxuIiwKLSAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7Ci0KLSAgICByZXR1cm4gbVNlc3Npb25JZDsKLX0KLQotdWludDMyX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Nc2Vjc1BlckZyYW1lID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAodWludDMyX3QpKDEuZTMgLyBtTXNlY3NQZXJGcmFtZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4YzEyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgUHJldmlld1BsYXllcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JQbGF5ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXJJbnRlcmZhY2UgewotICAgIHB1YmxpYzoKLSAgICBjbGFzcyBWZUF1ZGlvT3V0cHV0OiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5WZUF1ZGlvT3V0cHV0KCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gTlVMTDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFsdGltZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgbGF0ZW5jeSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgICAgICBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QqKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGdldFNhbXBsZVJhdGUoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBvcGVuKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOyB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCxjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKLQotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBpc09uRW11bGF0b3IoKTsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgZ2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7Ci0KLSAgICAgICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOwotICAgICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7Ci0gICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKLSAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0Ci0KLSAgICAgICAgcHVibGljOgotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc25vb3BXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KTsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclBsYXllcigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVMb2NrKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHgsIE00T1NBX1VJbnQzMiB5LCBNNE9TQV9VSW50MzIgeik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFSZW5kZXJpbmdNb2RlKE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpOwotCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICAgICAgICptUGxheWVyOwotICAgIHNwPFZlQXVkaW9PdXRwdXQ+ICAgIG1WZUF1ZGlvU2luazsKLQotICAgIFZpZGVvRWRpdG9yUGxheWVyKGNvbnN0IFZpZGVvRWRpdG9yUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2NkM2QwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3Q29udHJvbGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGhyZWFkLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpCi0gICAgOiBtQ3VycmVudFBsYXllcigwKSwKLSAgICAgIG1UaHJlYWRDb250ZXh0KE5VTEwpLAotICAgICAgbVBsYXllclN0YXRlKFZlUGxheWVySWRsZSksCi0gICAgICBtUHJlcGFyZVJlcWVzdChNNE9TQV9GQUxTRSksCi0gICAgICBtQ2xpcExpc3QoTlVMTCksCi0gICAgICBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQoMCksCi0gICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcoMCksCi0gICAgICBtU3RhcnRpbmdDbGlwSW5kZXgoMCksCi0gICAgICBtUHJldmlld0xvb3BpbmcoTTRPU0FfRkFMU0UpLAotICAgICAgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudCgwKSwKLSAgICAgIG1FZmZlY3RzU2V0dGluZ3MoTlVMTCksCi0gICAgICBtTnVtYmVyRWZmZWN0cygwKSwKLSAgICAgIG1DdXJyZW50Q2xpcE51bWJlcigtMSksCi0gICAgICBtQ2xpcFRvdGFsRHVyYXRpb24oMCksCi0gICAgICBtQ3VycmVudFZpZGVvRWZmZWN0KFZJREVPX0VGRkVDVF9OT05FKSwKLSAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKE5VTEwpLAotICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZShOVUxMKSwKLSAgICAgIG1UYXJnZXQoTlVMTCksCi0gICAgICBtSm5pQ29va2llKE5VTEwpLAotICAgICAgbUpuaUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUN1cnJlbnRQbGF5ZWREdXJhdGlvbigwKSwKLSAgICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uKDApLAotICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwKDApLAotICAgICAgbU92ZXJsYXlTdGF0ZShPVkVSTEFZX0NMRUFSKSwKLSAgICAgIG1BY3RpdmVQbGF5ZXJJbmRleCgwKSwKLSAgICAgIG1PdXRwdXRWaWRlb1dpZHRoKDApLAotICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0KDApLAotICAgICAgYlN0b3BUaHJlYWRJblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1TZW1UaHJlYWRXYWl0KE5VTEwpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gTTR4VlNTX2tCbGFja0JvcmRlcnM7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyArK2kpIHsKLSAgICAgICAgbVZlUGxheWVyW2ldID0gTlVMTDsKLSAgICB9Ci19Ci0KLVZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6On5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIFN0b3AgdGhlIHRocmVhZCBpZiBpdHMgc3RpbGwgcnVubmluZwotICAgIGlmKG1UaHJlYWRDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0b3AobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBzdG9wIHRocmVhZCIsIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBjbG9zZSB0aHJlYWQiLCAodW5zaWduZWQgaW50KSBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJjbGVhcmluZyBtVmVQbGF5ZXIgJWQiLCBwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgbU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7Ci0KLSAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgcmV0dXJucyIpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6bG9hZEVkaXRTZXR0aW5ncygKLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIGJnbVNldHRpbmdzKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsIGlDbGlwRHVyYXRpb24gPSAwLCByZ2JTaXplID0gMDsKLSAgICBNNFZJRklfVUludDggKnRtcCA9IE5VTEw7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyIpOwotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIENoYW5uZWxzID0gJWQsIHNhbXBsaW5nIEZyZXEgJWQiLAotICAgICAgICAgIGJnbVNldHRpbmdzLT51aU5iQ2hhbm5lbHMsIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICApOwotICAgICAgICAgIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyBDaGFubmVscyA9ICVkLCBzYW1wbGluZyBGcmVxICVkIiwKLSAgICAgICAgICBiZ21TZXR0aW5ncy0+dWlOYkNoYW5uZWxzLCBiZ21TZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSAgKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIEVkaXQgc2V0dGluZ3MgYmVmb3JlIGxvYWRpbmcgbmV3IG9uZXMKLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICBpZihtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1DbGlwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCA9IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgICAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5nczogIyBvZiBDbGlwcyA9ICVkIiwgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkKTsKLQotICAgICAgICBtQ2xpcExpc3QgPSAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyoqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIsIE00VlMsCi0gICAgICAgICAoTTRPU0FfQ2hhciopIkx2UFAsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoTlVMTCA9PSBtQ2xpcExpc3QpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBNYWxsb2MgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQ2xpcExpc3QsMCwKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIpOwotCi0gICAgICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspIHsKLQotICAgICAgICAgICAgLy8gQWxsb2NhdGUgY3VycmVudCBjbGlwCi0gICAgICAgICAgICBtQ2xpcExpc3RbaV0gPQotICAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSxNNFZTLChNNE9TQV9DaGFyKikiY2xpcCBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0gPT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IgZm9yIG1DbGlwTGlzdFslZF0iLCAoaW50KWkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENvcHkgcGxhaW4gc3RydWN0dXJlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBpZihOVUxMICE9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSkgewotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gbUNsaXBMaXN0W2ldLT5wRmlsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbUNsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk5VTEwgZmlsZSBwYXRoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGR1cmF0aW9uIG9mIGFsbCBjbGlwcwotICAgICAgICAgICAgaUNsaXBEdXJhdGlvbiA9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgbUNsaXBUb3RhbER1cmF0aW9uID0gbUNsaXBUb3RhbER1cmF0aW9uK2lDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzID09IE5VTEwpIHsKLSAgICAgICAgbU51bWJlckVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLSAgICAgICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3M6IG1OdW1iZXJFZmZlY3RzID0gJWQiLCBtTnVtYmVyRWZmZWN0cyk7Ci0KLSAgICAgICAgaWYobU51bWJlckVmZmVjdHMgIT0gMCkgewotICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKW1FZmZlY3RzU2V0dGluZ3MsMCwKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikmKG1FZmZlY3RzU2V0dGluZ3NbaV0pLAotICAgICAgICAgICAgICAgICAodm9pZCAqKSYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBwRnJhbWluZyBSR0IgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJsdnBwIGZyYW1pbmcgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIGZvciBwRnJhbWluZ0J1ZiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBhY19kYXRhIChSR0IpCi0gICAgICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I1NjUpewotICAgICAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCoyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoCi0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCODg4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZ2JTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0KjM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczogd3JvbmcgUkdCIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHJnYlNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopImZyYW1pbmcgYnVmZmVyIHBhY19kYXRhIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIHBGcmFtaW5nQnVmIHBhYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBGcmFtaW5nQnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfc3RyaWRlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3RvcGxlZnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBwRnJhbWluZyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnJnYlR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgPT0gTlVMTCkgewotCi0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBiZ21TZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKE5VTEwgPT0gbUJhY2tncm91bmRBdWRpb1NldHRpbmcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyBNYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgMCxzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKW1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLCAodm9pZCAqKWJnbVNldHRpbmdzLCBzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MpKTsKLQotICAgICAgICBpZiAoIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgPSAoTTRPU0FfVm9pZCopIGJnbVNldHRpbmdzLT5wUENNRmlsZVBhdGg7Ci0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+dWlOYkNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPcGVuIHRoZSBCRyBmaWxlCi0gICAgICAgIGlmICggbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJm1BdWRpb01peFBDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogbUJhY2tncm91bmRBdWRpbyBQQ00gRmlsZSBvcGVuIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3V0cHV0VmlkZW9TaXplID0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICBtRnJhbWVTdHIucEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgQUxPR1YoInNldFN1cmZhY2UiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RhcnRQcmV2aWV3KAotICAgIE00T1NBX1VJbnQzMiBmcm9tTVMsIE00T1NBX0ludDMyIHRvTXMsIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICBNNE9TQV9Cb29sIGxvb3ApIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotICAgIEFMT0dWKCJzdGFydFByZXZpZXciKTsKLQotICAgIGlmKGZyb21NUyA+IChNNE9TQV9VSW50MzIpdG9NcykgewotICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPiB0b01zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYodG9NcyA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IHRvTXMgaXMgMCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIElmIGFscmVhZHkgc3RhcnRlZCwgdGhlbiBzdG9wIHByZXZpZXcgZmlyc3QKLSAgICBmb3IoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc3RvcHBpbmcgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcgcGxheWJhY2siKTsKLSAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHJlbmRlclByZXZpZXcgd2FzIGNhbGxlZCBwcmV2aW91c2x5LCB0aGVuIGRlbGV0ZSBSZW5kZXJlciBvYmplY3QgZmlyc3QKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogZGVsZXRlIHByZXZpb3VzIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIEF1ZGlvIHBsYXllciB0byBiZSB1c2VkIGZvciBlbnRpcmUKLSAgICAvLyBzdG9yeWJvYXJkIGR1cmF0aW9uCi0gICAgbVZFQXVkaW9TaW5rID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgbVZFQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtVkVBdWRpb1NpbmspOwotICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICBtVkVBdWRpb1BsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgLy8gQ3JlYXRlIFZpZGVvIFJlbmRlcmVyIHRvIGJlIHVzZWQgZm9yIHRoZSBlbnRpcmUgc3Rvcnlib2FyZCBkdXJhdGlvbi4KLSAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihtT3V0cHV0VmlkZW9TaXplLCAmd2lkdGgsICZoZWlnaHQpOwotICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlciA9IG5ldyBOYXRpdmVXaW5kb3dSZW5kZXJlcihtU3VyZmFjZSwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBsb29wID0gJWQiLCBsb29wKTsKLSAgICBtUHJldmlld0xvb3BpbmcgPSBsb29wOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogY2FsbEJhY2tBZnRlckZyYW1lQ291bnQgPSAlZCIsIGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50KTsKLSAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250ID0gY2FsbEJhY2tBZnRlckZyYW1lQ291bnQ7Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyKG1OYXRpdmVXaW5kb3dSZW5kZXJlcik7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OkVycm9yIGNyZWF0aW5nIFZpZGVvRWRpdG9yUGxheWVyICVkIixwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBvYmplY3QgY3JlYXRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0Tm90aWZ5Q2FsbGJhY2sodGhpcywobm90aWZ5X2NhbGxiYWNrX2Ypbm90aWZ5KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogbm90aWZ5IGNhbGxiYWNrIHNldCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEVmZmVjdHNTZXR0aW5ncyhtRWZmZWN0c1NldHRpbmdzLAotICAgICAgICAgbU51bWJlckVmZmVjdHMpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBlZmZlY3RzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEF1ZGlvTWl4U2V0dGluZ3MobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFNldHRpbmdzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFBDTUZpbGVIYW5kbGUgc2V0Iik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoCi0gICAgICAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc2V0UHJvZ3Jlc3NDYWxsQmFja0ludGVydmFsIik7Ci0gICAgfQotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZihmcm9tTVMgPT0gMCkgewotICAgICAgICBtQ3VycmVudENsaXBOdW1iZXIgPSAtMTsKLSAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSA9IG1DbGlwTGlzdFswXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBmcm9tTVM9JWQiLCBmcm9tTVMpOwotICAgICAgICBpZihmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZihmcm9tTVMgPCAoaUluY3JlbWVudGVkRHVyYXRpb24gKyAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSkgewotICAgICAgICAgICAgICAgIC8vIFNldCB0byAxIGluZGV4IGJlbG93LAotICAgICAgICAgICAgICAgIC8vIGFzIHRocmVhZFByb2Nlc3MgZmlyc3QgaW5jcmVtZW50cyB0aGUgY2xpcCBpbmRleAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHByb2Nlc3NlcyBjbGlwIGluIHRocmVhZCBsb29wCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyID0gaS0xOwotICAgICAgICAgICAgICAgIEFMT0dEKCJzdGFydFByZXZpZXc6bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQgZnJvbU1TPSVkIixpLGZyb21NUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IGNvcnJlY3QgYmVnaW4gdGltZSB0byBzdGFydCBwbGF5YmFjawotICAgICAgICAgICAgICAgIGlmKChmcm9tTVMrbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkgPgotICAgICAgICAgICAgICAgIChpSW5jcmVtZW50ZWREdXJhdGlvbittQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSArCi0gICAgICAgICAgICAgICAgICAgICAoZnJvbU1TIC0gaUluY3JlbWVudGVkRHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAgPSBpSW5jcmVtZW50ZWREdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShmcm9tTVMsCi0gICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSwKLSAgICAgICAgIG1DbGlwTGlzdFtpXS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgc2V0ICVkIGN1dHRpbWUgXAotICAgICAgICAgJWQiLCBmcm9tTVMsIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0KLSAgICBtU3RhcnRpbmdDbGlwSW5kZXggPSBtQ3VycmVudENsaXBOdW1iZXIrMTsKLQotICAgIC8vIFN0YXJ0IHBsYXlpbmcgd2l0aCBwbGF5ZXIgaW5zdGFuY2UgMAotICAgIG1DdXJyZW50UGxheWVyID0gMDsKLSAgICBtQWN0aXZlUGxheWVySW5kZXggPSAwOwotCi0gICAgaWYodG9NcyA9PSAtMSkgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBQcmV2aWV3IHRpbGwgZW5kIG9mIHN0b3J5Ym9hcmQiKTsKLSAgICAgICAgbU51bWJlckNsaXBzVG9QcmV2aWV3ID0gbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkOwotICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lID0KLSAgICAgICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHRvTXM9JWQiLCB0b01zKTsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMil0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiB0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXRvTXMgPD0gKGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBjdXQgdGltZSBvZiBjbGlwIGluZGV4IGkgdG8gdG9NcwotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID0gdG9NczsKLQotICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjbGlwcyB0byBiZSBwcmV2aWV3ZWQgaXMgZnJvbSBpbmRleCAwIHRvIGkKLSAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgMSBhcyBpIHN0YXJ0cyBmcm9tIDAKLSAgICAgICAgICAgICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcgPSBpKzE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPcGVuIHRoZSB0aHJlYWQgc2VtYXBob3JlCi0gICAgTTRPU0Ffc2VtYXBob3JlT3BlbigmbVNlbVRocmVhZFdhaXQsIDEpOwotCi0gICAgLy8gT3BlbiB0aGUgcHJldmlldyBwcm9jZXNzIHRocmVhZAotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNPcGVuKCZtVGhyZWFkQ29udGV4dCwgKE00T1NBX1RocmVhZERvSXQpdGhyZWFkUHJvYyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOk00T1NBX3RocmVhZFN5bmNPcGVuIGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHN0YWNrc2l6ZQotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24obVRocmVhZENvbnRleHQsIE00T1NBX1RocmVhZFN0YWNrU2l6ZSwKLSAgICAgKE00T1NBX0RhdGFPcHRpb24pIGtQcmV2aWV3VGhyZWFkU3RhY2tTaXplKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogdGhyZWFkU3luY1NldE9wdGlvbiBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgLy8gU3RhcnQgdGhlIHRocmVhZAotICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RhcnQobVRocmVhZENvbnRleHQsIChNNE9TQV9Wb2lkKil0aGlzKTsKLSAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU3RhcnQgZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogcHJvY2VzcyB0aHJlYWQgc3RhcnRlZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RvcFByZXZpZXcoKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdWludDMyX3QgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgPSAwOwotICAgIEFMT0dWKCJzdG9wUHJldmlldyIpOwotCi0gICAgLy8gU3RvcCB0aGUgdGhyZWFkCi0gICAgaWYobVRocmVhZENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tTZW0pOwotICAgICAgICAgICAgaWYgKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVQb3N0KG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdG9wKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gc3RvcCB0aHJlYWQiLCBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsb3NlIHRoZSBzZW1hcGhvcmUgZmlyc3QKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja1NlbSk7Ci0gICAgICAgIGlmKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xvc2Ugc2VtYXBob3JlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBtU2VtVGhyZWFkV2FpdCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+aXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcCB0aGUgcGxheWVyIGZpcnN0Iik7Ci0gICAgICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGxheWVySW5zdCA9PSBtQWN0aXZlUGxheWVySW5kZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGxhc3QgcmVuZGVyZWQgZnJhbWUgdGltZSBzdGFtcAotICAgICAgICAgICAgICAgIG1WZVBsYXllclttQWN0aXZlUGxheWVySW5kZXhdLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMoJmxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UaGlzIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAgICAgLy9zdG9wUHJldmlldygpIGluIFByZXZpZXdDb250cm9sbGVyCi0gICAgICAgICAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gdGVtcCA9IG1WZVBsYXllcltwbGF5ZXJJbnN0XTsKLSAgICAgICAgICAgIHRlbXAtPmFjcXVpcmVMb2NrKCk7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyaW5nIG1WZVBsYXllciIpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBOVUxMOwotICAgICAgICAgICAgdGVtcC0+cmVsZWFzZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyIGF1ZGlvU2luayBhbmQgYXVkaW9QbGF5ZXIiKTsKLSAgICBtVkVBdWRpb1NpbmsuY2xlYXIoKTsKLSAgICBpZiAobVZFQXVkaW9QbGF5ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1WRUF1ZGlvUGxheWVyOwotICAgICAgICBtVkVBdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIgPSBOVUxMOwotCi0gICAgLy8gSWYgaW1hZ2UgZmlsZSBwbGF5aW5nLCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBwb2ludGVyCi0gICAgaWYobUZyYW1lU3RyLnBCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKG1GcmFtZVN0ci5wQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lU3RyLnBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGJlZ2luIGN1dHRpbWUgb2YgZmlyc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttU3RhcnRpbmdDbGlwSW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9IG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9IG1MYXN0UHJldmlld0NsaXBFbmRUaW1lOwotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uID0gMDsKLSAgICBtQ3VycmVudENsaXBEdXJhdGlvbiA9IDA7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBNNHhWU1Nfa0JsYWNrQm9yZGVyczsKLSAgICBtT3V0cHV0VmlkZW9XaWR0aCA9IDA7Ci0gICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gMDsKLQotICAgIEFMT0dWKCJzdG9wUHJldmlldygpIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zICVsZCIsIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICByZXR1cm4gbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXM7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpjbGVhclN1cmZhY2UoCi0gICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRCdWZmZXJXaWR0aCA9MCwgb3V0cHV0QnVmZmVySGVpZ2h0PTA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVPdXRbM107Ci0gICAgQUxPR1YoIkluc2lkZSBwcmV2aWV3IGNsZWFyIGZyYW1lIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbVRhcmdldCA9IFByZXZpZXdSZW5kZXJlcjo6Q3JlYXRlUHJldmlld1JlbmRlcmVyKAotICAgICAgICAgICAgc3VyZmFjZSwKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcldpZHRoLCBvdXRwdXRCdWZmZXJIZWlnaHQpOwotCi0gICAgICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogY2Fubm90IGNyZWF0ZSBQcmV2aWV3UmVuZGVyZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgob3V0cHV0QnVmZmVyV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChvdXRwdXRCdWZmZXJIZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdXJmYWNlIHdpdGggYmxhY2sgZnJhbWUgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFswXS5wYWNfZGF0YSwweDAwLHBsYW5lT3V0WzBdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogMS41KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFsxXS5wYWNfZGF0YSwxMjgscGxhbmVPdXRbMV0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzJdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsyXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgbVRhcmdldC0+cmVuZGVyWVYxMigpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpyZW5kZXJQcmV2aWV3RnJhbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbywKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBDdXJyRWRpdEluZm8pIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwLCB0blRpbWVNcz0wLCBmcmFtZXNpemUgPTA7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00VklGSV9VSW50OCAqcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChwQ3VyckVkaXRJbmZvICE9IE5VTEwpIHsKLSAgICAgICAgcEN1cnJFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSAtMTsKLSAgICB9Ci0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtT3V0cHV0VmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgfQotCi0gICAgaWYobU91dHB1dFZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICBtVGFyZ2V0ID0gUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBzdXJmYWNlLAotICAgICAgICAgICAgbU91dHB1dFZpZGVvV2lkdGgsIG1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLSAgICAgICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3QgY3JlYXRlIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0KLSAgICAvLyBBcHBseSByb3RhdGlvbiBpZiByZXF1aXJlZAotICAgIGlmIChwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUgIT0gMCkgewotICAgICAgICBlcnIgPSBhcHBseVZpZGVvUm90YXRpb24oKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgcEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3Qgcm90YXRlIHZpZGVvLCBlcnIgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAvLyBWaWRlbyByb3RhdGlvbiBkb25lLgotICAgICAgICAgICAvLyBTd2FwIHdpZHRoIGFuZCBoZWlnaHQgaWYgOTAgb3IgMjcwIGRlZ3JlZXMKLSAgICAgICAgICAgaWYgKHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgICAgICAgIGludDMyX3QgdGVtcCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQgPSB0ZW1wOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gUG9zdHByb2Nlc3NpbmcgKGFwcGx5IHZpZGVvIGVmZmVjdCkKLSAgICBpZihwRnJhbWVTdHItPmJBcHBseUVmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgZWZmZWN0IHN0YXJ0dGltZSBtYXRjaGVzIHRoZSBjbGlwIGJlaW5nIHByZXZpZXdlZAotICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCBwRnJhbWVTdHItPmNsaXBCZWdpbkN1dFRpbWUpCi0gICAgICAgICAgICAgfHwobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PSBwRnJhbWVTdHItPmNsaXBFbmRDdXRUaW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBGcmFtZVN0ci0+dGltZU1zKSAmJgotICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lK21FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICBwRnJhbWVTdHItPnRpbWVNcykgJiYgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgICAgIHNldFZpZGVvRWZmZWN0VHlwZShtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRWaWRlb0VmZmVjdFR5cGUobUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUHJvdmlkZSB0aGUgb3ZlcmxheSBVcGRhdGUgaW5kaWNhdGlvbiB3aGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgZWZmZWN0Ci0gICAgICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gflZJREVPX0VGRkVDVF9GUkFNSU5HOyAvL25ldmVyIGFwcGx5IGZyYW1pbmcgaGVyZS4KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lIDw9IHBGcmFtZUluZm8tPnRpbWVNcykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uKSA+PSBwRnJhbWVJbmZvLT50aW1lTXMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaW5kZXggPCBtTnVtYmVyRWZmZWN0cykgJiYgKHBDdXJyRWRpdEluZm8gIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIEFMT0dWKCJGcmFtaW5nIGluZGV4ID0gJWQiLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJObyBmcmFtaW5nIGVmZmVjdHMgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgIT0gVklERU9fRUZGRUNUX05PTkUpIHsKLSAgICAgICAgICAgIGVyciA9IGFwcGx5VmlkZW9FZmZlY3QoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCBwRnJhbWVTdHItPnRpbWVNcywKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOwotCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGFwcGx5VmlkZW9FZmZlY3QgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgICAgICBlcnIgPSBkb0ltYWdlUmVuZGVyaW5nTW9kZSgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTpkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgIGVyciA9IGRvSW1hZ2VSZW5kZXJpbmdNb2RlKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1UYXJnZXQtPnJlbmRlcllWMTIoKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9Wb2lkIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldEpuaUNhbGxiYWNrKHZvaWQqIGNvb2tpZSwKLSAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IGNhbGxiYWNrRmN0KSB7Ci0gICAgLy9BTE9HVigic2V0Sm5pQ2FsbGJhY2siKTsKLSAgICBtSm5pQ29va2llID0gY29va2llOwotICAgIG1KbmlDYWxsYmFjayA9IGNhbGxiYWNrRmN0OwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6cHJlcGFyZVBsYXllcigKLSAgICB2b2lkKiBwYXJhbSwgaW50IHBsYXllckluc3RhbmNlLCBpbnQgaW5kZXgpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKilwYXJhbTsKLQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBpbnN0YW5jZSAlZCBmaWxlICVkIiwgcGxheWVySW5zdGFuY2UsIGluZGV4KTsKLQotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gKGNvbnN0IGNoYXIqKSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+cEZpbGU7Ci0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldERhdGFTb3VyY2UoZmlsZU5hbWUsIE5VTEwpOwotCi0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldERhdGFTb3VyY2UgaW5zdGFuY2UgJXMiLAotICAgICAoY29uc3QgY2hhciAqKXBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0VmlkZW9TdXJmYWNlKAotICAgICBwQ29udHJvbGxlci0+bVN1cmZhY2UpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRWaWRlb1N1cmZhY2UiKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICBwQ29udHJvbGxlci0+bU91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldE1lZGlhUmVuZGVyaW5nTW9kZSIpOwotCi0gICAgaWYoKE00T1NBX1VJbnQzMilpbmRleCA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFBsYXliYWNrQmVnaW5UaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tFbmRUaW1lKAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0UGxheWJhY2tFbmRUaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUpOwotCi0gICAgaWYocENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0SW1hZ2VDbGlwUHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5wcmVwYXJlKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHByZXBhcmVkIik7Ci0KLSAgICBpZihwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUgPiAwKSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZWVrVG8oCi0gICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZWVrVG8oJWQpIiwKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgfQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9QbGF5ZXIocENvbnRyb2xsZXItPm1WRUF1ZGlvUGxheWVyKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5yZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHJlYWRGaXJzdFZpZGVvRnJhbWUgb2YgY2xpcCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnRocmVhZFByb2MoTTRPU0FfVm9pZCogcGFyYW0pIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9JbnQzMiBpbmRleCA9IDA7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKXBhcmFtOwotCi0gICAgQUxPR1YoImluc2lkZSB0aHJlYWRQcm9jIik7Ci0gICAgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllcklkbGUpIHsKLSAgICAgICAgKHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpKys7Ci0KLSAgICAgICAgQUxPR0QoInRocmVhZFByb2M6IHBsYXlpbmcgZmlsZSBpbmRleCAlZCB0b3RhbCBjbGlwcyAlZCIsCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyLCBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KTsKLQotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPj0KLSAgICAgICAgIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpIHsKLQotICAgICAgICAgICAgQUxPR0QoIkFsbCBjbGlwcyBwcmV2aWV3ZWQiKTsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA9IDA7Ci0KLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tUHJldmlld0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4OwotCi0gICAgICAgICAgICAgICAgQUxPR0QoIlByZXZpZXcgbG9vcGluZyBUUlVFLCByZXN0YXJ0aW5nIGZyb20gY2xpcCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHN0b3J5IGJvYXJkIHRpbWVzdGFtcCBpbnNpZGUgdGhlIHBsYXllcgotICAgICAgICAgICAgICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICAgICAgICAgIHBsYXllckluc3QrKykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RdLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGVuZEFyZ3MgPSAwOwotICAgICAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BSRVZJRVdfRU5ELCAmZW5kQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckF1dG9TdG9wOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgYmVnaW4gY3V0dGltZSBvZiBmaXJzdCBwcmV2aWV3ZWQgY2xpcAotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleF0tPnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIHdhcm5pbmcgdG8gTTRPU0EgdGhyZWFkIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRocmVhZCBpcyBtb3ZlZCBmcm9tIGV4ZWN1dGluZyBzdGF0ZSB0byBvcGVuIHN0YXRlCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXg9cENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcDsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0KLSAgICAgICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsIGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uOwotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldFN0b3J5Ym9hcmRTdGFydFRpbWUoCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbik7Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lIik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBuZXh0IGNsaXAgZHVyYXRpb24gZm9yIEF1ZGlvIG1peCBoZXJlCi0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24sCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotCi0gICAgICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0gZnJvbU1TICVkIFwKLSAgICAgICAgICAgICBDbGlwQmVnaW5UaW1lICVkIiwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gKwotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FwdHVyZSB0aGUgYWN0aXZlIHBsYXllciBiZWluZyB1c2VkCi0gICAgICAgIHBDb250cm9sbGVyLT5tQWN0aXZlUGxheWVySW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXI7Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zdGFydCgpOwotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc3RhcnRlZCIpOwotCi0gICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckJ1c3k7Ci0KLSAgICB9IGVsc2UgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllckF1dG9TdG9wKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3IGNvbXBsZXRlZC4uYXV0byBzdG9wIHRoZSBwbGF5ZXIiKTsKLSAgICB9IGVsc2UgaWYgKChwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID09IFZlUGxheWVyQnVzeSkgJiYgKHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCkpIHsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcGxheWVyIGhlcmUKLSAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpOwotICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVdhaXQocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0LAotICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXBDb250cm9sbGVyLT5iU3RvcFRocmVhZEluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzdGF0ZSBidXN5Li4ud2FpdCBmb3Igc2VtIik7Ci0gICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwKLSAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNlbSB3YWl0IHJldHVybmVkIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8vQWx3YXlzIHJldHVybiBNNE5PX0VSUk9SIHRvIGVuc3VyZSB0aGUgdGhyZWFkIGtlZXBzIHJ1bm5pbmcKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpub3RpZnkoCi0gICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCi17Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKWNvb2tpZTsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHVpbnQzMl90IGNsaXBEdXJhdGlvbiA9IDA7Ci0gICAgc3dpdGNoIChtc2cpIHsKLSAgICAgICAgY2FzZSBNRURJQV9OT1A6IC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9OT1AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX1BSRVBBUkVEOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1BSRVBBUkVEIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0QoIm5vdGlmeTpNRURJQV9QTEFZQkFDS19DT01QTEVURSwgbUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0KLSAgICAgICAgICAgIC8vc2VuZCBwcm9ncmVzcyBjYWxsYmFjayB3aXRoIGxhc3QgZnJhbWUgdGltZXN0YW1wCi0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPT0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAtIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTTRPU0FfVUludDMyIHBsYXllZER1cmF0aW9uID0gY2xpcER1cmF0aW9uK3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sCi0gICAgICAgICAgICAgICAgICZwbGF5ZWREdXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmICgocENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9VUERBVEUpICYmCi0gICAgICAgICAgICAgICAgKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPQotICAgICAgICAgICAgICAgIChwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3LTEpKSkgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8pLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkN1cnJlbnQgRWRpdCBpbmZvIik7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5jbGlwSW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOwotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID09IE9WRVJMQVlfQ0xFQVI7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmVlKHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9FUlJPUjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGVycl92YWwgPSBleHQxOwotICAgICAgICAgIC8vIEFsd2F5cyBsb2cgZXJyb3JzLgotICAgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgotICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgQUxPR0UoIk1FRElBX0VSUk9SOyBlcnJvciAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAmZXJyX3ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FRElBX0lORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmZvX3ZhbCA9IGV4dDI7Ci0gICAgICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgLy9BTE9HVygiTUVESUFfSU5GTzsgaW5mby93YXJuaW5nICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLCAmaW5mb192YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9TRUVLX0NPTVBMRVRFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1NFRUtfQ09NUExFVEU7IFJlY2VpdmVkIHNlZWsgY29tcGxldGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX0JVRkZFUklOR19VUERBVEU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfQlVGRkVSSU5HX1VQREFURTsgYnVmZmVyaW5nICVkIiwgZXh0MSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9TRVRfVklERU9fU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9TRVRfVklERU9fU0laRTsgTmV3IHZpZGVvIHNpemUgJWQgeCAlZCIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEFBQUFBQUFBKToKLSAgICAgICAgICAgIEFMT0dWKCJWSURFTyBQTEFZQkFDSyBBTE1PU1Qgb3ZlciwgcHJlcGFyZSBuZXh0IHBsYXllciIpOwotICAgICAgICAgICAgLy8gU2VsZWN0IG5leHQgcGxheWVyIGFuZCBwcmVwYXJlIGl0Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNsaXAgYWZ0ZXIgdGhpcyBvbmUKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKShwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpIDwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIrKzsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID49IGtUb3RhbE51bVBsYXllckluc3RhbmNlcykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBmaXJzdCBjbGlwIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEJCQkJCQkJCKToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZJREVPIFBMQVlCQUNLLCBVcGRhdGUgT3ZlcmxheSIpOwotICAgICAgICAgICAgaW50IG92ZXJsYXlJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwRWRpdEluZm8gPQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOwotICAgICAgICAgICAgLy9leHQxID0gMTsgc3RhcnQgdGhlIG92ZXJsYXkgZGlzcGxheQotICAgICAgICAgICAgLy8gICAgID0gMjsgQ2xlYXIgdGhlIG92ZXJsYXkuCi0gICAgICAgICAgICBwRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gZXh0MjsKLSAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgICAgIEFMT0dWKCJwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChleHQxID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX1VQREFURTsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfVVBEQVRFLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9DTEVBUjsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJ1bnJlY29nbml6ZWQgbWVzc2FnZTogKCVkLCAlZCwgJWQpIiwgbXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRWaWRlb0VmZmVjdFR5cGUoCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgLy8gbWFwIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdG8gbG9jYWwgZW51bQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1BJTks7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSRUVOOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9TRVBJQTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTkVHQVRJVkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRlJBTUlORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllczoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GSUZUSUVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkFESUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKGVuYWJsZSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIC8vIElmIGFscmVhZHkgc2V0LCB0aGVuIG5vIG5lZWQgdG8gc2V0IGFnYWluCi0gICAgICAgIGlmKCEobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0IHw9IGVmZmVjdDsKLSAgICAgICAgICAgIGlmKGVmZmVjdCA9PSBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAgICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgewotICAgICAgICAvLyBSZXNldCBvbmx5IGlmIGFscmVhZHkgc2V0Ci0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5lZmZlY3Q7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjphcHBseVZpZGVvRWZmZWN0KAotICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLAotICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB2ZVBvc3RQcm9jZXNzUGFyYW1zIHBvc3RQcm9jZXNzUGFyYW1zOwotCi0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkQnVmZmVyID0gKE00VklGSV9VSW50OCopZGF0YVB0cjsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnRpbWVNcyA9IHRpbWVNczsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy50aW1lT2Zmc2V0ID0gMDsgLy9TaW5jZSB0aW1lTVMgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIG9mZnNldCBpbiB0aGlzIGNhc2UKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5lZmZlY3RzU2V0dGluZ3MgPSBtRWZmZWN0c1NldHRpbmdzOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm51bWJlckVmZmVjdHMgPSBtTnVtYmVyRWZmZWN0czsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdXRWaWRlb1dpZHRoID0gbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3V0VmlkZW9IZWlnaHQgPSBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMuY3VycmVudFZpZGVvRWZmZWN0ID0gbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5yZW5kZXJpbmdNb2RlID0gbVJlbmRlcmluZ01vZGU7Ci0gICAgaWYobUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICBwb3N0UHJvY2Vzc1BhcmFtcy5pc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgcG9zdFByb2Nlc3NQYXJhbXMuaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvL3Bvc3RQcm9jZXNzUGFyYW1zLnJlbmRlcmVyID0gbVRhcmdldDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdmVybGF5RnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm92ZXJsYXlGcmFtZVlVVkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCYocG9zdFByb2Nlc3NQYXJhbXMucE91dEJ1ZmZlciksICYocG9zdFByb2Nlc3NQYXJhbXMub3V0QnVmZmVyU3RyaWRlKSk7Ci0KLSAgICBlcnIgPSBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKCZwb3N0UHJvY2Vzc1BhcmFtcywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFByZXZpZXdGcmFtZVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSkgewotCi0gICAgQUxPR1YoInNldE1lZGlhUmVuZGVyaW5nTW9kZTogb3V0cHV0VmlkZW9TaXplID0gJWQiLCBvdXRwdXRWaWRlb1NpemUpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgZXJyID0gZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKG91dHB1dFZpZGVvU2l6ZSwKLSAgICAgICAgICAgICAgJm1PdXRwdXRWaWRlb1dpZHRoLCAmbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1ZvaWQqIG91dFB0cikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0gICAgTTRWSUZJX1VJbnQ4ICppbkJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEJ1ZmZlcldpZHRoID0wLCBvdXRwdXRCdWZmZXJIZWlnaHQ9MDsKLQotICAgIC8vZnJhbWVTaXplID0gKHZpZGVvV2lkdGgqdmlkZW9IZWlnaHQqMykgPj4gMTsKLSAgICBpbkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWRhdGFQdHI7Ci0KLSAgICAvLyBJbiBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lSW4sIHZpZGVvV2lkdGgsCi0gICAgICB2aWRlb0hlaWdodCwgKE00VklGSV9VSW50OCAqKWluQnVmZmVyLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgobU91dHB1dFZpZGVvV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChtT3V0cHV0VmlkZW9IZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIG1SZW5kZXJpbmdNb2RlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZG9JbWFnZVJlbmRlcmluZ01vZGU6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzU2ZjMyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSAotI2RlZmluZSBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUGxheWVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIENhbGxiYWNrIG1lY2hhbmlzbSBmcm9tIFByZXZpZXdDb250cm9sbGVyIHRvIEpuaSAgKi8KLXR5cGVkZWYgdm9pZCAoKmpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QpKHZvaWQqIGNvb2tpZSwgTTRPU0FfVUludDMyIG1zZ1R5cGUsIHZvaWQgKmFyZ2MpOwotCi1zdHJ1Y3QgU3VyZmFjZTsKLXN0cnVjdCBQcmV2aWV3UmVuZGVyZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgewotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotICAgIH5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCk7Ci0KLSAgICBNNE9TQV9FUlIgbG9hZEVkaXRTZXR0aW5ncygKLSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBiZ21TZXR0aW5ncyk7Ci0KLSAgICBNNE9TQV9FUlIgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0KLSAgICBNNE9TQV9FUlIgc3RhcnRQcmV2aWV3KAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgbG9vcCkgOwotCi0gICAgTTRPU0FfVUludDMyIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICBNNE9TQV9FUlIgcmVuZGVyUHJldmlld0ZyYW1lKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8sCi0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwQ3VyckVkaXRJbmZvKTsKLQotICAgIE00T1NBX0VSUiBjbGVhclN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbyk7Ci0KLSAgICBNNE9TQV9Wb2lkIHNldEpuaUNhbGxiYWNrKAotICAgICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICAgICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBjYWxsYmFja0ZjdCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgICAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMgPSAyLAotICAgICAgICBrUHJldmlld1RocmVhZFN0YWNrU2l6ZSA9IDY1NTM2LAotICAgIH07Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBWZVBsYXllcklkbGUgPSAwLAotICAgICAgICBWZVBsYXllckJ1c3ksCi0gICAgICAgIFZlUGxheWVyQXV0b1N0b3AKLSAgICB9IFBsYXllclN0YXRlOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgT1ZFUkxBWV9VUERBVEUgPSAwLAotICAgICAgICBPVkVSTEFZX0NMRUFSCi0gICAgfSBPdmVybGF5U3RhdGU7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gbVZlUGxheWVyW2tUb3RhbE51bVBsYXllckluc3RhbmNlc107Ci0gICAgaW50IG1DdXJyZW50UGxheWVyOyAgLy8gcGxheWVyIGluc3RhbmNlIGN1cnJlbnRseSBiZWluZyB1c2VkCi0gICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgTTRPU0FfQ29udGV4dCBtVGhyZWFkQ29udGV4dDsKLSAgICBQbGF5ZXJTdGF0ZSBtUGxheWVyU3RhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICBtUHJlcGFyZVJlcWVzdDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqbUNsaXBMaXN0OwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJDbGlwc1RvUHJldmlldzsKLSAgICBNNE9TQV9VSW50MzIgbVN0YXJ0aW5nQ2xpcEluZGV4OwotICAgIE00T1NBX0Jvb2wgbVByZXZpZXdMb29waW5nOwotICAgIE00T1NBX1VJbnQzMiBtQ2FsbEJhY2tBZnRlckZyYW1lQ250OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckVmZmVjdHM7Ci0gICAgTTRPU0FfSW50MzIgbUN1cnJlbnRDbGlwTnVtYmVyOwotICAgIE00T1NBX1VJbnQzMiBtQ2xpcFRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBQcmV2aWV3UmVuZGVyZXIgKm1UYXJnZXQ7Ci0gICAgTTRPU0FfQ29udGV4dCBtSm5pQ29va2llOwotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgbUpuaUNhbGxiYWNrOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciBtRnJhbWVTdHI7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50UGxheWVkRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50Q2xpcER1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG1PdXRwdXRWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIE00T1NBX1VJbnQzMiBtTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOwotICAgIE92ZXJsYXlTdGF0ZSBtT3ZlcmxheVN0YXRlOwotICAgIGludCBtQWN0aXZlUGxheWVySW5kZXg7Ci0KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIGJvb2wgYlN0b3BUaHJlYWRJblByb2dyZXNzOwotICAgIE00T1NBX0NvbnRleHQgbVNlbVRocmVhZFdhaXQ7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLQotICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0PiBtVkVBdWRpb1Npbms7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbVZFQXVkaW9QbGF5ZXI7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIqIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja1NlbTsKLQotCi0gICAgc3RhdGljIE00T1NBX0VSUiBwcmVwYXJlUGxheWVyKHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIE00T1NBX0VSUiB0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKTsKLSAgICBzdGF0aWMgdm9pZCBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotCi0gICAgdm9pZCBzZXRWaWRlb0VmZmVjdFR5cGUoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0KLSAgICBNNE9TQV9FUlIgYXBwbHlWaWRlb0VmZmVjdCgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIE00T1NBX0VSUiBkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUhCi0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcihjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJik7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiZWFiZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JTUkMiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yU1JDOjpWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclNSQyAlcCglcCkiLCB0aGlzLCBzb3VyY2UuZ2V0KCkpOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6ID0ga0ZyZXEzMjAwMEh6OwotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgbUNoYW5uZWxDbnQgPSAwOwotICAgIG1TYW1wbGVSYXRlID0gMDsKLSAgICBtT3V0cHV0U2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6OwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSAgPSAwOwotICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgbUxlZnRvdmVyID0gMDsKLSAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgIG1TdG9wUGVuZGluZyA9IGZhbHNlOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0KLSAgICAvLyBJbnB1dCBTb3VyY2UgdmFsaWRhdGlvbgotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgLy8gU2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgb3V0cHV0IGFmdGVyIHJlc2FtcGxpbmcuCi0gICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHopOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOyAgLy8gYWx3YXlzIHN0ZXJlbwotfQotCi1WaWRlb0VkaXRvclNSQzo6flZpZGVvRWRpdG9yU1JDKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgLy8gU2V0IHJlc2FtcGxlciBpZiByZXF1aXJlZAotICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0KLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgICAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclNSQzo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbU91dHB1dEZvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyX291dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBBTE9HVigicmVhZCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmIChtUmVzYW1wbGVyKSB7Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBzZWVrIHBhcmFtZXRlcnMKLSAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCBTZWVrICVsbGQiLCBzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBhc2sgZm9yIDEwMjQgZnJhbWVzIGluIG91dHB1dAotICAgICAgICAvLyByZXNhbXBsZXIgb3V0cHV0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCAzMiBiaXRzCi0gICAgICAgIGNvbnN0IHNpemVfdCBrT3V0cHV0RnJhbWVDb3VudCA9IDEwMjQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrQnl0ZXMgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSAoaW50MzJfdCAqKWNhbGxvYygxLCBrQnl0ZXMpOwotICAgICAgICBpZiAoIXBUbXBCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWxsb2MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeTogJWQgYnl0ZXMiLCBrQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2FtcGxlIHRvIHRhcmdldCBxdWFsaXR5Ci0gICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50LCB0aGlzKTsKLQotICAgICAgICBpZiAobVN0b3BQZW5kaW5nKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoYW5nZSByZXNhbXBsZXIgYW5kIHJldHJ5IGlmIGZvcm1hdCBjaGFuZ2UgaGFwcGVuZWQKLSAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUJ1ZmZlcgotICAgICAgICBpbnQzMl90IG91dEJ1ZmZlclNpemUgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBvdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIob3V0QnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIDIgY2hhbm5lbHMgYW5kIDE2IGJpdHMKLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAoCi0gICAgICAgICAgICAgICAgKGludDMyX3QgKikoKHVpbnQ4X3QqKW91dEJ1ZmZlci0+ZGF0YSgpICsgb3V0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZlciwga091dHB1dEZyYW1lQ291bnQpOwotICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotCi0gICAgICAgIC8vIENvbXB1dGUgYW5kIHNldCB0aGUgbmV3IHRpbWVzdGFtcAotICAgICAgICBzcDxNZXRhRGF0YT4gdG8gPSBvdXRCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsT3V0RHVyYXRpb25VcyA9IChtQWNjdU91dEJ1ZmZlclNpemUgKiAxMDAwMDAwKSAvIChtT3V0cHV0U2FtcGxlUmF0ZSAqIDIgKiAyKTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBtSW5pdGlhbFRpbWVTdGFtcFVzICsgdG90YWxPdXREdXJhdGlvblVzOwotICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBhY2N1bXVsYXRlIHNpemUKLSAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplICs9IG91dEJ1ZmZlclNpemU7Ci0gICAgICAgICpidWZmZXJfb3V0ID0gb3V0QnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlc2FtcGxpbmcgbm90IHJlcXVpcmVkLiBSZWFkIGFuZCBwYXNzLXRocm91Z2guCi0gICAgICAgIE1lZGlhQnVmZmVyICphQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZhQnVmZmVyLCBvcHRpb25zKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgcmV0dXJucyBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgIGlmKGVyciAhPSBPSykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqYnVmZmVyX291dCA9IGFCdWZmZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKSB7Ci0gICAgQUxPR1YoImdldE5leHRCdWZmZXIgJWQsIGNoYW4gPSAlZCIsIHBCdWZmZXItPmZyYW1lQ291bnQsIG1DaGFubmVsQ250KTsKLSAgICB1aW50MzJfdCBkb25lID0gMDsKLSAgICB1aW50MzJfdCB3YW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1DaGFubmVsQ250ICogMjsKLSAgICBwQnVmZmVyLT5yYXcgPSBtYWxsb2Mod2FudCk7Ci0KLSAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgd2FudCA+IDApIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBsZWZ0LCByZWFkIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgaWYgKCFtQnVmZmVyKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBzZWVrLCByZXNldCB0aGUgaW5pdGlhbCB0aW1lIHN0YW1wIGFuZCBhY2N1bXVsYXRlZCB0aW1lCi0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXAgY2FjaGVNb3JlX2wgU2VlayByZXF1ZXN0ZWQgPSAlbGxkIiwgdGhpcywgbVNlZWtUaW1lVXMpOwotICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0gbVNlZWtNb2RlOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXI6IHNvdXJjZSByZWFkIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbm5vdCBzd2l0Y2ggdG8gYSBuZXcgQXVkaW9SZXNhbXBsZXIgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNhbGxiYWNrIGNhbGxlZCBieSB0aGUgQXVkaW9SZXNhbXBsZXIgaXRzZWxmLiBTbwotICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkLCBhbmQgbGV0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCgpIGhhbmRsZXMgdGhpcy4KLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRU9TIG9yIHNvbWUgb3RoZXIgZXJyb3IKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIG9yIHNvbWUgZXJyOiAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGNhbGwgc3RvcCgpIGhlcmUgYmVjYXVzZSBzdG9wKCkgd2lsbCByZWxlYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIEF1ZGlvUmVzYW1wbGVyLCBhbmQgd2UgYXJlIGluIGEgY2FsbGJhY2sgb2YgdGhlIEF1ZGlvUmVzYW1wbGVyLgotICAgICAgICAgICAgICAgIC8vIFNvIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgYW5kIGxldCByZWFkKCkgY2FsbCBzdG9wKCkuCi0gICAgICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyKTsKLSAgICAgICAgICAgIG1MZWZ0b3ZlciA9IG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsVGltZVN0YW1wVXMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGN1clRTOwotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmcm9tID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgICAgICAgICAgICAgZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmY3VyVFMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIG1Jbml0aWFsVGltZVN0YW1wVXMgdG8gJWxsZCIsIG1Jbml0aWFsVGltZVN0YW1wVXMpOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSBjdXJUUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBjb3B5IGRhdGEgdG8gdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIHVpbnQzMl90IHRvZG8gPSBtTGVmdG92ZXI7Ci0gICAgICAgIGlmICh0b2RvID4gd2FudCkgewotICAgICAgICAgICAgdG9kbyA9IHdhbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBlbmQgPSAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkKLSAgICAgICAgICAgICAgICArIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXBCdWZmZXItPnJhdyArIGRvbmUsIGVuZCAtIG1MZWZ0b3ZlciwgdG9kbyk7Ci0gICAgICAgIGRvbmUgKz0gdG9kbzsKLSAgICAgICAgd2FudCAtPSB0b2RvOwotICAgICAgICBtTGVmdG92ZXIgLT0gdG9kbzsKLQotICAgICAgICAvLyBSZWxlYXNlIE1lZGlhQnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICAgIGlmIChtTGVmdG92ZXIgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gZG9uZSAvIChtQ2hhbm5lbENudCAqIDIpOwotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyIGRvbmUgJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotdm9pZCBWaWRlb0VkaXRvclNSQzo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLSAgICBBTE9HVigicmVsZWFzZUJ1ZmZlcjogJXAiLCBwQnVmZmVyKTsKLSAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclNSQzo6Y2hlY2tBbmRTZXRSZXNhbXBsZXIoKSB7Ci0gICAgQUxPR1YoImNoZWNrQW5kU2V0UmVzYW1wbGVyIik7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDE2X3Qga1VuaXR5R2FpbiA9IDB4MTAwMDsKLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbUNoYW5uZWxDbnQpKTsKLQotICAgIC8vIElmIGEgcmVzYW1wbGVyIGV4aXN0cywgZGVsZXRlIGl0IGZpcnN0Ci0gICAgaWYgKG1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICAgICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ2xlYXIgcHJldmlvdXMgYnVmZmVyCi0gICAgaWYgKG1CdWZmZXIpIHsKLSAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVNhbXBsZVJhdGUgIT0gbU91dHB1dFNhbXBsZVJhdGUgfHwgbUNoYW5uZWxDbnQgIT0gMikgewotICAgICAgICBBTE9HVigiUmVzYW1wbGluZyByZXF1aXJlZCAoJWQgPT4gJWQgSHosICMgY2hhbm5lbHMgPSAlZCkiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlLCBtQ2hhbm5lbENudCk7Ci0KLSAgICAgICAgbVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiAvKiBiaXQgZGVwdGggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTYW1wbGVSYXRlKTsKLSAgICAgICAgQ0hFQ0sobVJlc2FtcGxlcik7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoa1VuaXR5R2Fpbiwga1VuaXR5R2Fpbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlJlc2FtcGxpbmcgbm90IHJlcXVpcmVkICglZCA9PiAlZCBIeiwgIyBjaGFubmVscyA9ICVkKSIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbU91dHB1dFNhbXBsZVJhdGUsIG1DaGFubmVsQ250KTsKLSAgICB9Ci19Ci0KLX0gLy9uYW1lc3BjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3MDdkNGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgotI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhQnVmZmVyOwotCi1jbGFzcyBWaWRlb0VkaXRvclNSQyA6IHB1YmxpYyBNZWRpYVNvdXJjZSAsIHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLQotcHVibGljOgotICAgIFZpZGVvRWRpdG9yU1JDKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQgKE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQgKAotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotCi0gICAgLy8gU2FtcGxpbmcgZnJlcWVuY2llcwotICAgIGVudW0gewotICAgICAgICBrRnJlcTgwMDBIeiAgPSA4MDAwLAotICAgICAgICBrRnJlcTExMDI1SHogPSAxMTAyNSwKLSAgICAgICAga0ZyZXExMjAwMEh6ID0gMTIwMDAsCi0gICAgICAgIGtGcmVxMTYwMDBIeiA9IDE2MDAwLAotICAgICAgICBrRnJlcTIyMDUwSHogPSAyMjA1MCwKLSAgICAgICAga0ZyZXEyNDAwMEh6ID0gMjQwMDAsCi0gICAgICAgIGtGcmVxMzIwMDBIeiA9IDMyMDAwLAotICAgICAgICBrRnJlcTQ0MTAwSHogPSA0NDEwMCwKLSAgICAgICAga0ZyZXE0ODAwMEh6ID0gNDgwMDAsCi0gICAgfTsKLQotcHJvdGVjdGVkIDoKLSAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclNSQygpOwotCi1wcml2YXRlOgotICAgIEF1ZGlvUmVzYW1wbGVyICptUmVzYW1wbGVyOwotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIGludCBtQ2hhbm5lbENudDsKLSAgICBpbnQgbVNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBtT3V0cHV0U2FtcGxlUmF0ZTsKLSAgICBib29sIG1TdGFydGVkOwotICAgIHNwPE1ldGFEYXRhPiBtT3V0cHV0Rm9ybWF0OwotCi0gICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0gICAgaW50MzJfdCBtTGVmdG92ZXI7Ci0gICAgYm9vbCBtRm9ybWF0Q2hhbmdlZDsKLSAgICBib29sIG1TdG9wUGVuZGluZzsKLQotICAgIGludDY0X3QgbUluaXRpYWxUaW1lU3RhbXBVczsKLSAgICBpbnQ2NF90IG1BY2N1T3V0QnVmZmVyU2l6ZTsKLQotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1TZWVrTW9kZTsKLQotICAgIFZpZGVvRWRpdG9yU1JDKCk7Ci0gICAgdm9pZCBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIFZpZGVvRWRpdG9yU1JDKGNvbnN0IFZpZGVvRWRpdG9yU1JDJik7Ci0gICAgVmlkZW9FZGl0b3JTUkMgJm9wZXJhdG9yPShjb25zdCBWaWRlb0VkaXRvclNSQyAmKTsKLQotfTsKLQotfSAvL25hbWVzcGNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiOWZkNjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0vKisgSGFuZGxlIHRoZSBpbWFnZSBmaWxlcyBoZXJlICovCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0vKi0gSGFuZGxlIHRoZSBpbWFnZSBmaWxlcyBoZXJlICovCi0KLWNvbnN0IE00VklGSV9VSW50OCAgIE00VklGSV9DbGlwVGFibGVbMTI1Nl0KLT0gewotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAotMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwKLTB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsCi0weDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLAotMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKLTB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsCi0weDJjLCAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDMzLAotMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwKLTB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsCi0weDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLAotMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywKLTB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsCi0weDVjLCAweDVkLCAweDVlLCAweDVmLCAweDYwLCAweDYxLCAweDYyLCAweDYzLAotMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwKLTB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsCi0weDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDdiLAotMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywKLTB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsCi0weDhjLCAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLAotMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwKLTB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsCi0weGE0LCAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLAotMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywKLTB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsCi0weGJjLCAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLAotMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwKLTB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsCi0weGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLAotMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywKLTB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsCi0weGVjLCAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLAotMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwKLTB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgotfTsKLQotLyogRGl2aXNpb24gdGFibGUgZm9yICggNjU1MzUveCApOyB4ID0gMCB0byA1MTIgKi8KLWNvbnN0IE00VklGSV9VSW50MTYgIE00VklGSV9EaXZUYWJsZVs1MTJdCi09IHsKLTAsIDY1NTM1LCAzMjc2OCwgMjE4NDUsIDE2Mzg0LCAxMzEwNywgMTA5MjIsIDkzNjIsCi04MTkyLCA3MjgxLCA2NTUzLCA1OTU3LCA1NDYxLCA1MDQxLCA0NjgxLCA0MzY5LAotNDA5NiwgMzg1NSwgMzY0MCwgMzQ0OSwgMzI3NiwgMzEyMCwgMjk3OCwgMjg0OSwKLTI3MzAsIDI2MjEsIDI1MjAsIDI0MjcsIDIzNDAsIDIyNTksIDIxODQsIDIxMTQsCi0yMDQ4LCAxOTg1LCAxOTI3LCAxODcyLCAxODIwLCAxNzcxLCAxNzI0LCAxNjgwLAotMTYzOCwgMTU5OCwgMTU2MCwgMTUyNCwgMTQ4OSwgMTQ1NiwgMTQyNCwgMTM5NCwKLTEzNjUsIDEzMzcsIDEzMTAsIDEyODUsIDEyNjAsIDEyMzYsIDEyMTMsIDExOTEsCi0xMTcwLCAxMTQ5LCAxMTI5LCAxMTEwLCAxMDkyLCAxMDc0LCAxMDU3LCAxMDQwLAotMTAyNCwgMTAwOCwgOTkyLCA5NzgsIDk2MywgOTQ5LCA5MzYsIDkyMywKLTkxMCwgODk3LCA4ODUsIDg3MywgODYyLCA4NTEsIDg0MCwgODI5LAotODE5LCA4MDksIDc5OSwgNzg5LCA3ODAsIDc3MSwgNzYyLCA3NTMsCi03NDQsIDczNiwgNzI4LCA3MjAsIDcxMiwgNzA0LCA2OTcsIDY4OSwKLTY4MiwgNjc1LCA2NjgsIDY2MSwgNjU1LCA2NDgsIDY0MiwgNjM2LAotNjMwLCA2MjQsIDYxOCwgNjEyLCA2MDYsIDYwMSwgNTk1LCA1OTAsCi01ODUsIDU3OSwgNTc0LCA1NjksIDU2NCwgNTYwLCA1NTUsIDU1MCwKLTU0NiwgNTQxLCA1MzcsIDUzMiwgNTI4LCA1MjQsIDUyMCwgNTE2LAotNTEyLCA1MDgsIDUwNCwgNTAwLCA0OTYsIDQ5MiwgNDg5LCA0ODUsCi00ODEsIDQ3OCwgNDc0LCA0NzEsIDQ2OCwgNDY0LCA0NjEsIDQ1OCwKLTQ1NSwgNDUxLCA0NDgsIDQ0NSwgNDQyLCA0MzksIDQzNiwgNDM0LAotNDMxLCA0MjgsIDQyNSwgNDIyLCA0MjAsIDQxNywgNDE0LCA0MTIsCi00MDksIDQwNywgNDA0LCA0MDIsIDM5OSwgMzk3LCAzOTQsIDM5MiwKLTM5MCwgMzg3LCAzODUsIDM4MywgMzgxLCAzNzgsIDM3NiwgMzc0LAotMzcyLCAzNzAsIDM2OCwgMzY2LCAzNjQsIDM2MiwgMzYwLCAzNTgsCi0zNTYsIDM1NCwgMzUyLCAzNTAsIDM0OCwgMzQ2LCAzNDQsIDM0MywKLTM0MSwgMzM5LCAzMzcsIDMzNiwgMzM0LCAzMzIsIDMzMCwgMzI5LAotMzI3LCAzMjYsIDMyNCwgMzIyLCAzMjEsIDMxOSwgMzE4LCAzMTYsCi0zMTUsIDMxMywgMzEyLCAzMTAsIDMwOSwgMzA3LCAzMDYsIDMwNCwKLTMwMywgMzAyLCAzMDAsIDI5OSwgMjk3LCAyOTYsIDI5NSwgMjkzLAotMjkyLCAyOTEsIDI4OSwgMjg4LCAyODcsIDI4NiwgMjg0LCAyODMsCi0yODIsIDI4MSwgMjgwLCAyNzgsIDI3NywgMjc2LCAyNzUsIDI3NCwKLTI3MywgMjcxLCAyNzAsIDI2OSwgMjY4LCAyNjcsIDI2NiwgMjY1LAotMjY0LCAyNjMsIDI2MiwgMjYxLCAyNjAsIDI1OSwgMjU4LCAyNTcsCi0yNTYsIDI1NSwgMjU0LCAyNTMsIDI1MiwgMjUxLCAyNTAsIDI0OSwKLTI0OCwgMjQ3LCAyNDYsIDI0NSwgMjQ0LCAyNDMsIDI0MiwgMjQxLAotMjQwLCAyNDAsIDIzOSwgMjM4LCAyMzcsIDIzNiwgMjM1LCAyMzQsCi0yMzQsIDIzMywgMjMyLCAyMzEsIDIzMCwgMjI5LCAyMjksIDIyOCwKLTIyNywgMjI2LCAyMjUsIDIyNSwgMjI0LCAyMjMsIDIyMiwgMjIyLAotMjIxLCAyMjAsIDIxOSwgMjE5LCAyMTgsIDIxNywgMjE3LCAyMTYsCi0yMTUsIDIxNCwgMjE0LCAyMTMsIDIxMiwgMjEyLCAyMTEsIDIxMCwKLTIxMCwgMjA5LCAyMDgsIDIwOCwgMjA3LCAyMDYsIDIwNiwgMjA1LAotMjA0LCAyMDQsIDIwMywgMjAyLCAyMDIsIDIwMSwgMjAxLCAyMDAsCi0xOTksIDE5OSwgMTk4LCAxOTcsIDE5NywgMTk2LCAxOTYsIDE5NSwKLTE5NSwgMTk0LCAxOTMsIDE5MywgMTkyLCAxOTIsIDE5MSwgMTkxLAotMTkwLCAxODksIDE4OSwgMTg4LCAxODgsIDE4NywgMTg3LCAxODYsCi0xODYsIDE4NSwgMTg1LCAxODQsIDE4NCwgMTgzLCAxODMsIDE4MiwKLTE4MiwgMTgxLCAxODEsIDE4MCwgMTgwLCAxNzksIDE3OSwgMTc4LAotMTc4LCAxNzcsIDE3NywgMTc2LCAxNzYsIDE3NSwgMTc1LCAxNzQsCi0xNzQsIDE3MywgMTczLCAxNzIsIDE3MiwgMTcyLCAxNzEsIDE3MSwKLTE3MCwgMTcwLCAxNjksIDE2OSwgMTY4LCAxNjgsIDE2OCwgMTY3LAotMTY3LCAxNjYsIDE2NiwgMTY1LCAxNjUsIDE2NSwgMTY0LCAxNjQsCi0xNjMsIDE2MywgMTYzLCAxNjIsIDE2MiwgMTYxLCAxNjEsIDE2MSwKLTE2MCwgMTYwLCAxNTksIDE1OSwgMTU5LCAxNTgsIDE1OCwgMTU3LAotMTU3LCAxNTcsIDE1NiwgMTU2LCAxNTYsIDE1NSwgMTU1LCAxNTQsCi0xNTQsIDE1NCwgMTUzLCAxNTMsIDE1MywgMTUyLCAxNTIsIDE1MiwKLTE1MSwgMTUxLCAxNTEsIDE1MCwgMTUwLCAxNDksIDE0OSwgMTQ5LAotMTQ4LCAxNDgsIDE0OCwgMTQ3LCAxNDcsIDE0NywgMTQ2LCAxNDYsCi0xNDYsIDE0NSwgMTQ1LCAxNDUsIDE0NCwgMTQ0LCAxNDQsIDE0NCwKLTE0MywgMTQzLCAxNDMsIDE0MiwgMTQyLCAxNDIsIDE0MSwgMTQxLAotMTQxLCAxNDAsIDE0MCwgMTQwLCAxNDAsIDEzOSwgMTM5LCAxMzksCi0xMzgsIDEzOCwgMTM4LCAxMzcsIDEzNywgMTM3LCAxMzcsIDEzNiwKLTEzNiwgMTM2LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNCwgMTM0LAotMTM0LCAxMzQsIDEzMywgMTMzLCAxMzMsIDEzMiwgMTMyLCAxMzIsCi0xMzIsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMwLCAxMzAsIDEzMCwKLTEzMCwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjgsIDEyOCwgMTI4Ci19OwotCi1jb25zdCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2UxWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsMHgwMDAwMDY0OSwweDAwMDAwZDBmLCAweDAwMDBEODZDLCAweDAwMDBEODNCLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwCi19OwotCi1jb25zdCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2VbOF0KLT0gewotMHgwMDAwMjU2OCwgMHgwMDAwMzM0MywgMHgxQkY4MDAsIDB4MDAwMDA2NDksIDB4MDAwMDBkMGYsIDB4MTEwMTgwLCAweDQwY2YsIDB4MjJCRTAwCi19OwotCi0KLWNvbnN0IE00VklGSV9VSW50MTYgICpNNFZJRklfRGl2VGFibGVfemVybwotID0gJk00VklGSV9EaXZUYWJsZVswXTsKLQotY29uc3QgTTRWSUZJX1VJbnQ4ICAgKk00VklGSV9DbGlwVGFibGVfemVybwotID0gJk00VklGSV9DbGlwVGFibGVbNTAwXTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJUb1lVVjQyMFNlbWlwbGFuYXIodm9pZCAqdXNlcl9kYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKSB7Ci0KLSAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0LCAqcF9idWZfc3JjX3UsICpwX2J1Zl9zcmNfdjsKLSAgICBNNFZJRklfVUludDggICAgcmV0dXJuX2NvZGUgPSBNNFZJRklfT0s7Ci0KLSAgICAvKiB0aGUgZmlsdGVyIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gc3RyaWRlICovCi0gICAgaWYoUGxhbmVJblswXS51X3dpZHRoICE9IFBsYW5lSW5bMF0udV9zdHJpZGUpCi0gICAgICAgIHJldHVybiBNNFZJRklfSU5WQUxJRF9QQVJBTTsKLQotICAgIC8qIFRoZSBpbnB1dCBZIFBsYW5lIGlzIHRoZSBzYW1lIGFzIHRoZSBvdXRwdXQgWSBQbGFuZSAqLwotICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJblswXS5wYWNfZGF0YVtQbGFuZUluWzBdLnVfdG9wbGVmdF0pOwotICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0WzBdLnBhY19kYXRhW1BsYW5lT3V0WzBdLnVfdG9wbGVmdF0pOwotICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsKHZvaWQgKilwX2J1Zl9zcmMgLAotICAgICAgICBQbGFuZU91dFswXS51X3dpZHRoICogUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgLyogVGhlIFUgYW5kIFYgY29tcG9uZW50cyBhcmUgcGxhbmFyLiBUaGUgbmVlZCB0byBiZSBtYWRlIGludGVybGVhdmVkICovCi0gICAgcF9idWZfc3JjX3UgPSAmKFBsYW5lSW5bMV0ucGFjX2RhdGFbUGxhbmVJblsxXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9zcmNfdiA9ICYoUGxhbmVJblsyXS5wYWNfZGF0YVtQbGFuZUluWzJdLnVfdG9wbGVmdF0pOwotICAgIHBfYnVmX2Rlc3QgID0gJihQbGFuZU91dFsxXS5wYWNfZGF0YVtQbGFuZU91dFsxXS51X3RvcGxlZnRdKTsKLQotICAgIGZvcihpID0gMDsgaSA8IFBsYW5lT3V0WzFdLnVfd2lkdGgqUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICB7Ci0gICAgICAgICpwX2J1Zl9kZXN0KysgPSAqcF9idWZfc3JjX3UrKzsKLSAgICAgICAgKnBfYnVmX2Rlc3QrKyA9ICpwX2J1Zl9zcmNfdisrOwotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotCi0gICAgIE00VklGSV9VSW50MzIgaTsKLSAgICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0LCAqcF9idWZfc3JjX3UsICpwX2J1Zl9zcmNfdjsKLSAgICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9kZXN0X3UsKnBfYnVmX2Rlc3RfdiwqcF9idWZfc3JjX3V2OwotICAgICBNNFZJRklfVUludDggICAgIHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotCi0gICAgIC8qIHRoZSBmaWx0ZXIgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB3aWR0aCBpcyBlcXVhbCB0byBzdHJpZGUgKi8KLSAgICAgaWYoUGxhbmVJblswXS51X3dpZHRoICE9IFBsYW5lSW5bMF0udV9zdHJpZGUpCi0gICAgICAgIHJldHVybiBNNFZJRklfSU5WQUxJRF9QQVJBTTsKLQotICAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8KLSAgICAgcF9idWZfc3JjID0gJihQbGFuZUluWzBdLnBhY19kYXRhW1BsYW5lSW5bMF0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0WzBdLnBhY19kYXRhW1BsYW5lT3V0WzBdLnVfdG9wbGVmdF0pOwotICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCh2b2lkICopcF9idWZfc3JjICwKLSAgICAgICAgIFBsYW5lT3V0WzBdLnVfd2lkdGggKiBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgLyogVGhlIFUgYW5kIFYgY29tcG9uZW50cyBhcmUgcGxhbmFyLiBUaGUgbmVlZCB0byBiZSBtYWRlIGludGVybGVhdmVkICovCi0gICAgIHBfYnVmX3NyY191diA9ICYoUGxhbmVJblsxXS5wYWNfZGF0YVtQbGFuZUluWzFdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0X3UgID0gJihQbGFuZU91dFsxXS5wYWNfZGF0YVtQbGFuZU91dFsxXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdF92ICA9ICYoUGxhbmVPdXRbMl0ucGFjX2RhdGFbUGxhbmVPdXRbMl0udV90b3BsZWZ0XSk7Ci0KLSAgICAgZm9yKGkgPSAwOyBpIDwgUGxhbmVPdXRbMV0udV93aWR0aCpQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICB7Ci0gICAgICAgICpwX2J1Zl9kZXN0X3UrKyA9ICpwX2J1Zl9zcmNfdXYrKzsKLSAgICAgICAgKnBfYnVmX2Rlc3RfdisrID0gKnBfYnVmX3NyY191disrOwotICAgICB9Ci0gICAgIHJldHVybiByZXR1cm5fY29kZTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgUGxhbmVJbiAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksajsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0gICAgTTR4VlNTX0NvbG9yU3RydWN0KiBDb2xvckNvbnRleHQgPSAoTTR4VlNTX0NvbG9yU3RydWN0KilwRnVuY3Rpb25Db250ZXh0OwotCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAwOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykKLSAgICB7Ci0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0KLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KSAvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMjgsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwyNTUsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEzOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKmZpcnN0IGdldCB0aGUgciwgZywgYiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4ZjgwMCk+PjExOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IFYxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKmZpcnN0IGdldCB0aGUgciwgZywgYiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4ZjgwMCk+PjExOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChNNE9TQV9VSW50MTYpKCBiIC0gKChiKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChNNE9TQV9VSW50MTYpKGcgLSAoKGcqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyprZWVwIHksIGJ1dCByZXBsYWNlIHUgYW5kIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZJRklfSU5WQUxJRF9QQVJBTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEx1bWluYW5jZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vc3dpdGNoICgoTTRPU0FfVUludDMyKXBGdW5jdGlvbkNvbnRleHQpLy8gY29tbWVudGVkIGJlY2F1c2UgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBlZmZlY3RzIGNvbnRleHQgZXhpc3QKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKENvbG9yQ29udGV4dC0+Y29sb3JFZmZlY3RUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8UGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoO2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3Rbal0gPSAyNTUgLSBwX2J1Zl9zcmNbal07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0gUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgUGxhbmVJbiAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQgKSB7Ci0KLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0KLSAgICAgKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9Ci0gICAgIChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGlmKEZyYW1pbmcgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmNsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbERlY29kZUdJRih1c2VyRGF0YSk7Ci0gICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nOiBcCi0gICAgICAgICAgICAgICAgRXJyb3IgaW4gTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgRnJhbWluZyA9Ci0gICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgLyogSW5pdGlhbGl6ZXMgZmlyc3QgR0lGIHRpbWUgKi8KLSAgICAgICAgKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Y3VycmVudF9naWZfdGltZSA9Ci0gICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGlucHV0IC8gb3V0cHV0IHBsYW5lIHBvaW50ZXJzICovCi0gICAgcF9pbl9ZICs9IFBsYW5lSW5bMF0udV90b3BsZWZ0OwotICAgIHBfaW5fVSArPSBQbGFuZUluWzFdLnVfdG9wbGVmdDsKLSAgICBwX2luX1YgKz0gUGxhbmVJblsyXS51X3RvcGxlZnQ7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIC8qKgotICAgICAqIERlcGVuZGluZyBvbiB0aW1lLCBpbml0aWFsaXplIEZyYW1pbmcgZnJhbWUgdG8gdXNlICovCi0gICAgaWYoRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgY3VycmVudCBjbGlwIHRpbWUgaGFzIHJlYWNoIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUgb2YgdGhlIGZyYW1pbmcgcGljdHVyZQotICAgICAqIHdlIG5lZWQgdG8gc3RlcCB0byBuZXh0IGZyYW1pbmcgcGljdHVyZSAqLwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgaWYoKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+Yl9hbmltYXRlZCA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgd2hpbGUoKCgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgKyBjdXJyZW50RnJhbWluZy0+ZHVyYXRpb24pIDwgcFByb2dyZXNzLT51aU91dHB1dFRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmNsaXBUaW1lID0KLSAgICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLQotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKHVzZXJEYXRhKTsKLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmc6IEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbiAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgKz0gY3VycmVudEZyYW1pbmctPmR1cmF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgKz0KLSAgICAgICAgICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nOwotICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICAgICAgICAgIEZyYW1pbmctPnBDdXJyZW50ID0gY3VycmVudEZyYW1pbmctPnBOZXh0OwotICAgICAgICAgICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqKUZyYW1pbmctPnBDdXJyZW50OwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIEZyYW1pbmdSR0IgPSBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0gICAgdG9wbGVmdFswXSA9IGN1cnJlbnRGcmFtaW5nLT50b3BsZWZ0X3g7Ci0gICAgdG9wbGVmdFsxXSA9IGN1cnJlbnRGcmFtaW5nLT50b3BsZWZ0X3k7Ci0KLSAgICBmb3IoIHg9MCA7eCA8IFBsYW5lSW5bMF0udV9oZWlnaHQgOyB4KyspCi0gICAgewotICAgICAgICBmb3IoIHk9MCA7eSA8IFBsYW5lSW5bMF0udV93aWR0aCA7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUbyBoYW5kbGUgZnJhbWluZyB3aXRoIGlucHV0IHNpemUgIT0gb3V0cHV0IHNpemUKLSAgICAgICAgICAgICAqIEZyYW1pbmcgaXMgYXBwbHllZCBpZiBjb29yZGluYXRlcyBtYXRjaGVzIGJldHdlZW4gZnJhbWluZy90b3BsZWZ0IGFuZCBpbnB1dCBwbGFuZSAqLwotICAgICAgICAgICAgaWYoIHkgPCAodG9wbGVmdFswXSArIGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfd2lkdGgpICAmJgotICAgICAgICAgICAgICAgIHkgPj0gdG9wbGVmdFswXSAmJgotICAgICAgICAgICAgICAgIHggPCAodG9wbGVmdFsxXSArIGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KSAmJgotICAgICAgICAgICAgICAgIHggPj0gdG9wbGVmdFsxXSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmxvYXQgYWxwaGFCbGVuZGluZyA9IDE7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogYWxwaGFCbGVuZGluZ1N0cnVjdCA9Ci0gICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YWxwaGFCbGVuZGluZ1N0cnVjdDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKSgoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqKXVzZXJEYXRhKS0+YWxwaGFCbGVuZGluZ1N0cnVjdDsKLSNlbmRpZiAvLyNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgaWYoYWxwaGFCbGVuZGluZ1N0cnVjdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocFByb2dyZXNzLT51aVByb2dyZXNzIDwgKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCkqcFByb2dyZXNzLT51aVByb2dyZXNzLyhhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkgJiYgcFByb2dyZXNzLT51aVByb2dyZXNzIDwgMTAwMCAtIChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKE00T1NBX0Zsb2F0KSgoTTRPU0FfRmxvYXQpYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUvMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAxMDAwIC0gKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLyhhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKi8KLQotICAgICAgICAgICAgICAgIGlmKCgqKEZyYW1pbmdSR0IpPT10cmFuc3BhcmVudDEpICYmICgqKEZyYW1pbmdSR0IrMSk9PXRyYW5zcGFyZW50MikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0oKihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPSgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPSgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGErKHktdG9wbGVmdFswXSkrKHgtdG9wbGVmdFsxXSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKSs9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpKygoeC10b3BsZWZ0WzFdKT4+MSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPSgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhKygoeS10b3BsZWZ0WzBdKT4+MSkrKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKSs9KCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIC0gUGxhbmVJblswXS51X3dpZHRoICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEp1c3QgY29weSBpbnB1dCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPSoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPSoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIGlmKHBQcm9ncmVzcy0+YklzTGFzdCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICYmIChNNE9TQV9Cb29sKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmJfSXNGaWxlR2lmID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUZfQ2xlYW5pbmcoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpOwotICAgIH0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBtYWtlIGEgdmlkZW8gbG9vayBhcyBpZiBpdCB3YXMgdGFrZW4gaW4gdGhlIGZpZnRpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICBwUGxhbmVJbiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gIE00VklGSV9PSzogICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcEZpZnRpZXNEYXRhLCBwUGxhbmVPdXQgb3IgcFByb2dyZXNzIGFyZSBOVUxMIChERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoCi0gICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBJblkgKz0gcFBsYW5lSW5bMF0udV90b3BsZWZ0OwotICAgIHBPdXRZID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBJblliZWdpbiAgPSBwSW5ZOwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcmFuZG9tICovCi0gICAgaWYocF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA8IDApCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kSW5pdCgpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfaGVpZ2h0KSA+PiA0KTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpID4gcF9GaWZ0aWVzRGF0YS0+ZmlmdGllc0VmZmVjdER1cmF0aW9uKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBQdXQgaW4gU2VwaWEgdGhlIGNocm9taW5hbmNlICovCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAxOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykKLSAgICB7Ci0gICAgICAgIHBJbkNyICA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGEgICsgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnQ7Ci0gICAgICAgIHBPdXRDciA9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhICsgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotCi0gICAgICAgIGZvciAoeCA9IDA7IHggPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoMSA9PSBwbGFuZV9udW1iZXIpCi0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dENyLCAxMTcscFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsgLyogVSB2YWx1ZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTM5LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFYgdmFsdWUgKi8KLQotICAgICAgICAgICAgcEluQ3IgICs9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgICAgICBwT3V0Q3IgKz0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHRoZSBuZXcgcGl4ZWxzIHZhbHVlcyAqLwotICAgIGZvciggeCA9IDAgOyB4IDwgcFBsYW5lSW5bMF0udV9oZWlnaHQgOyB4KyspCi0gICAgewotICAgICAgICBNNFZJRklfVUludDggKnBfb3V0WXRtcCwgKnBfaW5ZdG1wOwotCi0gICAgICAgIC8qIENvbXB1dGUgdGhlIHhTaGlmdCAocmFuZG9tIHZhbHVlKSAqLwotICAgICAgICBpZiAoMCA9PSAocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSAlIDUgKSkKLSAgICAgICAgICAgIHhTaGlmdCA9ICh4ICsgcF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSApICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHhTaGlmdCA9ICh4ICsgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gcF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSkgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzICovCi0gICAgICAgIHBfb3V0WXRtcCA9IHBPdXRZICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB5U2hpZnQgb2YgMSBwaXhlbCAqLwotICAgICAgICBwX2luWXRtcCAgPSBwSW5ZYmVnaW4gKyAoeFNoaWZ0ICogcFBsYW5lSW5bMF0udV9zdHJpZGUpOyAgLyogQXBwbHkgdGhlIHhTaGlmdCAqLwotCi0gICAgICAgIGZvciggeSA9IDAgOyB5IDwgcFBsYW5lSW5bMF0udV93aWR0aCA7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2V0IFkgdmFsdWUgKi8KLSAgICAgICAgICAgIGlmICh4U2hpZnQgPiAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSA0KSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gNDA7ICAgICAgICAvKiBBZGQgc29tZSBob3Jpem9udGFsIGJsYWNrIGxpbmVzIGJldHdlZW4gdGhlIHR3byBwYXJ0cyBvZiB0aGUgaW1hZ2UgKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKCB5ID09IHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA5MDsgICAgICAgIC8qIEFkZCBhIHJhbmRvbSB2ZXJ0aWNhbCBsaW5lIGZvciB0aGUgYnVsayAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSAqcF9pbll0bXA7Ci0KLQotICAgICAgICAgICAgLyogR28gdG8gdGhlIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHBfb3V0WXRtcCsrOwotICAgICAgICAgICAgcF9pbll0bXArKzsKLQotICAgICAgICAgICAgLyogUmVzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGZvciB0aGUgbGFzdCBwaXhlbCovCi0gICAgICAgICAgICBpZiAoeSA9PSAocFBsYW5lSW5bMF0udV93aWR0aCAtIDIpKQotICAgICAgICAgICAgICAgIHBfb3V0WXRtcCA9IHBPdXRZOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogR28gdG8gdGhlIG5leHQgbGluZSAqLwotICAgICAgICBwT3V0WSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbHVtX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGNoYXIgKnBfY3NyYywgKnBfY2Rlc3QsICpwX2NzcmNfbGluZSwgKnBfY2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICBsb25nIGksIGo7Ci0KLSAgICAvKiBjb3B5IG9yIGZpbHRlciBjaHJvbWEgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMV0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzFdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gcGxhbmVfaW5bMV0udV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfb3V0ID0gcGxhbmVfb3V0WzFdLnVfc3RyaWRlOwotICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMV0ucGFjX2RhdGFbcGxhbmVfb3V0WzFdLnVfdG9wbGVmdF07Ci0gICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMV0ucGFjX2RhdGFbcGxhbmVfaW5bMV0udV90b3BsZWZ0XTsKLQotICAgIGlmIChsdW1fZmFjdG9yID4gMjU2KQotICAgIHsKLSAgICAgICAgcF9jZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyYyA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICAvKiBjb3B5IGNocm9tYSAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdCwgKHZvaWQgKilwX2NzcmMsIHVfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2NzcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogZmlsdGVyIGNocm9tYSAqLwotICAgICAgICBwaXggPSAoMTAyNCAtIGx1bV9mYWN0b3IpIDw8IDc7Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMrKyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gUkdCNTY1IHBsYW5lIHRvIFlVVjQyMCBwbGFuYXIKLSAqIEBub3RlICAgIEl0IGlzIHVzZWQgb25seSBmb3IgZnJhbWluZyBlZmZlY3QKLSAqICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgZnJhbWluZ0N0eCAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlIG91dHB1dCBZVVYgcGxhbmVzICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQqMyk+PjEsIE00VlMsIChNNE9TQV9DaGFyKikiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0OwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBpbnB1dCBSR0IgNTY1IHRvIFlVViA0MjAgdG8gYmUgYWJsZSB0byBtZXJnZSBpdCB3aXRoIG91dHB1dCB2aWRlbyBpbiBmcmFtaW5nIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSB3aXRoIFJHQiBidWZmZXIuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gUkdCODg4IHBsYW5lIHRvIFlVVjQyMCBwbGFuYXIKLSAqIEBub3RlICAgIEl0IGlzIHVzZWQgb25seSBmb3IgZnJhbWluZyBlZmZlY3QKLSAqICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgZnJhbWluZ0N0eCAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I4ODggcGxhbmUKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlIG91dHB1dCBZVVYgcGxhbmVzICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQqMyk+PjEsIE00VlMsIChNNE9TQV9DaGFyKikiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0OwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBpbnB1dCBSR0I4ODggdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSB3aXRoIFJHQiBidWZmZXIuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBhdXRob3IgIFBhdHJpY2UgTWFydGluZXogLyBQaGlsaXBzIERpZ2l0YWwgTmV0d29ya3MgLSBNUDROZXQKLSAqIEBicmllZiAgIHRyYW5zZm9ybSBSR0I1NjUgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAbm90ZSAgICBDb252ZXJ0IFJHQjU2NSB0byBZVVY0MjAsCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAqICAgICAgICAgICAgICAgICAgR2V0IDQgUkdCIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAqICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBSR0I1NjUgUGxhbmUKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byAgWVVWNDIwIGJ1ZmZlciBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX3JnYiwgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLSAgICBNNFZJRklfVUludDggY291bnRfbnVsbD0wOwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjEwLGkzMl9nMTAsaTMyX3IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjExLGkzMl9nMTEsaTMyX3IxMSx1MTZfcGl4NCk7Ci0gICAgICAgICAgICAvKiBJZiBSR0IgaXMgdHJhbnNwYXJlbnQgY29sb3IgKDAsIDYzLCAwKSwgd2UgdHJhbnNmb3JtIGl0IHRvIHdoaXRlICgzMSw2MywzMSkgKi8KLSAgICAgICAgICAgIGlmKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMCA9PSAwICYmIGkzMl9nMTAgPT0gNjMgJiYgaTMyX3IxMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjEwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjAxID09IDAgJiYgaTMyX2cwMSA9PSA2MyAmJiBpMzJfcjAxID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTEgPT0gMCAmJiBpMzJfZzExID09IDYzICYmIGkzMl9yMTEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjExID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQ29udmVydCBSR0IgdmFsdWUgdG8gWVVWICovCi0gICAgICAgICAgICBpMzJfdTAwID0gVTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMCA9IFkxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTAgPSBZMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAxID0gWTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMSA9IFkxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLQotICAgICAgICAgICAgLyogU3RvcmUgbHVtaW5hbmNlIGRhdGEgKi8KLSAgICAgICAgICAgIHB1OF95blswXSA9IChNNFZJRklfVUludDgpaTMyX3kwMDsKLSAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsKLSAgICAgICAgICAgIHB1OF95c1swXSA9IChNNFZJRklfVUludDgpaTMyX3kwMTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLSAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm90bzoKLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotQXV0aG9yOiAgICAgUGF0cmljZSBNYXJ0aW5leiAvIFBoaWxpcHMgRGlnaXRhbCBOZXR3b3JrcyAtIE1QNE5ldAotUHVycG9zZTogICAgZmlsbGluZyBvZiB0aGUgWVVWNDIwIHBsYW5lIGZyb20gYSBCR1IyNCBwbGFuZQotQWJzdHJhY3Q6ICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICAgICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gICAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gICAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gICAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLQotSW46ICAgICAgICAgUkdCMjQgcGxhbmUKLUluT3V0OiAgICAgIG5vbmUKLU91dDogICAgICAgIGFycmF5IG9mIDMgTTRWSUZJX0ltYWdlUGxhbmUgc3RydWN0dXJlcwotTW9kaWZpZWQ6ICAgTUw6IFJHQiBmdW5jdGlvbiBtb2RpZmllZCB0byBCR1IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKQotewotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfViwgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLQotICAgIC8qIGNoZWNrIHNpemVzICovCi0gICAgaWYoIChQbGFuZUluLT51X2hlaWdodCAhPSBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotCi0gICAgaWYoIChQbGFuZUluLT51X3dpZHRoICE9IFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X3dpZHRoICE9IChQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLQotICAgIC8qIHNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgPSBQbGFuZU91dFswXS5wYWNfZGF0YSArIFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICA9IFBsYW5lT3V0WzFdLnBhY19kYXRhICsgUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgID0gUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBidWZmZXIgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBQbGFuZUluLT5wYWNfZGF0YSArIFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoICAgPSBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgID0gUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBzZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWT0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotICAgIC8qIGxvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogdHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogdXBkYXRlIHdvcmtpbmcgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luICA9IHB1OF95X2RhdGE7Ci0gICAgICAgIHB1OF95cyAgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0KLSAgICAgICAgcHU4X3UgICA9IHB1OF91X2RhdGE7Ci0gICAgICAgIHB1OF92ICAgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIGxvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGdldCBSR0Igc2FtcGxlcyBvZiA0IHBpeGVscyAqLwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDAsIHB1OF9yZ2JuLCAwKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwLCBwdThfcmdibiwgQ1NUX1JHQl8yNF9TSVpFKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IpOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEsIHB1OF9yZ2JuLCB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMjRfU0laRSk7Ci0KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3kwMCA9IFkyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsgICAgICAgLyogbWF0cml4IGx1bWluYW5jZSAqLwotICAgICAgICAgICAgcHU4X3luWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3kxMCA9IFkyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIHB1OF95blsxXT0gKE00VklGSV9VSW50OClpMzJfeTEwOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl95MDEgPSBZMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBwdThfeXNbMF09IChNNFZJRklfVUludDgpaTMyX3kwMTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfeTExID0gWTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotCi0gICAgICAgICAgICAqcHU4X3UgID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICBwdThfcmdibiAgICArPSAgKENTVF9SR0JfMjRfU0laRTw8MSk7Ci0gICAgICAgICAgICBwdThfeW4gICAgICArPSAyOwotICAgICAgICAgICAgcHU4X3lzICAgICAgKz0gMjsKLQotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBlbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIHB1OF95X2RhdGEgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICAgICAgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICAgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqIFlVVjQyMCB0byBZVVY0MjAgKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBUcmFuc2Zvcm0gWVVWNDIwIGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YSAoVW51c2VkIC0gY291bGQgYmUgTlVMTCkKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gWVVWIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFlVViBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBwbGFuZSBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gcGxhbmUgd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApCi17Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAwOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykKLSAgICB7Ci0gICAgICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgcF9idWZfZGVzdCA9ICYoUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgIHBfYnVmX3NyYyArPSBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBhdXRob3IgIERhdmlkIERhbmEgKFBISUxJUFMgU29mdHdhcmUpCi0gKiBAYnJpZWYgICBSZXNpemVzIFlVVjQyMCBQbGFuYXIgcGxhbmUuCi0gKiBAbm90ZSAgICBCYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgVSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgUGxhY2UgdGhlIFlVViBpbiB0aGUgb3VwdXQgcGxhbmUKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdwotICogICAgICAgICAgRm9yIHJlc2l6aW5nIGJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nCi0gKiAgICAgICAgICBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvd24gZWFjaCBjb2x1bW4uCi0gKiAgICAgICAgICBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQKLSAqICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMuIFRoZSByYXRpbyBvZiBjb21wcmVzc2lvbgotICogICAgICAgICAgb3IgZGlsYXRhdGlvbiBpcyBlc3RpbWF0ZWQgdXNpbmcgaW5wdXQgYW5kIG91dHB1dCBzaXplcy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbiwgKnB1OF9kYXRhX291dCwgKnB1OGR1bTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3BsYW5lOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3RlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotCi0gICAgTTRWSUZJX1VJbnQ4ICAgIHU4V2ZsYWcgPSAwOwotICAgIE00VklGSV9VSW50OCAgICB1OEhmbGFnID0gMDsKLSAgICBNNFZJRklfVUludDMyICAgbG9vcCA9IDA7Ci0KLQotICAgIC8qCi0gICAgIElmIGlucHV0IHdpZHRoIGlzIGVxdWFsIHRvIG91dHB1dCB3aWR0aCBhbmQgaW5wdXQgaGVpZ2h0IGVxdWFsIHRvCi0gICAgIG91dHB1dCBoZWlnaHQgdGhlbiBNNFZJRklfWVVWNDIwdG9ZVVY0MjAgaXMgY2FsbGVkLgotICAgICovCi0gICAgaWYgKChwUGxhbmVJblswXS51X2hlaWdodCA9PSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICYmCi0gICAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoID09IHBQbGFuZU91dFswXS51X3dpZHRoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfWVVWNDIwdG9ZVVY0MjAocFVzZXJEYXRhLCBwUGxhbmVJbiwgcFBsYW5lT3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJblswXS51X3dpZHRoKSA9PSBGQUxTRSkgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0WzBdLnVfd2lkdGgpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBMb29wIG9uIHBsYW5lcyAqLwotICAgIGZvcih1MzJfcGxhbmUgPSAwO3UzMl9wbGFuZSA8IFBMQU5FUzt1MzJfcGxhbmUrKykKLSAgICB7Ci0gICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotICAgICAgICBwdThfZGF0YV9pbiAgICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dFt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lT3V0W3UzMl9wbGFuZV0udV90b3BsZWZ0OwotCi0gICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgICAgIHUzMl9zdHJpZGVfaW4gICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9zdHJpZGU7Ci0gICAgICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotCi0gICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotCi0gICAgICAgIC8qCi0gICAgICAgIEZvciB0aGUgY2FzZSAsIHdpZHRoX291dCA9IHdpZHRoX2luICwgc2V0IHRoZSBmbGFnIHRvIGF2b2lkCi0gICAgICAgIGFjY2Vzc2luZyBvbmUgY29sdW1uIGJleW9uZCB0aGUgaW5wdXQgd2lkdGguSW4gdGhpcyBjYXNlIHRoZSBsYXN0Ci0gICAgICAgIGNvbHVtbiBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nCi0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID09IHUzMl93aWR0aF9pbikgewotICAgICAgICAgICAgdTMyX3dpZHRoX291dCA9IHUzMl93aWR0aF9vdXQtMTsKLSAgICAgICAgICAgIHU4V2ZsYWcgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aC4qLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICh1MzJfd2lkdGhfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgRm9yIHRoZSBjYXNlICwgaGVpZ2h0X291dCA9IGhlaWdodF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZAotICAgICAgICBhY2Nlc3Npbmcgb25lIHJvdyBiZXlvbmQgdGhlIGlucHV0IGhlaWdodC5JbiB0aGlzIGNhc2UgdGhlIGxhc3QKLSAgICAgICAgcm93IGlzIHJlcGxpY2F0ZWQgZm9yIHByb2Nlc3NpbmcKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID09IHUzMl9oZWlnaHRfaW4pIHsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gdTMyX2hlaWdodF9vdXQtMTsKLSAgICAgICAgICAgIHU4SGZsYWcgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyA9ICh1MzJfaGVpZ2h0X2luICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlCi0gICAgICAgIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeV9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZAotICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3hfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSB1MzJfeF9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX2hlaWdodCA9IHUzMl9oZWlnaHRfb3V0OwotCi0gICAgICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQKLSAgICAgICAgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4KLSAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uCi0gICAgICAgIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgICAgICBGKHAnLHEnKT1mKHAscSlSKC1hKVIoYikrZihwLHEtMSlSKC1hKVIoYi0xKStmKHArMSxxKVIoMS1hKVIoYikrCi0gICAgICAgIGYocCsmLHErMSlSKDEtYSlSKGItMSkgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXgKLSAgICAgICAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpd2VpZ2h0aW5nIGNvZWZmaWNpZW50IGlzIHRoZSBkaXN0YW5jZQotICAgICAgICBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAgICAgKi8KLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxsIHRoZSByb3cgKi8KLQotICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bT4+MTIpJjE1OwotCi0gICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aCA9IHUzMl93aWR0aF9vdXQ7Ci0KLSAgICAgICAgICAgIGRvIHsgLyogU2NhbiBhbG9uZyBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyB1MzJfc3RyaWRlX2luOwotICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSB1MzJfeF9pbmM7Ci0gICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgIFRoaXMgdThXZmxhZyBmbGFnIGdldHMgaW4gdG8gZWZmZWN0IGlmIGlucHV0IGFuZCBvdXRwdXQKLSAgICAgICAgICAgICAgIHdpZHRoIGlzIHNhbWUsIGFuZCBoZWlnaHQgbWF5IGJlIGRpZmZlcmVudC4gU28gcHJldmlvdXMKLSAgICAgICAgICAgICAgIHBpeGVsIGlzIHJlcGxpY2F0ZWQgaGVyZQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICh1OFdmbGFnKSB7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1OGR1bSA9IChwdThfZGF0YV9vdXQtdTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICBwdThfZGF0YV9vdXQgPSBwdThfZGF0YV9vdXQgKyB1MzJfc3RyaWRlX291dCAtIHUzMl93aWR0aF9vdXQ7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogdTMyX3N0cmlkZV9pbjsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgICAgICAvKgotICAgICAgICBUaGlzIHU4SGZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0IGhlaWdodAotICAgICAgICBpcyBzYW1lLCBhbmQgd2lkdGggbWF5IGJlIGRpZmZlcmVudC4gU28gcHJldmlvdXMgcGl4ZWwgcm93IGlzCi0gICAgICAgIHJlcGxpY2F0ZWQgaGVyZQotICAgICAgICAqLwotICAgICAgICBpZiAodThIZmxhZykgewotICAgICAgICAgICAgZm9yKGxvb3AgPTA7IGxvb3AgPCAodTMyX3dpZHRoX291dCt1OFdmbGFnKTsgbG9vcCsrKSB7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCkqcHU4ZHVtKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNE9TQV9FUlIgYXBwbHlSZW5kZXJpbmdNb2RlKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCwgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1lZGlhUmVuZGVyaW5nKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZykKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIHBQbGFuZU91dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImFwcGx5UmVuZGVyaW5nTW9kZTogTTRWaUZpbFJlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00QUlSX1BhcmFtcyBQYXJhbXM7Ci0gICAgICAgIE00T1NBX0NvbnRleHQgbV9haXJfY29udGV4dDsKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzVGVtcFszXTsKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZVRlbXA7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lViA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVVID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgICAgIC8qdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAvKkluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVJbi0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZihtZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMF0udV9oZWlnaHQqcFBsYW5lT3V0WzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFsxXS51X2hlaWdodCpwUGxhbmVPdXRbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSxWX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzJdLnVfaGVpZ2h0KnBQbGFuZU91dFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzFdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBQbGFuZU91dFsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclkiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclUiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsIE00VlMsIChNNE9TQV9DaGFyKikiYXBwbHlSZW5kZXJpbmdNb2RlOiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsKLSAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVVID0gcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKSAvcFBsYW5lSW4tPnVfd2lkdGgpIDw9IHBQbGFuZU91dC0+dV9oZWlnaHQpLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24gdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChNNE9TQV9VSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpIC9wUGxhbmVJbi0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgLypudW1iZXIgb2YgbGluZXMgYXQgdGhlIHRvcCovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfd2lkdGggKiBwUGxhbmVPdXQtPnVfaGVpZ2h0KSAvcFBsYW5lSW4tPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGgtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKT4+MSkpOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihtZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgIGlmKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg8UGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwUGxhbmVJbi0+dV93aWR0aCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZtX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICBlcnIgPSBNNEFJUl9jb25maWd1cmUobV9haXJfY29udGV4dCwgJlBhcmFtcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KG1fYWlyX2NvbnRleHQsIHBQbGFuZUluLCBwUGxhbmVUZW1wKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IEVycm9yIHdoZW4gZ2V0dGluZyBBSVIgcGxhbmU6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMF0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVZLCAodm9pZCAqKXBJblBsYW5lWSwgcFBsYW5lT3V0WzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lVSwgKHZvaWQgKilwSW5QbGFuZVUsIHBQbGFuZU91dFsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsyXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLCBwUGxhbmVPdXRbMl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgbV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vL1RPRE86IHJlbW92ZSB0aGlzIGNvZGUgYWZ0ZXIgbGluayB3aXRoIHZpZGVvYXJ0aXN0IGxpYgotLyogTTRBSVIgY29kZSovCi0jZGVmaW5lIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jZGVmaW5lIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QSUxBVElPTiBDSEVDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9KUEdfRk9STUFUX1NVUFBPUlRFRAotCi0jZXJyb3IgIlBsZWFzZSBkZWZpbmUgYXQgbGVhc3Qgb25lIGlucHV0IGZvcm1hdCBmb3IgdGhlIEFJUiBjb21wb25lbnQiCi0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBJTlRFUk5BTCBUWVBFUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgTTRBSVJfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgVGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rQ3JlYXRlZCwgICAgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NyZWF0ZSBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNEFJUl9rQ29uZmlndXJlZCAgICAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jb25maWd1cmUgaGFzIGJlZW4gY2FsbGVkICovCi19TTRBSVJfU3RhdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgIE00QUlSX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEFJUl9TdGF0ZXMgICAgICAgICAgICAgICAgbV9zdGF0ZTsgICAgICAgICAgICAvKio8IEludGVybmFsIHN0YXRlICovCi0gICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlICAgbV9pbnB1dEZvcm1hdDsgICAgICAvKio8IElucHV0IGZvcm1hdCBsaWtlIFlVVjQyMFBsYW5hciwgUkdCNTY1LCBKUEcsIGV0YyAuLi4gKi8KLSAgICBNNEFJUl9QYXJhbXMgICAgICAgICAgICBtX3BhcmFtczsgICAgICAgICAgIC8qKjwgQ3VycmVudCBpbnB1dCBQYXJhbWV0ZXIgb2YgIHRoZSBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfaW5jWzRdOyAgICAgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IHdpZHRoIGZvciBZVVYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9pbmNbNF07ICAgICAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgaGVpZ2h0IGZvciBZVVYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydFs0XTsgICAvKio8IGhvcml6b250YWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0WzRdOyAgIC8qKjwgVmVydGljYWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtWzRdOyAgICAgLyoqPCBzYXZlIG9mIGhvcml6b250YWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bVs0XTsgICAgIC8qKjwgc2F2ZSBvZiB2ZXJ0aWNhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgIHB1OF9kYXRhX2luWzRdOyAgICAgICAgIC8qKjwgU2F2ZSBvZiBpbnB1dCBwbGFuZSBwb2ludGVycyBpbiBjYXNlIG9mIHN0cmlwZSBtb2RlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9wcm9jUm93czsgICAgICAgICAvKio8IE51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgdXNlZCBpbiBzdHJpcGUgbW9kZSBvbmx5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iT25seUNvcHk7ICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2UganVzdCBwZXJmb3JtIGEgY29weSBvciBhIGJpbGluZWFyIGludGVycG9sYXRpb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JGbGlwWDsgICAgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWCBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYkZsaXBZOyAgICAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBZIGNvb3JkaW5hdGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iUmV2ZXJ0WFk7ICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBYIGFuZCBZIHByb2Nlc3Npbmcgb3JkZXIgKCstOTDCsCByb3RhdGlvbikgKi8KLX1NNEFJUl9JbnRlcm5hbENvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgSU1QTEVNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQotICogQGF1dGhvciAgQXJuYXVkIENvbGxhcmQKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUi4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTi9PVVQpIEFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBpbnB1dEZvcm1hdDogICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLiBJbnZhbGlkIGZvcm1hdFR5cGUKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiA7Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IE00T1NBX05VTEwgOwotICAgIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3Mgb24gdGhlIGNvbnRleHQgaXMgbm90IE5VTEwgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIC8qIEludGVybmFsIENvbnRleHQgY3JlYXRpb24gKi8KLSAgICBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBSVJfSW50ZXJuYWxDb250ZXh0KSwgTTRBSVIsIChNNE9TQV9DaGFyKikiQUlSIGludGVybmFsIGNvbnRleHQiKSA7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7Ci0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgc3VwcG9ydGVkICovCi0gICAgc3dpdGNoKGlucHV0Rm9ybWF0KQotICAgIHsKLSNpZmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSNpZmRlZiBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwQVA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgZ290byBNNEFJUl9jcmVhdGVfY2xlYW51cCA7Ci0gICAgfQotCi0gICAgLyoqPCBTYXZlIGlucHV0IGZvcm1hdCBhbmQgdXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1faW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDcmVhdGVkOwotCi0gICAgLyogUmV0dXJuIHRoZSBjb250ZXh0IHRvIHRoZSBjYWxsZXIgKi8KLSAgICAqcENvbnRleHQgPSBwQyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLU00QUlSX2NyZWF0ZV9jbGVhbnVwOgotICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCi0gICAgewotICAgICAgICBmcmVlKHBDKSA7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gZXJyIDsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBhdXRob3IgIEFybmF1ZCBDb2xsYXJkCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSIGNvbXBvbmVudAotICogQHBhcmFtICAgcENvbnRleHQ6ICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZSB0byBkZXN0cm95Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiBJbnRlcm5hbCBzdGF0ZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIGZ1bmN0aW9uIGNhbGwuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0gICAgZnJlZShwQykgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBBSVIuCi0gKiBAbm90ZSAgICBJdCB3aWxsIHNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb29yZGluYXRlcyBhbmQgc2l6ZXMsCi0gKiAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgSW4gY2FzZSBhIE00QUlSX2dldCBpbiBzdHJpcGUgbW9kZSB3YXMgb24gZ29pbmcsIGl0IHdpbGwgY2FuY2VsIHRoaXMgcHJldmlvdXMgcHJvY2Vzc2luZwotICogICAgICAgICAgYW5kIHJlc2V0IHRoZSBnZXQgcHJvY2Vzcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1fYk91dHB1dFN0cmlwZTooSU4pIFN0cmlwZSBtb2RlLgotICogQHBhcmFtICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgKElOKSBYLFkgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0LgotICogQHBhcmFtICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgKElOKSBpbnB1dCBST0kgc2l6ZS4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1fb3V0cHV0U2l6ZTogIChJTikgb3V0cHV0IHNpemUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0gICAgTTRPU0FfVUludDMyICAgIGksdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gMzsKLSAgICB9Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiogU2F2ZSBwYXJhbWV0ZXJzICovCi0gICAgcEMtPm1fcGFyYW1zID0gKnBQYXJhbXM7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIGlucHV0Jm91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkmMHgxKSAgICB8fAotICAgICAgICAgKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0KLSAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSAgICB8fAotICAgICAgICAgKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLSAgICBpZigoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgJiYoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIC8qKjwgTm8gcmVzaXplIGluIHRoaXMgY2FzZSwgd2Ugd2lsbCBqdXN0IGNvcHkgaW5wdXQgaW4gb3V0cHV0ICovCi0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgcmVzaXplIGZpbHRlciAqLwotICAgICAgICBmb3IoaT0wO2k8bmJfcGxhbmVzO2krKykKLSAgICAgICAgewotCi0gICAgICAgICAgICB1MzJfd2lkdGhfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOihwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDoocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KzEpPj4xOwotICAgICAgICAgICAgdTMyX3dpZHRoX291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDoocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICh1MzJfd2lkdGhfaW4gKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gPSAodTMyX2hlaWdodF9pbiAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl95X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFkgY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3hfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3hfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWCBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgUmVzZXQgdmFyaWFibGUgdXNlZCBmb3Igc3RyaXBlIG1vZGUgKi8KLSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0KLSAgICAvKio8IEluaXRpYWxpemUgdmFyIGZvciBYL1kgcHJvY2Vzc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gKi8KLSAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9GQUxTRTsKLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9vdXRwdXRPcmllbnRhdGlvbikKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRCb3R0b206Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgLyoqPCBVcGRhdGUgc3RhdGUgKi8KLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDb25maWd1cmVkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIHRoZSByZXF1ZXN0ZWQgcmVzaXplZCBhcmVhIG9mIGludGVyZXN0IGFjY29yZGluZyB0byBzZXR0aW5ncwotICogICAgICAgICAgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgIGluIHBJbiBpcyBub3QgdXNlZC4gSW4gbm9ybWFsIG1vZGUsIGRpbWVuc2lvbiBzcGVjaWZpZWQgaW4gb3V0cHV0IHBsYW5lKHMpIHN0cnVjdHVyZSBtdXN0IGJlIHRoZQotICogICAgICAgICAgc2FtZSB0aGFuIHRoZSBvbmUgc3BlY2lmaWVkIGluIE00QUlSX2NvbmZpZ3VyZS4gSW4gc3RyaXBlIG1vZGUsIG9ubHkgdGhlIHdpZHRoIHdpbGwgYmUgdGhlIHNhbWUsCi0gKiAgICAgICAgICBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgIEluIG5vcm1hbCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgb25jZSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IHBpY3R1cmUuIEluIHN0cmlwZSBtb2RlLCBpdCBpcyBjYWxsZWQKLSAqICAgICAgICAgIGZvciBlYWNoIHN0cmlwZSB0aWxsIHRoZSB3aG9sZSBwaWN0dXJlIGhhcyBiZWVuIHJldHJpZXZlZCxhbmQgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUKLSAqICAgICAgICAgIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgQW55IGNhbGwgdG8gTTRBSVJfY29uZmlndXJlIGR1cmluZyBzdHJpcGUgcHJvY2VzcyB3aWxsIHJlc2V0IHRoaXMgb25lIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwaWN0dXJlLgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCi0gKiBAcGFyYW0gICBwT3V0OiAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0gICAgTTRPU0FfVUludDMyIGksaixrLHUzMl94X2ZyYWMsdTMyX3lfZnJhYyx1MzJfeF9hY2N1bSx1MzJfeV9hY2N1bSx1MzJfc2hpZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfZGF0YV9pbiwgKnB1OF9kYXRhX2luX29yZywgKnB1OF9kYXRhX2luX3RtcCwgKnB1OF9kYXRhX291dDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfdG9wOwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X3NyY19ib3R0b207Ci0gICAgTTRPU0FfVUludDMyICAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00T1NBX0ludDMyIGkzMl90bXBfb2Zmc2V0OwotICAgIE00T1NBX1VJbnQzMiAgICBuYl9wbGFuZXM7Ci0KLQotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBMb29wIG9uIGVhY2ggUGxhbmUgKi8KLSAgICBmb3IoaT0wO2k8bmJfcGxhbmVzO2krKykKLSAgICB7Ci0KLSAgICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotCi0gICAgICAgIHUzMl9zaGlmdCA9ICgoaT09MCl8fChpPT0zKSk/MDoxOyAvKio8IERlcGVuZCBvbiBMdW1hIG9yIENocm9tYSAqLwotCi0gICAgICAgIGlmKChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKXx8KChNNE9TQV9UUlVFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpJiYoMCA9PSBwQy0+bV9wcm9jUm93cykpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEZvciBpbnB1dCwgdGFrZSBjYXJlIGFib3V0IFJPSSAqLwotICAgICAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcEluW2ldLnBhY19kYXRhICsgcEluW2ldLnVfdG9wbGVmdCArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feD4+dTMyX3NoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPj4gdTMyX3NoaWZ0KSAqIHBJbltpXS51X3N0cmlkZTsKLQotICAgICAgICAgICAgLyoqIEdvIGF0IGVuZCBvZiBsaW5lL2NvbHVtbiBpbiBjYXNlIFgvWSBzY2FubmluZyBpcyBmbGlwcGVkICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+dTMyX3NoaWZ0KSAtMSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+dTMyX3NoaWZ0KSAtMSkgKiBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBhY2N1bXVsYXRvcnMgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgaXQgKGJpbGluZWFyIGludGVycG9sYXRpb24pICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSBmb3Igb3RoZXIgdGhhbiBmaXJzdCBzdHJpcGUsIHdlIG5lZWQgdG8gcmVjb3ZlciBpbnB1dCBwb2ludGVyIGZyb20gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwQy0+cHU4X2RhdGFfaW5baV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IEluIGV2ZXJ5IG1vZGUsIG91dHB1dCBkYXRhIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfb3V0ICAgID0gcE91dFtpXS5wYWNfZGF0YSArIHBPdXRbaV0udV90b3BsZWZ0OwotCi0gICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnB1dCBvZmZzZXQgYXBwbGllZCBhZnRlciBlYWNoIHBpeGVsICovCi0gICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IC1wSW5baV0udV9zdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgbm8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBpcyBuZWVkZWQgYXMgaW5wdXQgYW5kIG91dHB1dCBkaW1lbnNpb25zIGFyZSB0aGUgc2FtZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBObyBmbGlwIG9uIFggYWJzY2lzc2EgKi8KLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY19oZWlnaHQgPSBwT3V0W2ldLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY193aWR0aCA9IHBPdXRbaV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2Nfc3RyaWRlID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bG9jX2hlaWdodDsgaisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvcHkgb25lIHdob2xlIGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXB1OF9kYXRhX291dCwgKHZvaWQgKilwdThfZGF0YV9pbiwgbG9jX3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IGxvY19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLT0gbG9jX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwT3V0W2ldLnVfd2lkdGggKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqPCBIZXJlIHdlIGhhdmUgYSArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW5fdG1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBpbnB1dCBwb2ludGVyIGluIG9yZGVyIHRvIGdvIHRvIG5leHQvcGFzdCBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgKz0gaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqPCBCaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgIGlmKDMgIT0gaSkgIC8qKjwgb3RoZXIgdGhhbiBhbHBoYSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgLyoqICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LyoqIDMgIT0gaSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8qKjwgTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgICAgICAvKiogKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IC8qKjwgTTRPU0FfVFJVRSA9PSBwQy0+bV9iUmV2ZXJ0WFkgKi8KLSAgICAgICAgfS8qKiAzID09IGkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqPCBJbiBjYXNlIG9mIHN0cmlwZSBtb2RlLCBzYXZlIGN1cnJlbnQgaW5wdXQgcG9pbnRlciAqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wdThfZGF0YV9pbltpXSA9IHB1OF9kYXRhX2luOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqPCBVcGRhdGUgbnVtYmVyIG9mIHByb2Nlc3NlZCByb3dzLCByZXNldCBpdCBpZiB3ZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIHdob2xlIHByb2Nlc3NpbmcgKi8KLSAgICBwQy0+bV9wcm9jUm93cyArPSBwT3V0WzBdLnVfaGVpZ2h0OwotICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoIDw9IHBDLT5tX3Byb2NSb3dzKSBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0vKisgSGFuZGxlIHRoZSBpbWFnZSBmaWxlcyBoZXJlICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIEx2R2V0SW1hZ2VUaHVtYk5haWwoTTRPU0FfVUNoYXIgKmZpbGVOYW1lLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcikKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgWVVWNDIwIGJ1ZmZlciBvZiBhIGdpdmVuIGltYWdlIGZpbGUgKGluIGFyZ2I4ODggZm9ybWF0KQotICogQE5vdGU6IFRoZSBjYWxsZXIgb2YgdGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIGZyZWUgdGhlIHl1diBidWZmZXIgYWxsb2NhdGVkCi0gKiBAcGFyYW0gICBmaWxlTmFtZTogICAgICAgKElOKSBQYXRoIHRvIHRoZSBmaWxlbmFtZSBvZiB0aGUgaW1hZ2UgYXJnYiBkYXRhCi0gKiBAcGFyYW0gICBoZWlnaHQ6ICAgICAoSU4pIEhlaWdodCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICAgd2lkdGg6ICAgICAgICAgICAgIChPVVQpIHBCdWZmZXIgcG9pbnRlciB0byB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgeXV2IGRhdGEgYWRkcmVzcyBuZWVkcyB0byBiZSByZXR1cm5lZC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiBpZiB0aGUgZmlsZSBwYXNzZWQgZG9lcyBub3QgZXhpc3RzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1ZvaWQgKipwQnVmZmVyKSB7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZSwgKnl1dlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYiA9ICh3aWR0aCAqIGhlaWdodCAqIDQpOyAvLyBhcmdiIGRhdGEKLSAgICBNNE9TQV9Db250ZXh0IGxJbWFnZUZpbGVGcCAgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGFyZ2IgZGF0YSIpOwotICAgIGlmKHBUbXBEYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgIC8qKiBSZWFkIHRoZSBhcmdiIGRhdGEgZnJvbSB0aGUgcGFzc2VkIGZpbGUuICovCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJmxJbWFnZUZpbGVGcCwgKE00T1NBX1ZvaWQgKikgZmlsZU5hbWUsIE00T1NBX2tGaWxlUmVhZCk7Ci0KLSAgICBpZigobGVyciAhPSBNNE5PX0VSUk9SKSB8fCAobEltYWdlRmlsZUZwID09IE00T1NBX05VTEwpKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IENhbiBub3Qgb3BlbiB0aGUgZmlsZSAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9GSUxFX05PVF9GT1VORDsKLSAgICB9Ci0gICAgbGVyciA9IE00T1NBX2ZpbGVSZWFkRGF0YShsSW1hZ2VGaWxlRnAsIChNNE9TQV9NZW1BZGRyOClwVG1wRGF0YSwgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZihsZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBBTE9HRSgiTFZQcmV2aWV3Q29udHJvbGxlcjogY2FuIG5vdCByZWFkIHRoZSBkYXRhICIpOwotICAgICAgICBNNE9TQV9maWxlUmVhZENsb3NlKGxJbWFnZUZpbGVGcCk7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gbGVycjsKLSAgICB9Ci0gICAgTTRPU0FfZmlsZVJlYWRDbG9zZShsSW1hZ2VGaWxlRnApOwotCi0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpOyAvL1NpemUgb2YgWVVWNDIwIGRhdGEuCi0gICAgcmdiUGxhbmUucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKLSAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChNNE9TQV9VSW50MzIgaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwVG1wRGF0YSk7Ci0KLSNpZmRlZiBGSUxFX0RVTVAKLSAgICBGSUxFICpmcCA9IGZvcGVuKCIvc2RjYXJkL0lucHV0L3Rlc3RfcmdiLnJhdyIsICJ3YiIpOwotICAgIGlmKGZwID09IE5VTEwpCi0gICAgICAgIEFMT0dFKCJFcnJvcnMgZmlsZSBjYW4gbm90IGJlIGNyZWF0ZWQiKTsKLSAgICBlbHNlIHsKLSAgICAgICAgZndyaXRlKHJnYlBsYW5lLnBhY19kYXRhLCBmcmFtZVNpemUsIDEsIGZwKTsKLSAgICAgICAgZmNsb3NlKGZwKTsKLSAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgcmdiUGxhbmUudV9zdHJpZGUgPSB3aWR0aCozOwotICAgICAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIHl1dlBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB5dXZQbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzBdLnVfc3RyaWRlID0gd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMF0udV93aWR0aCAqIDEuNSwgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsKLQotICAgICAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICAgICAgeXV2UGxhbmVbMV0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgeXV2UGxhbmVbMV0udV9zdHJpZGUgPSB5dXZQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVswXS5wYWNfZGF0YSArIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMF0udV93aWR0aCk7Ci0KLSAgICAgICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfc3RyaWRlID0geXV2UGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMV0ucGFjX2RhdGEgKyB5dXZQbGFuZVsxXS51X2hlaWdodCAqIHl1dlBsYW5lWzFdLnVfd2lkdGgpOwotCi0KLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZSwgeXV2UGxhbmUpOwotICAgICAgICAvL2VyciA9IE00VklGSV9CR1I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShyZ2JQbGFuZS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgLy9BTE9HRSgiUkdCIHRvIFlVViBkb25lIik7Ci0jaWZkZWYgRklMRV9EVU1QCi0gICAgICAgIEZJTEUgKmZwMSA9IGZvcGVuKCIvc2RjYXJkL0lucHV0L3Rlc3RfeXV2LnJhdyIsICJ3YiIpOwotICAgICAgICBpZihmcDEgPT0gTlVMTCkKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvcnMgZmlsZSBjYW4gbm90IGJlIGNyZWF0ZWQiKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmd3JpdGUoeXV2UGxhbmVbMF0ucGFjX2RhdGEsIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ICogeXV2UGxhbmVbMF0udV93aWR0aCAqIDEuNSwgMSwgZnAxKTsKLSAgICAgICAgICAgIGZjbG9zZShmcDEpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgKnBCdWZmZXIgPSB5dXZQbGFuZVswXS5wYWNfZGF0YTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi19Ci1NNE9TQV9Wb2lkIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00VklGSV9VSW50OCAqYnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpIHsKLQotICAgIC8vWSBwbGFuZQotICAgIHBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICBwbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZVswXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGg7Ci0gICAgcGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVswXS5wYWNfZGF0YSA9IGJ1ZmZlcjsKLQotICAgIC8vIFUgcGxhbmUKLSAgICBwbGFuZVsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzFdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aCA+PiAxOwotICAgIHBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMV0ucGFjX2RhdGEgPSBidWZmZXIrKHJlcG9ydGVkV2lkdGgqcmVwb3J0ZWRIZWlnaHQpOwotCi0gICAgLy8gViBQbGFuZQotICAgIHBsYW5lWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMl0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoID4+IDE7Ci0gICAgcGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsyXS5wYWNfZGF0YSA9IHBsYW5lWzFdLnBhY19kYXRhICsgKChyZXBvcnRlZFdpZHRoLzIpKihyZXBvcnRlZEhlaWdodC8yKSk7Ci19Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiBzdHJpZGUsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIpIHsKLQotICAgIC8vWSBwbGFuZQotICAgIHBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICBwbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZVswXS51X3N0cmlkZSA9IHN0cmlkZTsKLSAgICBwbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzBdLnBhY19kYXRhID0gYnVmZmVyOwotCi0gICAgLy8gVSBwbGFuZQotICAgIHBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMV0udV9zdHJpZGUgPSBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLzIsIDE2KTsKLSAgICBwbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzFdLnBhY19kYXRhID0gKGJ1ZmZlcgotICAgICAgICAgICAgICAgICsgcGxhbmVbMF0udV9oZWlnaHQgKiBwbGFuZVswXS51X3N0cmlkZQotICAgICAgICAgICAgICAgICsgKHBsYW5lWzBdLnVfaGVpZ2h0LzIpICogYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTigoCi0gICAgICAgICAgICAgICAgIHBsYW5lWzBdLnVfc3RyaWRlIC8gMiksIDE2KSk7Ci0KLSAgICAvLyBWIFBsYW5lCi0gICAgcGxhbmVbMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMl0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsyXS51X3N0cmlkZSA9IGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04ocGxhbmVbMF0udV9zdHJpZGUvMiwgMTYpOwotICAgIHBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMl0ucGFjX2RhdGEgPSAoYnVmZmVyICsKLSAgICAgcGxhbmVbMF0udV9oZWlnaHQgKiBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLCAxNikpOwotCi0KLX0KLQotTTRPU0FfVm9pZCBzd2FwSW1hZ2VQbGFuZXMoCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMikgewotCi0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IHBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgIHBsYW5lSW5bMF0udV93aWR0aCA9IHBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X3N0cmlkZSA9IHBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMF0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMF0ucGFjX2RhdGEgPSBwbGFuZU91dFswXS5wYWNfZGF0YTsKLQotICAgIC8qKgotICAgICAqIFUgcGxhbmUgKi8KLSAgICBwbGFuZUluWzFdLnVfd2lkdGggPSBwbGFuZU91dFsxXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMV0udV9oZWlnaHQgPSBwbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzFdLnVfc3RyaWRlID0gcGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgcGxhbmVJblsxXS51X3RvcGxlZnQgPSBwbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcGxhbmVJblsxXS5wYWNfZGF0YSA9IHBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIC8qKgotICAgICAqIFYgUGxhbmUgKi8KLSAgICBwbGFuZUluWzJdLnVfd2lkdGggPSBwbGFuZU91dFsyXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMl0udV9oZWlnaHQgPSBwbGFuZU91dFsyXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzJdLnVfc3RyaWRlID0gcGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0gICAgcGxhbmVJblsyXS51X3RvcGxlZnQgPSBwbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0gICAgcGxhbmVJblsyXS5wYWNfZGF0YSA9IHBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgaWYocGxhbmVPdXRbMF0ucGFjX2RhdGEgPT0gKE00VklGSV9VSW50OCopYnVmZmVyMSkKLSAgICB7Ci0gICAgICAgIHBsYW5lT3V0WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopYnVmZmVyMjsKLSAgICAgICAgcGxhbmVPdXRbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMiArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgICAgICBwbGFuZU91dFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKShidWZmZXIyICsKLSAgICAgICAgIHBsYW5lT3V0WzBdLnVfd2lkdGgqcGxhbmVPdXRbMF0udV9oZWlnaHQgKwotICAgICAgICAgcGxhbmVPdXRbMV0udV93aWR0aCpwbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBsYW5lT3V0WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopYnVmZmVyMTsKLSAgICAgICAgcGxhbmVPdXRbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMSArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgICAgICBwbGFuZU91dFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKShidWZmZXIxICsKLSAgICAgICAgIHBsYW5lT3V0WzBdLnVfd2lkdGgqcGxhbmVPdXRbMF0udV9oZWlnaHQgKwotICAgICAgICAgcGxhbmVPdXRbMV0udV93aWR0aCpwbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgfQotCi19Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKAotICAgIE00T1NBX1VJbnQzMiBjdHNNcywgTTRPU0FfVUludDMyIGVmZmVjdFN0YXJ0VGltZU1zLAotICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRPU0FfRG91YmxlICpwZXJjZW50YWdlRG9uZSkgewotCi0gICAgTTRPU0FfRG91YmxlIHZpZGVvRWZmZWN0VGltZSA9MDsKLQotICAgIC8vIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgIHZpZGVvRWZmZWN0VGltZSA9Ci0gICAgIChNNE9TQV9JbnQzMikoY3RzTXMrIDAuNSkgLSBlZmZlY3RTdGFydFRpbWVNczsKLQotICAgIC8vIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudAotICAgIC8vIGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUKLSAgICAvLyB3aGljaCBpcyBmcm9tIENUUyA9IChlb2YtdGltZUluY3JlbWVudCkgdGlsbCBDVFMgPSBlb2YKLSAgICAqcGVyY2VudGFnZURvbmUgPQotICAgICB2aWRlb0VmZmVjdFRpbWUgLyAoKE00T1NBX0Zsb2F0KWVmZmVjdER1cmF0aW9uKTsKLQotICAgIGlmKCpwZXJjZW50YWdlRG9uZSA8IDAuMCkgKnBlcmNlbnRhZ2VEb25lID0gMC4wOwotICAgIGlmKCpwZXJjZW50YWdlRG9uZSA+IDEuMCkgKnBlcmNlbnRhZ2VEb25lID0gMS4wOwotCi19Ci0KLQotTTRPU0FfVm9pZCBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdCgKLSAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzKiBleHRQcm9ncmVzcykgewotCi0gICAgTTRPU0FfRG91YmxlIHBlcmNlbnRhZ2VEb25lID0wOwotCi0gICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKGN0c01zLCBlZmZlY3RTdGFydFRpbWVNcywgZWZmZWN0RHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICBleHRQcm9ncmVzcy0+dWlQcm9ncmVzcyA9IChNNE9TQV9VSW50MzIpKCBwZXJjZW50YWdlRG9uZSAqIDEwMDAgKTsKLSAgICBleHRQcm9ncmVzcy0+dWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMikoY3RzTXMgKyAwLjUpOwotICAgIGV4dFByb2dyZXNzLT51aUNsaXBUaW1lID0gZXh0UHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBleHRQcm9ncmVzcy0+YklzTGFzdCA9IE00T1NBX0ZBTFNFOwotfQotCi1NNE9TQV9FUlIgcHJlcGFyZUZyYW1pbmdTdHJ1Y3R1cmUoCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgsCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBlZmZlY3RzU2V0dGluZ3MsIE00T1NBX1VJbnQzMiBpbmRleCwKLSAgICBNNFZJRklfVUludDgqIG92ZXJsYXlSR0IsIE00VklGSV9VSW50OCogb3ZlcmxheVlVVikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBGb3JjZSBpbnB1dCBSR0IgYnVmZmVyIHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4gWVVWIGNvbnZlcnNpb24KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoICYgfjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCAmIH4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBOVUxMOwotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpRHVyYXRpb247Ci0gICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnRvcGxlZnRfeDsKLSAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudG9wbGVmdF95OwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9Ci0gICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwgTTRWUywKLSAgICAgIChNNE9TQV9DaGFyKikiYWxwaGEgYmxlbmRpbmcgc3RydWN0Iik7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQ7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgLy8gSWYgbmV3IE92ZXJsYXkgYnVmZmVyLCBjb252ZXJ0IGZyb20gUkdCIHRvIFlVVgotICAgIGlmKChvdmVybGF5UkdCICE9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKSB8fCAob3ZlcmxheVlVViA9PSBOVUxMKSApIHsKLQotICAgICAgICAvLyBJZiBZVVYgYnVmZmVyIGV4aXN0cywgZGVsZXRlIGl0Ci0gICAgICAgIGlmKG92ZXJsYXlZVVYgIT0gTlVMTCkgewotICAgICAgICAgICBmcmVlKG92ZXJsYXlZVVYpOwotICAgICAgICAgICBvdmVybGF5WVVWID0gTlVMTDsKLSAgICAgICAgfQotICAgIGlmKGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCNTY1KSB7Ci0gICAgICAgIC8vIElucHV0IFJHQjU2NSBwbGFuZSBpcyBwcm92aWRlZCwKLSAgICAgICAgLy8gbGV0J3MgY29udmVydCBpdCB0byBZVVY0MjAsIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgpOwotICAgIH0KLSAgICBlbHNlIGlmKGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCODg4KSB7Ci0gICAgICAgIC8vIElucHV0IFJHQjg4OCBwbGFuZSBpcyBwcm92aWRlZCwKLSAgICAgICAgLy8gbGV0J3MgY29udmVydCBpdCB0byBZVVY0MjAsIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKGZyYW1pbmdDdHgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAgICAgb3ZlcmxheVlVViA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGE7Ci0gICAgICAgIG92ZXJsYXlSR0IgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgQUxPR1YoIiBZVVYgYnVmZmVyIHJldXNlIik7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIqKSJZVVYiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKW92ZXJsYXlZVVY7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZSBjb2xvckVmZmVjdCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyLCBNNE9TQV9VSW50MTYgcmdiQ29sb3JEYXRhKSB7Ci0KLSAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgY29sb3JDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgY29sb3JDb250ZXh0LmNvbG9yRWZmZWN0VHlwZSA9IGNvbG9yRWZmZWN0OwotICAgIGNvbG9yQ29udGV4dC5yZ2IxNkNvbG9yRGF0YSA9IHJnYkNvbG9yRGF0YTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoCi0gICAgIChNNE9TQV9Wb2lkICopJmNvbG9yQ29udGV4dCwgcGxhbmVJbiwgcGxhbmVPdXQsIE5VTEwsCi0gICAgIGNvbG9yRWZmZWN0KTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWKCJNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKCVkKSBlcnJvciAlZCIsCi0gICAgICAgICAgICBjb2xvckVmZmVjdCwgZXJyKTsKLQotICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjEpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmZmVyMSk7Ci0gICAgICAgICAgICBidWZmZXIxID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjIpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmZmVyMik7Ci0gICAgICAgICAgICBidWZmZXIyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwgYnVmZmVyMSwgYnVmZmVyMik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdmlkZW9FZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfSW50MzIgbHVtX2ZhY3RvcikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKAotICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilwbGFuZUluLChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVPdXQsCi0gICAgICAgICBsdW1fZmFjdG9yLCBOVUxMKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKCVkKSBlcnJvciAlZCIsIHZpZGVvRWZmZWN0LCAoaW50KWVycik7Ci0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOwotICAgICAgICAgICAgYnVmZmVyMT0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZihOVUxMICE9IGJ1ZmZlcjIpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmZmVyMik7Ci0gICAgICAgICAgICBidWZmZXIyPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gVGhlIG91dCBwbGFuZSBub3cgYmVjb21lcyB0aGUgaW4gcGxhbmUgZm9yIGFkZGluZyBvdGhlciBlZmZlY3RzCi0gICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilidWZmZXIxLAotICAgICAoTTRWSUZJX1VJbnQ4ICopYnVmZmVyMik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZSh2ZVBvc3RQcm9jZXNzUGFyYW1zICpwYXJhbXMsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0gICAgTTRWSUZJX1VJbnQ4ICpmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEwsICp0ZW1wT3V0cHV0QnVmZmVyPSBOVUxMOwotICAgIE00T1NBX0RvdWJsZSBwZXJjZW50YWdlRG9uZSA9MDsKLSAgICBNNE9TQV9JbnQzMiBsdW1fZmFjdG9yOwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0IGZpZnRpZXNDdHg7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDAsIGk9MDsKLQotICAgIGZyYW1lU2l6ZSA9IChwYXJhbXMtPnZpZGVvV2lkdGgqcGFyYW1zLT52aWRlb0hlaWdodCozKSA+PiAxOwotCi0gICAgZmluYWxPdXRwdXRCdWZmZXIgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAoTTRPU0FfQ2hhciopKCJsdnBwIGZpbmFsT3V0cHV0QnVmZmVyIikpOwotCi0gICAgaWYoZmluYWxPdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZTogbWFsbG9jIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvLyBhbGxvY2F0ZSB0aGUgdGVtcE91dHB1dEJ1ZmZlcgotICAgIHRlbXBPdXRwdXRCdWZmZXIgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICgocGFyYW1zLT52aWRlb0hlaWdodCpwYXJhbXMtPnZpZGVvV2lkdGgqMyk+PjEpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJsdnBwIGNvbG9yQnVmZmVyIikpOwotCi0gICAgaWYodGVtcE91dHB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlOiBtYWxsb2MgZXJyb3IgdGVtcE91dHB1dEJ1ZmZlciIpOwotICAgICAgICBpZihOVUxMICE9IGZpbmFsT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQsCi0gICAgICAgcGFyYW1zLT52aWRCdWZmZXIsIHJlcG9ydGVkV2lkdGgsIHJlcG9ydGVkSGVpZ2h0KTsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIE91dCBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lT3V0LCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQsCi0gICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIHBhcmFtcy0+dmlkZW9XaWR0aCwgcGFyYW1zLT52aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBUaGUgcGxhbmVJbiBjb250YWlucyB0aGUgWVVWNDIwIGlucHV0IGRhdGEgdG8gcG9zdHByb2Nlc3Npbmcgbm9kZQotICAgIC8vIGFuZCBwbGFuZU91dCB3aWxsIGNvbnRhaW4gdGhlIFlVVjQyMCBkYXRhIHdpdGggZWZmZWN0Ci0gICAgLy8gSW4gZWFjaCBzdWNjZXNzaXZlIGlmIGNvbmRpdGlvbiwgYXBwbHkgZmlsdGVyIHRvIHN1Y2Nlc3NpdmUKLSAgICAvLyBvdXRwdXQgWVVWIGZyYW1lIHNvIHRoYXQgY29uY3VycmVudCBlZmZlY3RzIGFyZSBib3RoIGFwcGxpZWQKLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEUpIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfUElOSykgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmssCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9HUkVFTikgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfU0VQSUEpIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX05FR0FUSVZFKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9HUkFESUVOVCkgewotICAgICAgICAvLyBmaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpUmdiMTZJbnB1dENvbG9yKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNikgewotICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2LAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aVJnYjE2SW5wdXRDb2xvcik7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QocGFyYW1zLT50aW1lTXMsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiwgJmV4dFByb2dyZXNzKTsKLQotICAgICAgICAgICAgaWYocGFyYW1zLT5pc0ZpZnRpZXNFZmZlY3RTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgZmlmdGllc0N0eC5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LmZpZnRpZXNFZmZlY3REdXJhdGlvbiA9Ci0gICAgICAgICAgICAgMTAwMC9wYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZTsKLQotICAgICAgICAgICAgZmlmdGllc0N0eC5zaGlmdFJhbmRvbVZhbHVlID0gMDsKLSAgICAgICAgICAgIGZpZnRpZXNDdHguc3RyaXBlUmFuZG9tVmFsdWUgPSAwOwotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQgKikmZmlmdGllc0N0eCwgcGxhbmVJbiwgcGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzKTsKLQotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IGZpbmFsT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoZmluYWxPdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlIG91dCBwbGFuZSBub3cgYmVjb21lcyB0aGUgaW4gcGxhbmUgZm9yIGFkZGluZyBvdGhlciBlZmZlY3RzCi0gICAgICAgICAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLQotICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCBmcmFtaW5nQ3R4OwotICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgZm9yKGk9MDtpPHBhcmFtcy0+bnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLSAgICAgICAgICAgICAgICBpZigocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0gcGFyYW1zLT50aW1lTXMgKyBwYXJhbXMtPnRpbWVPZmZzZXQpICYmCi0gICAgICAgICAgICAgICAgICAgKChwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSsKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24pID49IHBhcmFtcy0+dGltZU1zICsgcGFyYW1zLT50aW1lT2Zmc2V0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QocGFyYW1zLT50aW1lTXMsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiwgJmV4dFByb2dyZXNzKTsKLQotICAgICAgICAgICAgZXJyID0gcHJlcGFyZUZyYW1pbmdTdHJ1Y3R1cmUoJmZyYW1pbmdDdHgsCi0gICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5ncywgaSwgcGFyYW1zLT5vdmVybGF5RnJhbWVSR0JCdWZmZXIsCi0gICAgICAgICAgICAgICAgICBwYXJhbXMtPm92ZXJsYXlGcmFtZVlVVkJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKGVyciA9PSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJmZyYW1pbmdDdHgsIHBsYW5lSW4sIHBsYW5lT3V0LCAmZXh0UHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLQotICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC5GcmFtaW5nWXV2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguRnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC5GcmFtaW5nWXV2ID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vSWYgcHJlcGFyZUZyYW1pbmdTdHJ1Y3R1cmUgLyBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcKLSAgICAgICAgICAgIC8vIHJldHVybmVkIGVycm9yLCB0aGVuIHJldHVybiBmcm9tIGZ1bmN0aW9uCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgICAgICAgICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLKSB7Ci0gICAgICAgIC8qIGZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheSovCi0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpCi0gICAgICAgICAgICBsdW1fZmFjdG9yID0gKE00T1NBX0ludDMyKSggcGVyY2VudGFnZURvbmUgKiAxMDI0ICk7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdAotICAgICAgICAgICAgZXJyID0gYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2ssCi0gICAgICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIGx1bV9mYWN0b3IpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0spIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZihpIDwgcGFyYW1zLT5udW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICBjb21wdXRlUGVyY2VudGFnZURvbmUocGFyYW1zLT50aW1lTXMsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUsCi0gICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiwgJnBlcmNlbnRhZ2VEb25lKTsKLQotICAgICAgICAgICAgLy8gQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkKLSAgICAgICAgICAgIGx1bV9mYWN0b3IgPSAoTTRPU0FfSW50MzIpKCAoMS4wLXBlcmNlbnRhZ2VEb25lKSAqIDEwMjQgKTsKLSAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0Ci0gICAgICAgICAgICBlcnIgPSBhcHBseUx1bWFFZmZlY3QoTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2ssCi0gICAgICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIGx1bV9mYWN0b3IpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR1YoImRvTWVkaWFSZW5kZXJpbmcgQ0FMTCBnZXRCdWZmZXIoKSIpOwotICAgIC8vIFNldCB0aGUgb3V0cHV0IFlVVjQyMCBwbGFuZSB0byBiZSBjb21wYXRpYmxlIHdpdGggWVYxMiBmb3JtYXQKLSAgICAvLyBXICYgSCBldmVuCi0gICAgLy8gWVZVIGluc3RlYWQgb2YgWVVWCi0gICAgLy8gYWxpZ24gYnVmZmVycyBvbiAzMiBiaXRzCi0KLSAgICAvLyBZIHBsYW5lCi0gICAgLy9pbiBZVjEyIGZvcm1hdCwgc2l6ZXMgbXVzdCBiZSBldmVuCi0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZVdpZHRoID0gKChwYXJhbXMtPm91dFZpZGVvV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChwYXJhbXMtPm91dFZpZGVvSGVpZ2h0KzEpPj4xKTw8MTsKLQotICAgIHByZXBhcmVZVjEySW1hZ2VQbGFuZShwbGFuZU91dCwgeXYxMlBsYW5lV2lkdGgsIHl2MTJQbGFuZUhlaWdodCwKLSAgICAgKE00T1NBX1VJbnQzMilwYXJhbXMtPm91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKXBhcmFtcy0+cE91dEJ1ZmZlcik7Ci0KLSAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIHBhcmFtcy0+cmVuZGVyaW5nTW9kZSk7Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IGZpbmFsT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgIGZyZWUoZmluYWxPdXRwdXRCdWZmZXIpOwotICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlcj0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HVigiZG9WaWRlb1Bvc3RQcm9jZXNzaW5nOiBhcHBseVJlbmRlcmluZ01vZGUgcmV0dXJuZWQgZXJyPSVkIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotYW5kcm9pZDo6c3RhdHVzX3QgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIHJlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQpIHsKLQotICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0OwotCi0gICAgaWYgKHBXaWR0aCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRWaWRlb0ZyYW1lU2l6ZUJ5UmVzb2x1dGlvbiBpbnZhbGlkIHBvaW50ZXIgZm9yIHBXaWR0aCIpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAocEhlaWdodCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRWaWRlb0ZyYW1lU2l6ZUJ5UmVzb2x1dGlvbiBpbnZhbGlkIHBvaW50ZXIgZm9yIHBIZWlnaHQiKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHJlc29sdXRpb24pIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTI4OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMzIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAyNDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMzUyOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAyODg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNjQwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNjQwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAzNjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4NTRfNDgwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDg1NDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTA4MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA5NjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxOTIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxMDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCB2aWRlbyByZXNvbHV0aW9uICVkLiIsIHJlc29sdXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAqcFdpZHRoID0gZnJhbWVXaWR0aDsKLSAgICAqcEhlaWdodCA9IGZyYW1lSGVpZ2h0OwotCi0gICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGosIHVfc3RyaWRlOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIC8qKjwgTG9vcCBvbiBZLFUgYW5kIFYgcGxhbmVzICovCi0gICAgZm9yIChwbGFuZV9udW1iZXIgPSAwOyBwbGFuZV9udW1iZXIgPCAzOyBwbGFuZV9udW1iZXIrKykgewotICAgICAgICAvKio8IEdldCBhZHJlc3NlcyBvZiBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAvKio8IEFzIHdlIGhhdmUgYSAtOTDCsCByb3RhdGlvbiwgZmlyc3QgbmVlZGVkIHBpeGVsIGlzIHRoZSB1cHBlci1yaWdodCBvbmUgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pICsKLSAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodCAtIDEgOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHVfc3RyaWRlID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgLyoqPCBMb29wIG9uIG91dHB1dCByb3dzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAvKio8IExvb3Agb24gYWxsIG91dHB1dCBwaXhlbHMgaW4gYSByb3cgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAqcF9idWZfZGVzdCsrPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPSB1X3N0cmlkZTsgIC8qKjwgR28gdG8gdGhlIG5leHQgcm93ICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKjwgR28gb24gbmV4dCByb3cgb2YgdGhlIG91dHB1dCBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIC8qKjwgR28gdG8gbmV4dCBwaXhlbCBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIGlucHV0IGZyYW1lKi8KLSAgICAgICAgICAgIHBfYnVmX3NyYyAtPQotICAgICAgICAgICAgICAgIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoICsgMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqLCB1X3N0cmlkZTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgLyoqPCBBcyB3ZSBoYXZlIGEgKzkwwrAgcm90YXRpb24sIGZpcnN0IG5lZWRlZCBwaXhlbCBpcyB0aGUgbGVmdC1kb3duIG9uZSAqLwotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgICAgJihwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSkgKwotICAgICAgICAgICAgIChwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxKSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgdV9zdHJpZGUgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAvKio8IExvb3Agb24gb3V0cHV0IHJvd3MgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBhbGwgb3V0cHV0IHBpeGVscyBpbiBhIHJvdyAqLwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICpwX2J1Zl9kZXN0Kys9ICpwX2J1Zl9zcmM7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjIC09IHVfc3RyaWRlOyAgLyoqPCBHbyB0byB0aGUgcHJldmlvdXMgcm93ICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKjwgR28gb24gbmV4dCByb3cgb2YgdGhlIG91dHB1dCBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIC8qKjwgR28gdG8gbmV4dCBwaXhlbCBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIGlucHV0IGZyYW1lKi8KLSAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoICsxIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0LCB0ZW1wX3BpeDE7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0KLSAgICAgICAgLyoqPCBJZiBwUGxhbmVJbiA9IHBQbGFuZU91dCwgdGhlIGFsZ29yaXRobSB3aWxsIGJlIGRpZmZlcmVudCAqLwotICAgICAgICBpZiAocF9idWZfc3JjID09IHBfYnVmX2Rlc3QpIHsKLSAgICAgICAgICAgIC8qKjwgR2V0IEFkZHJlc3Mgb2YgbGFzdCBwaXhlbCBpbiB0aGUgbGFzdCByb3cgb2YgdGhlIGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0LTEpICsKLSAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCAtIDE7Ci0KLSAgICAgICAgICAgIC8qKjwgV2UgbG9vcCAoaGVpZ2h0LzIpIHRpbWVzIG9uIHRoZSByb3dzLgotICAgICAgICAgICAgICogSW4gY2FzZSB1X2hlaWdodCBpcyBvZGQsIHRoZSByb3cgYXQgdGhlIG1pZGRsZSBvZiB0aGUgZnJhbWUKLSAgICAgICAgICAgICAqIGhhcyB0byBiZSBwcm9jZXNzZWQgYXMgbXVzdCBiZSBtaXJyb3JlZCAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICgocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQpPj4xKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX3BpeDE9ICpwX2J1Zl9kZXN0OwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfc3JjKysgPSB0ZW1wX3BpeDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgR28gb24gbmV4dCByb3cgaW4gdG9wIG9mIGZyYW1lICovCi0gICAgICAgICAgICAgICAgcF9idWZfc3JjICs9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKio8IEdvIHRvIHRoZSBsYXN0IHBpeGVsIGluIHByZXZpb3VzIHJvdyBpbiBib3R0b20gb2YgZnJhbWUqLwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgLT0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IE1pcnJvciBtaWRkbGUgcm93IGluIGNhc2UgaGVpZ2h0IGlzIG9kZCAqLwotICAgICAgICAgICAgaWYgKChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodCUyKSE9IDApIHsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjICs9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodD4+MSk7Ci0gICAgICAgICAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAvKio8IFdlIGxvb3AgdV93aWR0aC8yIHRpbWVzIG9uIHRoaXMgcm93LgotICAgICAgICAgICAgICAgICAqICBJbiBjYXNlIHVfd2lkdGggaXMgb2RkLCB0aGUgcGl4ZWwgYXQgdGhlIG1pZGRsZSBvZiB0aGlzIHJvdwotICAgICAgICAgICAgICAgICAqIHJlbWFpbnMgdW5jaGFuZ2VkICovCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoPj4xKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBfcGl4MT0gKnBfYnVmX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICpwX2J1Zl9kZXN0LS09ICpwX2J1Zl9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICpwX2J1Zl9zcmMrKyA9IHRlbXBfcGl4MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKio8IEdldCBBZGRyZXNzIG9mIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQtMSkgKwotICAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxOwotCi0gICAgICAgICAgICAvKio8IExvb3Agb24gcm93cyAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwX2J1Zl9kZXN0LS09ICpwX2J1Zl9zcmMrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IGluIHRvcCBvZiBpbnB1dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKio8IEdvIHRvIGxhc3QgcGl4ZWwgb2YgcHJldmlvdXMgcm93IGluIGJvdHRvbSBvZiBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICAgICAgcF9idWZfZGVzdCAtPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNE9TQV9FUlIgYXBwbHlWaWRlb1JvdGF0aW9uKE00T1NBX1ZvaWQqIHBCdWZmZXIsIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHJvdGF0aW9uKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwbGFuZUluWzNdLCBwbGFuZU91dFszXTsKLQotICAgIGlmIChwQnVmZmVyID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5VmlkZW9Sb3RhdGlvbjogTlVMTCBpbnB1dCBmcmFtZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBNNE9TQV9VSW50OCogb3V0UHRyID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAod2lkdGgqaGVpZ2h0KjEuNSksIE00VlMsIChNNE9TQV9DaGFyKikoInJvdGF0aW9uIG91dCBwdHIiKSk7Ci0gICAgaWYgKG91dFB0ciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvLyBJbiBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lSW4sIHdpZHRoLAotICAgICAgICBoZWlnaHQsIChNNFZJRklfVUludDggKilwQnVmZmVyLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIC8vIE91dCBwbGFuZQotICAgIGlmIChyb3RhdGlvbiAhPSAxODApIHsKLSAgICAgICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVPdXQsIGhlaWdodCwKLSAgICAgICAgICAgIHdpZHRoLCBvdXRQdHIsIGhlaWdodCwgd2lkdGgpOwotICAgIH0KLQotICAgIHN3aXRjaChyb3RhdGlvbikgewotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZU91dCk7Ci0gICAgICAgICAgICBtZW1jcHkocEJ1ZmZlciwgKHZvaWQgKilvdXRQdHIsICh3aWR0aCpoZWlnaHQqMS41KSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZUluKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBsYW5lSW4sIHBsYW5lT3V0KTsKLSAgICAgICAgICAgIG1lbWNweShwQnVmZmVyLCAodm9pZCAqKW91dFB0ciwgKHdpZHRoKmhlaWdodCoxLjUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb24pOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZnJlZSgodm9pZCAqKW91dFB0cik7Ci0gICAgcmV0dXJuIGVycjsKLQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YjQ2NGRhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVfVE9PTFNfSAotI2RlZmluZSBBTkRST0lEX1ZFX1RPT0xTX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0KLSNkZWZpbmUgTUVESUFfUkVOREVSSU5HX0lOVkFMSUQgMjU1Ci0jZGVmaW5lIFRSQU5TUEFSRU5UX0NPTE9SIDB4N0UwCi0jZGVmaW5lIExVTV9GQUNUT1JfTUFYIDEwCi1lbnVtIHsKLSAgICBWSURFT19FRkZFQ1RfTk9ORSAgICAgICAgICAgICAgID0gMCwKLSAgICBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURSAgICAgID0gMSwKLSAgICBWSURFT19FRkZFQ1RfUElOSyAgICAgICAgICAgICAgID0gMiwKLSAgICBWSURFT19FRkZFQ1RfR1JFRU4gICAgICAgICAgICAgID0gNCwKLSAgICBWSURFT19FRkZFQ1RfU0VQSUEgICAgICAgICAgICAgID0gOCwKLSAgICBWSURFT19FRkZFQ1RfTkVHQVRJVkUgICAgICAgICAgID0gMTYsCi0gICAgVklERU9fRUZGRUNUX0ZSQU1JTkcgICAgICAgICAgICA9IDMyLAotICAgIFZJREVPX0VGRkVDVF9GSUZUSUVTICAgICAgICAgICAgPSA2NCwKLSAgICBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTYgICAgICAgID0gMTI4LAotICAgIFZJREVPX0VGRkVDVF9HUkFESUVOVCAgICAgICAgICAgPSAyNTYsCi0gICAgVklERU9fRUZGRUNUX0ZBREVGUk9NQkxBQ0sgICAgICA9IDUxMiwKLSAgICBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0sgICAgICAgID0gMjA0OCwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNFZJRklfVUludDggKnZpZEJ1ZmZlcjsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVNczsKLSAgICBNNE9TQV9VSW50MzIgdGltZU9mZnNldDsgLy9oYXMgdGhlIGR1cmF0aW9uIG9mIGNsaXBzIHBsYXllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmxhZyBzaGFsbCBiZSB1c2VkIGZvciBGcmFtaW5nLgotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzOwotICAgIE00T1NBX1VJbnQzMiBudW1iZXJFZmZlY3RzOwotICAgIE00T1NBX1VJbnQzMiBvdXRWaWRlb1dpZHRoOwotICAgIE00T1NBX1VJbnQzMiBvdXRWaWRlb0hlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudFZpZGVvRWZmZWN0OwotICAgIE00T1NBX0Jvb2wgaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZTsKLSAgICB1aW50OF90ICpwT3V0QnVmZmVyOwotICAgIHNpemVfdCBvdXRCdWZmZXJTdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgb3ZlcmxheUZyYW1lUkdCQnVmZmVyOwotICAgIE00VklGSV9VSW50OCogIG92ZXJsYXlGcmFtZVlVVkJ1ZmZlcjsKLX0gdmVQb3N0UHJvY2Vzc1BhcmFtczsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJUb1lVVjQyMFNlbWlwbGFuYXIodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICk7Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsIHVuc2lnbmVkIGxvbmcgbHVtX2ZhY3Rvciwgdm9pZCAqdXNlcl9kYXRhKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLQotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotTTRPU0FfRVJSIEx2R2V0SW1hZ2VUaHVtYk5haWwoY29uc3QgY2hhciAqZmlsZU5hbWUsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpOwotLyotIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi1NNE9TQV9FUlIgYXBwbHlSZW5kZXJpbmdNb2RlKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCwgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1lZGlhUmVuZGVyaW5nKTsKLQotCi1NNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfVm9pZCBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNFZJRklfVUludDggKmJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KTsKLQotTTRPU0FfVm9pZCBwcmVwYXJlWVYxMkltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHN0cmlkZSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIpOwotCi1NNE9TQV9Wb2lkIHN3YXBJbWFnZVBsYW5lcygKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyKTsKLQotTTRPU0FfVm9pZCBjb21wdXRlUGVyY2VudGFnZURvbmUoCi0gICAgIE00T1NBX1VJbnQzMiBjdHNNcywgTTRPU0FfVUludDMyIGVmZmVjdFN0YXJ0VGltZU1zLAotICAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00T1NBX0RvdWJsZSAqcGVyY2VudGFnZURvbmUpOwotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KAotICAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyogZXh0UHJvZ3Jlc3MpOwotCi1NNE9TQV9FUlIgcHJlcGFyZUZyYW1pbmdTdHJ1Y3R1cmUoCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgsCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBlZmZlY3RzU2V0dGluZ3MsIE00T1NBX1VJbnQzMiBpbmRleCwKLSAgICBNNFZJRklfVUludDgqIG92ZXJsYXlSR0IsIE00VklGSV9VSW50OCogb3ZlcmxheVlVVik7Ci0KLU00T1NBX0VSUiBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfVUludDE2IHJnYkNvbG9yRGF0YSk7Ci0KLU00T1NBX0VSUiBhcHBseUx1bWFFZmZlY3QoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB2aWRlb0VmZmVjdCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lT3V0LAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyMSwgTTRWSUZJX1VJbnQ4ICpidWZmZXIyLCBNNE9TQV9JbnQzMiBsdW1fZmFjdG9yKTsKLQotTTRPU0FfRVJSIGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUodmVQb3N0UHJvY2Vzc1BhcmFtcyAqcGFyYW1zLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpOwotCi1hbmRyb2lkOjpzdGF0dXNfdCBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24oTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgcmVzb2x1dGlvbiwKLSAgICB1aW50MzJfdCAqcFdpZHRoLCB1aW50MzJfdCAqcEhlaWdodCk7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNE9TQV9FUlIgYXBwbHlWaWRlb1JvdGF0aW9uKE00T1NBX1ZvaWQqIHBCdWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgcm90YXRpb24pOwotI2VuZGlmIC8vIEFORFJPSURfVkVfVE9PTFNfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMzczNzZkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9vcHRpbS5oCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyIGZvciBTeW1iaWFuCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9PUFRJTV9ICi0jZGVmaW5lIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSAotCi0jZGVmaW5lIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotCi0vKiovCi0jaWZuZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICBNNE9TQV9Wb2lkKiAgICAgICAgKCpwRmN0UHRyX09wZW4pKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfUmVhZCkoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uICgqcEZjdFB0cl9TZWVrKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfVGVsbCkoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ludDMyICAgICAgICAoKnBGY3RQdHJfQ2xvc2UpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiogZXJybm8gKTsKLSAgICAgICAgTTRPU0FfVm9pZCAgICAgICAgICgqcEZjdFB0cl9BY2Nlc3NUeXBlKSggTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzX0luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBGaWxlTW9kZUFjY2Vzc19PdXQgKTsKLQotICAgIH0gTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHI7Ci0jZW5kaWYKLS8qKi8KLQotCi0vKiBSZWFkZXIgQVBJIDogYnVmZmVyaXplZCBmdW5jdGlvbnMgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2Vzcyk7Ci0jZWxzZQotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUyk7Ci0jZW5kaWYKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0ICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUgKTsKLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlICk7Ci0KLSNlbmRpZiAvKiBNNE9TQV9GSUxFUkVBREVSX09QVElNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4ZDdlODUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTFZfTWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgICAgICBMVl9NYWNyb3MuaAotKiBAcGFyICAgICAgICBOWFAgU29mdHdhcmUKLSogQGJyaWVmICAgIE1hY3JvcyBkZWZpbml0aW9uIGZvciBTbWFydHBob25lIHRlYW0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTFZfTUFDUk9TX0gKLSNkZWZpbmUgTFZfTUFDUk9TX0gKLQotLyotLS0tLS0tLS0tLS0qLwotLyogICAgSU5DTFVERVMgICovCi0vKi0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDSEVDS19QVFIoZmN0LCBwLCBlcnIsIGVyclZhbHVlKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgcC4gSWYgaXQgaXMgTlVMTCwgaXQgc2V0cyB0aGUgdmFyaWFibGUgZXJyCi0qICAgICAgICAgICB0byBlcnJWYWx1ZSBhbmQganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuIEEgdHJhY2UgaXMgZGlzcGxheWVkCi0qICAgICAgICAgICBzaWduYWxsaW5nIHRoZSBlcnJvciwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsaW5lIG51bWJlci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkgXAoteyBcCi0gICAgaWYoTTRPU0FfTlVMTCA9PSAocCkpIFwKLSAgICB7IFwKLSAgICAgICAgKGVycikgPSAoZXJyVmFsdWUpIDsgXAotICAgICAgICBNNE9TQV9UUkFDRTFfMSgoTTRPU0FfQ2hhciopIiIgI2ZjdCAiKEwlZCk6ICIgI3AgIiBpcyBOVUxMLCByZXR1cm5pbmcgIiAjZXJyVmFsdWUgIiIsX19MSU5FX18pIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDSEVDS19FUlIoZmN0LCBlcnIpCi0qIEBub3RlICAgIFRoaXMgbWFjcm8gY2hlY2tzIHRoZSB2YWx1ZSBlcnIuIElmIGl0IGlzIG5vdCBOVUxMLCBhIHRyYWNlIGlzIGRpc3BsYXllZAotKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuIFRoZSBtYWNybwotKiAgICAgICAgICAganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIRUNLX0VSUihmY3QsIGVycikgXAoteyBcCi0gICAgaWYoTTROT19FUlJPUiAhPSAoZXJyKSkgXAotICAgIHsgXAotICAgICAgICBNNE9TQV9UUkFDRTFfMigoTTRPU0FfQ2hhciopIiEhISAiICNmY3QgIihMJWQpOiBFUlJPUiAweCUuOHggcmV0dXJuZWQiLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLGVycikgOyBcCi0gICAgICAgIGdvdG8gZmN0IyNfY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfRVJSKGZjdCwgZXJyKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNvbXBhcmVzIGEgY3VycmVudCBzdGF0ZSB3aXRoIGEgc3RhdGUgdmFsdWUuIElmIHRoZXkgYXJlIGRpZmZlcmVudCwKLSogICAgICAgICAgIGVyciBpcyBzZXQgdG8gTTRFUlJfU1RBVEUuCi0qICAgICAgICAgICBBIHRyYWNlIGlzIGRpc3BsYXllZCBzaWduYWxsaW5nIHRoZSBlcnJvciwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBsaW5lIG51bWJlci4KLSogICAgICAgICAgIFRoZSBtYWNybyBqdW1wcyB0byB0aGUgbGFiZWwgPGZjdD5fY2xlYW5VcC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgICAgQ0hFQ0tfU1RBVEUoZmN0LCBzdGF0ZVZhbHVlLCBzdGF0ZSkgXAoteyBcCi0gICAgaWYoKHN0YXRlVmFsdWUpICE9IChzdGF0ZSkpIFwKLSAgICB7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIiIgI2ZjdCAiIGNhbGxlZCBpbiBiYWQgc3RhdGUgJWQiLCBzdGF0ZSkgOyBcCi0gICAgICAgIChlcnIpID0gTTRFUlJfU1RBVEUgOyBcCi0gICAgICAgIGdvdG8gZmN0IyNfY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIFNBRkVfRlJFRShwKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgb2YgcCBpcyBub3QgTlVMTC4gSWYgaXQgaXMgTlVMTCwgaXQgZG9lcwotKiAgICAgICAgICAgbm90aGluZy4gRWxzZSwgcCBpcyBkZSBhbGxvY2F0ZWQgYW5kIHNldCB0byBOVUxMLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTQUZFX0ZSRUUocCkgXAoteyBcCi0gICAgaWYoTTRPU0FfTlVMTCAhPSAocCkpIFwKLSAgICB7IFwKLSAgICAgICAgZnJlZSgocCkpIDsgXAotICAgICAgICAocCkgPSBNNE9TQV9OVUxMIDsgXAotICAgIH0gXAotfQotCi0KLQotI2VuZGlmIC8qLS0tICBMVl9NQUNST1NfSCAtLS0qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDYzMTZmMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DaGFyU3Rhci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2hhclN0YXIuaAotICogQGluZ3JvdXAKLSAqIEBicmllZiAgICAgICAgZXh0ZXJuYWwgQVBJIG9mIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfQ0hBUlNUQVJfSAotI2RlZmluZSBNNE9TQV9DSEFSU1RBUl9ICi0KLS8qIGdlbmVyYWwgT1NBTCB0eXBlcyBhbmQgcHJvdG90eXBlcyBpbmNsdXNpb24gICAgICAgICAgICAgICAgICAgICAgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLQotLyogdHlwZXMgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rY2hyRGVjICA9IDB4MDEsCi0gICBNNE9TQV9rY2hySGV4YSA9IDB4MDIsCi0gICBNNE9TQV9rY2hyT2N0ICA9IDB4MDMKLX0gTTRPU0FfY2hyTnVtQmFzZTsKLQotLyogZXJyb3IgYW5kIHdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNNEVSUl9DSFJfU1RSX09WRVJGTE9XIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NIQVJTVEFSLDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9DSFJfQ09OVl9GQUlMRUQgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NIQVJTVEFSLDB4MDAwMDAyKQotI2RlZmluZSBNNFdBUl9DSFJfTk9UX0ZPVU5EICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX0NIQVJTVEFSLDB4MDAwMDAxKQotI2RlZmluZSBNNFdBUl9DSFJfTlVNX1JBTkdFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX0NIQVJTVEFSLDB4MDAwMDAyKQotI2RlZmluZSBNNFdBUl9DSFJfTkVHQVRJVkUgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX0NIQVJTVEFSLDB4MDAwMDAzKQotCi0vKiBwcm90b3R5cGVzIG9mIHRoZSBDaGFyIFN0YXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nock5Db3B5ICAgICAgICAgIChNNE9TQV9DaGFyICAgKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbjJDb3B5KTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyQXJlSWRlbnRpY2FsICAgKE00T1NBX0NoYXIgICAqc3RySW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKnN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCAgKnJlc3VsdCk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQzMiAgICAgIChNNE9TQV9DaGFyICAgKnN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICoqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MTYgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2ICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyU1ByaW50ZiAgICAgICAgIChNNE9TQV9DaGFyICAqc3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgc3RyT3V0TWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Nsb2NrLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmVhNjk2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Nsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9DbG9jay5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgY2xvY2sgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0NMT0NLX0gKLSNkZWZpbmUgTTRPU0FfQ0xPQ0tfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLQotCi0jZGVmaW5lIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00T1NBX0NMT0NLLDB4MDAwMDAxKSAvKio8IFRpbWUgcHJlY2lzaW9uIHRvbyBoaWdoIGZvciB0aGUgc3lzdGVtKi8KLSNkZWZpbmUgTTRFUlJfQ0xPQ0tfQkFEX1JFRl9ZRUFSICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRPU0FfQ0xPQ0ssMHgwMDAwMDEpIC8qKjwgSW5wdXQgeWVhciBvZiByZWZlcmVuY2UgaXMgbmVpdGhlciAxOTAwLCBub3IgMTk3MCBub3IgMjAwMCovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9DTE9DS19FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2xvY2tHZXRUaW1lKE00T1NBX1RpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVzY2FsZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKk00T1NBX0NMT0NLX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NvcmVJRC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTcyODAwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NvcmVJRC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00T1NBX0NvcmVJRC5oCi0gKiBAYnJpZWYgIGRlZmluZXMgdGhlIHVuaXF1ZXMgY29tcG9uZW50IGlkZW50aWZpZXJzIHVzZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci0gKiAgICAgICAgIGFuZCBvcHRpb25JRCBtZWNoYW5pc20KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000T1NBX0NPUkVJRF9IX18KLSNkZWZpbmUgX19NNE9TQV9DT1JFSURfSF9fCi0KLS8qIENvcmVJZCBhcmUgZGVmaW5lZCBvbiAxNCBiaXRzICovCi0vKiB3ZSBzdGFydCBmcm9tIDB4MDEwMCwgbG93ZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igb3NhbCBjb3JlIGNvbXBvbmVudHMgKi8KLQotLyogcmVhZGVyIHNoZWxscyovCi0jZGVmaW5lIE00UkVBREVSX0NPTU1PTiAgICAgMHgwMTAwCi0jZGVmaW5lIE00UkVBREVSX0FWSSAgICAgICAgMHgwMTAxCi0jZGVmaW5lIE00UkVBREVSX0FNUiAgICAgICAgMHgwMTAyCi0jZGVmaW5lIE00UkVBREVSXzNHUCAgICAgICAgMHgwMTAzCi0jZGVmaW5lIE00UkVBREVSX05FVCAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIE00UkVBREVSXzNHUF9IVFRQICAgMHgwMTA1Ci0jZGVmaW5lIE00UkVBREVSX01QMyAgICAgICAgMHgwMTA2Ci0jZGVmaW5lIE00UkVBREVSX1dBViAgICAgICAgMHgwMTA3Ci0jZGVmaW5lIE00UkVBREVSX01JREkgICAgICAgMHgwMTA4Ci0jZGVmaW5lIE00UkVBREVSX0FTRiAgICAgICAgMHgwMTA5Ci0jZGVmaW5lIE00UkVBREVSX1JFQUwgICAgICAgIDB4MDEwQQotI2RlZmluZSBNNFJFQURFUl9BQUMgICAgICAgIDB4MDEwQgotI2RlZmluZSBNNFJFQURFUl9GTEVYICAgICAgICAweDAxMEMKLSNkZWZpbmUgTTRSRUFERVJfQkJBICAgICAgICAweDAxMEQKLSNkZWZpbmUgTTRSRUFERVJfU1lOVEhFU0lTX0FVRElPICAgIDB4MDEwRQotI2RlZmluZSBNNFJFQURFUl9KUEVHICAgICAgICAweDAxMEYKLQotCi0vKiB3cml0ZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRXUklURVJfQ09NTU9OICAgICAweDAxMTAKLSNkZWZpbmUgTTRXUklURVJfQVZJICAgICAgICAweDAxMTEKLSNkZWZpbmUgTTRXUklURVJfQU1SICAgICAgICAweDAxMTIKLSNkZWZpbmUgTTRXUklURVJfM0dQICAgICAgICAweDAxMTMKLSNkZWZpbmUgTTRXUklURVJfSlBFRyAgICAgICAgMHgwMTE2Ci0jZGVmaW5lIE00V1JJVEVSX01QMyAgICAgICAgMHgwMTE3Ci0KLS8qIGRlY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00REVDT0RFUl9DT01NT04gICAgMHgwMTIwCi0jZGVmaW5lIE00REVDT0RFUl9KUEVHICAgICAgMHgwMTIxCi0jZGVmaW5lIE00REVDT0RFUl9NUEVHNCAgICAgMHgwMTIyCi0jZGVmaW5lIE00REVDT0RFUl9BVURJTyAgICAgMHgwMTIzCi0jZGVmaW5lIE00REVDT0RFUl9BVkMgICAgICAgMHgwMTI0Ci0jZGVmaW5lIE00REVDT0RFUl9NSURJICAgICAgMHgwMTI1Ci0jZGVmaW5lIE00REVDT0RFUl9XTUEgICAgICAgIDB4MDEyNgotI2RlZmluZSBNNERFQ09ERVJfV01WICAgICAgICAweDAxMjcKLSNkZWZpbmUgTTRERUNPREVSX1JNViAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIE00REVDT0RFUl9STUEgICAgICAgIDB4MDEyOQotI2RlZmluZSBNNERFQ09ERVJfQUFDICAgICAgIDB4MDEyQQotI2RlZmluZSBNNERFQ09ERVJfQkVBVEJSRVcgIDB4MDEyQgotI2RlZmluZSBNNERFQ09ERVJfRVhURVJOQUwgIDB4MDEyQwotCi0vKiBlbmNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNEVOQ09ERVJfQ09NTU9OICAgIDB4MDEzMAotI2RlZmluZSBNNEVOQ09ERVJfSlBFRyAgICAgIDB4MDEzMQotI2RlZmluZSBNNEVOQ09ERVJfTVBFRzQgICAgIDB4MDEzMgotI2RlZmluZSBNNEVOQ09ERVJfQVVESU8gICAgIDB4MDEzMwotI2RlZmluZSBNNEVOQ09ERVJfVklEX05VTEwgIDB4MDEzNAotI2RlZmluZSBNNEVOQ09ERVJfTUpQRUcgICAgICAgIDB4MDEzNQotI2RlZmluZSBNNEVOQ09ERVJfTVAzICAgICAgICAweDAxMzYKLSNkZWZpbmUgTTRFTkNPREVSX0gyNjQgICAgICAgIDB4MDEzNwotI2RlZmluZSBNNEVOQ09ERVJfQUFDICAgICAgICAweDAxMzgKLSNkZWZpbmUgTTRFTkNPREVSX0FNUk5CICAgICAgICAweDAxMzkKLSNkZWZpbmUgTTRFTkNPREVSX0FVRF9OVUxMICAweDAxM0EKLSNkZWZpbmUgTTRFTkNPREVSX0VYVEVSTkFMICAweDAxM0IKLQotLyogY29yZXMgKi8KLSNkZWZpbmUgTTRKUEdfREVDT0RFUiAgICAgICAweDAxNDAKLSNkZWZpbmUgTTRKUEdfRU5DT0RFUiAgICAgICAweDAxNDEKLQotI2RlZmluZSBNNE1QNF9ERUNPREVSICAgICAgIDB4MDE0MgotI2RlZmluZSBNNE1QNF9FTkNPREVSICAgICAgIDB4MDE0MwotCi0jZGVmaW5lIE00QVZJX0NPTU1PTiAgICAgICAgMHgwMTQ0Ci0jZGVmaW5lIE00QVZJX1JFQURFUiAgICAgICAgMHgwMTQ1Ci0jZGVmaW5lIE00QVZJX1dSSVRFUiAgICAgICAgMHgwMTQ2Ci0KLSNkZWZpbmUgTTRIVFRQX0VOR0lORSAgICAgICAweDAxNDcKLQotI2RlZmluZSBNNE9TQV9UTVBGSUxFICAgICAgIDB4MDE0OAotI2RlZmluZSBNNFRPT0xfVElNRVIgICAgICAgIDB4MDE0OQotCi0jZGVmaW5lIE00QU1SX1JFQURFUiAgICAgICAgMHgwMTRBCi0KLSNkZWZpbmUgTTRNUDNfUkVBREVSICAgICAgICAweDAxNEIKLQotI2RlZmluZSBNNFdBVl9SRUFERVIgICAgICAgIDB4MDE0QwotI2RlZmluZSBNNFdBVl9XUklURVIgICAgICAgIDB4MDE0RAotI2RlZmluZSBNNFdBVl9DT01NT04gICAgICAgIDB4MDE0RQotCi0jZGVmaW5lIE00QURUU19SRUFERVIgICAgICAgIDB4MDE0RgotI2RlZmluZSBNNEFESUZfUkVBREVSICAgICAgICAweDAxNkEKLQotI2RlZmluZSBNNFNQUyAgICAgICAgICAgICAgIDB4MDE1MAotI2RlZmluZSBNNEVYSUZfREVDT0RFUiAgICAgIDB4MDE1MQotI2RlZmluZSBNNEVYSUZfRU5DT0RFUiAgICAgIDB4MDE1MgotI2RlZmluZSBNNEdJRl9ERUNPREVSICAgICAgIDB4MDE1MwotI2RlZmluZSBNNEdJRl9FTkNPREVSICAgICAgIDB4MDE1NAotI2RlZmluZSBNNFBOR19ERUNPREVSICAgICAgIDB4MDE1NQotI2RlZmluZSBNNFBOR19FTkNPREVSICAgICAgIDB4MDE1NgotI2RlZmluZSBNNFdCTVBfREVDT0RFUiAgICAgIDB4MDE1NwotI2RlZmluZSBNNFdCTVBfRU5DT0RFUiAgICAgIDB4MDE1OAotCi0jZGVmaW5lIE00QU1SX1dSSVRFUiAgICAgICAgMHgwMTU5ICAgIC8qKjwgbm8gcm9vbSB0byBwdXQgaXQgYWxvbmcgTTRBTVJfUkVBREVSICovCi0KLQotI2RlZmluZSBNNEFWQ19ERUNPREVSICAgICAgIDB4MDE1QQotI2RlZmluZSBNNEFWQ19FTkNPREVSICAgICAgIDB4MDE1QgotCi0jZGVmaW5lIE00QVNGX1JFQURFUiAgICAgICAgMHgwMTVDCi0jZGVmaW5lIE00V01EUk1fQUdFTlQgICAgICAgIDB4MDE1RAotI2RlZmluZSBNNE1JRElfUkVBREVSICAgICAgICAweDAxNjIgICAgLyoqPCBubyByb29tIGJlZm9yZSB0aGUgcHJlc2VudGVycyAqLwotI2RlZmluZSBNNFJNX1JFQURFUiAgICAgICAgIDB4MTYzCi0jZGVmaW5lIE00Uk1WX0RFQ09ERVIgICAgICAgIDB4MTY0Ci0jZGVmaW5lIE00Uk1BX0RFQ09ERVIgICAgICAgIDB4MTY1Ci0KLSNkZWZpbmUgTTRUT09MX1hNTCAgICAgICAgICAgIDB4MDE2NgotI2RlZmluZSBNNFRPT0xfRUZSICAgICAgICAgICAgMHgwMTY3ICAgIC8qKjwgRGVjcnlwdGlvbiBtb2R1bGUgZm9yIFZpZGVvIEFydGlzdCAqLwotI2RlZmluZSBNNElBTF9GVE4gICAgICAgICAgICAweDAxNjggICAgLyogRlROIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJQUwgKi8KLSNkZWZpbmUgTTRGVE4gICAgICAgICAgICAgICAgMHgwMTY5ICAgIC8qIEZUTiBsaWJyYXJ5ICovCi0KLS8qIHByZXNlbnRlciAqLwotI2RlZmluZSBNNFBSRVNFTlRFUl9BVURJTyAgIDB4MDE2MAotI2RlZmluZSBNNFBSRVNFTlRFUl9WSURFTyAgIDB4MDE2MQotCi0vKiBoaWdoIGxldmVsIGludGVyZmFjZXMgKHZwcywgZXRjLi4pKi8KLSNkZWZpbmUgTTRWUFMgICAgICAgICAgICAgICAweDAxNzAKLSNkZWZpbmUgTTRWVFMgICAgICAgICAgICAgICAweDAxNzEKLSNkZWZpbmUgTTRWWFMgICAgICAgICAgICAgICAweDAxNzIKLSNkZWZpbmUgTTRDQUxMQkFDSyAgICAgICAgICAweDAxNzMKLSNkZWZpbmUgTTRWRVMgICAgICAgICAgICAgICAweDAxNzQKLSNkZWZpbmUgTTRQUkVQUk9DRVNTX1ZJREVPICAweDAxNzUKLSNkZWZpbmUgTTRHUkFCX0FVRElPICAgICAgICAweDAxNzYKLSNkZWZpbmUgTTRHUkFCX1ZJREVPICAgICAgICAweDAxNzcKLSNkZWZpbmUgTTRWU1NBVkkgICAgICAgICAgICAweDAxNzgKLSNkZWZpbmUgTTRWU1MzR1BQICAgICAgICAgICAweDAxNzkKLSNkZWZpbmUgTTRQVE8zR1BQICAgICAgICAgICAweDAxN0EKLSNkZWZpbmUgTTRQVlhfUEFSU0VSICAgICAgICAweDAxN0IKLSNkZWZpbmUgTTRWQ1MgICAgICAgICAgICAgICAgMHgwMTdDCi0jZGVmaW5lIE00TUNTICAgICAgICAgICAgICAgIDB4MDE3RAotI2RlZmluZSBNNE1OTUMgICAgICAgICAgICAgICAgMHgwMTgwICAgIC8qKjwgbW5tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTTRUVEVYVF9QQVJTRVIgICAgICAweDAxODEgICAgLyoqPCB0aW1lZCB0ZXh0ICovCi0jZGVmaW5lIE00TU0gICAgICAgICAgICAgICAgMHgwMTgyICAgIC8qKjwgTXVzaWMgbWFuYWdlciAqLwotI2RlZmluZSBNNE1EUCAgICAgICAgICAgICAgICAweDAxODMgICAgLyoqPCBNZXRhZGF0YSBwYXJzZXIgKi8KLSNkZWZpbmUgTTRNTVNRTENPUkUgICAgICAgICAgICAweDAxODQKLSNkZWZpbmUgTTRWUFNJTCAgICAgICAgICAgICAgICAweDAxODUKLSNkZWZpbmUgTTRGSUxFSUwgICAgICAgICAgICAweDAxODYgLyogSUwgZmlsZSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgTTRNVSAgICAgICAgICAgICAgICAweDAxODcKLSNkZWZpbmUgTTRWRUUgICAgICAgICAgICAgICAgMHgwMTg4ICAvKio8IFZpZGVvIGVmZmVjdCBlbmdpbmUgKi8KLSNkZWZpbmUgTTRWQSAgICAgICAgICAgICAgICAweDAxODkgLyogVmlkZW9BcnRpc3QgKi8KLSNkZWZpbmUgTTRKVFMgICAgICAgICAgICAgICAgMHgwMThBCi0jZGVmaW5lIE00SlRTSUwgICAgICAgICAgICAgICAgMHgwMThCCi0jZGVmaW5lIE00QUlSICAgICAgICAgICAgICAgIDB4MDE4QyAgLyoqPCBBSVIgKi8KLSNkZWZpbmUgTTRTUEUgICAgICAgICAgICAgICAgMHgwMThEICAvKio8IFN0aWxsIHBpY3R1cmUgZWRpdG9yICovCi0jZGVmaW5lIE00VlMgICAgICAgICAgICAgICAgMHgwMThFICAgIC8qKjwgVmlkZW8gU3R1ZGlvICh4VlNTKSAqLwotI2RlZmluZSBNNFZFU0lMICAgICAgICAgICAgICAgIDB4MDE4RiAgICAvKio8IFZFUyBpbCAqLwotI2RlZmluZSBNNElEMyAgICAgICAgICAgICAgICAweDAxOTAgICAgLyoqPCBJRDMgVGFnIE1vZHVsZSAqLwotI2RlZmluZSBNNFNDICAgICAgICAgICAgICAgIDB4MDE5MSAgICAvKio8IE1lZGlhIFNjYW5uZXIgKi8KLSNkZWZpbmUgTTRURyAgICAgICAgICAgICAgICAweDAxOTIgIC8qKjwgVGh1bWJuYWlsIEdlbmVyYXRvciovCi0jZGVmaW5lIE00VFMgICAgICAgICAgICAgICAgMHgwMTkzICAgIC8qKjwgVGh1bWJuYWlsIHN0b3JhZ2UgKi8KLSNkZWZpbmUgTTRNQiAgICAgICAgICAgICAgICAweDAxOTQgICAgLyoqPCBNZWRpYSBicm93c2VyICovCi0KLS8qIGhpZ2ggbGV2ZWwgYXBwbGljYXRpb24gKHRlc3Qgb3IgY2xpZW50IGFwcCkgKi8KLSNkZWZpbmUgTTRBUFBMSSAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgTTRWQV9BUFBMSSAgICAgICAgICAgIDB4MDIwMSAgICAvKio8IFZpZGVvIEFydGlzdCB0ZXN0IGFwcGxpY2F0aW9uICovCi0KLS8qIGV4dGVybmFsIGNvbXBvbmVudHMgKEhXIHZpZGVvIGNvZGVjcywgZXRjLikgKi8KLSNkZWZpbmUgTTRWRF9FWFRFUk5BTCAgICAgICAgMHgwMzAwCi0jZGVmaW5lIE00VkVfRVhURVJOQUwgICAgICAgIDB4MDMwMQotCi0KLS8qIHByaW9yaXR5IHRvIGNvbWJpbmUgd2l0aCBtb2R1bGUgaWRzICovCi0jZGVmaW5lIE00SElHSF9QUklPUklUWSAgICAgMHhDMDAwCi0jZGVmaW5lIE00TUVESVVNX1BSSU9SSVRZICAgMHg4MDAwCi0jZGVmaW5lIE00TE9XX1BSSU9SSVRZICAgICAgMHg0MDAwCi0jZGVmaW5lIE00REVGQVVMVF9QUklPUklUWSAgMHgwMDAwCi0KLQotI2VuZGlmIC8qX19NNE9TQV9DT1JFSURfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRGVidWcuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNmFiNTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9EZWJ1Zy5oCi0gKiBAYnJpZWYgICAgICAgIERlYnVnIGFuZCBUcmFjZSBNYWNybwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9NNE9TQV9ERUJVR19IXwotI2RlZmluZSBfTTRPU0FfREVCVUdfSF8KLQotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0vKiBkZWZhdXQgdmFsdWUsIGRlZmluZWQgb25seSBpZiBub3QgZGVmaW5lZCBhbHJlYWR5LiAqLwotI2lmbmRlZiBNNFRSQUNFX0lECi0jZGVmaW5lIE00VFJBQ0VfSUQgTTRVTktOT1dOX0NPUkVJRAotI2VuZGlmIC8qIE00VFJBQ0VfSUQgdW5kZWZpbmVkICovCi0KLQotI2RlZmluZSBNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCAwCi0KLSNpZm5kZWYgTTRPU0FfREVCVUdfTEVWRUwKLSNkZWZpbmUgTTRPU0FfREVCVUdfTEVWRUwgICAgICAgMAotI2VuZGlmCi0KLQotI2RlZmluZSBNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCAwCi0KLSNpZm5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgICAgICAgMAotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkKLQotLyogRGVidWcgbWFjcm9zICovCi1leHRlcm4gTTRPU0FfVm9pZCBNNE9TQV9ERUJVR190cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiByZXR1cm5lZEVycm9yKTsKLQotCi0jZGVmaW5lIE00T1NBX0RFQlVHX0lGeChjb25kLCBlcnJvckNvZGUsIG1zZywgbGV2ZWwpXAotICAgICAgaWYoY29uZClcCi0gICAgICB7XAotICAgICAgICAgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLCBsZXZlbCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikjY29uZCwgKE00T1NBX0NoYXIqKW1zZyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvckNvZGUpKTtcCi0gICAgICAgICByZXR1cm4oZXJyb3JDb2RlKTtcCi0gICAgICB9Ci0KLSNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpXAotICAgICAgICAgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLCAxLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSNlcnJvckNvZGUsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JDb2RlKSk7Ci0KLSNlbHNlIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotI2RlZmluZSBNNE9TQV9ERUJVRyhlcnJvckNvZGUsIG1zZykKLQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotCi0jaWYgKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYxKGNvbmQsIGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX0lGeChjb25kLCBlcnJvckNvZGUsIG1zZywgMSkKLSNlbHNlCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjEoY29uZCwgZXJyb3JDb2RlLCBtc2cpCi0jZW5kaWYgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpKi8KLQotCi0jaWYgKE00T1NBX0RFQlVHX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAyKQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYyKGNvbmQsIGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX0lGeChjb25kLCBlcnJvckNvZGUsIG1zZywgMikKLSNlbHNlCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjIoY29uZCwgZXJyb3JDb2RlLCBtc2cpCi0jZW5kaWYgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDIpKi8KLQotCi0jaWYgKE00T1NBX0RFQlVHX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAzKQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYzKGNvbmQsIGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX0lGeChjb25kLCBlcnJvckNvZGUsIG1zZywgMykKLSNlbHNlCi0gI2RlZmluZSBNNE9TQV9ERUJVR19JRjMoY29uZCwgZXJyb3JDb2RlLCBtc2cpCi0jZW5kaWYgLyooTTRPU0FfREVCVUdfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDMpKi8KLQotCi0KLS8qIFRyYWNlIG1hY3JvcyAqLwotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKQotCi1leHRlcm4gTTRPU0FfVm9pZCBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiApOwotCi0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfMChtc2csIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsIChNNE9TQV9DaGFyKiltc2cpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgbGV2ZWwpXAotICAgICAgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihfX0xJTkVfXywgKE00T1NBX0NoYXIqKV9fRklMRV9fLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKiltc2csIHBhcmFtMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTEscGFyYW0yLCBwYXJhbTMpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIsIHBhcmFtMywgcGFyYW00KTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpOwotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotCi0KLSNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8wKG1zZylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8wKG1zZywgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMShtc2csIHBhcmFtMSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCAxKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8yKG1zZywgcGFyYW0xLCBwYXJhbTIpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCAxKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNClcCi0gICAgICAgIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCAxKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCAxKQotCi0jZWxzZSAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkqLwotCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8wKG1zZykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzEobXNnLCBwYXJhbTEpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8yKG1zZywgcGFyYW0xLCBwYXJhbTIpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpCi0KLSNlbmRpZiAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkqLwotCi0KLSNpZiAoTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8wKG1zZylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8wKG1zZywgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMShtc2csIHBhcmFtMSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCAyKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8yKG1zZywgcGFyYW0xLCBwYXJhbTIpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMihtc2csIHBhcmFtMSwgcGFyYW0yLCAyKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcCi0gICAgICAgIE00T1NBX1RSQUNFeF8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNClcCi0gICAgICAgIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCAyKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCAyKQotCi0jZWxzZSAvKihNNE9TQV9UUkFDRV9MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMikqLwotCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8wKG1zZykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzEobXNnLCBwYXJhbTEpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8yKG1zZywgcGFyYW0xLCBwYXJhbTIpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8zKG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpKi8KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMykKLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMykKLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMykKLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMykKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDMpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFM18xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFM180KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMykgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDMpKi8KLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRPU0FfREVCVUdfSF8gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXJyb3IuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1YzMxNzcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXJyb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9FcnJvci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgdHlwZXMKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBlcnJvciBjb2Rlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9FUlJPUl9ICi0jZGVmaW5lIE00T1NBX0VSUk9SX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKiBNNE9TQV9FUlIgaXMgYSAzMiBiaXRzIHVuc2lnbmVkIGludGVnZXIuCi0gKiBUbyBzb3J0IHJldHVybmVkIGNvZGUsIGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb24gbXVzdCBiZSBmb2xsb3dlZDoKLSAqIC0gU2V2ZXJpdHkgKDIgYml0cyk6IEl0IG1heSBiciBlaXRoZXIgMGIwMCAobm8gZXJyb3IpLCAwYjAxICh3YXJuaW5nKSBvcgotICogICAgICAgICAgICAgICAgICAgICAgMGIwMSAoZmF0YWwgZXJyb3IpCi0gKiAtIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAotICogLSBFcnJvcklEICgxNiBiaXRzKTogSXQgaXMgdGhlIHNwZWNpZmljIGVycm9yIGNvZGUKLQotICogRUFDSCBDT1JFIENPTVBPTkVOVCBGVU5DVElPTiBTSE9VTEQgUkVUVVJOIEFOIE00T1NBX0VSUgotKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyICAgTTRPU0FfRVJSOwotCi0jZGVmaW5lIE00X09LICAgICAwCi0jZGVmaW5lIE00X1dBUiAgICAxCi0jZGVmaW5lIE00X0VSUiAgICAyCi0KLQotLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9FUlIgKi8KLQotLyoqIFRoaXMgbWFjcm8gdGVzdHMgaWYgdGhlIHByb3ZpZGVkIE00T1NBX0VSUiBpcyBhIHdhcm5pbmcgb3Igbm90Ki8KLSNkZWZpbmUgTTRPU0FfRVJSX0lTX1dBUk5JTkcoZXJyb3IpICAgKCgoKGVycm9yKT4+MzApID09IE00X1dBUikgPyAxOjApCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSBmYXRhbCBlcnJvciBvciBub3QqLwotI2RlZmluZSBNNE9TQV9FUlJfSVNfRVJST1IoZXJyb3IpICAgKCgoKGVycm9yKT4+MzApID09IE00X0VSUikgPyAxOjApCi0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgYW4gZXJyb3IgY29kZSBhY2Nyb2RpbmcgdG8gdGhlIDMgcHJvdmlkZWQgZmllbGRzOgotICAqIEBhcmcgc2V2ZXJpdHk6IChJTikgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBjb3JlSUQ6IChJTikgW000T1NBX1VJbnQzMl0gQ29yZUlEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgZXJyb3JJRDogKElOKSBbTTRPU0FfVUludDMyXSBFcnJvcklEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZSovCi0jZGVmaW5lIE00T1NBX0VSUl9DUkVBVEUoc2V2ZXJpdHksIGNvcmVJRCwgZXJyb3JJRClcCi0gICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9VSW50MzIpc2V2ZXJpdHkpPDwzMCkrKCgoKE00T1NBX1VJbnQzMiljb3JlSUQpJjB4MDAzRkZGKTw8MTYpKygoKE00T1NBX1VJbnQzMillcnJvcklEKSYweDAwRkZGRikpCi0KLS8qKiBUaGlzIG1hY3JvIGV4dHJhY3RzIHRoZSAzIGZpZWxkcyBmcm9tIHRoZSBlcnJvcjoKLSAgKiBAYXJnIGVycm9yOiAoSU4pIFtNNE9TQV9FUlJdIEVycm9yIGNvZGUKLSAgKiBAYXJnIHNldmVyaXR5OiAoT1VUKSBbTTRPU0FfVUludDMyXSBTZXZlcml0eSB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGNvcmVJRDogKE9VVCkgW000T1NBX1VJbnQzMl0gQ29yZUlEIHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgZXJyb3JJRDogKE9VVCkgW000T1NBX1VJbnQzMl0gRXJyb3JJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUqLwotI2RlZmluZSBNNE9TQV9FUlJfU1BMSVQoZXJyb3IsIHNldmVyaXR5LCBjb3JlSUQsIGVycm9ySUQpXAotICAgeyBzZXZlcml0eT0oTTRPU0FfVUludDMyKSgoZXJyb3IpPj4zMCk7XAotICAgICBjb3JlSUQ9KE00T1NBX1VJbnQzMikoKChlcnJvcik+PjE2KSYweDAwM0ZGRik7XAotICAgICAoTTRPU0FfVUludDMyKShlcnJvcklEPShlcnJvcikmMHgwMEZGRkYpOyB9Ci0KLQotLyogImZha2UiIENvcmVJRCwgaXMgdXNlZCB0byByZXBvcnQgYW4gdW5rbm93biBDb3JlSUQuIFVzZWQgYnkgdGhlIHRyYWNlIHN5c3RlbQotd2hlbiB0aGUgY29yZSBJRCBtYWNybyBpc24ndCBkZWZpbmVkLiBEZWZpbmVkIGhlcmUgaW5zdGVhZCBvZiBDb3JlSUQuaCB0byBhdm9pZAotaW50cm9kdWNpbmcgZGVwZW5kZW5jaWVzIHRvIGNvbW1vbi9pbmMuICovCi0KLSNkZWZpbmUgTTRVTktOT1dOX0NPUkVJRCAgICAweDNGRkYgLyogbWF4IHBvc3NpYmxlIENvcmVJRCAqLwotCi0jZGVmaW5lIE00X0NPTU1PTiAgICAgICAgICAgMHgwMCAgLyoqPENvbW1vbiovCi0jZGVmaW5lIE00TVA0X0NPTU1PTiAgICAgICAgMHgwMSAgLyoqPENvcmUgTVA0IChjb21tb24pKi8KLSNkZWZpbmUgTTRNUDRfV1JJVEVSICAgICAgICAweDAyICAvKio8Q29yZSBNUDQgd3JpdGVyKi8KLSNkZWZpbmUgTTRNUDRfUkVBREVSICAgICAgICAweDAzICAvKio8Q29yZSBNUDQgcmVhZGVyKi8KLSNkZWZpbmUgTTRSVFNQX0NPTU1PTiAgICAgICAweDExICAvKio8Q29yZSBSVFNQIGNvbW1vbiovCi0jZGVmaW5lIE00UlRTUF9XUklURVIgICAgICAgMHgxMiAgLyoqPENvcmUgUlRTUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00UlRTUF9SRUFERVIgICAgICAgMHgxMyAgLyoqPENvcmUgUlRTUCByZWNlaXZlciovCi0jZGVmaW5lIE00UlRQX1dSSVRFUiAgICAgICAgMHgxNCAgLyoqPENvcmUgUlRQL1JUQ1AgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFJUUF9SRUFERVIgICAgICAgIDB4MTUgIC8qKjxDb3JlIFJUUC9SVENQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRTQVBfV1JJVEVSICAgICAgICAweDE2ICAvKio8Q29yZSBTQVAgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFNBUF9SRUFERVIgICAgICAgIDB4MTcgIC8qKjxDb3JlIFNBUCByZWNlaXZlciovCi0jZGVmaW5lIE00RFZCSF9SRUFERVIgICAgICAgIDB4MTggIC8qKjxDb3JlIERWQkggcmVjZWl2ZXIqLwotI2RlZmluZSBNNFNEUF9XUklURVIgICAgICAgIDB4MjIgIC8qKjxDb3JlIFNEUCB3cml0ZXIqLwotI2RlZmluZSBNNFNEUF9SRUFERVIgICAgICAgIDB4MzEgIC8qKjxDb3JlIFNEUCByZWFkZXIqLwotI2RlZmluZSBNNFBBS19BTVIgICAgICAgICAgIDB4MzIgIC8qKjxDb3JlIHBhY2tldGl6ZXIgQU1SIChSRkMzMjY3KSovCi0jZGVmaW5lIE00REVQQUtfQU1SICAgICAgICAgMHgzMyAgLyoqPENvcmUgZGUtcGFja2V0aXplciBBTVIgKFJGQzMyNjcpKi8KLSNkZWZpbmUgTTRQQUtfSDI2MyAgICAgICAgICAweDM0ICAvKio8Q29yZSBwYWNrZXRpemVyIEgyNjMgKFJGQzI0MjkpKi8KLSNkZWZpbmUgTTRERVBBS19IMjYzICAgICAgICAweDM1ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIEgyNjMoUkZDMjQyOSkqLwotI2RlZmluZSBNNFBBS19TSU1QTEUgICAgICAgIDB4MzYgIC8qKjxDb3JlIHBhY2tldGl6ZXIgU2ltcGxlRHJhZnQgKFJGQyB4eHh4KSovCi0jZGVmaW5lIE00REVQQUtfU0lNUExFICAgICAgMHgzNyAgLyoqPENvcmUgZGUtcGFja2V0aXplciBTaW1wbGVEcmFmdCAoUkZDIHh4eHgpKi8KLSNkZWZpbmUgTTRQQUtfMzAxNl9WSURFTyAgICAweDM4ICAvKio8Q29yZSBwYWNrZXRpemVyIFJGQzMwMTYgdmlkZW8qLwotI2RlZmluZSBNNERFUEFLXzMwMTZfVklERU8gIDB4MzkgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUkZDMzAxNiB2aWRlbyovCi0jZGVmaW5lIE00UEFLXzMwMTZfQVVESU8gICAgMHgzQSAgLyoqPENvcmUgcGFja2V0aXplciBSRkMzMDE2IGF1ZGlvIChMQVRNKSovCi0jZGVmaW5lIE00REVQQUtfMzAxNl9BVURJTyAgMHgzQiAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSRkMzMDE2IGF1ZGlvIChMQVRNKSovCi0jZGVmaW5lIE00REVQQUtfSDI2NCAgICAgICAgMHgzQyAgLyoqPENvcmUgZGUtcGFja2V0aXplciBIMjY0Ki8KLSNkZWZpbmUgTTRERVBBS19SRUFMViAgICAgICAgMHgzRCAgLyoqPENvcmUgZGUtcGFja2V0aXplciBSZWFsIFZpZGVvICovCi0jZGVmaW5lIE00REVQQUtfUkVBTEEgICAgICAgIDB4M0UgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUmVhbCBBdWRpbyAqLwotI2RlZmluZSBNNFJEVF9SRUFERVIgICAgICAgIDB4M0YgIC8qKjxDb3JlIFJEVCByZWNlaXZlciovCi0jZGVmaW5lIE00VENQX0RNVVggICAgICAgICAgMHg1MCAgLyoqPENvcmUgVENQIGRlbXV4Ki8KLSNkZWZpbmUgTTRJT0RfUEFSU0VSICAgICAgICAweDUxICAvKio8Q29yZSBJT0QgcGFyc2VyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9DT01NT04gICAweDYxICAvKio8T1NBTCBmaWxlIGNvbW1vbiovCi0jZGVmaW5lIE00T1NBX0ZJTEVfV1JJVEVSICAgMHg2MiAgLyoqPE9TQUwgZmlsZSB3cml0ZXIqLwotI2RlZmluZSBNNE9TQV9GSUxFX1JFQURFUiAgIDB4NjMgIC8qKjxPU0FMIGZpbGUgcmVhZGVyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9FWFRSQSAgICAweDY0ICAvKio8T1NBTCBmaWxlIGV4dHJhKi8KLSNkZWZpbmUgTTRPU0FfRElSRUNUT1JZICAgICAweDY1ICAvKio8T1NBTCBkaXJlY3RvcnkqLwotI2RlZmluZSBNNE9TQV9TT0NLRVQgICAgICAgIDB4NzEgIC8qKjxPU0FMIHNvY2tldCAoYm90aCByZWFkZXIgYW5kIHdyaXRlcikqLwotI2RlZmluZSBNNE9TQV9USFJFQUQgICAgICAgIDB4ODEgIC8qKjxPU0FMIHRocmVhZCovCi0jZGVmaW5lIE00T1NBX01VVEVYICAgICAgICAgMHg4MiAgLyoqPE9TQUwgbXV0ZXgqLwotI2RlZmluZSBNNE9TQV9TRU1BUEhPUkUgICAgIDB4ODMgIC8qKjxPU0FMIHNlbWFwaG9yZSovCi0jZGVmaW5lIE00T1NBX0NMT0NLICAgICAgICAgMHg4NCAgLyoqPE9TQUwgY2xvY2sqLwotI2RlZmluZSBNNE9TQV9NRU1PUlkgICAgICAgIDB4OTEgIC8qKjxPU0FMIG1lbW9yeSovCi0jZGVmaW5lIE00Q0FMTF9CQUNLICAgICAgICAgMHhBMSAgLyoqPENhbGwgQmFjayBlcnJvciovCi0jZGVmaW5lIE00T1NBX1VSSSAgICAgICAgICAgMHhCMSAgLyoqPE9TQUwgVVJJIGhhbmRsZXIqLwotI2RlZmluZSBNNE9TQV9TVFJJTkcgICAgICAgIDB4QjIgIC8qKjxPU0FMIHN0cmluZyovCi0jZGVmaW5lIE00U1lTX0NNQVBJICAgICAgICAgMHhCMyAgLyoqPFNZU1RFTSBDb21tb24gTWVkaSBBUEkqLwotI2RlZmluZSBNNE9TQV9DSEFSU1RBUiAgICAgIDB4QjQgIC8qKjxPU0FMIENoYXJTdGFyKi8KLSNkZWZpbmUgTTRSRUFDVE9SICAgICAgICAgICAweEMxICAvKio8Q29yZSByZWFjdG9yKi8KLSNkZWZpbmUgTTRURVNUICAgICAgICAgICAgICAweEQxICAvKio8VGVzdCBjb21wb25lbnQqLwotI2RlZmluZSBNNFNUQUNLICAgICAgICAgICAgICAgIDB4RTEgIC8qKjwgQ29yZSBJRCBvZiB0aGUgaW50ZWdyYXRlZCBzdGFjayovCi0jZGVmaW5lIE00U1RBQ0tfUkVBTCAgICAgICAgMHhFMiAgLyoqPENvcmUgSUQgb2YgdGhlIFJlYWwgaW50ZWdyYXRlZCBzdGFjayAqLwotI2RlZmluZSBNNFRPT0xfTEJWVF9QQVJBTSAgIDB4RjEgIC8qKjxMQl9WVCBjb25maWcgZmlsZSBtYW5hZ2VyKi8KLSNkZWZpbmUgTTRUT09MX0xJTktfTElTVCAgICAweEYyICAvKio8VG9vbCBsaW5rZWQgbGlzdCovCi0jZGVmaW5lIE00VE9PTF9CQVNFNjQgICAgICAgMHhGMyAgLyoqPENvcmUgYmFzZTY0IGVuY29kZXIvZGVjb2RlciovCi0KLQotCi0vKiBEZWZpbml0aW9uIG9mIGNvbW1vbiBlcnJvciBjb2RlcyAqLwotLyoqIHRoZXJlIGlzIG5vIGVycm9yKi8KLSNkZWZpbmUgTTROT19FUlJPUiAgICAgICAgICAgIDB4MDAwMDAwMDAKLQotLyoqIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTCovCi0jZGVmaW5lIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMSkKLS8qKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ki8KLSNkZWZpbmUgTTRFUlJfU1RBVEUgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDAyKQotLyoqIFRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZSovCi0jZGVmaW5lIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMykKLS8qKiBQcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZSovCi0jZGVmaW5lIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNCkKLSNkZWZpbmUgTTRFUlJfQ09OVEVYVF9GQUlMRUQgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA1KQotI2RlZmluZSBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDYpCi0vKiogVGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZSovCi0jZGVmaW5lIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNykKLS8qKiBUaGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lKi8KLSNkZWZpbmUgTTRFUlJfV1JJVEVfT05MWSAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA4KQotLyoqIFRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZSovCi0jZGVmaW5lIE00RVJSX1JFQURfT05MWSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwOSkKLS8qKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Ki8KLSNkZWZpbmUgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDBBKQotCi0jZGVmaW5lICAgIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNF9DT01NT04sIDB4MDAwMDBCKQotCi0jZGVmaW5lIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAyKQotI2RlZmluZSBNNFdBUl9JTlZBTElEX1RJTUUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDMpCi0jZGVmaW5lIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNCkKLSNkZWZpbmUgTTRXQVJfVElNRV9PVVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA1KQotLyoqIFRoZSBidWZmZXIgaXMgZnVsbCovCi0jZGVmaW5lIE00V0FSX0JVRkZFUl9GVUxMICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNikKLS8qIFRoZSBzZXJ2ZXIgYXNrcyBmb3IgYSByZWRpcmVjdGlvbiAqLwotI2RlZmluZSBNNFdBUl9SRURJUkVDVCAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNykKLSNkZWZpbmUgTTRXQVJfVE9PX01VQ0hfU1RSRUFNUyAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDA4KQotLyogU0YgQ29kZWMgZGV0ZWN0ZWQgSU5GT19GT1JNQVRfQ0hBTkdFIGR1cmluZyBkZWNvZGUgKi8KLSNkZWZpbmUgTTRXQVJfSU5GT19GT1JNQVRfQ0hBTkdFIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNF9DT01NT04sIDB4MDAwMDA5KQotCi0jZW5kaWYgLypNNE9TQV9FUlJPUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FeHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjdhNmU4MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FeHBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE9TQV9FeHBvcnQuaAotICogQGJyaWVmICAgIERhdGEgYWNjZXNzIGV4cG9ydCB0eXBlcyBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdHlwZXMgd2hpY2ggbXVzdCBiZQotICogICAgICAgICAgdXNlZCB0byBpbXBvcnQgb3IgZXhwb3J0IGFueSBmdW5jdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRVhQT1JUX0gKLSNkZWZpbmUgTTRPU0FfRVhQT1JUX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBPU0FMIEVYUE9SVFMgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBDSEFSX1NUQVIgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9DTE9DS19FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBDTE9DSyAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9EQVRFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBEQVRFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgLyoqPCBPU0FMIEZJTEUgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgUkVBTCBUSU1FICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfU09DS0VUX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBTT0NLRVQgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NUUklOR19FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgT1NBTCBTVFJJTkcgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9VUklfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgLyoqPCBPU0FMIFVSSSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgTUVNT1JZICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgVFJBQ0UgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVE9PTF9USU1FUl9FWFBPUlRfVFlQRSAgICAgICAgLyoqPCBPU0FMIFRPT0wgVElNRVIgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NZU1RFTV9DTV9FWFBPUlRfVFlQRSAgICAgICAgLyoqPCBTWVNURU0gQ09NTU9OIEFQSSAgICAqLwotI2RlZmluZSBNNE9TQUxfTElOS0VEX0xJU1RfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgVE9PTCBMSU5LRUQgTElTVCAgICAqLwotI2RlZmluZSBNNE9TQUxfTUVNT1JZX01BTkFHRVJfRVhQT1JUX1RZUEUgICAgLyoqPCBNRU1PUlkgTUFOQUdFUiAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RSQUNFX01BTkFHRVJfRVhQT1JUX1RZUEUgICAgLyoqPCBUT09MIFRSQUNFIE1BTkFHRVIgKi8KLSNkZWZpbmUgTTRWUFNfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgVlBTIEFQSSAgICAgICAgICAgICovCi0jZGVmaW5lIE00QVBfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQVVESU8gUFJFU0VOVEVSUyAgICAqLwotI2RlZmluZSBNNFZQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZJREVPIFBSRVNFTlRFUlMgICAgKi8KLSNkZWZpbmUgTTRDQl9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBDYWxsIGJhY2sgICAgICAgICAgICAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotI2VuZGlmIC8qTTRPU0FfRVhQT1JUX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYyYWZiOGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVDb21tb24uaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHVzZWQgYnkgYm90aCB0aGUgZmlsZQotICogICAgICAgICAgICAgICB3cml0ZXIgYW5kIGZpbGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVDT01NT05fSAotI2RlZmluZSBNNE9TQV9GSUxFQ09NTU9OX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLQotCi10eXBlZGVmIE00T1NBX0ludDMyIE00T1NBX0ZpbGVQb3NpdGlvbjsKLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlIGFjY2Vzcy4KLSAqICBpZSwgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gcmVhZCBvciB0byB3cml0ZSAgb3IKLSAqICBib3RoIHRvIHJlYWQgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUuCi0gKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgTU0gcHJvamVjdCBvbmx5LiBJdCBlbmFibGVzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIGEgZmlsZQotICogIHdpdGggb25lIGRlc2NyaXB0b3IuCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa0Rlc2NOb25lQWNjZXNzICAgID0gMHgwMCwKLSAgIE00T1NBX2tEZXNjUmVhZEFjY2VzcyAgICA9IDB4MDEsICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBvbmx5IGZyb20gdGhlIGZpbGUgKi8KLSAgIE00T1NBX2tEZXNjV3JpdGVBY2Nlc3MgICAgPSAweDAyLCAgICAvKiogVGhlIERlc2NyaXB0b3Igd3JpdGVzIG9ubHkgZnJvbSB0aGUgZmlsZSovCi0gICBNNE9TQV9rRGVzY1JXQWNjZXNzICAgICAgICA9IDB4MDMgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHJlYWRzIGFuZCB3cml0ZXMgZnJvbS9pbiB0aGUgZmlsZSovCi19IE00T1NBX0Rlc2NyTW9kZUFjY2VzczsKLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgbW9kZSBhY2Nlc3MuIEJvdGggdGV4dCBtb2RlIGFzIGJpbmFyeSBtb2RlCi0gICAgY2Fubm90IGJlIHNldCB0b2dldGhlci4qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAvKiogVGhlIGZpbGUgbXVzdCBiZSBhY2Nlc3NlZCBpbiByZWFkIG9ubHkgbW9kZSovCi0gICBNNE9TQV9rRmlsZVJlYWQgICAgICAgICAgICAgPSAweDAxLAotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gd3JpdGUgb25seSBtb2RlKi8KLSAgIE00T1NBX2tGaWxlV3JpdGUgICAgICAgICAgICA9IDB4MDIsCi0gICAvKiogVGhlIGZpbGUgbXVzdCBiZSBhY2Nlc3NlZCBpbiBhcHBlbmQgbW9kZSAoQW4gZXhpc3RpbmcgZmlsZSBtdXN0Ci0gICAgICAgYmUgYXZhaWxhYmxlIHRvIGFwcGVuZCBkYXRhKSovCi0gICBNNE9TQV9rRmlsZUFwcGVuZCAgICAgICAgICAgPSAweDA0LAotICAgLyoqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQqLwotICAgTTRPU0Ffa0ZpbGVDcmVhdGUgICAgICAgICAgID0gMHgwOCwKLSAgIC8qKiBEYXRhIGFyZSBwcm9jZXNzZWQgYXMgYmluYXJ5IG9uZSwgdGhlcmUgaXMgbm8gZGF0YSBtYW5hZ2VtZW50Ki8KLSAgIE00T1NBX2tGaWxlSXNUZXh0TW9kZSAgICAgICA9IDB4MTAKLX0gTTRPU0FfRmlsZU1vZGVBY2Nlc3M7Ci0KLQotLyoqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIGEgZGF0ZS4qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8qKiBUaW1lIHNjYWxlICh0aWNrIG51bWJlciBwZXIgc2Vjb25kKSovCi0gICBNNE9TQV9VSW50MzIgdGltZVNjYWxlOwotICAgLyoqIERhdGUgZXhwcmVzc2VkIGluIHRoZSB0aW1lIHNjYWxlKi8KLSAgIE00T1NBX1RpbWUgICB0aW1lOwotICAgLyoqIFllYXIgb2YgdGhlIGFic29sdXRlIHRpbWUgKDE5MDAsIDE5NzAgb3IgMjAwMCkqLwotICAgTTRPU0FfVUludDMyIHJlZmVyZW5jZVllYXI7Ci19IE00T1NBX0RhdGU7Ci0KLQotLyoqIFRoaXMgc3RydWN1cmUgZGVmaW5lcyB0aGUgZmlsZSBhdHRyaWJ1dGVzKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAvKiogVGhlIGZpbGUgbW9kZSBhY2Nlc3MqLwotICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgICAgbW9kZUFjY2VzczsKLSAgIC8qKiBUaGUgY3JlYXRpb24gZGF0ZSovCi0gICBNNE9TQV9EYXRlICAgICAgICAgICAgICBjcmVhdGlvbkRhdGU7Ci0gICAvKiogVGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbW9kaWZpZWREYXRlOwotICAgLyoqIFRoZSBsYXN0IGFjY2VzcyBkYXRlIChyZWFkKSovCi0gICBNNE9TQV9EYXRlICAgICAgICAgICAgICBsYXN0QWNjZXNzRGF0ZTsKLX0gTTRPU0FfRmlsZUF0dHJpYnV0ZTsKLQotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgc2VlayBiZWhhdmlvciovCi10eXBlZGVmIGVudW0gTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlCi17Ci0gICAvKiogUmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSovCi0gICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgICAgICAgICAgICA9IDB4MDEsCi0gICAvKiogUmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCi0gICBNNE9TQV9rRmlsZVNlZWtFbmQgICAgICAgICAgICAgICAgICA9IDB4MDIsCi0gICAvKiogUmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiovCi0gICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50ICAgICAgICAgICAgICA9IDB4MDMKLX0gTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlOwotCi0KLS8qIEVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfRklMRV9MT0NLRUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAyKQotI2RlZmluZSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDMpCi0jZGVmaW5lIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwNCkKLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFQ09NTU9OX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb25fcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWJhNDU2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb25fcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVDb21tb25fcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24gcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUKLSAqICAgICAgICAgICAgICAgd3JpdGVyIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRUNPTU1PTl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNPTU1PTl9QUklWX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTTRPU0FfaXNBY2Nlc3NNb2RlQWN0aXZlZChjb21wb3VuZF9tb2RlX2FjY2VzcyxlbGVtZW50YXJ5X21vZGVfYWNjZXNzKVwKLSAgICAgICAgKCgoY29tcG91bmRfbW9kZV9hY2Nlc3MpJihlbGVtZW50YXJ5X21vZGVfYWNjZXNzKSk/IDE6MCkKLQotCi10eXBlZGVmIGVudW0gTTRPU0FfTGFzdFNlZWsKLXsKLSAgIFNlZWtOb25lLAotICAgU2Vla1JlYWQsCi0gICBTZWVrV3JpdGUKLX0gTTRPU0FfTGFzdFNlZWs7Ci0KLS8qKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmaWxlIGNvbnRleHQqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3JlYWQ7Ci0gICBNNE9TQV9VSW50MzIgICAgICAgICBjb3JlSURfd3JpdGU7Ci0gICBGSUxFKiAgICAgICAgICAgICAgICBmaWxlX2Rlc2M7Ci0gICAvKiogVGhlIG5hbWUgb2YgdGhlIFVSTCAqLwotICAgTTRPU0FfQ2hhciogICAgICAgICAgdXJsX25hbWU7Ci0gICAvKiogVGhlIG5hbWUgb2YgdGhlIGZpbGUgKi8KLSAgIE00T1NBX0NoYXIqICAgICAgICAgIGZpbGVfbmFtZTsKLSAgIC8qKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSAqLwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgZmlsZV9zaXplOwotICAgLyoqIFRoZSBmaWxlIG1vZGUgYWNjZXNzIHVzZWQgdG8gb3BlbiB0aGUgZmlsZSAqLwotICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgYWNjZXNzX21vZGU7Ci0gICBNNE9TQV9MYXN0U2VlayAgICAgICBjdXJyZW50X3NlZWs7Ci0gICBNNE9TQV9GaWxlUG9zaXRpb24gICByZWFkX3Bvc2l0aW9uOwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgd3JpdGVfcG9zaXRpb247Ci0gICBNNE9TQV9Cb29sICAgICAgICAgICBiX2lzX2VuZF9vZl9maWxlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgTTRPU0FfQ29udGV4dCAgICAgICAgc2VtYXBob3JlX2NvbnRleHQ7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSAgIC8qIFRoZXNlIHR3byB2YXJpYWJsZXMgd2VyZSBhZGRlZCB0byBtYW5hZ2UgY2FzZSB3aGVyZSBhIGZpbGUKLSAgICAqIGlzIG9wZW5lZCBpbiByZWFkIGFuZCB3cml0ZSBtb2RlIHdpdGggb25lIGRlc2NyaXB0b3IgKi8KLSAgICBNNE9TQV9EZXNjck1vZGVBY2Nlc3MgICAgbV9EZXNjck1vZGVBY2Nlc3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aUxvY2tNb2RlOwotCi0KLX0gTTRPU0FfRmlsZUNvbnRleHQ7Ci0KLQotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfVUludDE2IGNvcmVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgZmlsZU1vZGVBY2Nlc3MpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX1VJbnQxNiBjb3JlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlQXR0cmlidXRlKiBhdHRyaWJ1dGUpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldFVSTChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogdXJsKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZShNNE9TQV9DaGFyKiB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiBmaWxlbmFtZSk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uU2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOwotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLU00T1NBX0VSUiBNNE9TQV9Ub1VURjhfT1NBTCAoTTRPU0FfVm9pZCAgICpwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICAqcEJ1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpidWZmZXJPdXRTaXplKTsKLSNlbmRpZiAvKlVURl9DT05WRVJTSU9OKi8KLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFQ09NTU9OX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzIyNzU2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gcmVhZCBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVSRUFERVJfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlUmVhZEdldE9wdGlvbigpCi0gICAgYW5kIE00T1NBX0ZpbGVSZWFkU2V0T3B0aW9uKCkqLwotdHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQKLXsKLSAgIC8qKiBHZXQgdGhlIGZpbGUgc2l6ZSAoTTRPU0FfZnBvcyopKi8KLSAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDEpLAotCi0gICAgICAvKiogR2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDIpLAotCi0gICAvKiogR2V0IHRoZSBmaWxlIFVSTCwgcHJvdmlkZWQgYnkgdGhlIE00T1NBX0ZpbGVSZWFkT3BlbiAoTTRPU0FfQ2hhciopKi8KLSAgIE00T1NBX2tGaWxlUmVhZEdldFVSTAotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAzKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBwb3NpdGlvbiAoTTRPU0FfZnBvcyopKi8KLSAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbgotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDA0KSwKLQotICAgLyoqIENoZWNrIGVuZCBvZiBmaWxlOiBUUlVFIGlmIHRoZSBFT0YgaGFzIGJlZW4gcmVhY2hlZCwgRkFMU0UgZWxzZQotICAgICAgIChNNE9TQV9Cb29sKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkSXNFT0YKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNSksCi0KLSAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KLSAgIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRFdSSVRFLCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNikKLQotfSBNNE9TQV9GaWxlUmVhZE9wdGlvbklEOwotCi0KLQotCi0KLS8qKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHNldCBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhY2Nlc3MgdG8gYQotICAgIGZpbGUgaW4gcmVhZCBtb2RlKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBNNE9TQV9FUlIgKCpvcGVuUmVhZCkgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICBNNE9TQV9FUlIgKCpyZWFkRGF0YSkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUpOwotCi0gICBNNE9TQV9FUlIgKCpzZWVrKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotICAgTTRPU0FfRVJSICgqY2xvc2VSZWFkKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLSAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotICAgTTRPU0FfRVJSICgqZ2V0T3B0aW9uKSAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlKTsKLX0gTTRPU0FfRmlsZVJlYWRQb2ludGVyOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuICAgICAgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHNpemUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrICAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2UgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbiAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAgLypNNE9TQV9GSUxFUkVBREVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjdiMDg2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBwcml2YXRlIGZvciBBbmRyb2lkCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9GSUxFUkVBREVSX1BSSVZfSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX1BSSVZfSAotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfUE9TSVRJT04gICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0KLSNlbmRpZiAvKk00T1NBX0ZJTEVSRUFERVJfUFJJVl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlci5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTExMzMxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlcgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byB3cml0ZSBpbiBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVXUklURVJfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIG9wdGlvbiBJRCB0byBiZSB1c2VkIGluIE00T1NBX0ZpbGVXcml0ZUdldE9wdGlvbigpCi1hbmQgTTRPU0FfRmlsZVdyaXRlU2V0T3B0aW9uKCkqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAvKiogR2V0IHRoZSBmaWxlIFVSTCwgcHJvdmlkZWQgYnkgdGhlIE00T1NBX0ZpbGVXcml0ZU9wZW4gKE00T1NBX0NoYXIqKSovCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0VVJMCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDEpLAotCi0gICAvKiogR2V0IHRoZSBmaWxlIGF0dHJpYnV0ZXMgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKSovCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0QXR0cmlidXRlCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDIpLAotCi0gICAvKiogR2V0IHRoZSByZWFkZXIgY29udGV4dCBmb3IgcmVhZCAmIHdyaXRlIGZpbGUuIChNNE9TQV9Db250ZXh0KikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFJlYWRlckNvbnRleHQKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwMyksCi0KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlUG9zaXRpb24KLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNCksCi0KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA1KSwKLQotCi0gICAgTTRPU0Ffa0ZpbGVXcml0ZUxvY2tNb2RlCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRFdSSVRFLCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNiksCi0KLQotICAgLyoqIENoZWNrIGxvY2sgb2YgZmlsZSAqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZURlc2NNb2RlCi0gICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDcpCi19IE00T1NBX0ZpbGVXcml0ZU9wdGlvbklEOwotCi0KLS8qKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHNldCBvZiB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBhY2Nlc3MgdG8gYSBmaWxlCi0gICAgaW4gcmVhZCBtb2RlKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBNNE9TQV9FUlIgKCpvcGVuV3JpdGUpICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICBNNE9TQV9FUlIgKCp3cml0ZURhdGEpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpOwotCi0gICBNNE9TQV9FUlIgKCpzZWVrKSAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotICAgTTRPU0FfRVJSICgqRmx1c2gpICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotICAgTTRPU0FfRVJSICgqY2xvc2VXcml0ZSkgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotICAgTTRPU0FfRVJSICgqc2V0T3B0aW9uKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotICAgTTRPU0FfRVJSICgqZ2V0T3B0aW9uKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSk7Ci19IE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlT3BlbiAgICAgICAoTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRGF0YSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUpOwotCi0vKiBQaWVycmUgTGViZWF1cGluIDIwMDgvMDQvMjk6IFdBUk5JTkchIHRoZSBmZWF0dXJlIG9mIGZpbGUqU2VlayB3aGljaCByZXR1cm5zCi10aGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgKGZyb20gdGhlIGJlZ2lubmluZykgYWZ0ZXIgdGhlIHNlZWsgaW4gdGhlICJwb3NpdGlvbiIKLXBvaW50ZXIgaGFzIGJlZW4gZm91bmQgdG8gYmUgdW5yZWxpYWJseSAob3Igc29tZXRpbWVzIG5vdCBhdCBhbGwpIGltcGxlbWVudGVkCi1pbiBzb21lIE9TQUxzLCBzbyByZWx5aW5nIG9uIGl0IGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLCB1bmxlc3MgeW91IHJlYWxseSB3YW50Ci10byBoYXZlIGEgcGl6emEgZXZlbmluZy4gKi8KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZWVrICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24pOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlQ2xvc2UgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUZsdXNoICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24gIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKk00T1NBX0ZJTEVXUklURVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkOTcyZjQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIHByaXZhdGUgZm9yIEFuZHJvaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSAotI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSAotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0KLSNlbmRpZiAvKk00T1NBX0ZJTEVXUklURVJfUFJJVl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTRkMTVjYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX01lbW9yeS5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZnVuY3Rpb24gcHJvdG90eXBlcyB0byBhbGxvY2F0ZQotICogICAgICAgICAgICAgICBhbmQgZnJlZSBtZW1vcnkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX01FTU9SWV9ICi0jZGVmaW5lIE00T1NBX01FTU9SWV9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIgLypmb3IgTTRPU0FfQ29yZUlEIGRlZmluaXRpb24qLwotCi10eXBlZGVmIE00T1NBX0ludDMyKiBNNE9TQV9NZW1BZGRyMzI7Ci10eXBlZGVmIE00T1NBX0ludDgqICBNNE9TQV9NZW1BZGRyODsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db3JlSUQgY29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKTsKLQotTTRPU0FMX01FTU9SWV9FWFBPUlRfVFlQRSBleHRlcm4gTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KHZvaWQpOwotCi0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTXV0ZXguaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0OTZiZGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTXV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX011dGV4LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBtdXRleCBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9NVVRFWF9ICi0jZGVmaW5lIE00T1NBX01VVEVYX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLQotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhPcGVuKCAgICBNNE9TQV9Db250ZXh0KiBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleExvY2soICAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgICB0aW1lb3V0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleFVubG9jayggIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4Q2xvc2UoICAgTTRPU0FfQ29udGV4dCAgY29udGV4dCApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKk00T1NBX01VVEVYX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9PcHRpb25JRC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjFiOTA0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9PcHRpb25JRC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfT3B0aW9uSUQuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIE9wdGlvbiBJRCBtYWNyb3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgbWFjcm9zIHRvIGdlbmVyYXRlIGFuZCBhbmFseXplIG9wdGlvbiBJRC4KLSAqICAgICAgICAgICAgICAgT3B0aW9uIElEIGlzIHVzZWQgYnkgTTRZWVlfWlpzZXRPcHRpb24oKSBhbmQKLSAqICAgICAgICAgICAgICAgTTRZWVlfWlpnZXRPcHRpb24oKSBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX09QVElPTklEX0gKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKiogTTRPU0FfT3B0aW9uSUQgaXMgYSAzMiBiaXRzIHVuc2lnbmVkIGludGVnZXIuCi0tIFJpZ2h0IGFjY2VzcyAoMiBiaXRzKTogU29tZSBvcHRpb25zIG1heSBoYXZlIHJlYWQgb25seSwgd3JpdGUgb25seSBvciByZWFkCi0gIGFuZCB3cml0ZSBhY2Nlc3MKLS0gQ29yZSBJRCAoMTQgYml0cyk6IEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ci0tIFN1Yk9wdGlvbiBJRCAoMTYgYml0cyk6IFRvIHNlbGVjdCB3aGljaCBvcHRpb24gaW4gYSBzcGVjaWZpYyBjb3JlIGNvbXBvbmVudAotKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00T1NBX09wdGlvbklEOwotdHlwZWRlZiB2b2lkKiAgICAgICAgTTRPU0FfRGF0YU9wdGlvbjsKLQotI2RlZmluZSBNNF9SRUFEICAgICAgMHgwMQotI2RlZmluZSBNNF9XUklURSAgICAgMHgwMgotI2RlZmluZSBNNF9SRUFEV1JJVEUgMHgwMwotCi0vKiBNYWNybyB0byBwcm9jZXNzIE00T1NBX09wdGlvbklEICovCi0KLS8qKiBUaGlzIG1hY3JvIGNyZWF0ZXMgYW4gb3B0aW9uSUQgZ2l2ZW4gcmVhZC93cml0ZSBhY2Nlc3MsCi0gICAgY29yZUlEIGFuZCBTdWJPcHRpb25JRCovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9DUkVBVEUocmlnaHQsIGNvcmVJRCwgZXJyb3JJRClcCi0gICAoTTRPU0FfSW50MzIpKCgoKCgoTTRPU0FfVUludDMyKXJpZ2h0KSYweDAzKTw8MzApKSsoKCgoTTRPU0FfVUludDMyKWNvcmVJRCkmMHgwMDNGRkYpPDwxNikrKCgoTTRPU0FfVUludDMyKWVycm9ySUQpJjB4MDBGRkZGKSkKLQotLyoqIFRoaXMgbWFjcm8gc3BsaXRzIGFuIG9wdGlvbklEIGludG8gcmVhZC93cml0ZSBhY2Nlc3MsCi0gICAgY29yZUlEIGFuZCBTdWJPcHRpb25JRCovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9TUExJVChvcHRpb25JRCwgcmlnaHQsIGNvcmVJRCwgZXJyb3JJRClcCi0gICB7IHJpZ2h0PShNNE9TQV9VSW50OCkoKG9wdGlvbklEKT4+MzApO1wKLSAgICAgY29yZUlEPShNNE9TQV9VSW50MTYpKCgob3B0aW9uSUQpPj4xNikmMHgwMDAwM0ZGRik7XAotICAgICBlcnJvcklEPShNNE9TQV9VSW50MzIpKChvcHRpb25JRCkmMHgwMDAwRkZGRik7IH0KLQotLyoqIFRoaXMgbWFjcm8gcmV0dXJucyAxIGlmIHRoZSBvcHRpb25JRCBpcyB3cml0YWJsZSwgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpICgoKChvcHRpb25JRCk+PjMwKSZNNF9XUklURSkhPTApCi0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaXMgcmVhZGFibGUsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX1JFQURBQkxFKG9wdGlvbklEKSAoKCgob3B0aW9uSUQpPj4zMCkmTTRfUkVBRCkhPTApCi0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaGFzIGl0cyBjb3JlIElEIGVxdWFsIHRvICdjb3JlSUQnLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIGNvcmVJRClcCi0gICAoKCgoKG9wdGlvbklEKT4+MTYpJjB4MDAzRkZGKSA9PSAoY29yZUlEKSkgPyBNNE9TQV9UUlVFOk00T1NBX0ZBTFNFKQotCi0KLSNlbmRpZiAgIC8qTTRPU0FfT1BUSU9OSURfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2MzA0NTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfU2VtYXBob3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIHNlbWFwaG9yZSBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfU0VNQVBIT1JFX0gKLSNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVPcGVuKCAgTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgaW5pdGlhbE51bWJlciApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlUG9zdCggIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVdhaXQoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAgICB0aW1lb3V0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVDbG9zZSggTTRPU0FfQ29udGV4dCAgY29udGV4dCApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKk00T1NBX1NFTUFQSE9SRV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5NmFmYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWQuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIHRocmVhZCBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9USFJFQURfSAotI2RlZmluZSBNNE9TQV9USFJFQURfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLQotLyogRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX1RIUkVBRCwweDAwMDAwMSkKLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tUaHJlYWRPcGVuZWQgICA9IDB4MTAwLAotICAgTTRPU0Ffa1RocmVhZFN0YXJ0aW5nID0gMHgyMDAsCi0gICBNNE9TQV9rVGhyZWFkUnVubmluZyAgPSAweDMwMCwKLSAgIE00T1NBX2tUaHJlYWRTdG9wcGluZyA9IDB4NDAwLAotICAgTTRPU0Ffa1RocmVhZENsb3NlZCAgPSAweDUwMAotfSBNNE9TQV9UaHJlYWRTdGF0ZTsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa1RocmVhZEhpZ2hlc3RQcmlvcml0eSAgPSAgMHgwMDAsCi0gICBNNE9TQV9rVGhyZWFkSGlnaFByaW9yaXR5ICAgICA9ICAweDEwMCwKLSAgIE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSAgID0gIDB4MjAwLAotICAgTTRPU0Ffa1RocmVhZExvd1ByaW9yaXR5ICAgICAgPSAgMHgzMDAsCi0gICBNNE9TQV9rVGhyZWFkTG93ZXN0UHJpb3JpdHkgICA9ICAweDQwMAotfSBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9UaHJlYWRTdGFydGVkCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDAxKSwKLQotICAgTTRPU0FfVGhyZWFkU3RvcHBlZAotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMiksCi0KLSAgIE00T1NBX1RocmVhZFByaW9yaXR5Ci0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDAzKSwKLQotICAgTTRPU0FfVGhyZWFkTmFtZQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNCksCi0KLSAgIE00T1NBX1RocmVhZFN0YWNrU2l6ZQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNSksCi0KLSAgIE00T1NBX1RocmVhZFVzZXJEYXRhCi0gICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRHxNNF9XUklURSwgTTRPU0FfVEhSRUFELCAweDA2KQotCi19IE00T1NBX1RocmVhZE9wdGlvbklEOwotCi0KLQotdHlwZWRlZiBNNE9TQV9FUlIgICgqTTRPU0FfVGhyZWFkRG9JdCkoTTRPU0FfVm9pZCopOwotdHlwZWRlZiBNNE9TQV9Wb2lkICgqTTRPU0FfVGhyZWFkQ2FsbEJhY2spKE00T1NBX0NvbnRleHQsIE00T1NBX1ZvaWQqKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jT3BlbiggICAgIE00T1NBX0NvbnRleHQqICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkRG9JdCAgICAgIGZ1bmMgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdGFydCggICAgTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgcGFyYW0gKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdG9wKCAgICAgTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNDbG9zZSggICAgTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSggTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRTdGF0ZSogICAgc3RhdGUgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFNsZWVwKCAgICAgICAgTTRPU0FfVUludDMyICAgICAgICAgIHRpbWUgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24oTTRPU0FfQ29udGV4dCAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgICAgIHZhbHVlICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qICAgICB2YWx1ZSApOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0KLSNlbmRpZiAvKk00T1NBX1RIUkVBRF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MjRiMDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZF9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBUaHJlYWQgcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfVEhSRUFEX1BSSVZfSAotI2RlZmluZSBNNE9TQV9USFJFQURfUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotLyogQ29udGV4dCBmb3IgdGhlIHRocmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgTTRPU0FfVGhyZWFkQ29udGV4dCB7Ci0gICBNNE9TQV9VSW50MzIgY29yZUlEOyAgICAgICAgICAgICAgICAvKiB0aHJlYWQgY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgcHRocmVhZF90IHRocmVhZElEOyAgICAgICAgICAgICAgICAgLyogdGhyZWFkIGlkZW50aWZpZXIuICovCi0gICBNNE9TQV9DaGFyKiBuYW1lOyAgICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgbmFtZSAqLwotICAgTTRPU0FfVUludDMyIHN0YWNrU2l6ZTsgICAgICAgICAgICAgLyogdGhyZWFkIHN0YWNrU2l6ZSBpbiBieXRlcyAqLwotICAgTTRPU0FfVGhyZWFkRG9JdCBmdW5jOyAgICAgICAgICAgICAgLyogdGhyZWFkIGZ1bmN0aW9uICovCi0gICBNNE9TQV9Wb2lkKiBwYXJhbTsgICAgICAgICAgICAgICAgICAvKiB0aHJlYWQgcGFyYW1ldGVyICovCi0vKgotICAgTTRPU0FfVm9pZCogdXNlckRhdGE7ICAgICAgICAgICAgICAgLyAqIHRocmVhZCB1c2VyIGRhdGEgKiAvCi0qLwotICAgTTRPU0FfVGhyZWFkU3RhdGUgc3RhdGU7ICAgICAgICAgICAgLyogdGhyZWFkIGF1dG9tYXRvbiBzdGF0ZSAqLwotICAgTTRPU0FfQ29udGV4dCBzdGF0ZU11dGV4OyAgICAgICAgICAgLyogbXV0ZXggZm9yIHRocmVhZCBzdGF0ZSBtYW5hZ2VtZW50ICovCi0vKgotICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RhcnRDYWxsQmFjazsgLyAqIHN0YXJ0aW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCi0gICBNNE9TQV9UaHJlYWRDYWxsQmFjayBzdG9wQ2FsbEJhY2s7ICAvICogc3RvcHBpbmcgdGhyZWFkIGNhbGwgYmFjayAqIC8KLSovCi0gICBNNE9TQV9Db250ZXh0IHNlbVN0YXJ0U3RvcDsgICAgICAgICAvKiBzZW1hcGhvcmUgZm9yIHN0YXJ0IGFuZCBzdG9wIGRvX2l0ICovCi0gICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5OyAvKiB0aHJlYWQgcHJpb3JpdHkgbGV2ZWwgKi8KLX0gTTRPU0FfVGhyZWFkQ29udGV4dCA7Ci0KLQotLyoqIFRob3NlIGRlZmluZSBlbmFibGUvZGlzYWJsZSBvcHRpb24gSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBUlRFRCAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RPUFBFRCAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSAgICAgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9USFJFQURfVVNFUl9EQVRBICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9USFJFQURfUFJJVl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMWYyNWVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RpbWUuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIFRpbWUgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRpbWUgdHlwZSBhbmQgYXNzb2NpYXRlZCBtYWNyb3Mgd2hpY2ggbXVzdAotICogICAgICAgICAgICAgICBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGltZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qICRJZDogTTRPU0FfVGltZS5oLHYgMS4yIDIwMDcvMDEvMDUgMTM6MTI6MjIgdGhlbmF1bHQgRXhwICQgKi8KLQotI2lmbmRlZiBNNE9TQV9USU1FX0gKLSNkZWZpbmUgTTRPU0FfVElNRV9ICi0KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICBNNE9TQV9UaW1lOwotCi0KLS8qKiBUaGlzIG1hY3JvIHNldHMgdGhlIHVua25vd24gdGltZSB2YWx1ZSAqLwotCi0jZGVmaW5lIE00T1NBX1RJTUVfVU5LTk9XTiAweDgwMDAwMDAwCi0KLS8qKiBUaGlzIG1hY3JvIGNvbnZlcnRzIGEgdGltZSB3aXRoIGEgdGltZSBzY2FsZSB0byBtaWxsaXNlY29uZC4KLSAgICBUaGUgcmVzdWx0IGlzIGEgTTRPU0FfRG91YmxlKi8KLSNkZWZpbmUgTTRPU0FfVElNRV9UT19NUyhyZXN1bHQsIHRpbWUsIHRpbWVzY2FsZSlcCi0gICAgICB7IHJlc3VsdCA9ICgxMDAwKihNNE9TQV9Eb3VibGUpdGltZSkvKChNNE9TQV9Eb3VibGUpdGltZXNjYWxlKTsgfQotCi0jZW5kaWYgLypNNE9TQV9USU1FX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWUyNThhMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1R5cGVzLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBBYnN0cmFjdGlvbiB0eXBlcyBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgcmVkZWZpbmVzIGJhc2ljIHR5cGVzIHdoaWNoIG11c3QgYmUKLSAqICAgICAgICAgICAgICAgdXNlZCB0byBkZWNsYXJlIGFueSB2YXJpYWJsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX1RZUEVTX0gKLSNkZWZpbmUgTTRPU0FfVFlQRVNfSAotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIk00T1NBX0V4cG9ydC5oIgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLXR5cGVkZWYgaW50OF90ICAgICBNNE9TQV9Cb29sOwotdHlwZWRlZiB1aW50OF90ICAgIE00T1NBX1VJbnQ4OwotdHlwZWRlZiBpbnQ4X3QgICAgIE00T1NBX0ludDg7Ci10eXBlZGVmIHVpbnQxNl90ICAgTTRPU0FfVUludDE2OwotdHlwZWRlZiBpbnQxNl90ICAgIE00T1NBX0ludDE2OwotdHlwZWRlZiB1aW50MzJfdCAgIE00T1NBX1VJbnQzMjsKLXR5cGVkZWYgaW50MzJfdCAgICBNNE9TQV9JbnQzMjsKLQotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfQ2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1VDaGFyOwotCi10eXBlZGVmIGRvdWJsZSAgICAgICAgICBNNE9TQV9Eb3VibGU7Ci10eXBlZGVmIGZsb2F0ICAgICAgICAgICBNNE9TQV9GbG9hdDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfV0NoYXI7Ci0KLXR5cGVkZWYgdm9pZCAgICAgICAgICAgIE00T1NBX1ZvaWQ7Ci0KLS8qIE1pbiAmIG1heCBkZWZpbml0aW9ucyovCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDhfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDE2X01BWCAgICAgICAgICAgICA2NTUzNQotCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDMyX01BWCAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0lOVDhfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfSU5UOF9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX0lOVDE2X01JTiAgICAgICAgICAgICAtMzI3NjgKLSNkZWZpbmUgTTRPU0FfSU5UMTZfTUFYICAgICAgICAgICAgICAzMjc2NwotCi0jZGVmaW5lIE00T1NBX0lOVDMyX01JTiAgICAgICAoLTB4N0ZGRkZGRkYtMSkKLSNkZWZpbmUgTTRPU0FfSU5UMzJfTUFYICAgICAgICAgMHg3RkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0NIQVJfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfQ0hBUl9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX1VDSEFSX01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUNIQVJfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX05VTEwgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1RSVUUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE00T1NBX0ZBTFNFICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1dBSVRfRk9SRVZFUiAgICAgICAweGZmZmZmZmZmCi0KLSNkZWZpbmUgTTRPU0FfQ09OU1QgICAgICAgICAgICAgICAgICAgY29uc3QKLSNkZWZpbmUgTTRPU0FfSU5MSU5FICAgICAgICAgICAgICAgICBpbmxpbmUKLQotLyogUm9sbG92ZXIgb2Zmc2V0IG9mIHRoZSBjbG9jayAqLwotLyogVGhpcyB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgb2YgTTRPU0FfY2xvY2tHZXRUaW1lICovCi0jZGVmaW5lIE00T1NBX0NMT0NLX1JPTExPVkVSICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLQotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0OwotCi0vKiogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQqLwotdHlwZWRlZiAgTTRPU0FfVUludDE2IE00T1NBX0NvcmVJRDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qTTRPU0FfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjEzMzg3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBNNE9TQV9DaGFyU3Rhci5jIFwKLSAgICBNNE9TQV9DbG9jay5jIFwKLSAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXAotICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcCi0gICAgTTRPU0FfRmlsZVdyaXRlci5jIFwKLSAgICBNNE9TQV9NdXRleC5jIFwKLSAgICBNNE9TQV9SYW5kb20uYyBcCi0gICAgTTRPU0FfU2VtYXBob3JlLmMgXAotICAgIE00T1NBX1RocmVhZC5jIFwKLSAgICBNNFBTV19EZWJ1Z1RyYWNlLmMgXAotICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwKLSAgICBNNFBTV19UcmFjZS5jIFwKLSAgICBMVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1EX19BTkRST0lEX18gXAotICAgIC1ETTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQ09ERUNTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfUkVBREVSUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfM0dQUF9SRUFERVIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTFlMDA4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmMKLSAqIEBicmllZgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBmaWxlc3lzdGVtIGFjY2VzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqIEFkZGl0aW9uIG9mIFRyYWNlIElEICoqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBNNFRSQUNFX0lECi0jdW5kZWYgTTRUUkFDRV9JRAotI2VuZGlmCi0jZGVmaW5lIE00VFJBQ0VfSUQgICAgTTRPU0FfRklMRV9SRUFERVIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgIkxWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCIKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgI2luY2x1ZGUgIk00T1NBX0ZpbGVBY2Nlc3MuaCIKLSNlbmRpZgotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKHJldHZhbCk7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRmlsZSByZWFkZXIgY2FjaGUgYnVmZmVycyBwYXJhbWV0ZXJzIChzaXplLCBudW1iZXIgb2YgYnVmZmVycywgZXRjKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9TSVpFICAgIDEwMjQqMTYKLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9OQiAgICAgICAgMgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05PTkUgICAgLTEKLSNkZWZpbmUgTTRPU0FfRU9GICAgICAgICAgICAgICAgLTEKLQotI2RlZmluZSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1MgICAgTTRPU0FfUkVBREJVRkZFUl9OQioyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgQnVmZmVycyBjb250ZXh0IChwcml2YXRlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgICBkYXRhOyAgICAgICAgLyoqPCBidWZmZXIgZGF0YSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgc2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlcG9zOyAgICAvKio8IHBvc2l0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBidWZmZXIgc3RhcnRzICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICByZW1haW47ICAgICAgICAvKio8IGRhdGEgYW1vdW50IG5vdCBhbHJlYWR5IGNvcGllZCBmcm9tIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJGaWxsU2luY2VMYXN0QWNlc3M7ICAgIC8qKjwgVG8ga25vdyBzaW5jZSBob3cgbWFueSB0aW1lIHdlIGRpZG4ndCB1c2UgdGhpcyBidWZmZXIgKi8KLX0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIEZpbGUgUmVhZGVyIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBJc09wZW5lZDsgICAgICAgLyoqPCBNaWNybyBzdGF0ZSBtYWNoaW5lICovCi0gICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSAgICAgRmlsZUF0dHJpYnV0ZTsgIC8qKjwgT3BlbmluZyBtb2RlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgcmVhZEZpbGVQb3M7ICAgIC8qKjwgRWZmZWN0aXZlIHBvc2l0aW9uIG9mIHRoZSBHRkwgcmVhZCBwb2ludGVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgYWJzb2x1dGVQb3M7ICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCByZWFkaW5nICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgZmlsZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KLQotICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyX29wdGltIGJ1ZmZlcltNNE9TQV9SRUFEQlVGRkVSX05CXTsgIC8qKjwgUmVhZCBidWZmZXJzICovCi0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBhRmlsZURlc2M7ICAvKio8IEZpbGUgZGVzY3JpcHRvciAqLwotCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgRlM7ICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2Vsc2UKLSAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlM7ICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZW5kaWYKLQotfSBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW07Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICBHbG9iYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGxvdyBsZXZlbCByZWFkIGFjY2VzcyAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotc3RhdGljIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9uczsKLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9pbml0KE00T1NBX1ZvaWQgKmxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnMsIE00T1NBX1ZvaWQgKm9wdGltaXplZF9mdW5jdGlvblBvaW50ZXJzKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogbG93TGV2ZWxfZnAgID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIGxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnM7Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBvcHRpbWl6ZWRfZnAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnM7Ci0KLSAgICAvL1NldCB0aGUgb3B0aW1pemVkIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyCi0gICAgb3B0aW1pemVkX2ZwLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZWVrICAgICAgPSBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbTsKLQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fY2xlYW5VcCgpCi17Ci0KLSAgICBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fZ2V0TG93TGV2ZWxGdW5jdGlvbnMoTTRPU0FfVm9pZCAqKkZTKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqIHBGdW5jdGlvbnNQb2ludGVyID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqKSBGUzsKLSAgICAqcEZ1bmN0aW9uc1BvaW50ZXIgPSBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUmVhZCBhY2Nlc3MgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSAwOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotICAgIH0KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgCi0gICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0Iik7Ci0gICAgICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIGZyZWUoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsIE00T1NBX01lbUFkZHI4IHBEYXRhKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3B5c2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gb2Zmc2V0OwotCi0gICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9PSBNNE9TQV9FT0YpIHJldHVybiBNNE9TQV9FT0Y7Ci0KLSAgICBpZiggICAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICB8fCAocG9zID4gKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gMSkpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIGNvcGllZCAqLwotICAgIH0KLQotICAgIG9mZnNldCA9IHBvcyAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7Ci0KLSAgICBjb3B5c2l6ZSA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSBvZmZzZXQ7Ci0gICAgY29weXNpemUgPSAoc2l6ZSA8IGNvcHlzaXplKSA/IHNpemUgOiBjb3B5c2l6ZTsKLQotICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICsgb2Zmc2V0KSwgY29weXNpemUpOwotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluIC09IGNvcHlzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIHJldHVybiBjb3B5c2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGdyaWRQb3M7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgIHRlbXBQb3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBidWZmZXJTaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZGlmZjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIHNpemU7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICBmaWxlUmVhZFNpemUgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IDA7Ci0jZWxzZQotICAgIE00T1NBX0ludDMyICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIkJ1ZmZlckZpbGwgIGkgPSAlZCAgcG9zID0gJWxkICByZWFkID0gJWxkICBvbGQgPSAlbGQiLCBpLCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKLQotICAgIC8qIEF2b2lkIGN5Y2xpbmcgc3RhdGVtZW50IGJlY2F1c2Ugb2YgRU9GICovCi0gICAgaWYocG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotCi0gICAgLyogUmVsb2NhdGUgdG8gYWJzb2x1dGUgcG9zdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBidWZmZXJTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIHRlbXBQb3MgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKSAocG9zIC8gYnVmZmVyU2l6ZSk7Ci0gICAgZ3JpZFBvcyA9IHRlbXBQb3MgKiBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgZGlmZiA9IGdyaWRQb3MgLSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgaWYoZGlmZiAhPSAwKQotICAgIHsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IGRpZmY7Ci0gICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+c2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2Vla1Bvc2l0aW9uKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgZGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmVycm5vKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYocmV0X3ZhbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLSAgICB9Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKLQotICAgIC8qIFJlYWQgRGF0YSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGZpbGVSZWFkU2l6ZSA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnJlYWREYXRhKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCAmZmlsZVJlYWRTaXplKTsKLQotICAgIHNpemUgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKWZpbGVSZWFkU2l6ZTsKLSAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJybm8pJiYoTTRXQVJfTk9fREFUQV9ZRVQgIT0gZXJybm8pKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBzaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9SZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAoTTRPU0FfVUludDggKilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUsICZlcnJubyk7Ci0gICAgaWYoc2l6ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZgotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IHNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7Ci0KLSAgICAvKiBSZXRyaWV2ZSBjdXJyZW50IHBvc2l0aW9uICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikgJmFwQ29udGV4dC0+cmVhZEZpbGVQb3MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgcmV0dXJucyBOTyBEQVRBIFlFVCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbHNlCi0gICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKLQotICAgIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCi0gICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBtYXRjaGVzIHdpdGggZ2l2ZW4gcG9zICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZiggICAocG9zID49IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCi0gICAgICAgICAgICYmIChwb3MgPCAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE9TQV9SRUFEQlVGRkVSX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggY3VycmVudF9pKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaSxqOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtaW5fYW1vdW50LG1heF9hbW91bnQ7Ci0gICAgTTRPU0FfSW50OCBtaW5faSxtYXhfY291bnQ7Ci0KLSAgICAvKiB1cGRhdGUgbmJGaWxsU2luY2VMYXN0QWNlc3MgZmllbGQgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzICsrOwotICAgIH0KLQotICAgIC8qIFBsYW4gQSA6IFNjYW4gZm9yIGVtcHR5IGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF4X2NvdW50ID0gTTRPU0FfUkVBREJVRkZFUl9OQjsKLSAgICBtYXhfYW1vdW50ID0gTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTOwotCi0gICAgLyogUGxhbiBCIDogU2NhbiBmb3IgZGVhZCBidWZmZXIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID49IChNNE9TQV9VSW50MzIpIG1heF9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzczsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYobWF4X2NvdW50PE00T1NBX1JFQURCVUZGRVJfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMigiREVBRCBCVUZGRVI6ICVkLCAlZCIsbWF4X2NvdW50LGFwQ29udGV4dC0+YnVmZmVyW21heF9jb3VudF0ubmJGaWxsU2luY2VMYXN0QWNlc3MpOwotICAgICAgICByZXR1cm4gbWF4X2NvdW50OwotICAgIH0KLQotICAgIG1pbl9pID0gY3VycmVudF9pOwotICAgIG1pbl9hbW91bnQgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBpcyB0aGUgbW9zdCAiZW1wdHkiICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBqID0gKGkrY3VycmVudF9pKSVNNE9TQV9SRUFEQlVGRkVSX05COwotCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbiA8IG1pbl9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbl9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW47Ci0gICAgICAgICAgICBtaW5faSA9IGo7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWluX2k7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgLyogZ28gdG8gdGhlIGVuZCBvZiBmaWxlKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5maWxlU2l6ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZWxzZQotICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIDAsIE00T1NBX2tGaWxlU2Vla0VuZCwgJmVycm5vKTsKLQotICAgIGlmIChyZXRfdmFsICE9IDApCi0gICAgewotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gTTRPU0FfRU9GOwotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmV0cmlldmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICBhcENvbnRleHQtPmZpbGVTaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlc3lzdGVtIEFQSSAgICAgICAgICAgICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBvcGVucyB0aGUgcHJvdmlkZWQgZmlsZURlc2NyaXB0b3IgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKE9VVCkgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBGaWxlRGVzY3JpcHRvciA6ICAgICAgIChJTikgRmlsZSBEZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlLgotKiBAcGFyYW0gICAgICAgRmlsZU1vZGVBY2Nlc3MgOiAgICAgICAgKElOKSBGaWxlIG1vZGUgYWNjZXNzLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwQ29udGV4dCBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0IChpdCBtdXN0IGJlIGVpdGhlciBpc1RleHRNb2RlIG9yIHJlYWQpCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX05PVF9GT1VORCBUaGUgZmlsZSBjYW4gbm90IGJlIG9wZW5lZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzKQotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTKQotI2VuZGlmCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfRVJSICAgZXJyICAgICAgID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9Wb2lkKiBhRmlsZURlc2MgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0Jvb2wgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfRkFMU0U7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfVUludDE2IGVycm5vOwotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gcCA9IDB4JXAgZmQgPSAlcyBtb2RlID0gJWx1IiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIEZpbGVNb2RlQWNjZXNzKTsKLQotICAgIC8qICAgICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiAgICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQuICovCi0gICAgYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyICopIk00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSIpOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dCk7Ci0KLSAgICAvKiBTZXQgZmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotICAgIC8qU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIqLwotCi0gICAgYXBDb250ZXh0LT5GUyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkUG9pbnRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlck9wdGltX2luaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTD09YXBDb250ZXh0LT5GUykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCAtIEVSUk9SIDogYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBhcENvbnRleHQtPkZTLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW47Ci0gICAgYXBDb250ZXh0LT5GUy0+cmVhZERhdGEgID0gTTRPU0FfZmlsZVJlYWREYXRhOwotICAgIGFwQ29udGV4dC0+RlMtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2VlazsKLSAgICBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlOwotICAgIGFwQ29udGV4dC0+RlMtPnNldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOwotICAgIGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOwotI2Vsc2UKLSAgICBhcENvbnRleHQtPkZTID0gRlM7Ci0jZW5kaWYKLQotICAgIC8qIFZlcmlmeSBhY2Nlc3MgbW9kZSAqLwotICAgIGlmICggICAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpICE9IDApCi0gICAgICAgIHx8ICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpID09IDApKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIGZpbGUgaW4gcmVhZCBtb2RlICovCi0gICAgaWYoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGluIHJlYWQgb25seSovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkKCZhRmlsZURlc2MsIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgICAgICAgICBpZiAoKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKXx8KE00Tk9fRVJST1IgIT0gZXJybm8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgYUZpbGVEZXNjID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9PcGVuKHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MsICZlcnJubyk7Ci0KLSAgICAgICAgICAgIGlmIChhRmlsZURlc2MgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBBbGxvY2F0ZSBidWZmZXJzICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KGFwQ29udGV4dCk7Ci0gICAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9UUlVFOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgKi8KLSAgICBhcENvbnRleHQtPmZpbGVTaXplID0gMDsKLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gMDsKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gMDsKLQotICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIERlc2NyaXB0b3IqLwotICAgIGFwQ29udGV4dC0+YUZpbGVEZXNjID0gYUZpbGVEZXNjOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgbW9kZSBBY2Nlc3MgKi8KLSAgICBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzcyA9IChNNE9TQV9GaWxlTW9kZUFjY2VzcykgRmlsZU1vZGVBY2Nlc3M7Ci0KLSAgICAvKlJldHJpZXZlIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0PSAoTTRPU0FfQ29udGV4dClhcENvbnRleHQ7Ci0KLSAgICAvKiBDb21wdXRlIGZpbGUgc2l6ZSAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShhcENvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIC8qIGZyZWUgY29udGV4dCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmKGJ1ZmZlcnNfYWxsb2NhdGVkID09IE00T1NBX1RSVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZSggYXBDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSAoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTogcmV0dXJucyBlcnJvciAweCUweCIsIGVycikKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykKLSogICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgJ2RhdGEnIHBvaW50ZXIuIElmICdzaXplJyBieXRlIGNhbiBub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwKLSogICAgICAgICAgICAgICAgICAgICAgJ3NpemUnIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBEYXRhIDogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEuCi0qIEBwYXJhbSAgICAgICBwU2l6ZSA6IChJTk9VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlKS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcFNpemUsIGZpbGVEZXNjcmlwdG9yIG9yIHBEYXRhIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LE00T1NBX01lbUFkZHI4IHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gYVNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcGllZFNpemU7Ci0gICAgTTRPU0FfSW50OCBzZWxlY3RlZF9idWZmZXIsIGN1cnJlbnRfYnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBwID0gMHglcCAgZCA9IDB4JXAgIHMgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRGF0YSwgKnBTaXplKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBEYXRhKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBTaXplKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgLyogUHJldmVudCByZWFkaW5nIGJleW9uZCBFT0YgKi8KLSAgICBpZigoKnBTaXplID4gMCkgJiYgKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkpCi0gICAgewotICAgICAgICBjb3BpZWRTaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhIGJ1ZmZlciAqLwotICAgIC8qIElmIG5vdCwgZmlsbCBvbmUgYWNjb3JkaW5nIHRvIHF1YW50aXplZCBwb3NpdGlvbnMgKi8KLSAgICBjb3BpZWRTaXplID0gMDsKLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICB7Ci0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwgMCk7Ci0gICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0gICAgfQotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZihlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcFNpemUgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3BpZWRTaXplID0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemU7Ci0gICAgICAgICAgICAgICAgLypjb3B5IHRoZSBjb250ZW50IGludG8gcERhdGEqLwotICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zLCBjb3BpZWRTaXplLCBwRGF0YSk7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzMoInJlYWQgIHNpemUgPSAlbHUgIGJ1ZmZlciA9ICVkICBwb3MgPSAlbGQiLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgLyogQ29weSBidWZmZXIgaW50byBwRGF0YSAqLwotICAgIHdoaWxlKCgoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpICYmIChlcnIgPT0gTTROT19FUlJPUikpCi0gICAgewotICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgaWYoYVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPSBzZWxlY3RlZF9idWZmZXI7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGdvdCBhbGwgdGhlIGRhdGEgdGhhdCB3ZSB3YW50ZWQsIHdlIHNob3VsZCByZXR1cm4gbm8gZXJyb3IqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTaXplLWNvcGllZFNpemUpIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJZiB3ZSBkaWQgbm90IGdldCBlbm91Z2ggZGF0YSwgd2Ugd2lsbCByZXR1cm4gTk9fREFUQV9ZRVQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9BVSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29weSB0aGUgZGF0YSByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotY2xlYW51cCA6Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciAqLwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgY29waWVkU2l6ZTsKLQotICAgIGlmKChlcnIgIT0gTTROT19FUlJPUikmJihlcnIhPU00V0FSX05PX0RBVEFfWUVUKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0gc2l6ZSA9ICVsZCAgY29waWVkID0gJWxkICBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLCBjb3BpZWRTaXplLCBlcnIpOwotICAgIH0KLQotICAgIC8qIEVmZmVjdGl2ZSBjb3BpZWQgc2l6ZSBtdXN0IGJlIHJldHVybmVkICovCi0gICAgKnBTaXplID0gY29waWVkU2l6ZTsKLQotCi0gICAgLyogUmVhZCBpcyBkb25lICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCi0qICAgICAgICAgICAgICBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgOgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgYmVnaW5uaW5nIChwb3NpdGlvbiBNVVNUIGJlIHBvc2l0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IHBvc2l0aW9uCi0qICAgICAgICAgICAgICBGcm9tIHRoZSBlbmQgKHBvc2l0aW9uIE1VU1QgYmUgbmVnYXRpdmUpIDogZW5kIHBvc2l0aW9uID0gZmlsZSBzaXplICsgcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gKHNpZ25lZCBvZmZzZXQpIDogZW5kIHBvc2l0aW9uID0gY3VycmVudCBwb3NpdGlvbiArIHBvc2l0aW9uLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIFNlZWtNb2RlIDogICAgICAoSU4pIFNlZWsgYWNjZXNzIG1vZGUuCi0qIEBwYXJhbSAgICAgICBwUG9zaXRpb24gOiAgICAgKElOKSBQb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltIHAgPSAweCVwIG1vZGUgPSAlZCBwb3MgPSAlZCIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtNb2RlLCAqcFBvc2l0aW9uKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBQb3NpdGlvbik7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBTZWVrTW9kZSk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2goU2Vla01vZGUpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgotICAgICAgICAgICAgaWYoKnBQb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemUgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgotICAgICAgICAgICAgaWYoKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPiBhcENvbnRleHQtPmZpbGVTaXplKSB8fAotICAgICAgICAgICAgICAgICgoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb24pIDwgMCkpewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotKiAgICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpIGFuZCBhbHNvIGZyZWVzIHRoZSBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIHAgPSAweCVwIiwgcENvbnRleHQgKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Y2xvc2VSZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQotICAgIHsKLSAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgYVJldF9WYWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX0Nsb3NlKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYgKGFSZXRfVmFsICE9IDApCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8vPj4+PiBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLSAgICBpZiAoYXBDb250ZXh0LT5GUyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSggYXBDb250ZXh0LT5GUyk7Ci0gICAgfQotICAgIC8vPDw8PCBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAbm90ZSAgICAgICAgVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHJlcXVpcmVkIHRvIG1haW50YWluIGZ1bmN0aW9uIHBvaW50ZXIKLSogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25WYWx1ZSA6ICAgKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSogICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELlRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZwotKiAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgcE9wdGlvblZhbHVlIDogIChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcENvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KLSogQHJldHVybiAgICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCBUaGUgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIE9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyogR2V0IEZpbGUgU2l6ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOi8qKjwgR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBDaGVjayBFbmQgb2YgZmlsZSBPY2N1cnMgKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRiA6ICAgICAvKio8IFNlZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9Cb29sICopcE9wdGlvblZhbHVlKSA9IChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEZpbGUgUG9zaXRpb24gKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24gOiAgIC8qKjwgR2V0IGZpbGUgcG9zaXRpb24gKi8KLQotICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEF0dHJpYnV0ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUgOiAgLyoqPCBHZXQgdGhlIGZpbGUgYXR0cmlidXRlID0gYWNjZXNzIG1vZGUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfRmlsZUF0dHJpYnV0ZSAqKXBPcHRpb25WYWx1ZSkubW9kZUFjY2VzcyA9IGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qKjwgQmFkIG9wdGlvbiBJRCAqLwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MTRjYmYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNERQQUtfQ2hhclN0YXIuYwotICogQGluZ3JvdXAKLSAgKiBAYnJpZWYgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIENoYXIgU3RhciBzZXQgb2YgZnVuY3Rpb25zLgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKiBXQVJOSU5HOiBTcGVjaWZpYyBBbmRyb2lkICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJuY3B5KCkuCi0gKiBAbm90ZSAgICAgICBJdCBjb3BpZXMgZXhhY3RseSBsZW4yQ29weSBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIHBTdHJPdXQsCi0gKiAgICAgICAgICAgICB0cnVuY2F0aW5nICBwU3RySW4gb3IgYWRkaW5nIG51bGwgY2hhcmFjdGVycyB0byBwU3RyT3V0IGlmCi0gKiAgICAgICAgICAgICBuZWNlc3NhcnkuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwKLSAqICAgICAgICAgICAgICAgYSBudWxsIGNoYXJhY3RlciBpcyBhcHBlbmRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBjb3BpZWQKLSAqICAgICAgICAgICAgICAgc3RyaW5nLgotICogICAgICAgICAgICAgLSBJZiBsZW4yQ29weSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiBwU3RySW4sIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgICAgcGFkZGVkIHdpdGggbnVsbCBjaGFyYWN0ZXJzIHVwIHRvIGxlbmd0aCBsZW4yQ29weS4KLSAqICAgICAgICAgICAgIC0gcFN0ck91dCBhbmQgcFN0ckluIE1VU1QgTk9UIE9WRVJMQVAgKHRoaXMgaXMgTk9UIENIRUNLRUQpLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgRGVzdGluYXRpb24gY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBTb3VyY2UgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGxlbjJDb3B5OiAoSU4pIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gY29weS4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFN0ck91dCBpcyBNNE9TQV9OVUxMLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyTkNvcHkoTTRPU0FfQ2hhciogcFN0ck91dCwgTTRPU0FfQ2hhciAgICpwU3RySW4sIE00T1NBX1VJbnQzMiBsZW4yQ29weSkKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyTkNvcHlcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCxNNE9TQV9VSW50MzIgJWxkKSIsCi0gICAgICAgIHBTdHJPdXQscFN0ckluLGxlbjJDb3B5KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0ck91dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RySW4pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvcHk6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3RybmNweSgoY2hhciAqKXBTdHJPdXQsIChjb25zdCBjaGFyICopcFN0ckluLCAoc2l6ZV90KWxlbjJDb3B5KTsKLSAgICBpZihsZW4yQ29weSA8PSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W2xlbjJDb3B5XSA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBjb21wYXJpc29uIG9mIHBTdHJJbjEgYW5kIHBTdHJJbjIuCi0gKiBAbm90ZSAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gcmVzdWx0IGlzIE00T1NBX1RSVUUgaWYgdGhlIHN0cmluZwotICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIHN0cmljdGx5IGlkZW50aWNhbCB0byB0aGUgc3RyaW5nIHBvaW50ZWQKLSAqICAgICAgICAgICAgIHRvIGJ5IHBTdHJJbjIsIGFuZCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcGFyYW0gICAgICBwU3RySW4xOiAoSU4pIEZpcnN0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwU3RySW4yOiAoSU4pIFNlY29uZCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgY21wUmVzdWx0OiAoT1VUKSBDb21wYXJpc29uIHJlc3VsdC4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4xIHBTdHJJbjIgb3IgY21wUmVzdWx0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wqIHBSZXN1bHQpCi17Ci0gICAgTTRPU0FfVUludDMyIGkzMixsZW4zMjsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyQXJlSWRlbnRpY2FsXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsIgotICAgICAgICAiTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLHBSZXN1bHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFN0ckluMSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgbGVuMzIgPSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbjEpOwotICAgIGlmKGxlbjMyICE9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMikpCi0gICAgewotICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IoaTMyPTA7aTMyPGxlbjMyO2kzMisrKQotICAgIHsKLSAgICAgICAgaWYocFN0ckluMVtpMzJdICE9IHBTdHJJbjJbaTMyXSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBSZXN1bHQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBSZXN1bHQgPSBNNE9TQV9UUlVFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9VSW50MzIgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDMyIHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKLSAqICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIGJhc2UgcHJvdmlkZWQgYnkgdGhlIHBhcmFtZXRlciBiYXNlLiBwU3RyT3V0IGlzCi0gKiAgICAgICAgICAgICBzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdAotICogICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBudW1iZXIgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgY29udmVyc2lvbiwgcFN0ck91dCBpcyBub3QKLSAqICAgICAgICAgICAgICAgdXBkYXRlZCwgYW5kIHBWYWwgaXMgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbmVnYXRpdmUgbnVtYmVyLCBwU3RyT3V0IGlzIG5vdCB1cGRhdGVkLCBhbmQgcFZhbCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3csIHBWYWwgaXMgc2V0IHRvIE00T1NBX1VJTlQzMl9NQVguCi0gKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKLSAqICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBNNE9TQV9VSU5UMzJfTUFYLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKLSAqICAgICAgICAgICAgIG51bWJlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDMyKE00T1NBX0NoYXIqICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICBwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDMyXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDMyOlx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBlcnJubyA9IDA7Ci0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa2NockRlYzoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZihlcnJubyA9PSBFUkFOR0UpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX1VJTlQzMl9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDMyKXVsOwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQxNiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MTYgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDE2X01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQxNl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MTYgKE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfVUludDE2ICpwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBTdHJPdXQsIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWw7Ci0gICAgY2hhciogICAgICAgIHBUZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldFVJbnQxNlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MTYqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbixNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDE2Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2NockhleGE6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDE2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hyT2N0OgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCw4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLwotICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYodWw+TTRPU0FfVUlOVDE2X01BWCkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDE2X01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MTYpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0FfY2hyU1ByaW50ZihNNE9TQV9DaGFyICAqcFN0ck91dCwgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZm9ybWF0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCAgICAgICBtYXJrZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpwVGVtcDsKLSAgICBNNE9TQV9DaGFyICAgKnBlcmNlbnRQb2ludGVyOwotICAgIE00T1NBX0NoYXIgICAqbmV3Rm9ybWF0OwotICAgIE00T1NBX0ludDMyICBuZXdGb3JtYXRMZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2xsID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X3RtID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2FhID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50OwotICAgIE00T1NBX1VJbnQzMiAgbmJDaGFyOwotICAgIE00T1NBX0ludDMyICAgICBlcnI7Ci0gICAgTTRPU0FfQ2hhciBmbGFnQ2hhcltdICAgICAgICAgICAgID0gIictKyAjMCI7Ci0gICAgTTRPU0FfQ2hhciB3aWR0aE9yUHJlY2lzaW9uQ2hhcltdID0gIiowMTIzNDU2Nzg5IjsKLSAgICBNNE9TQV9DaGFyIG90aGVyUHJlZml4Q2hhcltdICAgICAgPSAiaGxMIjsKLSAgICBNNE9TQV9DaGFyIGNvbnZlcnNpb25DaGFyW10gICAgICAgPSAiZGlvdXhYbmZlRWdHY0NzU3AlIjsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJTUHJpbnRmXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiAlbGQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAleCkiLHBTdHJPdXQsc3RyT3V0TWF4TGVuLGZvcm1hdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ck91dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNQcmludGY6XHRwU3RyT3V0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBmb3JtYXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdGZvcm1hdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsKLQotICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0gKi8KLSAgICBwVGVtcCA9IGZvcm1hdDsKLSAgICB3aGlsZSgqcFRlbXApCi0gICAgewotICAgICAgICBwZXJjZW50UG9pbnRlciA9IChNNE9TQV9DaGFyICopc3RyY2hyKChjb25zdCBjaGFyICopcFRlbXAsJyUnKTsgLyogZ2V0IHRoZSBuZXh0IHBlcmNlbnQgY2hhcmFjdGVyICovCi0gICAgICAgIGlmKCFwZXJjZW50UG9pbnRlcikKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCA9IHBlcmNlbnRQb2ludGVyKzE7ICAgICAgICAgICAvKiBzcGFuIGl0ICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKilmbGFnQ2hhcik7ICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIGZsYWdzICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHdpZHRoICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoKnBUZW1wPT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wKys7Ci0gICAgICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHByZWNpc2lvbiAqLwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopcFRlbXApPj0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJsbCIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfbGwrKzsgICAgICAgICAgICAgICAgIC8qIEkgZ290IE9ORSAqLwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJ0bSIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfdG0rKzsKLSAgICAgICAgICAgICAgICBwVGVtcCArPTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImFhIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9hYSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilvdGhlclByZWZpeENoYXIpOyAvKiBzcGFuIHRoZSBvdGhlciBvcHRpb25hbCBwcmVmaXggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWNvbnZlcnNpb25DaGFyKTsKLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgfQotCi0gICAgY291bnQgPSBjb3VudF9sbCArIGNvdW50X3RtICsgY291bnRfYWE7Ci0KLSAgICBpZighY291bnQpCi0gICAgewotICAgICAgICBlcnI9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG1hcmtlcik7Ci0gICAgICAgIHZhX2VuZChtYXJrZXIpOwotICAgICAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9DSFJfU1RSX09WRVJGTE9XOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG5ld0Zvcm1hdExlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCkgKyAxOwotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoIC09IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0KLSAgICBuZXdGb3JtYXQgPShNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3Rm9ybWF0TGVuZ3RoLAotICAgICAgICBNNE9TQV9DSEFSU1RBUiwoTTRPU0FfQ2hhciopIk00T1NBX2NoclByaW50ZjogbmV3Rm9ybWF0Iik7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBuZXdGb3JtYXQpCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICBuZXdGb3JtYXRbbmV3Rm9ybWF0TGVuZ3RoLTFdID0gJ1wwJzsKLSAgICBwVGVtcCA9IG5ld0Zvcm1hdDsKLQotICAgIC8qIGNvcHkgZm9ybWF0IHRvIG5ld0Zvcm1hdCwgcmVwbGFjaW5nICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dCi0gICAgICogYnkgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dSTY0W2NvbnZlcnNpb25dICovCi0gICAgd2hpbGUoKmZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iQ2hhciA9IHN0cmNzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsICIlIik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IGNoYXJhY3RlcnMgYmVmb3JlIHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgJSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIGZsYWcgY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgaWYoKmZvcm1hdD09Jy4nKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRvdCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAibGwiLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgInRtIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsICovCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgInRtIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJhYSIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJhYSIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBvdGhlciBQcmVmaXggKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7Ci0gICAgICAgICAgICBmb3JtYXQgKz0gbmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPSBuYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgIH0KLQotICAgIC8qIFplcm8gdGVybWluYXRlIHRoZSBmb3JtYXQgc3RyaW5nLiAqLwotICAgICgqcFRlbXApID0gJ1wwJzsKLQotICAgIGVyciA9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKiluZXdGb3JtYXQsIG1hcmtlcik7Ci0gICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgZnJlZShuZXdGb3JtYXQpOwotICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgIHsKLSAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MTdiMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suYwotICogQGJyaWVmICAgICAgICBDbG9jayByZWxhdGVkIGZ1bmN0aW9ucwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBjbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DbG9jay5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGFuIGFic29sdXRlIHRpbWUgdG8gYW4gdW5rbm93biByZWZlcmVuY2Ugd2l0aAotICogICAgICAgICAgICAgYSBoaWdoIHByZWNpc2lvbi4KLSAqIEBub3RlICAgICAgIEl0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIHVzZWQgdG8gZ2V0IGEgcmVsYXRpdmUgdGltZSBieSBjb21wdXRpbmcKLSAqICAgICAgICAgICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gdG8gdGltZXMuCi0gKiAgICAgICAgICAgICBJdCBpcyB0byB0aGUgY2FsbGVyIHRvIGFsbG9jYXRlIHRpbWUuIFRpbWUgaXMgZXhwcmVzc2VkIGluCi0gKiAgICAgICAgICAgICB0aW1lc2NhbGUgdW5pdC4KLSAqICAgICAgICAgICAgIE00T1NBX1JPTExPVkVSX0NMT0NLIGluIE00T1NBX1R5cGVzLmggbXVzdCBiZSBjb25maWd1cmVkIHdpdGggdGhlIHJvbGxvdmVyCi0gKiAgICAgICAgICAgICBvZmZzZXQgb2YgdGhpcyBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIHRpbWU6IChJTi9PVVQpIHRpbWUKLSAqIEBwYXJhbSAgICAgIHRpbWVzY2FsZTogKElOKSBUaGUgdGltZXNjYWxlICh0aW1lIHVuaXQgcGVyIHNlY29uZCkKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRVNDQUxFX1RPT19CSUc6IHRoZSBwcmVjaXNpb24gb2YgdGhlIHN5c3RlbSBjbG9jayBpcwotICogICAgICAgICAgICAgbm90Ci0gKiAgICAgICAgICAgICBjb21wbGlhbnQgd2l0aCB0aGUgaW5wdXQgdGltZXNjYWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwgTTRPU0FfVUludDMyIHRpbWVzY2FsZSkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfaGk7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xvOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9saDsKLSAgICBNNE9TQV9VSW50MzIgZmFjdG9yOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2Nsb2NrR2V0VGltZVx0XHRNNE9TQV9UaW1lKiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZSwgdGltZXNjYWxlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUaW1lLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogcFRpbWUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHRpbWVzY2FsZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogdGltZXNjYWxlIGlzIDAiKTsKLQotICAgIGZhY3RvciA9IDEwMDAwMDAgLyB0aW1lc2NhbGU7Ci0KLSAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCAmdHopID09IDApCi0gICAgewotICAgICAgICB1MzJfdGltZV9sbyA9ICh0di50dl9zZWMgJiAweEZGRkYpICogdGltZXNjYWxlOwotICAgICAgICB1MzJfdGltZV9oaSA9ICgoKHR2LnR2X3NlYyA+PiAxNikgJiAweEZGRkYpICogdGltZXNjYWxlKSArICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZV9sbyArPSB0di50dl91c2VjIC8gZmFjdG9yOwotICAgICAgICB1MzJfdGltZV9oaSArPSAoKHUzMl90aW1lX2xvID4+IDE2KSAmIDB4RkZGRik7Ci0gICAgICAgIHUzMl90aW1lX2xvICY9IDB4RkZGRjsKLSAgICAgICAgdTMyX3RpbWUgPSAoKHUzMl90aW1lX2hpICYgMHg3RkZGKSA8PCAxNikgfCB1MzJfdGltZV9sbzsKLSAgICB9Ci0KLSAgICAvKiBNNE9TQV9UaW1lIGlzIHNpZ25lZCwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWF4IHZhbHVlKi8KLSAgICBpZiAodTMyX3RpbWUgPiBNNE9TQV9JTlQzMl9NQVgpCi0gICAgewotICAgICAgICB1MzJfdGltZSA9IHUzMl90aW1lIC0gTTRPU0FfSU5UMzJfTUFYOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9UaW1lKXUzMl90aW1lOwotCi0gICAgaWYoIHRpbWVzY2FsZSA+IDEwMDAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzEyZGI1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbi5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUgd3JpdGVyCi0gKiAgICAgICAgICAgICAgIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotI2Vycm9yICJVU0VfU1RBR0VGUklHSFRfQ09ERUNTIGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmIC8qVVNFX1NUQUdFRlJJR0hUX0NPREVDUyovCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmIC8qVVRGX0NPTlZFUlNJT04qLwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0gKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSAqIEBwYXJhbSAgICAgIGNvcmVfaWQ6IChJTikgQ29yZSBJRCBvZiB0aGUgY2FsbGVyIChNNE9TQV9GSUxFX1JFQURFUiBvciBNNE9TQV9GSUxFX1dSSVRFUikKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBwVXJsLCBNNE9TQV9GaWxlTW9kZUFjY2VzcyBmaWxlTW9kZUFjY2VzcykKLXsKLQotICAgIE00T1NBX0ludDMyIGkgICAgICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaU1vZGUgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLQotICAgIE00T1NBX0NoYXIgIG1vZGVbNF0gICAgICAgICAgICA9ICIiOwotICAgIE00T1NBX0NoYXIqIHBSZWFkU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiciI7Ci0gICAgTTRPU0FfQ2hhciogcFdyaXRlU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJ3IjsKLSAgICBNNE9TQV9DaGFyKiBwQXBwZW5kU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJhIjsKLSAgICBNNE9TQV9DaGFyKiBwQmluYXJ5U3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJiIjsKLSAgICBNNE9TQV9DaGFyKiBwUGx1c1N0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopIisiOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBGSUxFKiBwRmlsZUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ZpbGVDb250ZXh0ICpwRmlsZUNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotICAgIC8qRkI6IHRvIHRlc3QgdGhlIFVURjE2LT5VVEY4IGNvbnZlcnNpb24gaW50byBWaWRlbyBBcnRpc3QqLwotICAgIC8qQ29udmVydCB0aGUgVVJMIGZyb20gVVRGMTYgdG8gVVRGOCovCi0gICAgTTRPU0FfVm9pZCogdGVtcENvbnZlcnNpb25CdWY7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBDb252ZXJzaW9uU2l6ZSA9IDEwMDA7Ci0KLSAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLCAiY29udmVyc2lvbiBidWYiKTsKLSAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIE00T1NBX1RvVVRGOF9PU0FMKHBVcmwsIHRlbXBDb252ZXJzaW9uQnVmLCAmdGVtcENvbnZlcnNpb25TaXplKTsKLSAgICAoKE00T1NBX0NoYXIqKXRlbXBDb252ZXJzaW9uQnVmKVt0ZW1wQ29udmVyc2lvblNpemUgXSA9ICdcMCc7Ci0KLSAgICBwcmludGYoImZpbGUgb3BlbiAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOwotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIk00T1NBX2ZpbGVDb21tb25PcGVuXHRcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAiTTRPU0FfQ2hhciogJXNcdGZpbGVNb2RlQWNjZXNzICVkIiwgY29yZV9pZCwgcENvbnRleHQsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcFVybCAgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IGZpbGVNb2RlQWNjZXNzLCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZU1vZGVBY2Nlc3MgaXMgMCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIFJlYWQgbW9kZSBub3Qgc2V0IGZvciB0aGUgcmVhZGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAvKiBNNE9TQWZpbGVSZWFkT3BlbiBjYW5ub3QgYmUgdXNlZCB3aXRoIFdyaXRlIGZpbGUgbW9kZSBhY2Nlc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAvKiBBcHBlbmQgYW5kIENyZWF0ZSBmbGFncyBjYW5ub3QgYmUgdXNlZCB3aXRoIFJlYWQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVBcHBlbmQiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUNyZWF0ZSIpOwotCi0gICAgLyogV3JpdGUgbW9kZSBub3Qgc2V0IGZvciB0aGUgd3JpdGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIENyZWF0ZSBmbGFnIG5lY2Vzc2FyeSBmb3Igb3BlbmluZyBmaWxlICovCi0gICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYKLSAgICAgICAgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBBcHBlbmRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFJlYWRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwoY29uc3QgY2hhciAqKXBQbHVzU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlSXNUZXh0TW9kZSkpCi0gICAgewotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwQmluYXJ5U3RyaW5nLChzaXplX3QpMSk7Ci0gICAgfQotCi0gICAgLypPcGVuIHRoZSBmaWxlKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0ZW1wQ29udmVyc2lvbkJ1ZiwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSAgICAvKkZyZWUgdGhlIHRlbXBvcmFyeSBkZWNvZGVkIGJ1ZmZlciovCi0gICAgZnJlZSh0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZWxzZSAvKiBVVEZfQ09OVkVSU0lPTiAqLwotICAgIHBGaWxlSGFuZGxlciA9IGZvcGVuKChjb25zdCBjaGFyICopcFVybCwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSNlbmRpZiAvKiBVVEZfQ09OVkVSU0lPTiAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVIYW5kbGVyKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRU5PRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTk9UX0ZPVU5ELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRmlsZSBub3QgZm91bmQ6ICVzIiwgcFVybCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEVBQ0NFUzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0xPQ0tFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBQZXJtaXNzaW9uIGRlbmllZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0xPQ0tFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogSW52YWxpZCBBcmd1bWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICAgfQotICAgICAgICBjYXNlIEVNRklMRToKLSAgICAgICAgIGNhc2UgRU5PU1BDOgotICAgICAgICBjYXNlIEVOT01FTToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBUb28gbWFueSBvcGVuIGZpbGVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBmaWxlIGNvbnRleHQgKi8KLSAgICBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZSBjb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0KQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjICAgICAgICA9IHBGaWxlSGFuZGxlcjsKLSAgICBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlICAgID0gZmlsZU1vZGVBY2Nlc3M7Ci0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgICAgPSBTZWVrTm9uZTsKLSAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICAqIE5vdGU6IE5ldmVyIHVzZSB0aGlzIGV4cHJlc3Npb24gImkgPSAodmFsdWUxID09IHZhbHVlMikgPyB4OiB5OyIKLSAgICAgKiBiZWNhdXNlIHRoYXQgZG9lbnMndCBjb21waWxlIG9uIG90aGVyIHBsYXRmb3JtcyAoQURTIGZvciBleGFtcGxlKQotICAgICAqIFVzZTogaWYodmFsdWUxID09IHZhbHVlMikKLSAgICAgKiAgICAgICAgeyBpPSB4OyAuLmV0YwotICAgICAqLwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NOb25lQWNjZXNzOwotCi0gICAgaWYgKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjUmVhZEFjY2VzczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTRPU0FfRklMRV9XUklURVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjV3JpdGVBY2Nlc3M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gMDsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gc3RvcmUgdGhlIFVSTCBzdHJpbmcgKi8KLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKChjb25zdCBjaGFyICopcFVybCkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFVSTCBuYW1lIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT51cmxfbmFtZSkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBNNE9TQV9jaHJOQ29weShwRmlsZUNvbnRleHQtPnVybF9uYW1lLCBwVXJsLCBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxKTsKLQotICAgIC8qIEdldCB0aGUgZmlsZSBuYW1lICovCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBVcmwsICZwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQpOwotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVPcGVuKCYocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCksIDEpOyAvKiBBbGxvY2F0ZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLQotI2lmZGVmIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MKLSAgICAvLyBXb3JrYXJvdW5kIGZvciBmaWxlIHN5c3RlbSBidWcgb24gU3RpbmdyYXkvSG9uZXljb21iIHdoZXJlIGEgZmlsZSByZS1jcmVhdGVkIHdpbGwga2VlcAotICAgIC8vIHRoZSBvcmlnaW5hbCBmaWxlJ3Mgc2l6ZSBmaWxsZWQgd2l0aCAwcy4gRG8gbm90IHNlZWsgdG8gdGhlIGVuZCB0byBhdm9pZCBpbGwgZWZmZWN0cwotICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpIHsKLSAgICAgICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgICAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICAgICAgZnNlZWsocEZpbGVIYW5kbGVyLCBpU2F2ZVBvcywgU0VFS19TRVQpOy8qICAgIDQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlTaXplID0gMDsKLSAgICB9Ci0jZWxzZSAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0gICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgZnNlZWsocEZpbGVIYW5kbGVyLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKiAgICAyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KLSAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0jZW5kaWYgLyogVVNFX1NUQUdFRlJJR0hUX0NPREVDUyAqLwotCi0KLQotICAgIC8qIFdhcm5pbmcgcG9zc2libGUgb3ZlcmZsb3cgaWYgdGhlIGZpbGUgaXMgaGlnaGVyIHRoYW4gMkdCeXRlcyAqLwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAqcENvbnRleHQgPSBwRmlsZUNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjE2IHRvIFVURjgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJJbjogKElOKSBVVEYxNiBpbnB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBwQnVmZmVyT3V0OiAoT1VUKSBVVEY4IG91dHB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBidWZmZXJPdXRTaXplOiAoSU4vT1VUKSBzaXplIG9mIHRoZSBvdXRwdXQgcGF0aAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogdGhlIG91dHB1dCBwYXRoIHNpemUgaXMgbm90IGVub3VnaCB0byBjb250YWluCi0gKiAgICAgICAgICAgICAgIHRoZSBkZWNvZGVkIHBhdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLU00T1NBX0VSUiBNNE9TQV9Ub1VURjhfT1NBTCAoTTRPU0FfVm9pZCAgICpwQnVmZmVySW4sIE00T1NBX1VJbnQ4ICAqcEJ1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmJ1ZmZlck91dFNpemUpCi17Ci0gICAgTTRPU0FfVUludDE2IGk7Ci0gICAgd2NoYXJfdCAgICAgICp3X3N0ciA9ICh3Y2hhcl90ICopIHBCdWZmZXJJbjsKLSAgICBNNE9TQV9VSW50MzIgbGVuLCBzaXplX25lZWRlZCwgc2l6ZV9naXZlbjsKLSAgICBpZiAocEJ1ZmZlckluID09IE5VTEwpCi0gICAgewotICAgICAgICAqcEJ1ZmZlck91dD1OVUxMOwotICAgICAgICAqYnVmZmVyT3V0U2l6ZT0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsZW4gICAgICAgICA9IHdjc2xlbih3X3N0cik7Ci0gICAgICAgIHNpemVfbmVlZGVkID0gbGVuKzE7Ci0gICAgICAgIHNpemVfZ2l2ZW4gID0gKmJ1ZmZlck91dFNpemU7Ci0KLSAgICAgICAqYnVmZmVyT3V0U2l6ZT1zaXplX25lZWRlZDsKLSAgICAgICAgaWYgKHNpemVfZ2l2ZW4gPCBzaXplX25lZWRlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQnVmZmVyT3V0W2ldPShNNE9TQV9VSW50OCl3X3N0cltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCdWZmZXJPdXRbbGVuXT0wOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwRmlsZVBvcykKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfY3VycmVudDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX251bGwgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX25lZ191biA9IC0xOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2ZpbGVfc2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVDb21tb25TZWVrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSAlZFx0TTRPU0FfRmlsZVBvc2l0aW9uKiAweCV4IiwKLSAgICAgICAgcENvbnRleHQsIHNlZWtNb2RlLCBwRmlsZVBvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZVBvcywgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotICAgIGZwb3NfZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7Ci0KLSAgICBpZihTZWVrUmVhZCA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZihTZWVrV3JpdGUgPT0gcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWspCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSAwOwotICAgIH0KLQotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtDdXJyZW50OgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgLSBmcG9zX2N1cnJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgKyBmcG9zX2ZpbGVfc2l6ZSAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZyA9IGZwb3NfY3VycmVudCArIGZwb3Nfc2VlazsKLQotICAgIGlmKGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBmcG9zX3NlZWssIFNFRUtfQ1VSKSAhPSAwKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgLyogbWVhbmluZyB0aGUgdmFsdWUgZm9yIG9yaWdpbiBpcyBpbnZhbGlkIG9yIHRoZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBvZmZzZXQgaXMgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRUJBREY6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOy8qIGZpbGUgaGFuZGxlIGlzIGludmFsaWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcmV0dXJuZWQgcG9zaXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCi0gICAgKnBGaWxlUG9zID0gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgLyogU0VFSyBkb25lLCByZXNldCBlbmQgb2YgZmlsZSB2YWx1ZSAqLwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdG8gY2xvc2UgdGhlIGZpbGUgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlci93cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwgTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTMyX2Vycl9jb2RlPTA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkNsb3NlXHRNNE9TQV9VSW50MTYgJWRcdE00T1NBX0NvbnRleHQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgcENvbnRleHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LAotICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUocEZpbGVDb250ZXh0LT5maWxlX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGkzMl9lcnJfY29kZSA9IGZjbG9zZShwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyA9IE00T1NBX05VTEw7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlQ2xvc2UocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7LyogZnJlZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQpOwotCi0gICAgaWYgKGkzMl9lcnJfY29kZSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2UiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgKGFzc29jaWF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBjb250ZXh0KQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBhdHRyaWJ1dGU6IChPVVQpIFRoZSBmaWxlIGF0dHJpYnV0ZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpCi17Ci0KLSAgICBNNE9TQV9GaWxlQ29udGV4dCogZmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIHN0cnVjdCBzdGF0IFRoZVN0YXQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZVx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICJNNE9TQV9GaWxlQXR0cmlidXRlKiAweCV4IiwgcENvbnRleHQsIHBBdHRyaWJ1dGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEF0dHJpYnV0ZSwgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotCi0gICAgaWYoc3RhdCgoY2hhciopZmlsZUNvbnRleHQtPnVybF9uYW1lLCAmVGhlU3RhdCkgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2N0aW1lOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2F0aW1lOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9tdGltZTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lU2NhbGUgPSAxOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWVTY2FsZSA9IDE7Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwotCi0gICAgcEF0dHJpYnV0ZS0+bW9kZUFjY2VzcyA9IGZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZmlsZSBVUkwgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTikgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoT1VUKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldFVSTChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiogcFVybCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyICAgIHVpTGVuZ3RoOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfQ2hhcioqIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgdWlMZW5ndGggPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwRmlsZUNvbnRleHQtPnVybF9uYW1lKSsxOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXJsX25hbWUgKi8KLSAgICAqcFVybCA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModWlMZW5ndGgsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiB1cmwiKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBNNE9TQV9jaHJOQ29weSgqcFVybCwgcEZpbGVDb250ZXh0LT51cmxfbmFtZSwgdWlMZW5ndGgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHRvIHRoZSBpbnB1dCBVUkwuCi0gKiBAbm90ZSAgICAgICBUaGUgdXNlciBzaG91bGQgbm90IGZvcmdldCB0byBkZWxldGUgdGhlIG91dHB1dCBzdHJpbmcgdXNpbmcKLSAqICAgICAgICAgICAgIE00T1NBX3N0ckRlc3Ryb3kKLSAqIEBwYXJhbSAgICAgIHBVcmw6ICAgICAgICAgICAgKElOKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTAotICogQHBhcmFtICAgICAgcEZpbGVOYW1lOiAgICAoT1VUKSBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTC4gSXQgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0NoYXIqKiBwRmlsZU5hbWUpCi17Ci0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpVXJsTGVuICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgRmlsZU5hbWVMZW4gPSAwOwotCi0gICAgTTRPU0FfQ2hhciogcHRyVXJsICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQ2hhciogcHRyRmlsZW5hbWUgICAgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXJsLCBwRmlsZU5hbWUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZU5hbWUsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBGaWxlTmFtZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIC8qUGFyc2UgVVJMKi8KLSAgICBpVXJsTGVuID0gc3RybGVuKChjb25zdCBjaGFyICopcFVybCk7Ci0gICAgZm9yKGk9aVVybExlbi0xOyBpPj0wOyBpLS0pCi0gICAgewotICAgICAgICBpZiAocFVybFtpXSAhPSAnXFwnICYmIHBVcmxbaV0gIT0gJy8nKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlTmFtZUxlbisrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7IC8qIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBuYW1lICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdHJGaWxlbmFtZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKEZpbGVOYW1lTGVuKzEsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogRmlsZW5hbWUgc3RyaW5nIik7Ci0gICAgaWYgKHB0ckZpbGVuYW1lID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcHRyVXJsID0gcFVybCArIChpVXJsTGVuIC0gRmlsZU5hbWVMZW4pOwotICAgIE00T1NBX2Nock5Db3B5KHB0ckZpbGVuYW1lLCBwdHJVcmwsIEZpbGVOYW1lTGVuKzEpOwotCi0gICAgKnBGaWxlTmFtZSA9IHB0ckZpbGVuYW1lOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhNzJmNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyLmMKLSAqIEBhdXRob3IgICAgICAgQ2VkcmljIExlY291dHJlIChjZWRyaWMubGVjb3V0cmVAcGhpbGlwcy5jb20pCi0gKiAgICAgICAgICAgICAgIExhdXJlbnQgRmF5IChsYXVyZW50LmZheUBwaGlsaXBzLmNvbSkKLSAqIEBwYXIgT3JnOiAgICAgUGhpbGlwcyBEaWdpdGFsIFN5c3RlbXMgTGFib3JhdG9yaWVzIC0gUGFyaXMgKFBEU0wtUCkKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0qIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotKiAgICAgICAgICAgICBmaWxlCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVSZWFkT3BlbiA6IHBDID0gMHglcCAgZmQgPSAweCVwICBtb2RlID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qICAgICAgICAgICAgIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKSBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgcG9pbnRlci4KLSogQG5vdGUgICAgICAgSWYgJ3NpemUnIGJ5dGUgY2Fubm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsICdzaXplJwotKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdAotKiBAbm90ZSAgICAgICBudW1iZXIgb2YgcmVhZCBieXRlcy4KLSogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICBidWZmZXI6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhCi0qIEBwYXJhbSAgICAgIHNpemU6IChJTi9PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZXMpCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgIE00V0FSX05PX0RBVEFfWUVUOiB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgYnVmZmVyLCBzbyB0aGUgc2l6ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyICAgIHVpU2l6ZVJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWREYXRhIDogZGF0YSA9IDB4JXAgIHNpemUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgKE00T1NBX05VTEwgIT0gcFNpemUpID8gKCpwU2l6ZSkgOiAwKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGRhdGEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogZGF0YSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwU2l6ZSBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLCBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KLSAgICAgICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiArIHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1JlYWQpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSAqLwotICAgIHVpU2l6ZVJlYWQgPSBmcmVhZChkYXRhLCBzaXplb2YoTTRPU0FfQ2hhciksICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0gICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGhhbmRsZSBpcyBpbnZhbGlkLCBvciB0aGUgZmlsZSBpcyBub3Qgb3BlbiBmb3IgcmVhZGluZywKLSAgICAgICAgIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAqcFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLQotICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQotICogICAgICAgICAgICAgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KLSAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsIGZyb20KLSAqICAgICAgICAgICAgIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLiBUbyBzdXBwb3J0IGxhcmdlIGZpbGUKLSAqICAgICAgICAgICAgIGFjY2VzcyAobW9yZSB0aGFuIDJHQnl0ZXMpLCB0aGUgcG9zaXRpb24gaXMgcHJvdmlkZWQgb24gYSA2NAotICogICAgICAgICAgICAgYml0cy4KLSAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgIHBvc2l0aW9uIHBvaW50ZXIgbXVzdCBiZSB1cGRhdGVkLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVSZWFkU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1Iiwgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQb3NpdGlvbiAhPSBNNE9TQV9OVUxMKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBzZWVrTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGlmIChNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19TRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrRW5kID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfRU5EOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19DVVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVJlYWRTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsICpwUG9zaXRpb24sIFNlZWtNb2RlT3B0aW9uKTsKLSAgICAgICAgaWYoZXJyICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgIGVycj0oKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKGVycik7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0KLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pKTsKLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrUmVhZDsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKE00T1NBX0ZJTEVfV1JJVEVSID09IHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQpOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRCBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weQotICogICAgICAgICAgICAgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgcE9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHBPcHRpb25WYWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gMCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IG9wdGlvbklEIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBPcHRpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9XUklURV9PTkxZLCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfQm9vbCogYklzRW5kT2ZGaWxlID0gKE00T1NBX0Jvb2wqKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpiSXNFbmRPZkZpbGUgPSBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YqLwotCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQnVnZml4OiB1cGRhdGUgdGhlIGZpbGUgc2l6ZS4KLSAgICAgICAgICAgICogV2hlbiBhIGZpbGUgaXMgaW4gcmVhZCBtb2RlLCBtYXkgYmUgYW5vdGhlciBhcHBsaWNhdGlvbiBpcyB3cml0aW5nIGluLgotICAgICAgICAgICAgKiBTbywgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKjItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlQXR0cmlidXRlKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRVUkw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMKi8KLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1VJbnQzMiopcE9wdGlvblZhbHVlID0gcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSkKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdmYzE3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byB3cml0ZSBpbiBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKLSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlV3JpdGVPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCwgcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdzaXplJyBieXRlcyBzdG9yZWQgYXQgJ2RhdGEnIG1lbW9yeQotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgc2VsZWN0ZWQgYnkgaXRzIGNvbnRleHQuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCi0gKiBAbm90ZSAgICAgICBNb3Jlb3ZlciB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0Ci0gKiAgICAgICAgICAgICAnc2l6ZScgYnl0ZXMuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgYnVmZmVyOiAoSU4pIERhdGEgcG9pbnRlciBvZiB0aGUgd3JpdGUgZGF0YQotICogQHBhcmFtICAgICAgc2l6ZTogKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpU2l6ZVdyaXRlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZURhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNpemUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSB1aVNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHVpU2l6ZSBpcyAwIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIFdyaXRlU2l6ZTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgV3JpdGVTaXplID0gZndyaXRlKCh2b2lkICopZGF0YSwxLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoV3JpdGVTaXplICE9IHVpU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyID0gKChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShXcml0ZVNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZURhdGEgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgICAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiArIFdyaXRlU2l6ZTsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpZihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID4gcEZpbGVDb250ZXh0LT5maWxlX3NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1dyaXRlKQotICAgIHsKLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKSk7Ci0KLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgZGF0YSAqLwotICAgIHVpU2l6ZVdyaXRlID0gZndyaXRlKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgdWlTaXplLCBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBpZih1aVNpemVXcml0ZSA9PSAoTTRPU0FfVUludDMyKS0xKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIC8qIEFuIGVycm9yIG9jY3VyZWQgKi8KLQotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGZ3cml0ZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgdWlTaXplV3JpdGU7Ci0KLSAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBpZigoTTRPU0FfVUludDMyKXVpU2l6ZVdyaXRlIDwgdWlTaXplKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZVdyaXRlRGF0YSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICB3cml0ZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywKLSAqICAgICAgICAgICAgIGZyb20gdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZVNlZWsgOiBtb2RlID0gJWQgIHBvcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSwgKE00T1NBX05VTEwgIT0gcFBvc2l0aW9uKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZWVtTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgLypUaGUgcG9zaXRpb24gZm9yIHRoZSBzZWVrIG1vZGUgYmV0d2VlbiB0aGUgU0hQIGFuZCB0aGUgT1NBbCBwYXJ0IGFyZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlV3JpdGVTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkgIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCpwUG9zaXRpb24sU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlV3JpdGVTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIHNlZWtNb2RlLCBwUG9zaXRpb24pOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlV3JpdGVTZWVrOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAqcFBvc2l0aW9uOwotCi0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVdyaXRlQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0KTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgc3RyZWFtIGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRmx1c2goTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlRmx1c2ggOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUZsdXNoOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKSAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQKLSAqICAgICAgICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwT3Rpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLCBNNEVSUl9XUklURV9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVQb3NpdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04qLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotICAgICAgICAgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBpU2F2ZVBvcywgU0VFS19TRVQpOyAgICAvKjQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwgKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dDoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgYWNjZXNzID0gcEZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMSghKGFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBNNE9TQV9GSUxFX1JFQURFUjsKLQotICAgICAgICAgICAgKnBPcHRpb25WYWx1ZSA9IHBDb250ZXh0OwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQqLwotCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUKLSogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsCi0qICAgICAgICAgICAgIHZhcmlhYmxlLgotKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0qIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gb3B0aW9uSUQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1dSSVRFUiksCi0gICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwgTTRFUlJfUkVBRF9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlID0gKE00T1NBX1VJbnQzMikqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZURlc2NNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gKE00T1NBX0ludDMyKSooTTRPU0FfSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJlNmJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIE11dGV4IGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIG11dGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSBtdXRleCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX1VJbnQzMiAgICAgY29yZUlEOyAgICAgICAgICAgICAgIC8qIG11dGV4IGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0ZXg7ICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCi0gICBwdGhyZWFkX3QgICAgICAgIHRocmVhZE93bmVySUQ7ICAgICAgICAvKiB0aHJlYWQgb3duZXIgaWRlbnRpZmlhbnQgKi8KLX0gTTRPU0FfTXV0ZXhDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IG11dGV4LgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX211dGV4Q2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0IHBhcmFtZXRlcgotICogICAgICAgICAgICAgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBtdXRleCBmdW5jdGlvbnMgdG8gYWxsb3cKLSAqICAgICAgICAgICAgIHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleE9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfTlVMTDsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHJpYnV0ZSA9IHsgMCB9OwotICAgIE00T1NBX0Jvb2wgb3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXgiLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhPcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTXV0ZXhDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTVVURVgsIChNNE9TQV9DaGFyKikiTTRPU0FfbXV0ZXhPcGVuOiBtdXRleCBjb250ZXh0Iik7Ci0KLSAgICBpZihNNE9TQV9OVUxMID09IHBNdXRleENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX211dGV4T3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXR0cmlidXRlLiAqLwotICAgIGlmICggMCA9PSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmYXR0cmlidXRlICkgKQotICAgIHsKLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggdHlwZS4gKi8KLSAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleC4gKi8KLSAgICAgICAgICAgIGlmICgwID09IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnBNdXRleENvbnRleHQtPm11dGV4LCAmYXR0cmlidXRlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZXN0cm95IHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgICB9Ci0KLSAgICBpZighb3BlbmVkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsICJNNE9TQV9tdXRleE9wZW46IE9TIG11dGV4IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICBmcmVlKHBNdXRleENvbnRleHQpOwotICAgICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQgOwotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPmNvcmVJRCA9IE00T1NBX01VVEVYOwotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDA7Ci0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCkgcE11dGV4Q29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGxvY2tzIHRoZSBtdXRleC4gIkNvbnRleHQiIGlkZW50aWZpZXMgdGhlIG11dGV4LgotICogQG5vdGUgICAgICAgSWYgdGhlIG11dGV4IGlzIGFscmVhZHkgbG9ja2VkLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzIHVudGlsCi0gKiAgICAgICAgICAgICB0aGUgbXV0ZXggYmVjb21lcyBhdmFpbGFibGUgKGJ5IGNhbGxpbmcgTTRPU0FfbXV0ZXhVbmxvY2spIG9yCi0gKiAgICAgICAgICAgICAidGltZW91dCIgaXMgcmVhY2hlZC4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcGFyYW0gICAgICB0aW1lb3V0OihJTikgVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVfT1VUOiB0aW1lIG91dCBpcyBlbGFwc2VkIGJlZm9yZSBtdXRleCBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVUludDMyIHRpbWVvdXQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgICAgICAgICAgIGN1cnJlbnRUaHJlYWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICB0czsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIGxlZnQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfbXV0ZXhMb2NrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgY29udGV4dCwgdGltZW91dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleExvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dCAtPnRocmVhZE93bmVySUQgPT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBUaHJlYWQgdHJpZWQgdG8gbG9jayBhIG11dGV4IGl0IGFscmVhZHkgb3ducyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgIH0KLQotICAgIC8qIExvY2sgdGhlIG11dGV4LiAqLwotICAgIGlmICggTTRPU0FfV0FJVF9GT1JFVkVSID09IHRpbWVvdXQpCi0gICAgewotICAgICAgICBpZiAoIDAgIT0gcHRocmVhZF9tdXRleF9sb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgd2hpbGUgKCAoIEVCVVNZID09IHJlc3VsdCApICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRzLnR2X3NlYyAgPSAwOwotICAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRUJVU1kgPT0gcmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9USU1FX09VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gY3VycmVudFRocmVhZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCB1bmxvY2tzIHRoZSBtdXRleC4gVGhlIG11dGV4IGlzIGlkZW50aWZpZWQgYnkKLSAqICAgICAgICAgICAgIGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBUaGUgTTRPU0FfbXV0ZXhMb2NrIHVuYmxvY2tzIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgYW5kIG1hZGUgaXQgcmVhZHkgdG8gcnVuLgotICogQG5vdGUgICAgICAgTm8gaHlwb3RoZXNlcyBjYW4gYmUgbWFkZSBvbiB3aGljaCB0aHJlYWQgd2lsbCBiZSB1bi1ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0gICAgcHRocmVhZF90IGN1cnJlbnRUaHJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhVbmxvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4VW5sb2NrOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTVVURVggIT0gcE11dGV4Q29udGV4dC0+Y29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2siKTsKLQotICAgIGN1cnJlbnRUaHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLQotICAgIGlmKHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgIT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2s6IFRocmVhZCB0cmllZCB0byB1bmxvY2sgYSBtdXRleCBpdCBkb2Vzbid0IG93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDAgOwotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBtdXRleCAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsLCB0aGUgbXV0ZXggYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUgdXNlYWJsZS4gVGhpcwotICogICAgICAgICAgICAgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzIG11dGV4LgotICogQG5vdGUgICAgICAgSXQgaXMgYW4gYXBwbGljYXRpb24gaXNzdWUgdG8gd2FycmFudCBubyBtb3JlIHRocmVhZHMgYXJlIGxvY2tlZAotICogICAgICAgICAgICAgb24gdGhlIGRlbGV0ZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4Q2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4Q2xvc2U6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0KLSAgICBmcmVlKCBwTXV0ZXhDb250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjRkMDM5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQoKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBudW1iZXIgZ2VuZXJhdG9yCi0gKiAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBiZWZvcmUgYW55IGNhbGwgdG8gTTRPU0FfcmFuZCgpCi0gKiAgICAgICAgICAgICAgIG5lZWQgdGhlIHN0ZGxpYiBhbmQgdGltZSBsaWJyYXJpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLQotICAgIC8qIFdpbmRvd3MnIHJhbmQgaXMgcm90dGVuLCB0aGUgZmlyc3QgZ2VuZXJhdGVkIHZhbHVlIGFmdGVyIHRoZSBpbml0Ci0gICAgYWJvdmUgaXMgbm90IHJhbmRvbSBlbm91Z2gsIHNvIGxldCdzIHNoYWtlIHRoaW5ncyBhIGxpdHRsZS4uLiAqLwotCi0gICAgZm9yIChpPTA7IGk8MTAwOyBpKyspIHJhbmQoKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAxIGFuZCBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgICAgKGluY2x1c2l2ZSkgd2l0aCBhcHByb3hpbWF0ZWx5IGVxdWFsIHByb2JhYmlsaXR5LCBhbmQKLSAqICAgICAgICAgICAgICAgcmV0dXJucyB0aGlzIG51bWJlciBpbiBvdXRfdmFsdWUuIEZvciBpbnN0YW5jZSwgYSBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgIG9mIDYgd2lsbCBzaW11bGF0ZSBhIGZhaXIgNi1zaWRlZCBkaWNlIHJvbGwuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgb3V0X3ZhbHVlIChPVVQpOiBvbiByZXR1cm4sIHBvaW50cyB0byByYW5kb20gcmVzdWx0Ci0gKiBAcGFyYW0gICAgICAgbWF4X3ZhbHVlIChJTik6IG1heCBleHBlY3RlZCB2YWx1ZQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLXsKLSAgICBpZiggKG91dF92YWx1ZSA9PSBNNE9TQV9OVUxMKSB8fCAobWF4X3ZhbHVlIDwgMSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAoKm91dF92YWx1ZSkgPSByYW5kKCk7Ci0gICAgLyogbm90aWNlIHRoaXMgYWxnb3JpdGhtIHdpbGwgb25seSB3b3JrIGZvciBtYXhfdmFsdWVzIHN1Y2ggdGhhdCB0aGUgbXVsdGlwbGljYXRpb24KLSAgICB3b24ndCBvdmVyZmxvdywgd2hpY2ggbWVhbnMgdGhhdCBtYXhfdmFsdWUgdHlwaWNhbGx5IHNob3VsZG4ndCBnbyBvdmVyIHRoZSByYW5nZSBvZgotICAgIGFuIEludDE2LiAqLwotICAgICgqb3V0X3ZhbHVlKSA9ICgoKCpvdXRfdmFsdWUpICogbWF4X3ZhbHVlKSAvICgoTTRPU0FfVUludDMyKVJBTkRfTUFYICsgMSkpICsgMTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjU4NTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmMKLSAqIEBicmllZiAgICAgICAgU2VtYXBob3JlIGZvciBXaW5kb3dzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHNlbWFwaG9yZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLQotI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIHNlbWFwaG9yZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRPU0FfVUludDMyICAgY29yZUlEOyAgICAgLyogc2VtYXBob3JlIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHNlbV90ICAgICAgICAgIHNlbWFwaG9yZTsgIC8qIHNlbWFwaG9yZSAqLwotfSBNNE9TQV9TZW1hcGhvcmVDb250ZXh0OwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgc2VtYXBob3JlIHdpdGggdGhlICJpbml0aWFsQ291bnRlciIKLSAqICAgICAgICAgICAgIHZhbHVlLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3NlbWFwaG9yZUNsb3NlIGZ1bmN0aW9uLiBUaGUgY29udGV4dAotICogICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgc2VtYXBob3JlIGZ1bmN0aW9ucwotICogICAgICAgICAgICAgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgc2VtYXBob3JlCi0gKiBAcGFyYW0gICAgICBpbml0aWFsX2NvdW50OihJTikgSW5pdGlhbCBjb3VudGVyIG9mIHRoZSBzZW1hcGhvcmUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHByb3ZpZGVkIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVPcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5pdGlhbF9jb3VudCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlT3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4XHRNNE9TQV9VSW50MzIgIgotICAgICAgICAgICAgICAgICAgIiVkIiwgY29udGV4dCwgaW5pdGlhbF9jb3VudCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfU2VtYXBob3JlQ29udGV4dCksIE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX3NlbWFwaG9yZU9wZW46IHNlbWFwaG9yZSBjb250ZXh0Iik7Ci0KLSAgIGlmKHNlbWFwaG9yZUNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIGlmICgwICE9IHNlbV9pbml0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUsIDAsIGluaXRpYWxfY291bnQpKQotICAgewotICAgICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAiTTRPU0Ffc2VtYXBob3JlT3BlbjogT1Mgc2VtYXBob3JlIGNyZWF0aW9uIGZhaWxlZCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQ7Ci0gICB9Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCA9IE00T1NBX1NFTUFQSE9SRSA7Ci0gICAqY29udGV4dCA9IChNNE9TQV9Db250ZXh0KXNlbWFwaG9yZUNvbnRleHQ7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlY3JlbWVudHMgKG9uZSBieSBvbmUpIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUgaXMgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dCBUaGlzIGNhbGwgaXMgbm90IGJsb2NraW5nCi0gKiAgICAgICAgICAgICBpZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgcG9zaXRpdmUgb3IgemVybyAoYWZ0ZXIKLSAqICAgICAgICAgICAgIGRlY3JlbWVudGF0aW9uKS4gVGhpcyBjYWxsIGlzIGJsb2NraW5nIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlcgotICogICAgICAgICAgICAgaXMgbGVzcyB0aGFuIHplcm8gKGFmdGVyIGRlY3JlbWVudGF0aW9uKSwgdW50aWwgdGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgdXBwZXIgdGhhbiB6ZXJvIChzZWUgTTRPU0Ffc2VtYXBob3JlUG9zdCkgb3IgdGltZV9vdXQgaXMKLSAqICAgICAgICAgICAgIHJlYWNoZWQuCi0gKiBAbm90ZSAgICAgICBJZiAidGltZW91dCIgdmFsdWUgaXMgTTRPU0FfV0FJVF9GT1JFVkVSLCB0aGUgY2FsbGluZyB0aHJlYWQKLSAqICAgICAgICAgICAgIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5IHVudGlsIHRoZSBzZW1hcGhvcmUgIGlzIHVubG9ja2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIHNlbWFwaG9yZSBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlLgotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVdhaXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9JbnQzMiB0aW1lb3V0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgdHM7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICBsZWZ0OwotICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlV2FpdFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlV2FpdCIpOwotCi0gICBpZiAoIChNNE9TQV9JbnQzMilNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgIHsKLSAgICAgICBpZiAoIDAgIT0gc2VtX3dhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSkgKQotICAgICAgIHsKLSAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAiTTRPU0Ffc2VtYXBob3JlV2FpdDogT1Mgc2VtYXBob3JlIHdhaXQgZmFpbGVkIik7Ci0KLSAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUIDsKLSAgICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgcmVzdWx0ID0gc2VtX3RyeXdhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0gICAgICAgd2hpbGUgKCAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKSAmJiAoIDAgPCB0aW1lb3V0ICkgKQotICAgICAgIHsKLSAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgIGlmICgxIDw9IHRpbWVvdXQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCAtPSAxOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKChFQlVTWSA9PSByZXN1bHQpIHx8IChFQUdBSU4gPT0gcmVzdWx0KSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dAotICogQG5vdGUgICAgICAgSWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyIGlzIHVwcGVyIHRoYW4gemVybyAoYWZ0ZXIgYWRkaXRpb24pLAotICogICAgICAgICAgICAgdGhlIE00T1NBX3NlbWFwaG9yZVdhaXQgY2FsbCBvZiB0aGUgdGhyZWFkIHdpdGggdGhlIGhpZ2hlc3QKLSAqICAgICAgICAgICAgIHByaW9yaXR5IGlzIHVuYmxvY2tlZCBhbmQgbWFkZSByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuYmxvY2tlZAotICogICAgICAgICAgICAgYmV0d2VlbiB0aHJlYWRzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVQb3N0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3NlbWFwaG9yZVBvc3RcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVBvc3QiKTsKLQotICAgc2VtX3Bvc3QoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIHNlbWFwaG9yZSAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLgotICogICAgICAgICAgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzZW1hcGhvcmUgYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUKLSAqICAgICAgICAgICAgIHVzZWFibGUuIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUuCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBzZW1fZGVzdHJveSgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlODJmYjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWQuYwotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudHMgYW5kIG1hbmlwdWxhdGUgdGhyZWFkcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWRfcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotCi12b2lkKiBNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvKHZvaWQgKmNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9Cb29sIGF1dG9fa2lsbCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoKLSAgICAgICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsKLSAgICAqLwotCi0gICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEb1x0XHRMUFZPSUQgMHgleCIsIGNvbnRleHQpOwotCi0gICAgLyoKLSAgICAgICB1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFJ1bm5pbmc7Ci0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotICAgd2hpbGUodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgaWYoKHRocmVhZENvbnRleHQtPmZ1bmModGhyZWFkQ29udGV4dC0+cGFyYW0pKSAhPSBNNE5PX0VSUk9SKQotICAgICAgewotICAgICAgICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgICAgICAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRSdW5uaW5nKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvL1BSIDIzNTQgLSBBQ08gOiBTdXBwcmVzcyBzdG9wcGluZyBzdGF0ZSBhbmQgZG9uJ3QKLSAgICAgICAgICAgIC8vICAgICAgICAgdW5sb2NrIG11dGV4IGJlZm9yZSBjbG9zaW5nIHRoZSB0aHJlYWQKLSAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLSAgICAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgfQotCi0gICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgIH0KLQotCi0gICBNNE9TQV9zZW1hcGhvcmVQb3N0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyB0aHJlYWQuIEFmdGVyIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyAiY29udGV4dCIuIFRoZSB0aHJlYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkKLSAqICAgICAgICAgICAgIHRoZSAiZnVuYyIgcGFyYW1ldGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgJiBhbGxvY2F0ZXMgYSB1bmlxdWUKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0J3MgdGhlIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0IG11c3QgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3RocmVhZFN5bmNDbG9zZSBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhcmFtZXRlciB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIHRocmVhZAotICogICAgICAgICAgICAgZnVuY3Rpb25zIHRvIGFsbG93IHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQKLSAqICAgICAgICAgICAgIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgdGhyZWFkLCBidXQgdGhlIHRocmVhZCBpcyBub3QgcnVubmluZy4KLSAqIEBub3RlICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBjcmVhdGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIGZ1bmM6KElOKSAiZG9JdCIgZnVuY3Rpb24gcG9pbnRlciB0byBydW4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0IGZ1bmMpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWREb0l0IDB4JXgiLCBjb250ZXh0LCBmdW5jKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoZnVuYyA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHRocmVhZENvbnRleHQgPQotICAgICAgKE00T1NBX1RocmVhZENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVGhyZWFkQ29udGV4dCksCi0gICAgICBNNE9TQV9USFJFQUQsIChNNE9TQV9DaGFyKikiTTRPU0FfdGhyZWFkU3luY09wZW46IHRocmVhZCBjb250ZXh0Iik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5mdW5jID0gZnVuYzsKLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IDY0ICogMTAyNDsKLSAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQgPSAwOwotICAgdGhyZWFkQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfVEhSRUFEOwotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgdGhyZWFkQ29udGV4dC0+cHJpb3JpdHkgPSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgOwotCi0gICBlcnJfY29kZSA9IE00T1NBX211dGV4T3BlbigmKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpKTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY09wZW46IE00T1NBX211dGV4T3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgIGVycl9jb2RlID0gTTRPU0Ffc2VtYXBob3JlT3BlbigmKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCksIDApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgICpjb250ZXh0ID0gdGhyZWFkQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBydW5zIGEgc3BlY2lmaWVkIHRocmVhZC4gVGhlICJwYXJhbSIgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCBhIHNwZWNpZmljIHBhcmFtZXRlciB0byB0aGUKLSAqICAgICAgICAgICAgIGNyZWF0ZWQgdGhyZWFkLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIHNlY29uZCBvbmUgb2YKLSAqICAgICAgICAgICAgIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIgZnVuY3Rpb24uCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCBpcyBhIGJsb2NraW5nIHVwIHRvIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KLSAqICAgICAgICAgICAgIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RhcnRpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgcnVubmluZywgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4gSWYgdGhlICJ0aHJlYWRTdGFydGVkIiBvcHRpb25JRAotICogICAgICAgICAgICAgaXMgbm90IE5VTEwsIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGl0IGJlZm9yZSBydW5uaW5nIHRoZSBkb0l0Ci0gKiAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBwYXJhbTooSU4pIEFwcGxpY2F0aW9uIGRhdGEgdGhyZWFkIHBhcmFtZXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ6IHRoZSB0aHJlYWQgZGlkIG5vdCBzdGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwYXJhbSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAgKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBwdGhyZWFkX2F0dHJfdCAgICAgYXR0cmlidXRlID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICBpbnQgICAgICAgICAgICAgICAgbWluICAgICAgID0gMDsKLSAgIGludCAgICAgICAgICAgICAgICBtYXggICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9IDA7Ci0gICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWQgICAgID0geyAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnRcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9Wb2lkKiAiCi0gICAgICAgICAgICAgICAgICAiMHgleCIsIGNvbnRleHQsIHBhcmFtKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRTdGFydGluZzsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICB0aHJlYWRDb250ZXh0LT5wYXJhbSA9IHBhcmFtOwotCi0gICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICB7Ci0gICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmYXR0cmlidXRlLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCApICkKLSAgICAgIHsKLSAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmYXR0cmlidXRlLCAoc2l6ZV90KXRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSApICkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koICZhdHRyaWJ1dGUsIFNDSEVEX09USEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRlbnRhdGl2ZSBwYXRjaGVzIHRvIGhhbmRsZSBwcmlvcml0aWVzIGluIGEgYmV0dGVyIHdheSA6ICovCi0gICAgICAgICAgICAgICAgLyogVXNlIEFuZHJvaWQncyBwcmVkZWZpbmVkIHByaW9yaXRpZXMgKHJhbmdlICsxOS4uLTIwKQotICAgICAgICAgICAgICAgICAqcmF0aGVyIHRoYW4gTGludXggb25lcyAoMC4uOTkpKi8KLQotICAgICAgICAgICAgICAgIC8qIEdldCBtaW4gYW5kIG1heCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgbWluID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiggU0NIRURfRklGTyApOwotICAgICAgICAgICAgICAgIG1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgoIFNDSEVEX0ZJRk8gKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnQgTUFYPSVkIE1JTj0lZCIsIG1heCwgbWluKTsKLQotICAgICAgICAgICAgICAgIC8qIHRlbnRhdGl2ZSBtb2RpZmljYXRpb24gb2YgdGhlIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHByaW9yaXR5IGJhc2VkIG9uIGRlZmF1bHQgYW5kcm9pZCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgLyogVGhpcyBwcm9iYWJseSByZXF1aXJlcyBzb21lIG1vcmUgdHVuaW5nLAotICAgICAgICAgICAgICAgICAqIG91dGNvbWUgb2YgdGhpcyBwcmlvcml0eSBzZXR0aW5ncyBhcmUgbm90IHlldCBzYXRpc2ZhY3RvcnkgKi8KLSAgICAgICAgICAgICAgICAvKiBJbXBsZW1lbnRpbmcgdGhyZWFkIGhhbmRsaW5nIGJhc2VkIG9uIEFuZHJvaWQncyB0aHJlYWQgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgKiBoZWxwZXJzIG1pZ2h0IGJyaW5nIHNvbWUgaW1wcm92ZW1lbnQgKHNlZSB0aHJlYWRzLmgpICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKHRocmVhZENvbnRleHQtPnByaW9yaXR5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9BVURJTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWQuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKLQotICAgICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSggJmF0dHJpYnV0ZSwgJnNjaGVkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRocmVhZENvbnRleHQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTTRPU0FfRkFMU0UgPT0gTTRPU0FfRVJSX0lTX0VSUk9SKCBNNE9TQV9zZW1hcGhvcmVXYWl0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUiApICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgIH0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICByZXR1cm4gTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHN0b3BzIGEgc3BlY2lmaWVkIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgY2FsbCBpcyBhIGJsb2NraW5nIG9uZSB1cCB0byB0aGUgIk00T1NBX1RocmVhZERvSXQiCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkUnVubmluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RvcHBpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIG9uY2UgdGhlIHRocmVhZCBoYXMgYmVlbiBzdG9wcGVkLiBJZiB0aGUKLSAqICAgICAgICAgICAgICJ0aHJlYWRTdG9wcGVkIiBvcHRpb25JRCBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQKLSAqICAgICAgICAgICAgIGJlZm9yZSBkeWluZy4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY1N0b3BcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0b3BwaW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0Ffc2VtYXBob3JlV2FpdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgdGhyZWFkIChpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKLSAqICAgICAgICAgICAgIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGFuZCBpdHMgY29udGV4dCBhcmUgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgdGhyZWFkLgotICogQG5vdGUgICAgICAgQmVmb3JlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkQ2xvc2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY0Nsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZENsb3NlZCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZENsb3NlZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhDbG9zZSh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlOiBNNE9TQV9tdXRleENsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZSh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgIH0KLQotICAgZnJlZSh0aHJlYWRDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgdGhyZWFkIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgc3RhdGU6KE9VVCkgVGhyZWFkIHN0YXRlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRTdGF0ZSogc3RhdGUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVGhyZWFkU3RhdGUqIDB4JXgiLCBjb250ZXh0LCBzdGF0ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzdGF0ZSA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICAqc3RhdGUgPSB0aHJlYWRDb250ZXh0LT5zdGF0ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgZHVyaW5nICJ0aW1lU2xlZXAiCi0gKiAgICAgICAgICAgICBtaWxsaXNlY29uZHMuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICB0aW1lOihJTikgVGltZSB0byBzbGVlcCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFNsZWVwKE00T1NBX1VJbnQzMiB0aW1lKQotewotICAgc3RydWN0IHRpbWVzcGVjIHJxdHAgPSB7IDAsIDAgfTsKLSAgIHN0cnVjdCB0aW1lc3BlYyBybXRwID0geyAwLCAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTbGVlcFx0XHRNNE9TQV9VSW50MzIgJWQiLCB0aW1lKTsKLQotICAgcnF0cC50dl9zZWMgPSAodGltZV90KXRpbWUvMTAwMDsKLSAgIHJxdHAudHZfbnNlYyA9ICh0aW1lJTEwMDApICogMTAwMDAwMDsKLSAgIG5hbm9zbGVlcCgmcnF0cCwgJnJtdHApOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotCi1NNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCkob3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5XHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYoKE00T1NBX1VJbnQzMikodWludHB0cl90KW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKLSAgIHsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOwotICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgfQotCi0gICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgbmFtZVNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiluYW1lKSsxOwotCi0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KLSAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7Ci0KLSAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KCh2b2lkICopdGhyZWFkQ29udGV4dC0+bmFtZSwgKHZvaWQgKiluYW1lLAotICAgICAgICAgICAgICAgICAgIG5hbWVTaXplKTsKLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHVpbnRwdHJfdClvcHRpb25WYWx1ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCB0byBzZXQgdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIG9mIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgICJ2YWx1ZSIgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsCi0gKiAgICAgICAgICAgICB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDooSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIG9wdGlvblZhbHVlOihJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiAweCV4IiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1JFQURfT05MWSwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICBzd2l0Y2gob3B0aW9uSUQpCi0gICB7Ci0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkUHJpb3JpdHk6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNQcmlvcml0eShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNOYW1lKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgICAgICAgZXJyX2NvZGUgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICByZXR1cm4gZXJyX2NvZGU7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIE9TQUwtVGhyZWFkIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICJvcHRpb25WYWx1ZSIgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZS1hbGxvY2F0aW5nIHRoZSAidmFsdWUiCi0gKiAgICAgICAgICAgICBmaWVsZCwgdGhlIGNvcmUgT1NBTC1UaHJlYWQgY29tcG9uZW50IG11c3QgcGVyZm9ybSBhIGNvcHkgb2YgaXRzCi0gKiAgICAgICAgICAgICBpbnRlcm5hbCB2YWx1ZSB0byB0aGUgdmFsdWUgZmllbGQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTikgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDooSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIG9wdGlvblZhbHVlOihPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX09wdGlvbklEICVkXHRNNE9TQV9EYXRhT3B0aW9uKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25WYWx1ZSA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfVEhSRUFEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfV1JJVEVfT05MWSwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCogcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqcHJpb3JpdHkgPSB0aHJlYWRDb250ZXh0LT5wcmlvcml0eTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkTmFtZToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0NoYXIqKiBuYW1lID0gKE00T1NBX0NoYXIqKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKm5hbWUgPSB0aHJlYWRDb250ZXh0LT5uYW1lOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFN0YWNrU2l6ZToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiogc3RhY2tTaXplID0gKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpzdGFja1NpemUgPSB0aHJlYWRDb250ZXh0LT5zdGFja1NpemU7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgIH0KLQotICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19EZWJ1Z1RyYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19EZWJ1Z1RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MGVkOTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgIE00UFNXX0RlYnVnVHJhY2UuYwotICogQGJyaWVmICAgICAgRGVmYXVsdCB0cmFjZSBmdW5jdGlvbiBmb3IgZGVidWdnaW5nIG1hY3JvcwotICogQG5vdGUgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbgotICogICAgICAgICAgICAgdXNlZCBpbiB0aGUgZGVidWcgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcywgYmFzZWQgb24gcHJpbnRmLgotICogICAgICAgICAgICAgQXBwbGljYXRpb24gd3JpdGVycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byBpbXBsZW1lbnQgdGhlaXIKLSAqICAgICAgICAgICAgIG93biAiTTRPU0FfRGVidWdUcmFjZSIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+IC8qZm9yIHByaW50ZiAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKiNkZWZpbmUgTk9fRklMRSAqLyAvKiBzdXBwcmVzc2VzIHRoZSBmaWxlIG5hbWUgcHJpbnQgb3V0ICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgY2hhciogZmlsZSwgTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY29uZCwgY2hhciogbXNnLCBNNE9TQV9FUlIgZXJyKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZCBpbiB0aGUgZGVidWcgbWFjcm9zIG9ubHkuCi0gKiAgICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuCi0gKiBAcGFyYW0gICAgbGluZSAoSU4pOiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlCi0gKiBAcGFyYW0gICAgZmlsZSAoSU4pOiB0aGUgc291cmNlIGZpbGUgbmFtZQotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIG1zZyAoSU4pOiB0aGUgZXJyb3IgbWVzc2FnZQotICogQHBhcmFtICAgIGVyciAoSU4pOiB0aGUgcmV0dXJuIHZhbHVlIChlcnJvciBjb2RlKQotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9EZWJ1Z1RyYWNlKE00T1NBX0ludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIpCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIC8qIHRyeSB0byAiaW5kZW50IiB0aGUgcmVzdWx0aW5nIHRyYWNlcyBkZXBlbmRpbmcgb24gdGhlIGxldmVsICovCi0gICAgZm9yIChpID0wIDsgaSA8IGxldmVsOyBpICsrKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCIgIik7Ci0gICAgfQotCi0jaWZkZWYgTk9fRklMRQotICAgIHByaW50ZigiRXJyb3I6ICUiIFBSSXUzMiAiLCBvbiAlczogJXNcbiIsZXJyLGNvbmQsbXNnKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgcHJpbnRmKCJFcnJvcjogJSIgUFJJdTMyICIsIG9uICVzOiAlcyBMaW5lICUiIFBSSXUzMiAiIGluOiAlc1xuIixlcnIsY29uZCxtc2csbGluZSxmaWxlKTsKLSNlbmRpZiAvKiBOT19GSUxFICAgICAqLwotCi19Ci0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSBNNE9TQV9Wb2lkIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ0NvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IpCi17Ci0gICAgTTRPU0FfRGVidWdUcmFjZShsaW5lLCBmaWxlTmFtZSwgbGV2ZWwsIHN0cmluZ0NvbmRpdGlvbiwgbWVzc2FnZSwgcmV0dXJuZWRFcnJvcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhNGNjZWEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYwotICogQGJyaWVmICBNZW1vcnkgSW50ZXJmYWNlCi0gKiBAbm90ZSAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBvc2FsIG1lbW9yeSBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaWZuZGVmIE00VlBTX0FEVkFOQ0VEX01FTU9SWV9NQU5BR0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLSAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIChhdCBsZWFzdCAzMiBiaXRzIGFsaWduZWQpCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIGFsbG9jYXRlZCBibG9jayBpbiBieXRlcwotICogQHBhcmFtICAgICAgY29yZUlEIChJTik6IGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjYWxsZXIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgICBzdHJpbmcgKElOKTogZGVzY3JpcHRpb24gb2YgdGhlIGFsbG9jYXRlZCBibG9jayAobnVsbCB0ZXJtaW5hdGVkKQotICogQHJldHVybiAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrLCBNNE9TQV9OVUxMIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLXsKLSAgICBNNE9TQV9NZW1BZGRyMzIgQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzaXplIGlzIDAsIG1hbGxvYyBvbiBXSU4gT1MgYWxsb2NhdGVzIGEgemVyby1sZW5ndGggaXRlbSBpbgotICAgICAqIHRoZSBoZWFwIGFuZCByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGF0IGl0ZW0uCi0gICAgICogT24gb3RoZXIgcGxhdGZvcm1zLCBtYWxsb2MgY291bGQgcmV0dXJucyBhbiBpbnZhbGlkIHBvaW50ZXIKLSAgICAgKiBTbywgRE9OJ1QgYWxsb2NhdGUgbWVtb3J5IG9mIDAgYnl0ZSAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gQWRkcmVzczsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSU0ICE9IDApCi0gICAgewotICAgICAgICBzaXplID0gc2l6ZSArIDQgLSAoc2l6ZSU0KTsKLSAgICB9Ci0KLSAgICBBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikgbWFsbG9jKHNpemUpOwotCi0gICAgcmV0dXJuIEFkZHJlc3M7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkOWExZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+IC8qIEFOU0kgQyBtYWNyb3MgYW5kIGRlZnMgZm9yIHZhcmlhYmxlIGFyZ3MgKi8KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2RlZmluZSBOT19GSUxFIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX1NJWkUgMTAyNAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHJpbnRmLiBGaXJzdCB0aGUgdmFyaWFibGVzIGFyZSByZXRyaWV2ZWQgdXNpbmcKLSAqICAgICAgICAgICAgQU5TSSBDIGRlZnMgYW5kIG1hY3JvcyB3aGljaCBlbmFibGUgdG8gYWNjZXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAqICAgICAgICAgICAgVGhlbiB0aGUgcHJpbnRmIGlzIGRvbmUgKHdpdGggc29tZSBvcm5lbWVudGFsIGFkZHMpLgotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIGZvcm1hdCAoSU4pOiB0aGUgInByaW50ZiIgZm9ybWF0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgLi4uIChJTik6IGFzIG1hbnkgcGFyYW1ldGVycyBhcyByZXF1aXJlZCAuLi4KLSAqIEByZXR1cm4gICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotewotICAgIE00T1NBX0NoYXIgbWVzc2FnZVtNQVhfU1RSSU5HX1NJWkVdOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgdmFfbGlzdCBtYXJrZXI7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBhcmd1bWVudHMgKi8KLQotICAgIC8qIGdldCB0aGUgdmFyIGFyZ3VtZW50cyBpbnRvIHRoZSBzdHJpbmcgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHByaW50ICovCi0gICAgdmFfc3RhcnQobWFya2VyLGZvcm1hdCk7IC8qIHNldCBwdHIgdG8gZmlyc3QgYXJndW1lbnQgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gKi8KLSAgICB2c3ByaW50ZigoY2hhciAqKW1lc3NhZ2UsIChjb25zdCBjaGFyICopZm9ybWF0LG1hcmtlciApOyAgLyogZm9ybWF0cyBhbmQgd3JpdGVzIHRoZSBkYXRhIGludG8gbWVzc2FnZSAqLwotICAgIHZhX2VuZChtYXJrZXIpOyAvKiByZXNldCBwb2ludGVyIHRvIE5VTEwgKi8KLQotICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KLSNpZmRlZiBOT19GSUxFCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1lc3NhZ2UsIGxpbmUsIGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsc3RyaW5nTXNnKTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilzdHJpbmdNc2csbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOwotI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgKGNoYXIqKWZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjlkMTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19UeXBlcy5oCi0gKiBAYnJpZWYgICBEZWZpbml0aW9uIG9mIHR5cGVzIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVFlQRVNfSAotI2RlZmluZSBNNE1QNFdfVFlQRVNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0Q19GdHlwQm94Ci0gKiBAYnJpZWYgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTTRNUEFDX0ZUWVBfVEFHIDB4NjY3NDc5NzAgLyogJ2Z0eXAnICovCi0jZGVmaW5lIE00TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgIC8qIGdlbmVyYWxseSAnM2dwNCcgICAgICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtaW5vcl92ZXJzaW9uOyAgICAgICAvKiBnZW5lcmFsbHkgJzAwMDAnIG9yICd4LnggJyAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbmJDb21wYXRpYmxlQnJhbmRzOyAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFNdOyAgIC8qIGFycmF5IG9mIG1heCBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kcyAqLwotfSBNNE1QNENfRnR5cEJveDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfbWVtQWRkcgotICogQGJyaWVmICAgICAgICBCdWZmZXIgc3RydWN0dXJlIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2l6ZTsKLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgYWRkcjsKLX0gTTRNUDRXX21lbUFkZHI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGltZSB0eXBlIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00TVA0V19UaW1lMzI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICBNNE1QNFdfU3RhdGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBzdGF0ZXMKLSAqIEBub3RlICAgICAgICAgVGhlc2Ugc3RhdGVzIGFyZSB1c2VkIGludGVybmFseSwgYnV0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBvdXRzaWRlCi0gKiAgICAgICAgICAgICAgIHRoZSB3cml0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TVA0V19vcGVuZWQgICAgICAgICAgICA9IDB4MTAwLAotICAgIE00TVA0V19yZWFkeSAgICAgICAgICAgICA9IDB4MjAwLAotICAgIE00TVA0V193cml0aW5nICAgICAgICAgICA9IDB4MzAwLAotICAgIE00TVA0V193cml0aW5nX3N0YXJ0QVUgICA9IDB4MzAxLAotICAgIE00TVA0V19jbG9zZWQgICAgICAgICAgICA9IDB4NDAwCi19IE00TVA0V19TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNE1QNFdfT3B0aW9uSUQKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBvcHRpb25zCi0gKiBAbm90ZSAgICAgICAgVGhlc2Ugb3B0aW9ucyBnaXZlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX21heEFVcGVyQ2h1bmsgICAgICAgID0gMHhDMTAxLAotICAgIE00TVA0V19tYXhDaHVua1NpemUgICAgICAgICA9IDB4QzEwMiwKLSAgICBNNE1QNFdfbWF4Q2h1bmtJbnRlciAgICAgICAgPSAweEMxMDMsCi0gICAgTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2sgICAgID0gMHhDMTA0LAotICAgIE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayAgICA9IDB4QzEwNSwKLSAgICBNNE1QNFdfbWF4QVVzaXplICAgICAgICAgICAgPSAweEMxMDYsCi0gICAgTTRNUDRXX0lPRCAgICAgICAgICAgICAgICAgID0gMHhDMTExLAotICAgIE00TVA0V19FU0QgICAgICAgICAgICAgICAgICA9IDB4QzExMiwKLSAgICBNNE1QNFdfU0RQICAgICAgICAgICAgICAgICAgPSAweEMxMTMsCi0gICAgTTRNUDRXX3RyYWNrU2l6ZSAgICAgICAgICAgID0gMHhDMTE0LAotICAgIE00TVA0V19NT09WZmlyc3QgICAgICAgICAgICA9IDB4QzEyMSwKLSAgICBNNE1QNFdfVjJfTU9PRiAgICAgICAgICAgICAgPSAweEMxMzEsCi0gICAgTTRNUDRXX1YyX3RibENvbXByZXMgICAgICAgID0gMHhDMTMyLAotICAgIC8qd2FybmluZzogdW5zcGVjaWZpZWQgb3B0aW9uczoqLwotICAgIE00TVA0V19tYXhGaWxlU2l6ZSAgICAgICAgICA9IDB4QzE1MiwKLSAgICBNNE1QNFdfQ2FtY29kZXJWZXJzaW9uICAgICAgPSAweEMxNTMsIC8qMDAwIHRvIDk5OSAhKi8KLSAgICBNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUgICAgPSAweEMxNTQsIC8qYXVkaW8gQVVzIGFyZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHZpZGVvLCAqLwotICAgIC8qdGhpcyBvcHRpb24gTVVTVCBOT1QgYmUgc2V0IGlmIG5vbiBjb25zdGFudCBhdWRpbwotICAgIGZyYW1lIHNpemUgKGUuZy4gaWYgU0lEKSovCi0gICAgTTRNUDRXX2VtYmVkZGVkU3RyaW5nICAgICAgID0gMHhDMTU1LAotICAgIE00TVA0V19pbnRlZ3JhdGlvblRhZyAgICAgICA9IDB4QzE1NiwKLSAgICBNNE1QNFdfbWF4RmlsZUR1cmF0aW9uICAgICAgPSAweEMxNTcsCi0gICAgTTRNUDRXX3NldEZ0eXBCb3ggICAgICAgICAgID0gMHhDMTU4LAotICAgIE00TVA0V19EU0kgICAgICAgICAgICAgICAgICA9IDB4QzE1OSwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotICAgIE00TVA0V19NVUxfUFBTX1NQUyAgICAgICAgICA9IDB4QzE2MCwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotfSBNNE1QNFdfT3B0aW9uSUQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXVkaW8gJiB2aWRlbyBzdHJlYW0gSURzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgQXVkaW9TdHJlYW1JRCAxCi0jZGVmaW5lIFZpZGVvU3RyZWFtSUQgMgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmF1bHQgcGFyYW1ldGVycyB2YWx1ZXMsIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IE00TVA0V19zZXRPcHRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdFdpZHRoIDMyMAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEhlaWdodCAyNDAKLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhBdVNpemUgIDQwOTYgLypieXRlcyovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0TWF4Q2h1bmtTaXplIDEwMDAwMCAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyIDAgLypieXRlcyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1N0cmVhbUlEc2l6ZQotICogQGJyaWVmICAgICAgICBWaWRlbyBwbGFuZSBzaXplCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQ7Ci0gICAgTTRPU0FfVUludDE2ICAgIGhlaWdodDsKLSAgICBNNE9TQV9VSW50MTYgICAgd2lkdGg7Ci19IE00TVA0V19TdHJlYW1JRHNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgdHJhY2sgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICB0cmFja1R5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICB0aW1lc2NhbGU7ICAgICAgICAgIC8qIFQgKHZpZGVvPTEwMDApLCAoQU1SOD04MDAwKSwgKEFNUjE2PTE2MDAwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVTaXplOyAgICAgICAgIC8qIFMgKHZpZGVvPTApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHN0dHNUYWJsZUVudHJ5TmI7ICAgLyogSiAoYXVkaW89MSkqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgIGxhc3RDVFM7ICAgICAgICAgICAvKiBDVFMgb2YgdGhlIHByZXZpb3VzIEFVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0IHRvIDAuR2l2ZXMgZHVyYXRpb24gYXQgdGhlIGVuZC4qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2FtcGxlTmI7ICAgICAgICAgICAvKiBLIChhdWRpbz1GKSovCi19IE00TVA0V19UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBhdWRpbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgLyogSW5pdCB0byAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50UG9zOyAgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAvKiBJbml0IHRvIDAgKi8KLSNlbmRpZgotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uOyAgICAgLyogQ2hlY2sgKEFNUjg9MTYwKSwgKEFNUjE2PTMyMCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heENodW5rU2l6ZTsgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIC8qIHByZXZpb3VzbHksIGF1ZGlvIGF1IHNpemUgd2FzIHN1cHBvc2VkIGNvbnN0YW50LAotICAgICAqIHdoaWNoIGlzIGFjdHVhbGx5IG5vdCB0aGUgY2FzZSBpZiBzaWxlbmNlcyAoc2lkKS4qLwotICAgIC8qIGF0IGZpcnN0IGF1ZGlvIGF1LCBzYW1wbGVTaXplIGlzIHNldC4gSXQgaXMgbGF0ZXIgcmVzZXQgdG8gMCBpZiBub24gY29uc3RhbnQgc2l6ZS4qLwotICAgIC8qIFNvIHNhbXBsZVNpemUgc2hvdWxkIGJlIHRlc3RlZCB0byBrbm93IHdlaXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgVEFCTEVfU1RTWi4gKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAvKiB0YWJsZSBzaXplIGlzIDRLKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBhdmdCaXRyYXRlOyAgICAgLypub3QgdXNlZCBpbiBhbXIgY2FzZSovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEFNUiAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDkgYnl0ZXMgZm9yIEFNUiAqLwotfSBNNE1QNFdfQXVkaW9UcmFja0RhdGE7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB2aWRlbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE1QNFdfVGltZTMyKiAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3MgOyAgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBzdHNzVGFibGVFbnRyeU5iIDsgICAgICAgLyogTiovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIFgqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgICAvKiBZKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBKKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQxNiogICAgICAgICAgIFRBQkxFX1NUU1o7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIDJLKi8KLSNlbHNlCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgNEsqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTUzsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgTiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3M7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVXBlckNodW5rOyAgICAgICAgICAgLypJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAgICAgIC8qSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhBVVNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIExhc3RBbGxvY2F0ZWRDaHVuazsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtYXhCaXRyYXRlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7Ci0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEgyNjMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDcgYnl0ZXMgZm9yIEgyNjMgKi8KLX0gTTRNUDRXX1ZpZGVvVHJhY2tEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfTXA0RmlsZURhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgcHJpdmF0ZSBjb250ZXh0IHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgICAgICAgIHN0YXRlOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgIHVybDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsgICAgLyogRCBpbiBtcywgbWF4IGR1cmF0aW9uIG9mIGF1ZGlvJnZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBmaWxlc2l6ZTsgICAgLyogYWN0dWFsIGZpbGVzaXplIGluIGJ5dGVzKi8KLSAgICBNNE1QNFdfQXVkaW9UcmFja0RhdGEqICAgICAgICBhdWRpb1RyYWNrUHRyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvOwotICAgIE00TVA0V19WaWRlb1RyYWNrRGF0YSogICAgICAgIHZpZGVvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW87Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIDEwMDAwMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4QVVTaXplOyAgICAgICAgICAvKiBJbml0IHRvIDQwOTYqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVTaXplOyAgICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNFdfVGltZTMyICAgICAgICAgICAgICAgICBJbnRlcmxlYXZlRHVyOyAgICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCwgbXMqLwotICAgIC8qIE00TVA0V19Xcml0ZUNhbGxCYWNrICAgICAgICAgICAgUHJlV3JpdGVDYWxsQmFjazsqLyAgICAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQb3N0V3JpdGVDYWxsQmFjazsqLyAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb25zOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGNhbWNvZGVyVmVyc2lvbjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZUF1ZGlvU2l6ZTsgIC8qIGRlZmF1bHQgaXMgZmFsc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNDaHVua0R1cjsgICAgLyogaW4gbXMsIHNldCBvbmx5IGlmIGVzdGltYXRlQXVkaW9TaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0cnVlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhdWRpb01zU3RvcFRpbWU7ICAgIC8qIHRpbWUgdG8gc3RvcCBhdWRpbywgc2V0IG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0OwotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUN1cnJlbnRQb3M7IC8qIG5ldyBmaWVsZCBmb3Igb2Zmc2V0IHVwZGF0ZSovCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkU3RyaW5nOyAgICAgLyogMTYgYnl0ZXMgc3RyaW5nLCBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZW4gaWYgTlVMTCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb25UYWc7ICAgICAvKiA2MCBieXRlcyBzdHJpbmcsIG1lbXNldCB0byAwIGlmIE5VTEwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhGaWxlRHVyYXRpb247ICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgTTRNUDRDX0Z0eXBCb3ggICAgICAgICAgICAgICAgZnR5cDsgICAgICAgICAgICAgICAvKiBmdHlwIGF0b20sIGlmIG5vdCBkZWZpbmVkIHNldCBtYWpvcl9icmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCB3aWxsIHVzZSBkZWZhdWx0IGJveCAqLwotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgIHNhZmV0eUZpbGVVcmw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuU2FmZXR5RmlsZTsKLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1VTFBQU1NQUzsKLX0gTTRNUDRXX01wNEZpbGVEYXRhOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qTTRNUDRXX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmU3YWJiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19VdGlscy5oCi0gKiBAYnJpZWYgICBVdGlsaXRpZXMgYW5kIHByaXZhdGUgZnVuY3Rpb25zIGRlY2xhcmF0aW9uIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgTTRNUDRXX1VUSUxTX0gKLSNkZWZpbmUgTTRNUDRXX1VUSUxTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byB3cml0ZSBkYXRhIGluIGJpZyBlbmRpYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCeXRlKE00T1NBX1VDaGFyIGMsICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTMyKE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXcml0ZSBhIGJ1bGsgb2YgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgZmlsZSwgc2l6ZSBpcyBnaXZlbiBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJsb2NrKGNvbnN0IE00T1NBX1VDaGFyKiBCbG9jaywgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCB0aGUgJ25iJyB1bnNpZ25lZCBpbnRlZ2VycyBpbiAndGFiJyB0YWJsZSBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfdGFibGUzMlRvQkUoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQzMiBuYik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCBhbiB1bnNpZ25lZCAzMiBiaXRzIGludGVnZXIgZnJvbSBMRSBpbnRvIEJFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKE00T1NBX1VJbnQzMiogdmFsUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZS1hbGxvY2F0aW9uIGZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGUtYWxsb2NhdGUgdGhlIGNvbnRleHQKLSAqIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgd3JpdGVyIGV4dGVybmFsIGludGVyZmFjZSwgYnV0IGlzIGNhbGxlZCBmcm9tCi0gKiB0aGUgZnVuY3Rpb24gTTRNUDRXX2Nsb3NlV3JpdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19mcmVlQ29udGV4dChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdXQgSGkgYW5kIExvIHUxNiBwYXJ0IGluIGEgdTMyIHZhcmlhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0hpKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgSGkpOwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBMbyk7Ci1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVVRJTFNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjczYTIyMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1dyaXRlci5oCi0gKiBAYnJpZWYgICBDb3JlIE1QNCB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1QNCB3cml0ZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqICAgICAgICAgIFRoZSBNUDQgd3JpdGVyIHNwZWNpZmljIHR5cGVzIGFyZSBkZWZpbmVkIGluIGZpbGUgTTRNUDRXX1R5cGVzLmgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBNNE1QNFdfV1JJVEVSX0gKLSNkZWZpbmUgTTRNUDRXX1dSSVRFUl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNFdBUl9NUDRXX09WRVJTSVpFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00TVA0X1dSSVRFUiAsMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IE1QNFcgdmVyc2lvbgotICogQHBhcmFtICAgIG1ham9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21ham9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICBtaW5vciAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdtaW5vcicgdmVyc2lvbiBudW1iZXIuCi0gKiBAcGFyYW0gICAgcmV2aXNpb24gICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAncmV2aXNpb24nIG51bWJlci4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4KiBtYWpvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHJldmlzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdGlhdGlvbiBvZiB0aGUgTVA0IGZpbGUgY3JlYXRpb24KLSAqIEBwYXJhbSAgICBjb250ZXh0UHRyICAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlIE1QNCB3cml0ZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVSZWFkZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19vcGVuV3JpdGUoIE00T1NBX0NvbnRleHQqICAgICAgICAgICAgICAgICAgY29udGV4dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgZmlsZVJlYWRlckZ1bmN0aW9uICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFkZCBhIG5ldyB0cmFjawotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgc3RyZWFtRGVzY1B0ciAgICAgICAgKElOKSAgICAgIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IHRyYWNrLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQ6ICBBbiBhdWRpbyAocmVzcC52aWRlbykgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGlzIGNvbnRleHQgd2hpbGUgYXR0ZW1wdGluZyB0byBhZGQgYW5vdGhlciBvbmUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgZm9yYmlkZGVuLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2FkZFN0cmVhbSggTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICAgc3RyZWFtRGVzY1B0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2lnbmFsIHRvIHRoZSBjb3JlIE1QNCB3cml0ZXIgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHRyYWNrcyB0byBhZGQKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVDogIEF1ZGlvIHNpemUgZXN0aW1hdGlvbiBpcyByZXF1aXJlZCBidXQgbm90IHR3byBzdHJlYW1zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrcyB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIGluaXRpYXRlIHRoZSBhY2Nlc3MgdW5pdCBjcmVhdGlvbiBpbgotICogICAgICAgICAgdGhlIHN0cmVhbUlEIHRyYWNrCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHN0cmVhbUlEICAgICAgICAgICAgKElOKSBTdHJlYW0gSUQgb2YgdGhlIHRyYWNrLgotICogQHBhcmFtICAgYXVQdHIgICAgICAgICAgICAgICAoSU4vT1VUKSBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDpVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydEFVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCAgICAgICBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHdyaXRlIHRoZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBub3RlICAgIElmIE00TVA0V19XQVJfT1ZFUlNJWkUgaXMgcmV0dXJuZWQsIE00TVA0V19zdGFydEFVIG11c3Qgbm90IGJlIGNhbGxlZCBhbnltb3JlLAotICogICAgICAgICAgYnV0IGRpcmVjdGx5IE00TVA0V19jbG9zZVdyaXRlKCkuCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pICAgICAgIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpICAgQWNjZXNzIHVuaXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICAgICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEU6ICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGV2YWx1YXRlIGF1ZGlvIHNpemUgaWYgYXVkaW8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHNpemUuCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfT1ZFUlNJWkU6ICAgICAgICBNYXggZmlsZSBzaXplIHdhcyByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHJvY2Vzc0FVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgIGF1UHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIENsb3NlIHRoZSBNUDQgZmlsZQotICogQG5vdGUgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgTVA0IHdyaXRlciwgdGhlIE00TVA0V19mcmVlQ29udGV4dCBtZXRob2QKLSAqICAgICAgICAgICAgd2FzIGluIHRoZSBpbnRlcmZhY2UsIHdoaWNoIGlzIG5vdCB0aGUgY2FzZSBhbnltb3JlLgotICogICAgICAgICAgICBUaGUgY29udGV4dCBpcyBub3cgYWx3YXlzIGRlYWxsb2NhdGVkIGluIHRoZSBNNE1QNFdfY2xvc2VXcml0ZSBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklECi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBvcHRpb24gICAgICAgICAgICAgICAgIChJTikgICAgT3B0aW9uIElELgotICogQHBhcmFtICAgIHZhbHVlUHRyICAgICAgICAgICAgICAgKE9VVCkgICBQb2ludGVyIHRvIHRoZSBvcHRpb24gdmFsdWUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiAgTm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogICAgVW5rbm93biBvcHRpb25JRAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICBCYWQgc3RyZWFtIElEIGluIHRoZSBvcHRpb24gdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICp2YWx1ZVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAoSU4vT1VUKSAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgIChJTikgICAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWUgICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3NldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgdmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gaXRzIHN0YXRlLgotICogQG5vdGUgICAgIEJ5IHNlbGVjdGluZyBhIHNwZWNpZmljIHN0cmVhbUlEIChub3QgbnVsbCksIHRoZSBjYWxsZXIgY2FuIG9idGFpbgotICogICAgICAgICAgIHRoZSBzdGF0ZSBvZiBhIHNwZWNpZmljIHN0cmVhbS4gQnkgdXNpbmcgMCBhcyBzdHJlYW1JRCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICBzdGF0ZSBpcyBub3Qgc3RyZWFtIHNwZWNpZmljLgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOKSAgICAgUG9pbnRlciB0byB0aGUgc3RhdGUgZW51bWVyYXRpb24uCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBzdHJlYW1JRCBvZiB0aGUgc3RyZWFtIHRvIHJldHJpZXZlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm8tc3RhdGUgKDAgZm9yIGdsb2JhbCBzdGF0ZSkuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIFVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRTdGF0ZSggTTRPU0FfQ29udGV4dCAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX1N0YXRlKiAgICBzdGF0ZVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIGN1cnJlbnRseSBleHBlY3RlZCBmaWxlIHNpemUKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICAgICAgY3VycmVudEZpbGVTaXplKTsKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qTTRNUDRXX1dSSVRFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3MDMwMGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYjNncHdyaXRlcgotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICAgIE00TVA0V19JbnRlcmZhY2UuYyBcCi0gICAgICBNNE1QNFdfVXRpbHMuYyBcCi0gICAgICBNNE1QNFdfV3JpdGVyLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1ERFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYzUyNTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19JbnRlcmZhY2UuYwotICogQGJyaWVmICAgIDNHUFAgZmlsZSB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIGNvbW1vbiBpbnRlcmZhY2UgZGVmaW5lZAotICogICAgICAgICAgaW4gIk00V1JJVEVSX2NvbW1vbi5oIi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogT1NBTCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGJhc2ljIHR5cGVzIGRlZmluaXRvbiAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBmaWxlIGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIG1lbW9yeSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGRlYnVnIHRvb2xzICovCi0KLS8qKgotICogV3JpdGVyIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IERlZmluaXRpb24gb2YgdGhlIHdyaXRlciBjb21tb24gaW50ZXJmYWNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbW9kdWxlIGZvbGxvd3MgKi8KLQotI2lmZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZWxzZQotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciB0eXBlcyAqLwotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotLyoqCi0gKiBTcGVjaWZpYyBlcnJvcnMgZm9yIHRoaXMgbW9kdWxlICovCi0jZGVmaW5lIE00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEUgXAotICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdSSVRFUl8zR1AsIDB4MDAwMDAxKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgd3JpdGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICBwTVA0Q29udGV4dDsgICAgLyoqPCBNUDQgd3JpdGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWF4QVVzaXplczsgICAgICAgIC8qKjwgdGhlIG1heGltdW0gQVUgc2l6ZSBwb3NzaWJsZSAqLwotfSBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKE00V1JJVEVSX0NvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwV2hhdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyKQotICogQGJyaWVmICAgIE9wZW4gYSB3cml0ZXIgc2Vzc2lvbi4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gY3JlYXRlLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mIE9TQUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEBwYXJhbSAgICBmaWxlUmVhZGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMIGZpbGUgcmVhZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwRmlsZVB0ckZjdCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBvcGVuV3JpdGUgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKCBNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlciApCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZSIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZXJQb2ludGVyKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcEZpbGVXcml0ZXJQb2ludGVyIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQgPSAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmVzZXQgY29udGV4dCB2YXJpYWJsZXMgKi8KLSAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQtPm1heEFVc2l6ZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuIHRoZSB3cml0ZXIgY29udGV4dCAqLwotICAgICpwQ29udGV4dCA9IChNNFdSSVRFUl9Db250ZXh0ICopYXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgTGF1bmNoIHRoZSBvcGVuV3JpdGUgb2YgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogY2FsbGluZyBNNE1QNFdfb3BlbldyaXRlKCkiKTsKLQotICAgIGVyciA9IE00TVA0V19vcGVuV3JpdGUoJmFwQ29udGV4dC0+cE1QNENvbnRleHQsIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgcEZpbGVXcml0ZXJQb2ludGVyLCB0ZW1wRmlsZURlc2NyaXB0b3IsIHBGaWxlUmVhZGVyUG9pbnRlciApOwotCi0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19vcGVuV3JpdGUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZyhNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIEluZGljYXRlcyB0byB0aGUgd3JpdGVyIHRoYXQgdGhlIHNldHVwIHNlc3Npb24gaXMgZW5kZWQgYW5kIHRoYXQKLSAqICAgICAgICAgIHdlIHdpbGwgc3RhcnQgdG8gd3JpdGUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHN0YXJ0V3JpdGluZyAoSXRzCi0gKiAgICAgICAgICAgIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmcoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogY2FsbGluZyBNNE1QNFdfc3RhcnRXcml0aW5nKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRXcml0aW5nKGFwQ29udGV4dC0+cE1QNENvbnRleHQpOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc3RhcnRXcml0aW5nIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKAotICogICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gKnBTdHJlYW1EZXNjcmlwdGlvbikKLSAqIEBicmllZiAgICAgQWRkIGEgc3RyZWFtIChhdWRpbyBvciB2aWRlbykuCi0gKiBAbm90ZSAgICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyBwcm9wZXJ0aWVzIGFyZSBjb3JyZWN0bHkgc2V0IGJlZm9yZSBjYWxsaW5nCi0gKiAgICAgICAgICAgIHRoZSBjb3JlIHdyaXRlciBhZGQgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtRGVzY3JpcHRpb246ICAgIChJTikgc3RyZWFtIGRlc2NyaXB0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBhZGRTdHJlYW0KLSAqICAgICAgICAgICAgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2NyaXB0aW9uKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQgKmFwQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgKnBWaWRlb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgKnBBdWRpb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19TdHJlYW1JRHNpemUgc2l6ZVZhbHVlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBDb250ZXh0PTB4JXgsICIKLSAgICAgICAgICAgICAgICAgICAicFN0cmVhbURlc2NyaXB0aW9uPTB4JXgiLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwU3RyZWFtRGVzY3JpcHRpb24pOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjcmlwdGlvbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBZGFwdCBhdWRpby92aWRlbyBzdHJlYW0gaW5mb3MgKi8KLSAgICBzd2l0Y2ggKHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICJhZGRpbmcgYSBWaWRlbyBzdHJlYW0gKHN0cmVhbVR5cGU9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBDb21tb24gZGVzY3JpcHRpb25zICovCi0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsgICAgLyoqPCBUaGUgb25seSB2YWx1ZXMgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgd3JpdGVyIGFyZSBzdHJlYW1JRCAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT50aW1lU2NhbGUgPSAxMDAwOyAgICAgICAgICAgIC8qKjwgYW5kIHRpbWVTY2FsZSAqLwotCi0vKiBOb3QgcmVjb21tZW5kZWQgZm9yIHZpZGVvIGVkaXRpbmcgLT4gd3JpdGUgZXhwbGljaXRlbHkgdGhlICdiaXRyJyBib3ggaW50byAnZDI2MycgKi8KLS8qIFJlbSA6IGl0IGlzIFJFTCA1IG9mIDNncHAgZG9jdW1lbnRhdGlvbiAqLwotLy8gICAgICAgICAgICAvKioKLS8vICAgICAgICAgICAgICogQXZlcmFnZSBiaXQtcmF0ZSBtdXN0IG5vdCBiZSBzZXQgaW4gSDI2MyB0byBiZSBjb21wYXRpYmxlIHdpdGggUGxhdGZvcm00ICovCi0vLyAgICAgICAgICAgIGlmIChNNFNZU19rSDI2MyA9PSBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+YXZlcmFnZUJpdHJhdGUgPSAtMTsKLS8vICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyAqLwotICAgICAgICAgICAgcFZpZGVvSW5mbyA9IChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICopcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHBWaWRlb0luZm8tPkhlYWRlci5TaXplOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX01lbUFkZHIzMilwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZjsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogRFNJPTB4JXgsIERTSXNpemU9JWQiLAotICAgICAgICAgICAgICAgICBwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZiwgcFZpZGVvSW5mby0+SGVhZGVyLlNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBTVJfV0I6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBhZGRpbmcgYW4gQXVkaW8gc3RyZWFtIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgQ29tbW9uIGRlc2NyaXB0aW9ucyAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1JRCA9IEF1ZGlvU3RyZWFtSUQ7ICAgIC8qKjwgVGhlIG9ubHkgdmFsdWUgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSB3cml0ZXIgaXMgc3RyZWFtSUQgKi8KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICAgICAgICAgIHBBdWRpb0luZm8gPSAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyAqKXBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBwQXVkaW9JbmZvLT5IZWFkZXIuU2l6ZTsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9NZW1BZGRyMzIpcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWY7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogQXVkaW86IERTST0weCV4LCBEU0lzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWYsIHBBdWRpb0luZm8tPkhlYWRlci5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTpcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IGNhbGxpbmcgTTRNUDRXX2FkZFN0cmVhbSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX2FkZFN0cmVhbShhcENvbnRleHQtPnBNUDRDb250ZXh0LHBTdHJlYW1EZXNjcmlwdGlvbik7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IE00TVA0V19hZGRTdHJlYW0gcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIChlcnIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZvciBWaWRlbywgc2V0IHRoZSBNNE1QNFdfdHJhY2tTaXplIE9wdGlvbiAqLwotICAgIHN3aXRjaCAocFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgc2l6ZVZhbHVlLnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsKLSAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQgPSAoTTRPU0FfVUludDE2KShwVmlkZW9JbmZvLT5oZWlnaHQpOwotICAgICAgICAgICAgc2l6ZVZhbHVlLndpZHRoICA9IChNNE9TQV9VSW50MTYpKHBWaWRlb0luZm8tPndpZHRoKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogaGVpZ2h0PSVkLCB3aWR0aD0lZCIsCi0gICAgICAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQsIHNpemVWYWx1ZS53aWR0aCk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBjYWxsaW5nIE00TVA0V19zZXRPcHRpb24oTTRNUDRXX3RyYWNrU2l6ZSkiKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V190cmFja1NpemUsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSZzaXplVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBNNE1QNFdfc2V0T3B0aW9uIHJldHVybnMgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2xvc2UgdGhlIHdyaXRlci4gVGhlIGNvbnRleHQgaXMgZnJlZWQgaGVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgY2xvc2VXcml0ZSAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0PShNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dC0+cE1QNENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IGNhbGxpbmcgTTRNUDRXX2Nsb3NlV3JpdGUoKSIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfY2xvc2VXcml0ZShhcENvbnRleHQtPnBNUDRDb250ZXh0KTsKLSAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IE00TVA0V19jbG9zZVdyaXRlIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBEZWFsbG9jYXRlIG91ciBvd24gY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gKiAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBwcHRpb25JZDogICAgIChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcGFyYW0gICAgIE9wdGlvblZhbHVlIDogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgSUQgb2YgdGhlIG9wdGlvbiBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHNldE9wdGlvbiAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX21lbUFkZHIgbWVtdmFsOwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0dmFsOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHBDb250ZXh0PTB4JXgsIG9wdGlvbklEPTB4JXgsXAotICAgICAgICAgb3B0aW9uVmFsdWU9MHgleCIsIHBDb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1hcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4QVVzaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heENodW5rU2l6ZSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHN0cmluZyBzaWduYXR1cmUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmc6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHRleHQgc3RyaW5nICovCi0gICAgICAgICAgICBtZW12YWwuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICAvKio8IHRoaXMgaXMgbWF4IHN0cmluZyBzaXplIGNvcGllZCBieSB0aGUgY29yZSAqLwotICAgICAgICAgICAgbWVtdmFsLnNpemUgPSAxNjsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfZW1iZWRkZWRTdHJpbmcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19lbWJlZGRlZFN0cmluZylcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIGludGVncmF0aW9uIHRhZyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIFRoZSBnaXZlbiBNNE9TQV9EYXRhT3B0aW9uIG11c3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgIGJlIGEgdGV4dCBzdHJpbmcgKi8KLSAgICAgICAgICAgIG1lbXZhbC5hZGRyID0gKE00T1NBX01lbUFkZHIzMilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIC8qKjwgdGhpcyBpcyBtYXggc3RyaW5nIHNpemUgY29waWVkIGJ5IHRoZSBjb3JlICovCi0gICAgICAgICAgICBtZW12YWwuc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfaW50ZWdyYXRpb25UYWcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19pbnRlZ3JhdGlvblRhZykiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHZlcnNpb24gc2lnbmF0dXJlICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24gb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHZlcnNpb24gbnVtYmVyICovCi0KLSAgICAgICAgICAgIC8qKjwgSGVyZSAwIG1lYW5zIGJvdGggc3RyZWFtcyAqLwotICAgICAgICAgICAgb3B0dmFsLnN0cmVhbUlEID0gMDsKLSAgICAgICAgICAgIC8qKjwgdmVyc2lvbiBudW1iZXIgKi8KLSAgICAgICAgICAgIG9wdHZhbC52YWx1ZSA9ICooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfQ2FtY29kZXJWZXJzaW9uLCAmb3B0dmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFNvbWUgb3B0aW9ucyBhcmUgcmVhZC1vbmx5ICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplOgotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBzZXQgYSByZWFkLW9ubHkgb3B0aW9uISAoSUQ9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9SRUFEX09OTFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gZmlsZXNpemUgbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4RmlsZVNpemUsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfbWF4RmlsZVNpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGZpbGUgZHVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb246Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhGaWxlRHVyYXRpb24sIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgU2V0ICdmdHlwJyBhdG9tICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa1NldEZ0eXBCb3g6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rU2V0RnR5cEJveCBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX3NldEZ0eXBCb3gsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfc2V0RnR5cEJveClcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tEU0k6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRFNJIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfRFNJLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0RTSSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKyBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTVVMX1BQU19TUFM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTVVMX1BQU19TUFMgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19NVUxfUFBTX1NQUywgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19EU0kpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKi0gSC4yNjQgVHJpbW1pbmcgICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFVua25vd24gb3B0aW9uICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgidHJ5aW5nIHRvIHNldCBhbiB1bmtub3duIG9wdGlvbiFcCi0gICAgICAgICAgICAgICAgIChvcHRpb25JRD0weCV4KSIsIG9wdGlvbklEKTsKLSAgICAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRPcHRpb24oCi0gKiAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBPcHRpb25JZDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHBhcmFtICAgICBwT3B0aW9uVmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBJRCBvZiB0aGUgb3B0aW9uIGlzIG5vdCB2YWxpZC4KLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiBUaGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBnZXRPcHRpb24gKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcENvbnRleHQ9MHgleCwgb3B0aW9uSUQ9MHgleCxcCi0gICAgICAgICBvcHRpb25WYWx1ZT0weCV4IiwgcENvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldE9wdGlvbihhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhBVXNpemUsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSZvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRPcHRpb24oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0T3B0aW9uKE00TVA0V19tYXhDaHVua1NpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVGhlIGZpbGUgc2l6ZSBvcHRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBnZXQgdGhlIGN1cnJlbnQgZmlsZSBzaXplICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFRoZSBmaWxlIHNpemUgd2l0aCBhdWRpbyBvcHRpb24gaGFzIGl0cyBvd24gZnVuY3Rpb24gY2FsbAotICAgICAgICAgICAgICBpbiB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgLi4uICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL25vIG1vcmUgbmVlZGVkIDNncCB3cml0ZXIgaGFzIGl0cyBvd24gbWVjYW5pc20KLSAgICAgICAgICAgIC8vLyogLi4uIGFkZCB0aGUgZXN0aW1hdGVkIG5leHQgbWF4IEFVIHNpemUgKi8KLSAgICAgICAgICAgIC8vKigoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSkgKz0gYXBDb250ZXh0LT5tYXhBVXNpemVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBVbmtub3duIG9wdGlvbiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBnZXQgYW4gdW5rbm93biBvcHRpb24hXAotICAgICAgICAgICAgICAgICAob3B0aW9uSUQ9MHgleCkiLCBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gICAgKE00T1NBX0VSUilNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRBVSgKLSAqICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICogICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgICBQcmVwYXJlIGFuIEFjY2VzcyBVbml0IHRvIGJlIHJlYWR5IHRvIHN0b3JlIGRhdGEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEFVIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6IHN0cmVhbUlEIGlzIG5vdCBWaWRlb1N0cmVhbUlEIG5vcgotICogICAgICAgICAgICBBdWRpb1N0cmVhbUlEIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzdGFydEFVIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0QVUoCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBDb250ZXh0PTB4JXgsIHN0cmVhbUlEPSVkLCBwQVU9MHgleCIsCi0gICAgICAgICBwQ29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcEFVIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoCi0gICAgICAgICAoKFZpZGVvU3RyZWFtSUQgIT0gc3RyZWFtSUQpICYmIChBdWRpb1N0cmVhbUlEICE9IHN0cmVhbUlEKSksCi0gICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lELAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IFdyb25nIHN0cmVhbUlEIik7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9zdGFydEFVOiBjYWxsaW5nIE00TVA0V19zdGFydEFVKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3N0YXJ0QVUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiQVU6IGRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQiLAotICAgICAgICAgcEFVLT5kYXRhQWRkcmVzcywgcEFVLT5zaXplKTsKLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYgKE00V0FSX01QNFdfT1ZFUlNJWkUgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfV1JJVEVSX1NUT1BfUkVROwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9wcm9jZXNzQVUoCi0gKiAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAqICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgICAgV3JpdGUgYW4gQWNjZXNzIFVuaXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBBVSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiBzdHJlYW1JRCBpcyBub3QgVmlkZW9TdHJlYW1JRCBub3IKLSAqICAgICAgICAgICAgQXVkaW9TdHJlYW1JRCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgcHJvY2Vzc0FVCi0gKiAgICAgICAgICAgIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3Byb2Nlc3NBVSgKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6ICIKLSAgICAgICAgICAgICAgICAgICAicENvbnRleHQ9MHgleCwgc3RyZWFtSUQ9JWQsIHBBVT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQVUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigKLSAgICAgICAgICgoVmlkZW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkgJiYgKEF1ZGlvU3RyZWFtSUQgIT0gc3RyZWFtSUQpKSwKLSAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogV3Jvbmcgc3RyZWFtSUQiKTsKLQotICAgIE00T1NBX1RSQUNFM180KCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBBVTogIgotICAgICAgICAgImRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQsIENUUz0lZCwgbmJGcmFnPSVkIiwKLSAgICAgICAgIHBBVS0+ZGF0YUFkZHJlc3MsIHBBVS0+c2l6ZSwgKE00T1NBX1VJbnQzMilwQVUtPkNUUywgcEFVLT5uYkZyYWcpOwotCi0gICAgaWYocEFVLT5zaXplID4gYXBDb250ZXh0LT5tYXhBVXNpemVzKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5tYXhBVXNpemVzID0gcEFVLT5zaXplOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IGNhbGxpbmcgTTRNUDRXX3Byb2Nlc3NBVSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX3Byb2Nlc3NBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3Byb2Nlc3NBVSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYoTTRXQVJfTVA0V19PVkVSU0laRSA9PSBlcnIpCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9XUklURVJfU1RPUF9SRVE7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAqICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gKiAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAqICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICAgIEdldCB0aGUgM0dQUCB3cml0ZXIgY29tbW9uIGludGVyZmFjZQotICogQG5vdGUgICAgICBSZXRyaWV2ZXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSB0aGUgM0dQUCB3cml0ZXIuCi0gKiAgICAgICAgICAgIEl0IGZvbGxvd3MgdGhlIGNvbW1vbiB3cml0ZXIgaW50ZXJmYWNlLgotICogQHBhcmFtICAgICBUeXBlOiAoT1VUKSByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB3cml0ZXIuIFdpbGwgYWx3YXlzIGJlCi0gKiAgICAgICAgICAgIE00V1JJVEVSX2szR1BQLgotICogQHBhcmFtICAgICBTcmNHbG9iYWxJbnRlcmZhY2U6IChPVVQpIE1haW4gc2V0IG9mIGZ1bmN0aW9uIHRvIHVzZSB0aGlzCi0gKiAgICAgICAgICAgIDNHUFAgd3JpdGVyCi0gKiBAcGFyYW0gICAgIFNyY0RhdGFJbnRlcmZhY2U6ICAgKE9VVCkgU2V0IG9mIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZGF0YXMKLSAqICAgICAgICAgICAgdG8gdXNlIHRoaXMgM0dQUCB3cml0ZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwR2xvYmFsOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiAiCi0gICAgICAgICAiVHlwZT0weCV4LCBTcmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgICBTcmNEYXRhSW50ZXJmYWNlPTB4JXgiLCBUeXBlLCBTcmNHbG9iYWxJbnRlcmZhY2UsIFNyY0RhdGFJbnRlcmZhY2UpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFR5cGUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFR5cGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBTcmNHbG9iYWxJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFNyY0RhdGFJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0RhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgU2V0IHRoZSBvdXRwdXQgdHlwZSAqLwotICAgICpUeXBlID0gTTRXUklURVJfazNHUFA7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZ2xvYmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwR2xvYmFsID0gKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwgKE00T1NBX0NoYXIgKikiTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEdsb2JhbCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICpTcmNEYXRhSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgdGhlIGRhdGEgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBEYXRhID0KLSAgICAgICAgKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICBNNFdSSVRFUl8zR1AsIChNNE9TQV9DaGFyICopIk00V1JJVEVSX0RhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGF0YSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfRGF0YUludGVyZmFjZSxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUocEdsb2JhbCk7Ci0gICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZpbGwgdGhlIGdsb2JhbCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcEdsb2JhbC0+cEZjdE9wZW4gPSBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOwotICAgIHBHbG9iYWwtPnBGY3RBZGRTdHJlYW0gPSBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOwotICAgIHBHbG9iYWwtPnBGY3RTdGFydFdyaXRpbmcgPSBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOwotICAgIHBHbG9iYWwtPnBGY3RDbG9zZVdyaXRlID0gTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU7Ci0gICAgcEdsb2JhbC0+cEZjdFNldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9zZXRPcHRpb247Ci0gICAgcEdsb2JhbC0+cEZjdEdldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9nZXRPcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBGaWxsIHRoZSBkYXRhIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwRGF0YS0+cFN0YXJ0QVUgPSBNNFdSSVRFUl8zR1Bfc3RhcnRBVTsKLSAgICBwRGF0YS0+cFByb2Nlc3NBVSA9IE00V1JJVEVSXzNHUF9wcm9jZXNzQVU7Ci0KLSAgICAvKioKLSAgICAgKiAgICBTZXQgdGhlIHJldHVybiB2YWx1ZXMgKi8KLSAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gcEdsb2JhbDsKLSAgICAqU3JjRGF0YUludGVyZmFjZSA9IHBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmUyYWQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmMKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIHRoZSBNUDQgd3JpdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzLmgiCi0KLSNkZWZpbmUgRVJSX0NIRUNLKGV4cCwgZXJyKSBpZiAoIShleHApKSB7IHJldHVybiBlcnI7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gZmlsZUZ1bmN0aW9uLT53cml0ZURhdGEoY29udGV4dCwgKE00T1NBX01lbUFkZHI4KSZjLCAxKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDE2KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDI0KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gMTYpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiA4KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKXZhbCwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBmaWxlRnVuY3Rpb24tPndyaXRlRGF0YShjb250ZXh0LCAoTTRPU0FfTWVtQWRkcjgpQmxvY2ssIHNpemUpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VQ2hhciBhLCBiOwotICAgIE00T1NBX1VDaGFyKiBjID0gKE00T1NBX1VDaGFyKil2YWxQdHI7Ci0gICAgYSAgICAgICA9ICooYyk7Ci0gICAgYiAgICAgICA9ICooYysxKTsKLSAgICAqKGMpICAgPSAqKGMrMyk7Ci0gICAgKihjKzEpID0gKihjKzIpOwotICAgICooYysyKSA9IGI7Ci0gICAgKihjKzMpID0gYTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgZm9yIChpPTA7IGk8bmI7IGkrKykKLSAgICAgICAgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKCYodGFiKVtpXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfTWVtQWRkcjMyIHB0cjIgPSAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdTaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicmVhbGxvYyIpOwotICAgIGlmIChNNE9TQV9OVUxMICE9IHB0cjIpCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIyLCAodm9pZCAqKXB0ciwgb2xkU2l6ZSk7Ci0gICAgfQotICAgIGZyZWUocHRyKTsKLSAgICByZXR1cm4gcHRyMjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiBpOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEqIG1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qZnJlZUNvbnRleHQgaXMgbm93IGNhbGxlZCBhZnRlciBjbG9zZVdyaXRlKi8KLSAgICBFUlJfQ0hFQ0soIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX2Nsb3NlZCwgTTRFUlJfU1RBVEUpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLypkZWxldGUgYWxzbyBvdGhlciBjaHVua3MgaWYgYW55Ki8KLSAgICAgICAgLypmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgICAgIGZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0pOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykgJiYKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qZGVsZXRlIGFsc28gb3RoZXIgY2h1bmtzIGlmIGFueSovCi0gICAgICAgIC8qZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rW2ldKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspICYmCi0gICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICp0YWIgJj0gMHhGRkZGOwotICAgICp0YWIgfD0gSGk8PDE2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0xvKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgTG8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqdGFiICY9IDB4RkZGRjAwMDA7Ci0gICAgKnRhYiB8PSBMbzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICgqdGFiID4+IDE2KSAmIDB4RkZGRjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0xvKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICp0YWIgJiAweEZGRkY7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RmYzQ0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1Mzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlci5oIgotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBCRUdJTiAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0jZXJyb3IgIl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIF9NNE1QNFdfTU9PVl9GSVJTVCIKLQotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jZXJyb3IgIl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyBzaG91bGQgYmUgdXNlZCB3aXRoIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIgotCi0jZW5kaWYKLQotI2VuZGlmCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBFTkQgKi8KLQotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2VuZGlmIC8qX000TVA0V19ET05UX1VTRV9USU1FX0gqLwotCi0vKk1BQ1JPUyovCi0jZGVmaW5lIE1BSk9SX1ZFUlNJT04gMwotI2RlZmluZSBNSU5PUl9WRVJTSU9OIDMKLSNkZWZpbmUgUkVWSVNJT04gMAotCi0jZGVmaW5lIEVSUl9DSEVDSyhleHAsIGVycikgaWYgKCEoZXhwKSkgeyByZXR1cm4gZXJyOyB9Ci0jZGVmaW5lIENMRUFOVVBvbkVSUihmdW5jKSBpZiAoKGVyciA9IGZ1bmMpICE9IE00Tk9fRVJST1IpIGdvdG8gY2xlYW51cAotCi0jZGVmaW5lIG1heChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLQotLyoqKioqKioqKioqKioqKi8KLS8qU3RhdGljIGJsb2NrcyovCi0vKioqKioqKioqKioqKioqLwotCi0vKkNvbW1vbkJsb2NrcyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIERlZmF1bHRfZnR5cCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgJ2YnLCAndCcsICd5JywgJ3AnLCAnMycsICdnJywgJ3AnLCAnNycsIDB4MDAsIDB4MDAsCi0gICAgMHgwMywgMHgwMCwgJzMnLCAnZycsICdwJywgJzcnLCAnaScsICdzJywgJ28nLCAnbScKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMiBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdhJywgJ3QnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazMgW10gPQotewotICAgICdtJywgJ28nLCAnbycsICd2JywgMHgwMCwgMHgwMCwgMHgwMCwgMHg2QywgJ20nLCAndicsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMywgMHhFOAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazYgW10gPQotewotICAgICd0JywgJ3InLCAnYScsICdrJywgMHgwMCwgMHgwMCwgMHgwMCwgMHg1QywgJ3QnLCAnaycsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNyBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s3YmlzIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrOCBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdpJywgJ2EnLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAnbScsICdkJywgJ2gnLCAnZCcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s5IFtdID0KLXsKLSAgICAweDU1LCAweEM0LCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazEwIFtdID0KLXsKLSAgICAnbScsICdpJywgJ24nLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsICdkJywgJ2knLCAnbicsICdmJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDFDLCAnZCcsICdyJywgJ2UnLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgJ3UnLCAncicsICdsJywgJyAnLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTEgW10gPQotewotICAgICdzJywgJ3QnLCAnYicsICdsJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMiBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICd0JywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNSBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ3onLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE2IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAnYycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTcgW10gPQotewotICAgICdzJywgJ3QnLCAnYycsICdvJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwSGVhZGVyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDVFLCAncycsICdrJywgJ2knLCAncCcKLX07Ci0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDE2ICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcgW10gPQotewotICAgICdOJywgJ1gnLCAnUCcsICdTJywgJ1cnLCAnICcsICdDJywgJ0EnLCAnTScsICdDJywgJ08nLCAnUicsICdEJywgJ0UnLAotICAgICdSJywgJyAnCi19OwotLyogZm9sbG93cyB0aGUgdmVyc2lvbiAobGlrZSAiIDMuMC4yIiksIHRoZW4gIiAtLSAiICovCi0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDYwICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcgW10gPQotewotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi0vKlZpZGVvQmxvY2tzKi8KLS8qIDMyMCoyNDAsIG5vdyBubyBsb25nZXIgaGFyZGNvZGVkICovCi0vKiBjb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrMVtdID0KLSAgICB7IDB4MDEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4MDAsIDB4MDAgfTsgKi8KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2sxXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsICdoJywgJ2QnLCAnbCcsICdyJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAndicsICdpJywgJ2QnLCAnZScsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4RkYsIDB4RkYKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s0IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07IC8qU1RTUyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE0LCAndicsICdtJywgJ2gnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9SZXNvbHV0aW9ucyBbXSA9Ci17Ci0gICAgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMAotfTsKLQotLypNcDR2QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1wNHZCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICd2JwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTXA0dkJsb2NrMyBbXSA9Ci17Ci0gICAgMHgyMCwgMHgxMQotfTsKLQotLypIMjYzQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazEgW10gPQotewotICAgICdzJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMiBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgJ2QnLCAnMicsICc2JywgJzMnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2syX2JpdHIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsICdkJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMyBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDBBLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAnYicsICdpJywgJ3QnLCAncicKLX07Ci0KLS8qSDI2NEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2sxIFtdID0KLXsKLSAgICAnYScsICd2JywgJ2MnLCAnMScKLX07Ci0KLS8qIFN0b3JlIHRoZSBhdmNDIGZpZWxkLCB0aGUgdmVyc2lvbiAoPTEpLAotICAgIHRoZSBwcm9maWxlICg9NjYpLCB0aGUgY29tcGF0aWJpbGl0eSAoPTApLCAqLwotCi0vKiB0aGUgbGV2ZWwgKD0xMCksMTExMTExICsgTkFMIGZpZWxkIFNpemUgKD0gNCAtIDEpLAotICAgIDExMSArIG51bWJlciBvZiBQUFMgKD0xKSAqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2syIFtdID0KLXsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICdhJyAsICd2JyAsICdjJyAsICdDJwotfTsKLQotLypBTVJCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2sxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazFfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgJ2gnLCAnZCcsICdsJywgJ3InLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsICdzJywgJ28nLCAndScsICduJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlIFtdID0KLXsKLSAgICAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJEU0lIZWFkZXIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsICdkJywgJ2EnLCAnbScsICdyJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SRGVmYXVsdERTSSBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsICdzJywgJ20nLCAnaCcsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi0vKkFNUjhCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnYScsICdtJywgJ3InCi19OwotCi0vKkFNUjE2QmxvY2tzKi8KLS8qY29uc3QgTTRPU0FfVUNoYXIgQU1SMTZCbG9jazFbXSA9IHsgJ3MnLCAnYScsICd3JywgJ2InfTsqLwotCi0vKkFBQ0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBBQUNCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICdhJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQUFDQmxvY2syIFtdID0KLXsKLSAgICAweDQwLCAweDE1Ci19OwotCi0vKk1QRUdDb25maWdCbG9ja3MgKEFBQyAmIE1QNFYpKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazAgW10gPQotewotICAgICdlJywgJ3MnLCAnZCcsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMiBbXSA9IHsgMHgwNSB9OwotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMyBbXSA9Ci17Ci0gICAgMHgwNiwgMHgwMSwgMHgwMgotfTsKLQotLypFVlJDQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEVWUkNCbG9jazNfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgJ2QnLCAnZScsICd2JywgJ2MnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDQmxvY2szXzIgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwMAotfTsKLQotLypFVlJDOEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnZScsICd2JywgJ2MnCi19OwotCi0vKioqKioqKioqKiovCi0vKiBNZXRob2RzICovCi0vKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4ICptYWpvciwgTTRPU0FfVUludDggKm1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpyZXZpc2lvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtYWpvciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtaW5vciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSByZXZpc2lvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICptYWpvciA9IE1BSk9SX1ZFUlNJT047Ci0gICAgKm1pbm9yID0gTUlOT1JfVkVSU0lPTjsKLSAgICAqcmV2aXNpb24gPSBSRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFRTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNaX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19DSFVOS19BTExPQ19OQjsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLS8qIHN0c2NbIF0gdGFibGUgaXMgc3BsaXR0ZWQgYXQgMTIgYml0cyAqLwotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA0MDk1IC8qIDA9bm90dXNlZCAqLwotCi0jZWxzZQotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAxMCAgIC8qIDA9bm90dXNlZCAqLwotCi0jZW5kaWYKLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgTTRNUDRXX2luaXRpYWxpemVBbGxvY2F0aW9uUGFyYW1ldGVycyhNNE1QNFdfTXA0RmlsZURhdGEgKlB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIG1heE1lbW9yeSwgdmVzTWVtb3J5OwotICAgIE00T1NBX1VJbnQzMiBuYlZpZGVvRnJhbWVzLCBuYkF1ZGlvRnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBhdmVyYWdlVmlkZW9DaHVuazsKLQotICAgIC8qLS0tLS0tLS0tLS0qLwotICAgIC8qIE5CX0ZSQU1FUyAqLwotICAgIC8qLS0tLS0tLS0tLS0qLwotCi0gICAgLyogbWFnaWNhbCBmb3JtdWxhIDogbWVtb3J5ID0gdmVzTWVtb3J5ICsgMTIgKiBmcmFtZXJhdGUgKiBkdXJhdGlvbiAqLwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICB2ZXNNZW1vcnkgPSAweDMyMDAwOyAvKiAyMDAga0IgKi8KLQotI2Vsc2UKLQotICAgIHZlc01lbW9yeSA9IDB4M0U4MDA7IC8qIDI1MCBrQiAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBWSURFT19QT09MX01FTU9SWSAxMDAwMDAwCi0KLSAgICBtYXhNZW1vcnkgPSBWSURFT19QT09MX01FTU9SWTsKLQotICAgIGlmIChtYXhNZW1vcnkgPCB2ZXNNZW1vcnkpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIG5iVmlkZW9GcmFtZXMgPSAoIG1heE1lbW9yeSAtIHZlc01lbW9yeSkgLyAxMjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFc6ICVkIGltYWdlcyBtYXgiLCBuYlZpZGVvRnJhbWVzKTsKLQotICAgIC8qIFZJREVPICovCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgMjUgZnBjIDogcmVmZXJlbmNlID0gMTUgZnBzICogMnMgKiAwLjggKi8KLQotICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gMjUwMDsKLQotI2Vsc2UKLQotICAgIGlmIChNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA+IDApCi0gICAgewotICAgICAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDEwMCAqIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMjAKLSAgICAgICAgICAgICogKE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMSk7IC8qIG1hcmdpbiAyMCUgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgNTAgZnBjICovCi0gICAgICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gNTAwMDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgTTRNUDRXX1NUVFNfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoTTRPU0FfVUludDMyKTsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZihNNE9TQV9VSW50MTYpOwotICAgIE00TVA0V19TVFNTX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKAotICAgICAgICBNNE9TQV9VSW50MzIpOyAvKiB2ZXJ5IGNvbnNlcnZhdGl2ZSAoYWxsIGltYWdlcyBhcmUgaW50cmEpICovCi0KLSAgICBNNE1QNFdfQ0hVTktfQUxMT0NfTkIgPSAoIG5iVmlkZW9GcmFtZXMgKiAxMDApIC8gYXZlcmFnZVZpZGVvQ2h1bmsgKyAxOwotCi0gICAgLyogQVVESU8gKi8KLQotICAgIG5iQXVkaW9GcmFtZXMgPSBuYlZpZGVvRnJhbWVzOwotICAgIC8qIGF1ZGlvIGlzIDUgZnBzLCB3aGljaCBpcyB0aGUgc21hbGxlc3QgZnJhbWVyYXRlIGZvciB2aWRlbyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDEwMDsgLyogY29tcHJlc3NlZCAqLwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAxMDA7IC8qIGNvbXByZXNzZWQgKi8KLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gbmJBdWRpb0ZyYW1lcyAvIDEwICsgMTsKLQotI2Vsc2UKLQotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IG5iQXVkaW9GcmFtZXMgLyAzOCArIDE7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICAvKiBWSURFTyA1IG1pbiBhdCAyNSBmcHMgbnVsbC1lbmMgKi8KLQotICAgIE00TVA0V19TVFRTX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gMTgwMDA7Ci0gICAgTTRNUDRXX1NUU1NfQUxMT0NfU0laRSA9IDUwMDA7Ci0gICAgTTRNUDRXX0NIVU5LX0FMTE9DX05CID0gNTAwOwotCi0gICAgLyogQVVESU8gMiBtaW4gYWFjKyBudWxsLWVuYyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDMyMDAwOwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSAxMDAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfb3BlbldyaXRlKE00T1NBX0NvbnRleHQgKmNvbnRleHRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKmZpbGVSZWFkZXJGdW5jdGlvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0UHRyLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IG91dHB1dEZpbGVEZXNjcmlwdG9yLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGZpbGVXcml0ZXJGdW5jdGlvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIE9wdGlvbmFsLCBmZWF0dXJlIHdvbid0IGJlIHVzZWQgaWYgTlVMTCAqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoInRlbXBGaWxlRGVzY3JpcHRvciA9ICVwIiwgdGVtcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IHRlbXBGaWxlRGVzY3JpcHRvcikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgInRlbXBGaWxlRGVzY3JpcHRvciBpcyBOVUxMLCBSRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgZmVhdHVyZSBub3QgdXNlZCIpOwotICAgIH0KLQotI2Vsc2UgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICAvKiBOb3QgdXNlZCA6IEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IHRlbXBGaWxlRGVzY3JpcHRvciwgTTRFUlJfUEFSQU1FVEVSKTsgKi8KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIC8qIE5vdCB1c2VkIDogRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gZmlsZVJlYWRlckZ1bmN0aW9uLCBNNEVSUl9QQVJBTUVURVIpOyAqLwotCi0gICAgLyogVGhlIGNvbnRleHQgcmV1c2UgbW9kZSB3YXMgc3VwcHJlc3NlZCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHIgPQotICAgICAgICAoTTRNUDRXX01wNEZpbGVEYXRhICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfTXA0RmlsZURhdGEpLAotICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk1QNCB3cml0ZXIgY29udGV4dCIpOwotICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsID0gb3V0cHV0RmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplID0gTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemU7IC8qZGVmYXVsdCAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZSA9IE00TVA0V19EZWZhdWx0TWF4QXVTaXplOyAgICAgICAvKmRlZmF1bHQgICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyID0KLSAgICAgICAgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplID0gMDsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gPSAwOyAvKmRlZmF1bHQgaXMgIiAwLjAuMCIqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgaXMgaW4gQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7IC8qZGVmYXVsdCBpcyAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPSAwOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucyA9IGZpbGVXcml0ZXJGdW5jdGlvbjsKLSAgICBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfb3BlbmVkOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPSAwOyAvKmkqLwotICAgIC8qcGF0Y2ggZm9yIGludGVncmF0aW9uVGFnIDE3NCAtPiAyMzggKCs2NCkqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgPQotICAgICAgICAyMzg7IC8qaW5pdGlhbGl6YXRpb24gd2l0aCBjb25zdGFudCBwYXJ0IGluIGZ0eXArbWRhdCttb292K3NraXAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPQotICAgICAgICAzMjsgLyppbml0IHdpdGggZnR5cCArIGJlZ2lubmluZyBvZiBtZGF0IHNpemUqLwotCi0jZW5kaWYKLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSB0ZW1wRmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPQotICAgICAgICBNNE9TQV9GQUxTRTsgLyogTm8gbmVlZCB0byBjbGVhbiBpdCBqdXN0IHlldC4gKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIC8qIGZ0eXAgYXRvbSAqLwotCi0gICAgbWVtc2V0KCh2b2lkICopICZtTXA0RmlsZURhdGFQdHItPmZ0eXAsMCwKLSAgICAgICAgc2l6ZW9mKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCkpOwotCi0gICAgKmNvbnRleHRQdHIgPSBtTXA0RmlsZURhdGFQdHI7Ci0KLSAgICBNNE1QNFdfaW5pdGlhbGl6ZUFsbG9jYXRpb25QYXJhbWV0ZXJzKG1NcDRGaWxlRGF0YVB0cik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICpzdHJlYW1EZXNjUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLQotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3JlYWR5OwotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAvKkF1ZGlvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYW4gYXVkaW8gdHJhY2sgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSwKLSAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYWxsb2MgbmVlZCB0byBiZSBkb25lKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSAoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfQXVkaW9UcmFja0RhdGEpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19BdWRpb1RyYWNrRGF0YSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXZSBtdXN0IGluaXQgdGhlc2UgcG9pbnRlcnMgaW4gY2FzZSBhbiBhbGxvYyBiZWxsb3cgZmFpbHMgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKm5vdyBkeW5hbWljKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0MDI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7IC8qIGluaXQgdmFsdWUgKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19yZWFkeTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGUgPT0gODAwMCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgMTYwOyAvKkFNUjgrdGltZXNjYWxlPTgwMDAgPT4gc2FtcGxlIGR1cmF0aW9uIDE2MCBjb25zdGFudCovCi0KLSAgICAgICAgICAgICAgICAvKlVzZSBnaXZlbiBEU0kgaWYgcGFzc2VkLCBlbHNlIHVzZSBkZWZhdWx0IHZhbHVlKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qYW1yIERTSSBpcyA5IGJ5dGVzIGxvbmcgISovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICA5OyAvKmFsd2F5cyA5IGZvciBhbXIqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gOSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg5LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDkgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rRVZSQykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDgwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDE2MDsgLypFVlJDK3RpbWVzY2FsZT04MDAwID0+IHNhbXBsZSBkdXJhdGlvbiAxNjAgY29uc3RhbnQqLwotCi0gICAgICAgICAgICAgICAgLypVc2UgZ2l2ZW4gRFNJIGlmIHBhc3NlZCwgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSovCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmV2cmMgRFNJIGlzIDYgYnl0ZXMgbG9uZyAhKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDY7IC8qYWx3YXlzIDYgZm9yIGV2cmMqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDYgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKk00U1lTX2tBQUMqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qYXZnIGJpdHJhdGUgc2hvdWxkIGJlIHNldCovCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qZG9uJ3Qga25vdyBmb3IgYWFjLCBzbyBzZXQgMCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKm5vIGRzaTogcmV0dXJuIGJhZCBwYXJhbWV0ZXIgPyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNFNZU19rTVBFR180KToKLSAgICAgICAgY2FzZSAoTTRTWVNfa0gyNjQpOgotICAgICAgICBjYXNlIChNNFNZU19rSDI2Myk6Ci0gICAgICAgICAgICAvKlZpZGVvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYSB2aWRlbyB0cmFjayBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhbGxvYyBuZWVkIHRvIGJlIGRvbmUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IChNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TVA0V19WaWRlb1RyYWNrRGF0YSksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiTTRNUDRXX1ZpZGVvVHJhY2tEYXRhIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdlIG11c3QgaW5pdCB0aGVzZSBwb2ludGVycyBpbiBjYXNlIGFuIGFsbG9jIGJlbGxvdyBmYWlscyAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLypub3cgZHluYW1pYyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgLypyZS11c2UgdGhlIHNhbWUgY2h1bmsgYW5kIGZsdXNoIGl0IHdoZW4gZnVsbCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgICAgICAvKnRhYmxlcyBhcmUgbm93IGR5bmFtaWMqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1NfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDYyOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA9IE00TVA0V19EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCA9IE00TVA0V19EZWZhdWx0SGVpZ2h0OwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsgLyogaW5pdCB2YWx1ZSAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuayA9Ci0gICAgICAgICAgICAgICAgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTks7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDEwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0gMTAwMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tIMjYzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlID09IC0xKQotICAgICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZSA9PSAtMSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnRoZSBiaXRyYXRlIHdpbGwgbm90IGJlIHdyaXR0ZW4gaWYgdGhlIGJpdHJhdGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBmdWxseSBzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnByb3ByaWV0YXJ5IHN0b3JhZ2Ugb2YgaDI2MyBiaXRyYXRlLgotICAgICAgICAgICAgICAgICAgICAgV2FybmluZzogbm90IHRoZSBhY3R1YWwgYml0cmF0ZSAoYml0IHNldCB0byAxKS4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoIDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNyBieXRlcyBsb25nICovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA3LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp1c2UgdGhlIGRlZmF1bHQgZHNpKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa01QRUdfNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDIyOyAvKmV4dHJhIGJ5dGVzIChmcm9tIGgyNjMpKi8KLSAgICAgICAgICAgICAgICAvKiBhbGxvdyBEU0kgdG8gYmUgTTRPU0FfTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgYWN0dWFsIERTSSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgIHNldCBieSBzZXRPcHRpb24uICovCi0gICAgICAgICAgICAgICAgaWYgKCggMCA9PSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTVA0ViBzcGVjaWZpYyovCi0gICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwNSBzbyB0aGF0IEVTRCBzaXplIGNhbiBiZSBjb2RlZCB3aXRoIDEgYnl0ZSovCi0gICAgICAgICAgICAgICAgICAgIC8qKHRoaXMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGl2ZSBiZWNhdXNlIGRzaSBpcyBhbHdheXMgc2hvcnRlciAhKSovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA8IDEwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKmF2ZyBiaXRyYXRlIHNob3VsZCBiZSBzZXQqLwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSDI2NCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiBTUFNMZW5ndGgsIFBQU0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqRFNJOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBEU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICAgICAgU1BTTGVuZ3RoID0gRFNJWzZdOwotICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoID0gRFNJWzEwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsxMiksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrMiksICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCksIFNQU0xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIgKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyMCksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrNCArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzI4ICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogLSBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdXNlIHRoZSBkZWZhdWx0IGRzaSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MgPSBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGU7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUgKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IGF1ZGlvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IHZpZGVvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIC8qc2V0IGF1ZGlvTXNDaHVua0R1ciAoZHVyYXRpb24gaW4gbXMgYmVmb3JlIGEgbmV3IGNodW5rIGlzIGNyZWF0ZWQpCi0gICAgICAgICBmb3IgYXVkaW8gc2l6ZSBlc3RpbWF0aW9uKi8KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8sIE00RVJSX0JBRF9DT05URVhUKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8sIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9Ci0gICAgICAgICAgICAyMCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotCi0gICAgICAgIGlmICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cgotICAgICAgICAgICAgPCAyMCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cjsKLSAgICAgICAgfQotICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKAotICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIoMTYgKyAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihNNE1QQUNfRlRZUF9UQUcsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1pbm9yX3ZlcnNpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAuY29tcGF0aWJsZV9icmFuZHNbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHV0IGRlZmF1bHQgZnR5cCBib3ggKi8KLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKERlZmF1bHRfZnR5cCwgc2l6ZW9mKERlZmF1bHRfZnR5cCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgfQotCi0gICAgLyppbml0IG1kYXQgdmFsdWUgd2l0aCAwIGJ1dCB0aGUgcmlnaHQgdmFsdWUgaXMgc2V0IGp1c3QgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCovCi0gICAgZXJyID0gTTRNUDRXX3B1dEJFMzIoMCwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBpZiAoMCAhPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplCi0gICAgICAgICYmIE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfRVJSIGVycjIgPSBNNE5PX0VSUk9SOwotICAgICAgICBNNE9TQV9Db250ZXh0IHNhZmV0eUZpbGVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNhZmV0eUZpbGVTaXplID0gMCwgYWRkZW5kdW0gPSAwOwotICAgICAgICBNNE9TQV9VQ2hhciBkdW1teURhdGFbMTAwXTsgLyogVG8gZmlsbCB0aGUgc2FmZXR5IGZpbGUgd2l0aCAqLwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmc2FmZXR5RmlsZUNvbnRleHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIDEwJSBzZWVtcyB0byBiZSBhIHJlYXNvbmFibGUgd29yc3QgY2FzZSwgYnV0IGFsc28gcHJvdmlzaW9uIGZvciAxa2Igb2YgbW9vdiBvdmVyaGVhZC4qLwotICAgICAgICBzYWZldHlGaWxlU2l6ZSA9IDEwMDAgKyAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSAqIDEwICsgOTkpIC8gMTAwOwotCi0gICAgICAgIC8qIEhlcmUgd2UgYWRkIHNwYWNlIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHdlIGhhdmUgdG8gZmx1c2ggYW55IHBlbmRpbmcKLSAgICAgICAgY2h1bmsgaW4gY2xvc2VXcml0ZSwgdGhpcyBzcGFjZSBpcyB0aGUgc3VtIG9mIHRoZSBtYXhpbXVtIGNodW5rIHNpemVzLCBmb3IgZWFjaAotICAgICAgICB0cmFjay4gKi8KLQotI2lmbmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICAgICAgewotICAgICAgICAgICAgc2FmZXR5RmlsZVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZmV0eUZpbGVTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopZHVtbXlEYXRhLCAweENBLHNpemVvZihkdW1teURhdGEpKTsgLyogRm9yIGV4dHJhIHNhZmV0eS4gKi8KLQotICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgIGkgPCAoc2FmZXR5RmlsZVNpemUgKyBzaXplb2YoZHVtbXlEYXRhKSAtIDEpIC8gc2l6ZW9mKGR1bW15RGF0YSk7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPndyaXRlRGF0YSgKLSAgICAgICAgICAgICAgICBzYWZldHlGaWxlQ29udGV4dCwgZHVtbXlEYXRhLCBzaXplb2YoZHVtbXlEYXRhKSk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIERvbid0IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiB5ZXQsIGFzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGZpbGUgZmlyc3QuICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJIGRvbid0IG5lZWQgdG8ga2VlcCBpdCBvcGVuLiAqLwotICAgICAgICBlcnIyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZShzYWZldHlGaWxlQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIyKSwgZXJyMik7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlNhZmV0eSBmaWxlIGNvcnJlY3RseSBjcmVhdGVkIik7Ci0gICAgfQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfbmV3QXVkaW9DaHVuayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqbGVmdFNwYWNlSW5DaHVuayApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvOwotCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgcmVhbGxvY05iOwotCi0jZW5kaWYKLQotICAgIC8qIHZpZGVvIG9ubHkgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiIE00TVA0V19uZXdBdWRpb0NodW5rIC0gZmx1c2ggYXVkaW8iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zKTsKLQotICAgIHNjYWxlX2F1ZGlvID0gMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3QXVkaW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0KLSAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgIGNvbnNlcXVlbmNlIHRoYXQgaXQgd2lsbCBiZSBhcyBpZiB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuIGZsdXNoZWQgeWV0LCBhbmQgdGhlcmVmb3JlCi0gICAgICAgICBpdCB3aWxsIGJlIGRvbmUgYXMgcGFydCBvZiBjbG9zZVdyaXRlICh3aGVyZSB0aGVyZSBjb3VsZCBiZSByb29tIHRvIGRvIHNvLAotICAgICAgICAgaWYgc29tZSBlbWVyZ2VuY3kgcm9vbSBpcyBmcmVlZCBmb3IgdGhhdCBwdXJwb3NlKS4gKi8KLQotICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4gKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLyp1cGRhdGUgY2h1bmsgaW5mbyAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayArPSAxOwotICAgIC8qaWYgYXVkaW8gYW1vdW50IG9mIGRhdGEgaXMgbm90IGVzdGltYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gMTY7Ci0KLSAgICAvKmFsbG9jIG5ldyBjaHVuayovCi0gICAgLypvbmx5IGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdBdWRpb0NodW5rIDogYXVkaW8gY2h1bmsgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBpZiAoKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICAgICAgICAgICUgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFsbG9jTmIgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgICAgICsgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE1QNFdfVGltZTMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLQotICAgIC8qdXBkYXRlIGxlZnRTcGFjZUluQ2h1bmssIGN1cnJlbnRQb3MgYW5kIGN1cnJlbnRDaHVua0R1ciovCi0gICAgKmxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAvKiBjaGVjayB3ZXRoZXIgdG8gdXNlIGEgbmV3IHN0c2Mgb3Igbm90ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA+IDApCi0gICAgewotICAgICAgICBpZiAoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgIT0gKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgLSAxXSAmIDB4RkZGKSkKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0KLSAgICAvKiBtYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld0F1ZGlvQ2h1bmsgOiBhdWRpbyBzdHNjIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyogc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2NdID0KLSAgICAgICAgMCArIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA8PCAxMik7Ci0KLSNlbHNlCi0gICAgLypzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLypzZXQgdGltZSBvZiB0aGUgbmV3IGNodW5rIHRvIGxhc3RDVFMgKGZvciBpbml0aWFsaXphdGlvbiwgYnV0IHVwZGF0ZWQgZnVydGhlciB0byB0aGUKLSAgICBDVFMgb2YgdGhlIGxhc3Qgc2FtcGxlIGluIHRoZSBjaHVuaykqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX2F1ZGlvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19uZXdWaWRlb0NodW5rKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpsZWZ0U3BhY2VJbkNodW5rICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW87Ci0KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiByZWFsbG9jTmI7Ci0KLSNlbmRpZgotCi0gICAgLyogYXVkaW8gb25seSAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayAtIGZsdXNoIHZpZGVvIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICBzY2FsZV92aWRlbyA9IDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAvKiBzYW1wbGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4gdG8gZmlsZSAqLwotI2Vsc2UKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3VmlkZW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0gICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIGNodW5rIGhhcyBub3QgYmVlbiBmbHVzaGVkIHlldCwgYW5kIHRoZXJlZm9yZSBpdAotICAgICAgICAgd2lsbCBiZSBkb25lIGFzIHBhcnQgb2YgY2xvc2VXcml0ZSAod2hlcmUgdGhlcmUgY291bGQgYmUgcm9vbSB0byBkbyBzbywgaWYgc29tZQotICAgICAgICAgZW1lcmdlbmN5IHJvb20gaXMgZnJlZWQgZm9yIHRoYXQgcHVycG9zZSkuICovCi0KLSAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBpbmZvIGJlZm9yZSB0byBnbyBmb3IgYSBuZXcgb25lKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfdmlkZW8pOwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgKz0gMTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDE2OwotCi0gICAgLyphbGxvYyBuZXcgY2h1bmsqLwotICAgIC8qb25seSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayA6IHZpZGVvIGNodW5rIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKCgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgICAgICAgICAlIE00TVA0V19DSFVOS19BTExPQ19OQikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGxvY05iID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICAgICArIE00TVA0V19DSFVOS19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaywKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYgotICAgICAgICAgICAgICAgIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKSAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUNoYXIgKikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua09mZnNldFRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTaXplVGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZSwgKCByZWFsbG9jTmIKLSAgICAgICAgICAgICAgICAtIE00TVA0V19DSFVOS19BTExPQ19OQikgKiBzaXplb2YoTTRNUDRXX1RpbWUzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00TVA0V19UaW1lMzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUiKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotCi0gICAgLyp1cGRhdGUgbGVmdFNwYWNlSW5DaHVuaywgY3VycmVudFBvcyBhbmQgY3VycmVudENodW5rRHVyKi8KLSAgICAqbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIC8qIGNoZWNrIHdldGhlciB0byB1c2UgYSBuZXcgc3RzYyBvciBub3QgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID4gMCkKLSAgICB7Ci0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpICE9IChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgIC0gMV0gJiAweEZGRikpCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotCi0gICAgLyogbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdWaWRlb0NodW5rIDogdmlkZW8gc3RzYyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSA9Ci0gICAgICAgIDAgKyAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPDwgMTIpOwotCi0jZWxzZQotICAgIC8qc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAwOwotCi0jZW5kaWYKLQotICAgIC8qc2V0IHRpbWUgb2YgdGhlIG5ldyBjaHVuayB0byBsYXN0Q1RTIChmb3IgaW5pdGlhbGl6YXRpb24sIGJ1dCB1cGRhdGVkIGZ1cnRoZXIgdG8gdGhlCi0gICAgQ1RTIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgY2h1bmspKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV92aWRlbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICphdVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVmdFNwYWNlSW5DaHVuazsKLSAgICBNNE1QNFdfVGltZTMyIGNodW5rRHVyTXM7Ci0KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW87Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvOwotCi0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soYXVQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCItLS0tLSBNNE1QNFdfc3RhcnRBVSAtLS0tLSIpOwotCi0gICAgLypjaGVjayBtYWNybyBzdGF0ZSovCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiBhdWRpbyIpOwotCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoImF1ZGlvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGNodW5rRHVyTXMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV9hdWRpbykgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudENodW5rXSk7Ci0KLSAgICAgICAgaWYgKChsZWZ0U3BhY2VJbkNodW5rIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChjaHVua0R1ck1zID49IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cikpKQotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgICAgICAvKiBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgdmlkZW8gc2FtcGxlIGluIHRoZSBjaHVuayAqLwotCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgb3BlbmVkIHZpZGVvIGNodW5rIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdWRpbyBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3VmlkZW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgICAgICAgLyogbm90IGVub3VnaCBzcGFjZSBpbiBjdXJyZW50IGNodW5rOiBjcmVhdGUgYSBuZXcgb25lICovCi0KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdBdWRpb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBhdVB0ci0+c2l6ZSA9IGxlZnRTcGFjZUluQ2h1bms7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpIC8qdmlkZW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiB2aWRlbyIpOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgY2h1bmtEdXJNcyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50Q2h1bmtdKTsKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLQotI2VuZGlmCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoInZpZGVvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGlmICgoIGxlZnRTcGFjZUluQ2h1bmsgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSkKLSAgICAgICAgICAgIHx8ICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKGNodW5rRHVyTXMgPj0gbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyKSkKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmICgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKQotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rKSkKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgLypub3QgZW5vdWdoIHNwYWNlIGluIGN1cnJlbnQgY2h1bms6IGNyZWF0ZSBhIG5ldyBvbmUqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld1ZpZGVvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJzdGFydEFVOiBzaXplIDB4JXggcG9zIDB4JXggY2h1bmsgJXUiLCBhdVB0ci0+c2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiYWRyID0gMHglcCIsIGF1UHRyLT5kYXRhQWRkcmVzcyk7Ci0KLSAgICAgICAgaWYgKGF1UHRyLT5kYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzMoIiBkYXRhID0gJTA4WCAlMDhYICUwOFgiLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMF0sCi0gICAgICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzWzFdLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVQdHItPnNpemUgPSBsZWZ0U3BhY2VJbkNodW5rOwotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zICsgNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSArIDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MKLSAgICAgICAgICAgICsgNCk7IC8qIEluIEgyNjQsIHdlIG11c3Qgc3RhcnQgYnkgdGhlIGxlbmd0aCBvZiB0aGUgTkFMVSwgY29kZWQgaW4gNCBieXRlcyAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE1QV19zdGFydEFVOiBzdGFydCBhZGRyZXNzOiVwLCBzaXplOiVsdSwgc3RyZWFtOiVkIiwKLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzLCBhdVB0ci0+c2l6ZSwgc3RyZWFtSUQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3Byb2Nlc3NBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKmF1UHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19UaW1lMzIgZGVsdGE7Ci0gICAgTTRNUDRXX1RpbWUzMiBsYXN0U2FtcGxlRHVyOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIC8qZXhwZWN0ZWRTaXplIGlzIHRoZSBtYXggZmlsZXNpemUgdG8gZm9yZWNhc3Qgd2hlbiBhZGRpbmcgYSBuZXcgQVU6Ki8KLSAgICBNNE9TQV9VSW50MzIgZXhwZWN0ZWRTaXplID0KLSAgICAgICAgMzI7IC8qaW5pdGlhbGl6ZWQgd2l0aCBhbiBlc3RpbWF0aW9uIG9mIHRoZSBtYXggbWV0YWRhdGEgc3BhY2UgbmVlZGVkIGZvciBhbiBBVS4qLwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbyA9IDAuMDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW8gPSAwLjA7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKmNoZWNrIG1hY3JvIHN0YXRlKi8KLSAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSIpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAvKiBQTCAyNy8xMC8yMDA4OiBhZnRlciB0aGUgcmVzdXJnZW5jZSBvZiB0aGUgQUFDIDEyOCBidWcsIEkgYWRkZWQgYSBkZWJ1ZyBjaGVjayB0aGF0Ci0gICAgIHRoZSBlbmNvZGVkIGRhdGEgZGlkbid0IG92ZXJmbG93IHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFVICovCi0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgQXVkaW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplLAotICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgWW91IG1pZ2h0IHdpc2ggdG8gaW52ZXN0aWdhdGUgdGhhdC4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVmlkZW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3aXNoIHRvIGludmVzdGlnYXRlIHRoYXQuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKm9ubHkgaWYgbm90IGluIHRoZSBjYXNlIGF1ZGlvIHdpdGggZXN0aW1hdGVBdWRpb1NpemUKLSAgICAoZWxzZSwgc2l6ZSBhbHJlYWR5IGVzdGltYXRlZCBhdCB0aGlzIHBvaW50KSovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICB8fCAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKmNoZWNrIGZpbGVzaXplIGlmIG5lZWRlZCovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICsgYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgIGlmICgoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgICAgID09IE00U1lTX2tIMjY0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZFNpemUgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4cGVjdGVkU2l6ZSA+IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInByb2Nlc3NBVSA6ICEhIEZJTEVTSVpFIEVYQ0VFREVEICEhIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBwYXRjaCBmb3IgYXV0b3N0b3AgaXMgTWF4RmlsZVNpemUgZXhjZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHN0b3AgYXQgdGFyZ2V0ZWQgZmlsZXNpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qY2FzZSBhdWRpb01zU3RvcFRpbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQgZHVyaW5nIHZpZGVvIHByb2Nlc3NpbmcsCi0gICAgIGFuZCBub3cgY2hlY2sgaXQgZm9yIGF1ZGlvKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lIDw9IChhdVB0ci0+Q1RTICpzY2FsZV9hdWRpbykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RvcCB0aW1lIHJlYWNoZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIC0+IGF1ZGlvIik7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nX3N0YXJ0QVUpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBkZWx0YSA9IChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICAgICAgLyogREVCVUcgc3R0cyBlbnRyaWVzIHdoaWNoIGFyZSBlcXVhbCB0byAwICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJBX0RFTFRBID0gJWxkXG4iLCBkZWx0YSk7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotICAgICAgICAgICAgLypzZXQgYXUgc2l6ZSovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICAvKnNhbXBsZSBkdXJhdGlvbiBpcyBhIHByaW9yaSBjb25zdGFudCBpbiBhdWRpbyBjYXNlLCAqLwotICAgICAgICAgICAgLypidXQgaWYgYW4gQXUgYXQgbGVhc3QgaGFzIGRpZmZlcmVudCBzaXplLCBhIHN0c3ogdGFibGUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9IGRlbHRhOyAqLwotICAgICAgICAgICAgLypUT0RPIHRlc3Qgc2FtcGxlIGR1cmF0aW9uPyAoc2hvdWxkIGJlIDIwbXMgaW4gQU1SOCwgMTYwIHRpY3Mgd2l0aCB0aW1lc2NhbGUgODAwMCkgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYXUgc2l6ZSBpcyBjb25zdGFudCAoYXVkaW8pICovCi0gICAgICAgICAgICAvKjAgc2FtcGxlIHNpemUgbWVhbnMgbm9uIGNvbnN0YW50IHNpemUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICE9IGF1UHRyLT5zaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBBVSB3aXRoIGRpZmZlcmVudCBzaXplID0+IG5vbiBjb25zdGFudCBzaXplID0+IFNUU1ogdGFibGUgbmVlZGVkKi8KLSAgICAgICAgICAgICAgICAgICAgLypjb21wdXRhdGlvbiBvZiB0aGUgbmIgb2YgYmxvY2sgb2Ygc2l6ZSBNNE1QNFdfU1RTWl9BTExPQ19TSVpFIHRvIGFsbG9jYXRlKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgICAgICogNCAvIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaSA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmJdID0gYXVQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qdXNlZCBhcyBhIGZsYWcgaW4gdGhhdCBjYXNlKi8KLSAgICAgICAgICAgICAgICAgICAgLyptb3JlIGJ5dGVzIGluIHRoZSBmaWxlIGluIHRoYXQgY2FzZToqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UgdGFibGUgYWxyZWFkeSBleGlzdHMqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArIDMpCi0gICAgICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKk00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaLCAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYl0gPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVsdGEgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHJlYWwgc2FtcGxlIGR1cmF0aW9uKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMSkgLyp0ZXN0IGlmIHNlY29uZCBBVSovCi0gICAgICAgIHsKLSNpZm5kZWYgRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IGRlbHRhOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotICAgICAgICAgICAgbGFzdFNhbXBsZUR1ciA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgaWYgKDggKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg4ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFMsICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBsYXN0U2FtcGxlRHVyKSAvKm5ldyBlbnRyeSBpbiB0aGUgdGFibGUqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXSA9IGRlbHRhOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9Ci0gICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpIC0gMl0gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKz0gMTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbmRpZgotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkgLyp2aWRlbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUgLT4gdmlkZW8iKTsKLQotICAgICAgICAvKiBJbiBoMjY0LCB0aGUgc2l6ZSBvZiB0aGUgQVUgbXVzdCBiZSBhZGRlZCB0byB0aGUgZGF0YSAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFkZCB0aGUgc2l6ZSBvZiB0aGUgTkFMVSBpbiBCRSAqLwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcERhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyAtPSAxOwotICAgICAgICAgICAgcFRtcERhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KWF1UHRyLT5kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgLy8gYml0IG1hbmlwdWxhdGlvbgotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gMjQpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiAxNikgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDgpICAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUpICAgICAgICYgMHgwMDAwMDBGRik7Ci0KLSAgICAgICAgICAgIGF1UHRyLT5zaXplICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgLyogc2FtcGxlcyBhcmUgd3JpdHRlbiB0byBmaWxlIG5vdyAqLwotCi0gICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jaygoTTRPU0FfVUNoYXIgKilhdVB0ci0+ZGF0YUFkZHJlc3MsIGF1UHRyLT5zaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX3Byb2Nlc3NBVTogcHV0QmxvY2sgZXJyb3Igd2hlbiB3cml0aW5nIHVuYnVmZmVyZWQgdmlkZW8gc2FtcGxlOiAlI1giLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdAotICAgICAgICAgICAgIHRoZSBzdGF0ZSBpcyBzdGlsbCBjb25zaXN0ZW50IGFuZCB3ZSBjYW4gcHJvcGVybHkgY2xvc2UgdGhlIGZpbGUgc28gdGhhdCB3aGF0IGhhcwotICAgICAgICAgICAgICBiZWVuIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgICAgICAvKiBGaXJzdCwgd2UgZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlLiBQdXQgdXMgYmFjayBhdCB3aGVyZSB3ZSB3ZXJlIGJlZm9yZQotICAgICAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgYW5kIHNhbXBsZQotICAgICAgICAgICAgIHN0YXRlIGRhdGEuYWJzb2x1dGVDdXJyZW50UG9zIGlzIG9ubHkgdXBkYXRlZCBmb3IgY2h1bmtzLCBpdCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgIG9mIHRoZSBjaHVuayx0aGVyZWZvcmUgd2UgbmVlZCB0byBhZGQgdmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyB0byBrbm93IHdoZXJlIHdlCi0gICAgICAgICAgICAgd2VyZSBpbiB0aGUgZmlsZS4gKi8KLSAgICAgICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAiQmFja3RyYWNraW5nIHRvIHBvc2l0aW9uIDB4JTA4WCwgc2VlayByZXR1cm5lZCAlZCBhbmQgcG9zaXRpb24gJTA4WCIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywgZXJyLCB0ZW1wKTsKLQotICAgICAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIHNhbXBsZSBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLCBzbyB0aGUgY2h1bmsKLSAgICAgICAgICAgICB3aWxsIGJlIG1lcmVseSBjbG9zZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHNhbXBsZSAodGhlIHNhbXBsZSB3ZSBhdHRlbXB0ZWQgdG8gd3JpdGUKLSAgICAgICAgICAgICBoZXJlIGlzIGxvc3QpLiAqLwotCi0gICAgICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4KLSAgICAgICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZiAoKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUyA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgcmVwb3J0IGFzIGVycm9yLCBpdCB3aWxsIGFib3J0IHRoZSBlbnRpcmUgZmlsZXdyaXRlLiBKdXN0IHNraXAgdGhpcyBmcmFtZS4KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJTa2lwIGZyYW1lLiBWaWRlbyBmcmFtZSBoYXMgdG9vIG9sZCB0aW1lc3RhbXAuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIGRlbHRhID0gKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUwotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLQotICAgICAgICAvKiBERUJVRyBzdHRzIGVudHJpZXMgd2hpY2ggYXJlIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIlZfREVMVEEgPSAlbGRcbiIsIGRlbHRhKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKDIgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKyAzKQotICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgKk00TVA0V19TVFNaX0FMTE9DX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYl0gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZWxzZQotCi0gICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BTExPQ19TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzICs9IDE7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FMTE9DX1NJWkUpOwotCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iXSA9Ci0gICAgICAgICAgICBhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZW5kaWYKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDEpOwotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDApOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDEgKSAvKnRlc3QgaWYgc2Vjb25kIEFVKi8KLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSBkZWx0YTsKLQotI2VuZGlmCi0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBNNE1QNFdfZ2V0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLQotICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXTsKLQotICAgICAgICAgICAgaWYgKDggKm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUUywgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RUU19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgaWYgKGRlbHRhICE9IGxhc3RTYW1wbGVEdXIpIC8qbmV3IGVudHJ5IGluIHRoZSB0YWJsZSovCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmJdLCAxKTsKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iXSwgKE00T1NBX1VJbnQxNilkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpKzFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0KLSAgICAgICAgICAgICAgICAgICAgMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppbmNyZWFzZSBvZiAxIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQVVzIHdpdGggc2FtZSBkdXJhdGlvbiovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0gKz0gMTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICs9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2NdICs9Ci0gICAgICAgICAgICAxOwotCi0jZWxzZQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdICs9Ci0gICAgICAgICAgICAxOwotCi0jZW5kaWYKLQotICAgICAgICBpZiAoYXVQdHItPmF0dHJpYnV0ZSA9PSBBVV9SQVApCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiArIDMpCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzcyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFNTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNTLCAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNTX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RTU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmJdID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIC8qIEkgbW92ZWQgc29tZSBzdGF0ZSBtb2RpZmljYXRpb24gdG8gYWZ0ZXIgd2Uga25vdyB0aGUgc2FtcGxlIGhhcyBiZWVuIHdyaXR0ZW4gY29ycmVjdGx5LiAqLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA9Ci0gICAgICAgICAgICAoTTRNUDRXX1RpbWUzMikoYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIHx8IChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIGZpbGVTaXplKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSBhdVB0ci0+c2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgZmlsZXNpemUgd2l0aCBlc3RpbWF0ZWQgYXVkaW8gZGF0YSB0aGF0IHdpbGwgYmUgYWRkZWQgbGF0ZXIuICAgICovCi0gICAgICAgIC8qV2FybmluZzogQXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gYXVkaW8gc2FtcGxlcyBoYXZlIGNvbnN0YW50IHNpemUgKGUuZy4gbm8gc2lkKS4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gbWF4IGF1ZGlvIHNhbXBsZSBzaXplIGhhcyBiZWVuIHNldCwgYW5kIGlzIHRoZSBhY3R1YWwgc2FtcGxlIHNpemUuICovCi0KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyICE9IDAsCi0gICAgICAgICAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAqICgwLjA1LyphbHdheXMgNTAgQU1SIHNhbXBsZXMgcGVyIHNlY29uZCovCi0gICAgICAgICAgICAqKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZQotICAgICAgICAgICAgKyAxNi8qYWRkaXRpb25hbCBkYXRhIGZvciBhIG5ldyBjaHVuayovCi0gICAgICAgICAgICAvIChNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIpKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IChNNE9TQV9VSW50MzIpKCggYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKQotICAgICAgICAgICAgKiAoMC4wNS8qYWx3YXlzIDUwIEFNUiBzYW1wbGVzIHBlciBzZWNvbmQqLwotICAgICAgICAgICAgKihNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUKLSAgICAgICAgICAgICsgMTYvKmFkZGl0aW9uYWwgZGF0YSBmb3IgYSBuZXcgY2h1bmsqLwotICAgICAgICAgICAgLyAoTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyKSk7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzQoInByb2Nlc3NBVSA6IHNpemUgMHgleCBtb2RlICVkIGZpbGVzaXplICVsdSBsaW1pdCAlbHUiLAotICAgICAgICBhdVB0ci0+c2l6ZSwgYXVQdHItPmF0dHJpYnV0ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0ICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBlcnIyID0gTTROT19FUlJPUiwgZXJyMyA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKldhcm5pbmc6IHRlc3Qgc2hvdWxkIGJlIGRvbmUgaGVyZSB0byBlbnN1cmUgY29udGV4dC0+cENvbnRleHQgaXMgbm90IE00T1NBX05VTEwsCi0gICAgIGJ1dCBDIGlzIG5vdCBDKysuLi4qLwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VQ2hhciBjYW1jb2Rlcl9tYWosIGNhbWNvZGVyX21pbiwgY2FtY29kZXJfcmV2OyAvKmNhbWNvZGVyIHZlcnNpb24qLwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvID0KLSAgICAgICAgKCggbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAhPSAwKSk7IC8qKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAhPSAwKSk7Ki8KLSAgICBNNE9TQV9Cb29sIGJWaWRlbyA9Ci0gICAgICAgICgoIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgIT0gMCkpOyAvKigobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgIT0gMCkpOyovCi0gICAgTTRPU0FfQm9vbCBiSDI2MyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkgyNjQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJNUDRWID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiQUFDID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiRVZSQyA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyppbnRlcm1lZGlhdGUgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgQSwgQiwgTiwgQUI0TjsKLQotICAgIC8qVHJhayB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtJZCA9IEF1ZGlvU3RyZWFtSUQ7IC8qICAgICAoYXVkaW89MSkqLwotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrT2Zmc2V0ID0gMzI7Ci0gICAgTTRPU0FfVUludDMyIGFfc3R0c1NpemUgPSAyNDsgICAgICAgICAgLyogQSAoYXVkaW89MjQpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdHN6U2l6ZSA9IDIwOyAgICAgICAgICAvKiBCIChhdWRpbz0yMCkqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtTaXplID0gNDAyOyAgICAgICAgIC8qICAgICAoYXVkaW89NDAyKSovCi0gICAgTTRPU0FfVUludDMyIGFfbWRpYVNpemUgPSAzMDI7ICAgICAgICAgLyogICAgIChhdWRpbz0zMDIpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9taW5mU2l6ZSA9IDIyOTsgICAgICAgICAvKiAgICAgKGF1ZGlvPTIyOSkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0YmxTaXplID0gMTY5OyAgICAgICAgIC8qICAgICAoYXVkaW89MTY5KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RzZFNpemUgPSA2OTsgICAgICAgICAgLyogICAgIChhdWRpbz02OSApKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RTaXplID0gNTM7ICAgICAgICAgICAvKiAgICAgKGF1ZGlvPTUzICkqLwotICAgIE00T1NBX1VJbnQzMiBhX2RhdGFTaXplID0gMDsgICAgICAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiBhX3RyYWtEdXJhdGlvbiA9IDA7ICAgICAgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgIE00TVA0V19UaW1lMzIgYV9tc1RyYWtEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFfc3RzY1NpemUgPSAyODsgICAgICAgICAgLyogMTYrMTIqbmJjaHVua3NhdWRpbyovCi0gICAgTTRPU0FfVUludDMyIGFfc3Rjb1NpemUgPSAyMDsgICAgICAgICAgLyogMTYrNCpuYmNodW5rc2F1ZGlvKi8KLQotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtJZCA9IFZpZGVvU3RyZWFtSUQ7IC8qICh2aWRlbz0yKSovCi0gICAgLyogZmlyc3QgdHJhayBvZmZzZXQgaXMgMzIrbW9vdlNpemUsIHNlY29uZCBlcXVhbHMgMzIrbW9vdlNpemUrMXN0X3RyYWNrX3NpemUqLwotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtPZmZzZXQgPSAzMjsKLSAgICBNNE9TQV9VSW50MzIgdl9zdHRzU2l6ZSA9IDA7ICAgICAgLyogQSAodmlkZW89MTYrOEopKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHN6U2l6ZSA9IDA7ICAgICAgLyogQiAodmlkZW89MjArNEspKi8KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0Tis0MjYpLCAobXA0dj1BK0IrZHNpKzROKzQ0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9tZGlhU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TiszMjYpLCAobXA0dj1BK0IrZHNpKzROKzM0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9taW5mU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisyNTMpLCAobXA0dj1BK0IrZHNpKzROKzI3NSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGJsU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisxODkpLCAobXA0dj1BK0IrZHNpKzROKzIxMSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNkU2l6ZSA9IDA7ICAgICAgLyogKGgyNjM9MTE3KSAgICAgICAgLCAobXA0dj0xMzkrZHNpICAgICkqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZFNpemUgPSAwOyAgICAgICAvKiAoaDI2Mz0xMDEpICAgICAgICAsIChtcDR2PTE1Mytkc2kgICAgKSovCi0gICAgTTRPU0FfVUludDMyIHZfZGF0YVNpemUgPSAwOyAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiB2X3RyYWtEdXJhdGlvbiA9IDA7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICBNNE1QNFdfVGltZTMyIHZfbXNUcmFrRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQzMiB2X3N0c2NTaXplID0gMjg7ICAgICAvKiAxNisxMipuYmNodW5rc3ZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGNvU2l6ZSA9IDIwOyAgICAgLyogMTYrNCpuYmNodW5rc3ZpZGVvKi8KLQotICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNzU2l6ZSA9IDA7IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSAgICAvKmFhYyAmIG1wNHYgdGVtcCB2YXJpYWJsZSovCi0gICAgTTRPU0FfVUludDggZHNpID0gMDsKLQotICAgIC8qSDI2NCB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2F2Y0NTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qTVA0ViB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZHNTaXplID0gMDsgICAgICAgIC8qIGRzaSszNyovCi0gICAgTTRPU0FfVUludDggdl9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgMDsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICBNNE9TQV9VSW50OCB2X0RDRGVzY3JpcHRvclNpemUgPSAwOyAvKiBkc2krMTUqLwotCi0gICAgLypBQUMgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RzU2l6ZSA9IDA7ICAgICAgICAvKiBkc2krMzcqLwotICAgIE00T1NBX1VJbnQ4IGFfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgIDA7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgTTRPU0FfVUludDggYV9EQ0Rlc2NyaXB0b3JTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qR2VuZXJhbCB2YXJpYWJsZXMqLwotCi0gICAgLyogYXVkaW8gY2h1bmsgc2l6ZSArIHZpZGVvIGNodW5rIHNpemUqLwotICAgIE00T1NBX1VJbnQzMiBtZGF0U2l6ZSA9IDg7Ci0gICAgTTRPU0FfVUludDMyIG1vb3ZTaXplID0gMTE2OyAvKiAxMTYgKyA0MDIoYXVkaW8pICsgICAgKEErQis0Tis0MjYpKGgyNjMpIG9yICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAoQStCK2RzaSs0Tis0NDgpKG1wNHYpICAgICovCi0gICAgTTRPU0FfVUludDMyIGNyZWF0aW9uVGltZTsgLyogQyAqLwotCi0gICAgLypmbGFnIHRvIHNldCB1cCB0aGUgY2h1bmsgaW50ZXJsZWF2ZSBzdHJhdGVneSovCi0gICAgTTRPU0FfQm9vbCBiSW50ZXJsZWF2ZUFWID0KLSAgICAgICAgKGJBdWRpbyAmJiBiVmlkZW8gJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKSk7Ci0KLSAgICBNNE9TQV9Db250ZXh0IGZpbGVXcml0ZXJDb250ZXh0ID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dDsKLQotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvID0gMC4wOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbyA9IDAuMDsKLSAgICBNNE1QNFdfVGltZTMyIGRlbHRhOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1vb3ZQb3MsIG1kYXRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyptYWNybyBzdGF0ZSAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgLyppZiBubyBkYXRhICEqLwotICAgIGlmICgoIWJBdWRpbykgJiYgKCFiVmlkZW8pKQotICAgIHsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsgLyp3b3VsZCBiZSBiZXR0ZXIgdG8gcmV0dXJuIGEgd2FybmluZyA/Ki8KLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgLyogUmVtb3ZlIHNhZmV0eSBmaWxlIHRvIG1ha2Ugcm9vbSBmb3Igd2hhdCBuZWVkcyB0byBiZSB3cml0dGVuIG91dCBoZXJlCi0gICAgKGNodW5rIGZsdXNoaW5nIGFuZCBtb292KS4gKi8KLQotICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlKQotICAgIHsKLSAgICAgICAgTTRPU0FfQ29udGV4dCB0ZW1wQ29udGV4dDsKLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSBNNE9TQV9OVUxMOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICBpZiAoYlZpZGVvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICAvKmN1cnJlbnQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lIGFuZCBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZpZGVvIGNodW5rcyAoLTEpKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdl9kYXRhU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0jaWZuZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiZmx1c2ggdmlkZW8gfCBDTE9TRSIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMygiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IHNpemUgPSAweCUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayBzaXplLCBhbmQgYWRkIHRoaXMgdmFsdWUgdG8gdl9kYXRhU2l6ZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgIHZfZGF0YVNpemUgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsgLyphZGQgbGFzdCBjaHVuayBzaXplKi8KLQotICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLmxhc3RDVFM7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLQotICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgfQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MtLTsKLSAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0gICAgICAgIC8qIExhc3Qgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgIC8qIElmIHdlIGhhdmUgdGhlIGZpbGUgZHVyYXRpb24gd2UgdXNlIGl0LCBlbHNlIHdlIGR1cGxpY2F0ZSB0aGUgbGFzdCBBVSAqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVzZSBtYXggZmlsZSBkdXJhdGlvbiB0byBjYWxjdWxhdGUgZGVsdGEgb2YgbGFzdCBBVSAqLwotICAgICAgICAgICAgZGVsdGEgPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0gICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBtb3JlIHRoYW4gMSBmcmFtZSwgY3JlYXRlIGEgbmV3IHN0dHMgZW50cnkgKGVsc2UgYWxyZWFkeSBjcmVhdGVkKSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKys7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdLCAxKTsKLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0sIGRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKV0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKSArIDFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkdXBsaWNhdGUgdGhlIGRlbHRhIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbW9yZSB0aGFuIDEgZnJhbWUsIGR1cGxpY2F0ZSB0aGUgc3R0cyBlbnRyeSAoZWxzZSBhbHJlYWR5IGV4aXN0cykgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX2dldDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdICs9IDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSArIDFdOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgdmlkZW9UcmFja1B0cixcCi0gICAgICAgICAgICAgICAgICAgICBjYW5ub3Qga25vdyB0aGUgZHVyYXRpb24gb2YgdGhlIHVuaXF1ZSBBVSAhIik7Ci0gICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gYXVkaW8gdHJhY2ssIHdlIHVzZSBpdCBhcyBhIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAoYW5kIHNvLCBhcyBBVSBkdXJhdGlvbi4uLikgKi8KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTGV0J3MgdXNlIHRoZSBhdWRpbyB0cmFjayBkdXJhdGlvbiAhIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAgICAgICAgICAgICAqICgxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS50aW1lc2NhbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBFbHNlLCB3ZSB1c2UgYSBNQUdJQ0FMIHZhbHVlICg2NiBtcykgKi8KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTm8gYXVkaW8gdHJhY2sgLT4gdXNlIG1hZ2ljYWwgdmFsdWUgKDY2KSAhIik7IC8qICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDY2OwotICAgICAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IDY2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0YWJsZSBzaXplcyAqLwotICAgICAgICBBID0gdl9zdHRzU2l6ZSA9IDE2ICsgOCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7IC8qIEEgKHZpZGVvPTE2KzhKKSovCi0gICAgICAgIEIgPSB2X3N0c3pTaXplID0gMjAgKyA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmI7IC8qIEIgKHZpZGVvPTIwKzRLKSovCi0gICAgICAgIE4gPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmI7Ci0gICAgICAgIEFCNE4gPSBBICsgQiArIDQgKiBOOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0gICAgICAgIHZfbXNUcmFrRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKSh2X3RyYWtEdXJhdGlvbiAqIHNjYWxlX3ZpZGVvKTsKLQotICAgICAgICAvKkNvbnZlcnQgaW50ZWdlcnMgaW4gdGhlIHRhYmxlIGZyb20gTEUgaW50byBCRSovCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYik7Ci0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAyICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSk7Ci0KLSNlbmRpZgotCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIpOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyA0MjY7IC8qIChoMjYzPUErQis0Tis0MjYpKi8KLSAgICAgICAgICAgIHZfbWRpYVNpemUgPSBBQjROICsgMzI2OyAvKiAoaDI2Mz1BK0IrNE4rMzI2KSovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIDI1MzsgLyogKGgyNjM9QStCKzROKzI1MykqLwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyAxODk7IC8qIChoMjYzPUErQis0TisxODkpKi8KLSAgICAgICAgICAgIHZfc3RzZFNpemUgPSAxMTc7ICAgICAgICAvKiAoaDI2Mz0xMTcpKi8KLSAgICAgICAgICAgIHZfZXNkU2l6ZSA9IDEwMTsgICAgICAgICAvKiAoaDI2Mz0xMDEpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIDQyNjsKLQotICAgICAgICAgICAgaWYgKCgoTTRPU0FfSW50MzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKnRoZSBvcHRpb25hbCAnYml0cicgYXRvbSBpcyBhcHBlbmRlZCB0byB0aGUgZHNpLHNvIGZpbGVzaXplIGlzIDE2IGJ5dGVzIGJpZ2dlciovCi0gICAgICAgICAgICAgICAgdl90cmFrU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X21kaWFTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfbWluZlNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9zdGJsU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X3N0c2RTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfZXNkU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICBtb292U2l6ZSArPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgLyogRm9yIEgyNjQgdGhlcmUgaXMgbm8gZGVmYXVsdCBEU0ksIGFuZCBpdHMgcHJlc2VuY2UgaXMgbWFuZGF0b3J5LAotICAgICAgICAgICAgc28gY2hlY2sgdGhlIERTSSBoYXMgYmVlbiBzZXQqLwotICAgICAgICAgICAgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplCi0gICAgICAgICAgICAgICAgfHwgTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBlcnJvciwgbm8gSDI2NCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypIMjY0IHNpemVzIG9mIHRoZSBhdG9tKi8KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBiTVVMUFBTU1BTIGNhc2UKLSAgICAgICAgICAgIHZfYXZjQ1NpemUgPSBzaXplb2YoTTRPU0FfVUludDMyKSArIHNpemVvZihIMjY0QmxvY2syKSArCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplOwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyA0MTE7Ci0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAzMTE7Ci0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAyMzg7Ci0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAxNzQ7Ci0gICAgICAgICAgICB2X3N0c2RTaXplID0gICAgICAgIHZfYXZjQ1NpemUgKyAxMDI7Ci0gICAgICAgICAgICB2X2VzZFNpemUgID0gICAgICAgIHZfYXZjQ1NpemUgKyA4NjsKLQotICAgICAgICAgICAgbW9vdlNpemUgICArPSBBQjROICsgdl9hdmNDU2l6ZSArIDQxMTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tNUEVHXzQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNUDRWID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIEZvciBNUEVHNCB0aGVyZSBpcyBubyBkZWZhdWx0IERTSSwgYW5kIGl0cyBwcmVzZW5jZSBpcyBtYW5kYXRvcnksCi0gICAgICAgICAgICBzbyBjaGVjayB0aGUgRFNJIGhhcyBiZWVuIHNldCovCi0gICAgICAgICAgICBpZiAoMCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUKLSAgICAgICAgICAgICAgICB8fCBNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGVycm9yLCBubyBNUEVHNCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypNUDRWIHZhcmlhYmxlcyovCi0gICAgICAgICAgICBkc2kgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemU7Ci0gICAgICAgICAgICB2X2VzZHNTaXplID0gMzcgKyBkc2k7ICAgICAgICAgLyogZHNpKzM3Ki8KLSAgICAgICAgICAgIHZfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgICAgICAgICAgMjMKLSAgICAgICAgICAgICAgICArIGRzaTsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICAgICAgICAgIHZfRENEZXNjcmlwdG9yU2l6ZSA9IDE1ICsgZHNpOyAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIGRzaSArIDQ0ODsgLyogKG1wNHY9QStCK2RzaSs0Tis0NDgpICAgICovCi0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIGRzaSArIDM0ODsgLyogKG1wNHY9QStCK2RzaSs0TiszNDgpICAgICovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIGRzaSArIDI3NTsgLyogKG1wNHY9QStCK2RzaSs0TisyNzUpICAgICovCi0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIGRzaSArIDIxMTsgLyogKG1wNHY9QStCK2RzaSs0TisyMTEpICAgICovCi0gICAgICAgICAgICB2X3N0c2RTaXplID0gZHNpICsgMTM5OyAgICAgICAgLyogKG1wNHY9MTM5K2RzaSkqLwotICAgICAgICAgICAgdl9lc2RTaXplID0gZHNpICsgMTIzOyAgICAgICAgIC8qIChtcDR2PTEyMytkc2kpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIGRzaSArIDQ0ODsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICAgICAgdl9zdHNzU2l6ZSA9IDE2ICsgNCAqIE47IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0Y28gdXBkYXRlICovCi0gICAgICAgIHZfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayB0aW1lKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgdl9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoYkF1ZGlvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9PSBNNFNZU19rQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiQUFDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLSAgICAgICAgICAgIGRzaSA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZTsgLyp2YXJpYWJsZSBzaXplKi8KLQotICAgICAgICAgICAgYV9lc2RzU2l6ZSA9IDM3ICsgZHNpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkc2krMzcqLwotICAgICAgICAgICAgYV9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgICAgICAgICAyMwotICAgICAgICAgICAgICAgICsgZHNpOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgICAgICAgICAgYV9EQ0Rlc2NyaXB0b3JTaXplID0gMTUgKyBkc2k7ICAgICAgICAgICAgICAgICAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICBhX2VzZFNpemUgPSBkc2kgKyA3MzsgLypvdmVyd3JpdGUgYV9lc2RTaXplIHdpdGggYWFjIHZhbHVlKi8KLSAgICAgICAgICAgIC8qYWRkIGRpZi4gYmV0d2VlbiBhbXIgJiBhYWMgc2l6ZXM6ICgtIDUzICsgZHNpICsgMzcpKi8KLSAgICAgICAgICAgIGFfc3RzZFNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9taW5mU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgbW9vdlNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0VWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJFVlJDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLQotICAgICAgICAgICAgLyogZXZyYyBkc2kgaXMgb25seSA2IGJ5dGVzIHdoaWxlIGFtciBkc2kgaXMgOSBieXRlcyxhbGwgb3RoZXIgYmxvY2tzIGFyZSB1bmNoYW5nZWQgKi8KLSAgICAgICAgICAgIGFfZXNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdHNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9taW5mU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV90cmFrU2l6ZSAtPSAzOwotICAgICAgICAgICAgbW9vdlNpemUgLT0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7IC8qKjwgRnJlZSB0aGUgY29udGV4dCBjb250ZW50ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypDb252ZXJ0IGludGVnZXJzIGluIHRoZSB0YWJsZSBmcm9tIExFIGludG8gQkUqLwotICAgICAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIpOwotICAgICAgICAgICAgYV9zdHN6U2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfbWluZlNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgIH0KLQotICAgICAgICBtb292U2l6ZSArPSA0MDI7Ci0KLSAgICAgICAgLypjdXJyZW50IGNodW5rIGlzIHRoZSBsYXN0IG9uZSBhbmQgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBhdWRpbyBjaHVua3MgKC0xKSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFfZGF0YVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJmbHVzaCBhdWRpbyB8IENMT1NFIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHNpemUsIGFuZCBhZGQgdGhpcyB2YWx1ZSB0byBhX2RhdGFTaXplKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICAgICAgYV9kYXRhU2l6ZSArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOyAvKmFkZCBsYXN0IGNodW5rIHNpemUqLwotCi0gICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rICE9IDApCi0gICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuay0tOwotICAgICAgICB9Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYy0tOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSAgICAgICAgYV90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5sYXN0Q1RTOyAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgICAgIC8qIGFkZCBsYXN0IHNhbXBsZSBkdXIgKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgIT0gMSkKLSAgICAgICAgewotI2lmZGVmIERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLSAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICAtIDEpIC0gMl0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoMTIyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoMTAyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNzk1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyMQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg3NDAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDIwCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDY3MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTgKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNTkwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxNgotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg1MTUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDQ3NTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTMKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotICAgICAgICBhX21zVHJha0R1cmF0aW9uID0gKE00T1NBX1VJbnQzMikoYV90cmFrRHVyYXRpb24gKiBzY2FsZV9hdWRpbyk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0c28gdXBkYXRlICovCi0gICAgICAgIGFfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgbmV3IHNpemUgb2Ygc3R0cyovCi0KLSAgICAgICAgYV9zdHRzU2l6ZSA9IDE2ICsgOCAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSk7Ci0KLSAgICAgICAgbW9vdlNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX21kaWFTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9taW5mU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX3RyYWtTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHRpbWUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgYV9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBjaGFuZ2luZyB0aGUgd2F5IHRoZSBtZGF0IHNpemUgaXMgY29tcHV0ZWQuCi0gICAgVGhlIHJlYWwgcHVycG9zZSBvZiB0aGUgbWRhdCBzaXplIGlzIHRvIGtub3cgdGhlIGFtb3VudCB0byBza2lwIHRvIGdldCB0byB0aGUgbmV4dAotICAgIGF0b20sIHdoaWNoIGlzIHRoZSBtb292OyB0aGUgc2l6ZSBvZiBtZWRpYSBpbiB0aGUgbWRhdCBpcyBhbG1vc3Qgc2Vjb25kYXJ5LiBUaGVyZWZvcmUsCi0gICAgaXQgaXMgb2YgdXRtb3N0IGltcG9ydGFuY2UgdGhhdCB0aGUgbWRhdCBzaXplICJwb2ludHMiIHRvIHdoZXJlIHRoZSBtb292IGFjdHVhbGx5Ci0gICAgYmVnaW5zLiBOb3csIHRoZSBtb292IGJlZ2lucyByaWdodCBhZnRlciB0aGUgbGFzdCBkYXRhIHdlIHdyb3RlLCBzbyBob3cgY291bGQgdGhlIHN1bQotICAgIG9mIGFsbCBjaHVuayBzaXplcyBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdG90YWwgc2l6ZSBvZiB3aGF0IGhhcyBiZWVuIHdyaXR0ZW4/IFdlbGwsIGl0Ci0gICAgY2FuIGhhcHBlbiB3aGVuIHRoZSB3cml0aW5nIHdhcyB1bmV4cGVjdGVkbHkgc3RvcHBlZCAoYmVjYXVzZSBvZiBsYWNrIG9mIGRpc2sgc3BhY2UsCi0gICAgZm9yIGluc3RhbmNlKSwgaW4gdGhpcyBjYXNlIGEgY2h1bmsgbWF5IGJlIHBhcnRpYWxseSB3cml0dGVuICh0aGUgcGFydGlhbCB3cml0ZSBpcyBub3QKLSAgICBuZWNlc3NhcmlseSBlcmFzZWQpIGJ1dCBpdCBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgY2h1bmsgc2l6ZSBsaXN0ICh3aGljaCBtYXkKLSAgICBiZWxpZXZlIGl0IGhhc24ndCBiZWVuIHdyaXR0ZW4gb3Igb24gdGhlIGNvbnRyYXJ5IHRoYXQgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbikuIEluCi0gICAgdGhlIGNhc2Ugb2Ygc3VjaCBhIG1pc21hdGNoLCB0aGVyZSBpcyBlaXRoZXIgdW51c2VkIGRhdGEgaW4gdGhlIG1kYXQgKG5vdCB2ZXJ5IGdvb2QsCi0gICAgYnV0IHRvbGVyYWJsZSkgb3Igd2hlbiByZWFkaW5nIHRoZSBsYXN0IGNodW5rIGl0IHdpbGwgcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb292Ci0gICAgYXMgcGFydCBvZiB0aGUgY2h1bmsgKHdoaWNoIG1lYW5zIHRoZSBsYXN0IGNodW5rIHdvbid0IGJlIGNvcnJlY3RseSBkZWNvZGVkKSwgYm90aCBvZgotICAgIHdoaWNoIGFyZSBzdGlsbCBiZXR0ZXIgdGhhbiBsb3NpbmcgdGhlIHdob2xlIHJlY29yZGluZy4gSW4gdGhlIGxvbmcgcnVuIGl0J2xsIHByb2JhYmx5Ci0gICAgYmUgYXR0ZW1wdGVkIHRvIGFsd2F5cyBjbGVhbiB1cCBiYWNrIHRvIGEgY29uc2lzdGVudCBzdGF0ZSwgYnV0IGF0IGFueSByYXRlIGl0IGlzCi0gICAgYWx3YXlzIHNhZmVyIHRvIGhhdmUgdGhlIG1kYXQgc2l6ZSBiZSBjb21wdXRlZCB1c2luZyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG1vb3YKLSAgICBhY3R1YWxseSBiZWdpbnMsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBzaXplIGl0IGlzIHRob3VnaHQgdGhlIG1kYXQgaGFzLgotCi0gICAgVGhlcmVmb3JlLCBJIHdpbGwgcmVjb3JkIHdoZXJlIHdlIGFyZSBqdXN0IGJlZm9yZSB3cml0aW5nIHRoZSBtb292LCB0byBzZXJ2ZSB3aGVuCi0gICAgdXBkYXRpbmcgdGhlIG1kYXQgc2l6ZS4gKi8KLQotICAgIC8qIG1kYXRTaXplICs9IGFfZGF0YVNpemUgKyB2X2RhdGFTaXplOyAqLy8qVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgY2h1bmtzKi8KLQotICAgIC8qIEVuZCBvZiBQaWVycmUgTGViZWF1cGluIDE5LzEyLzIwMDc6IGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4gKi8KLQotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBhX3RyYWtPZmZzZXQgKz0gbW9vdlNpemU7Ci0gICAgdl90cmFrT2Zmc2V0ICs9IG1vb3ZTaXplLyorIGFfZGF0YVNpemUqLzsKLQotICAgIGlmIChiSW50ZXJsZWF2ZUFWID09IE00T1NBX0ZBTFNFKQotICAgICAgICB2X3RyYWtPZmZzZXQgKz0gYV9kYXRhU2l6ZTsKLQotICAgIC8qc3lzdGVtIHRpbWUgc2luY2UgMTk3MCAqLwotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotCi0gICAgdGltZSgodGltZV90ICopJmNyZWF0aW9uVGltZSk7Ci0gICAgLypjb252ZXJ0IGludG8gdGltZSBzaW5jZSAxLzEvMTkwNCAwMGgwMCAobm9ybWF0aXZlKSovCi0gICAgY3JlYXRpb25UaW1lICs9IDIwODI4NDE3NjE7IC8qbmIgb2Ygc2VjIGJldHdlZW4gMTkwNCBhbmQgMTk3MCovCi0KLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIGNyZWF0aW9uVGltZSA9Ci0gICAgICAgIDB4QkJEMDkxMDA7IC8qID0gNy8xMS8yMDAzIDAwaDAwIDsgaW4gaGV4YSBiZWNhdXNlIG9mIGNvZGUgc2NyYW1ibGVyIGxpbWl0YXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIGludGVnZXJzICovCi0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPQotICAgICAgICBtYXgoYV9tc1RyYWtEdXJhdGlvbiwgdl9tc1RyYWtEdXJhdGlvbik7IC8qbWF4IGF1ZGlvL3ZpZGVvKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZmaWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIDB4MjIpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMTYKLSAgICAgICAgICAgICsgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVBBQ19GVFlQX1RBRywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5taW5vcl92ZXJzaW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5jb21wYXRpYmxlX2JyYW5kc1tpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBkZWZhdWx0IGZ0eXAgYm94ICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRGVmYXVsdF9mdHlwLCBzaXplb2YoRGVmYXVsdF9mdHlwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyogc2VlayBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0gICAgLyogLi4uIG9yIHJhdGhlciwgc2VlayB1c2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQsIGJ1dCBpdCBoYXMgYmVlbiBmb3VuZCB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAgICBpcyBub3QgcmVsaWFibHksIG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsLCBpbXBsZW1lbnRlZCBpbiB0aGUgdmFyaW91cyBPU0FMcywgc28gd2Ugbm93IGF2b2lkCi0gICAgdXNpbmcgaXQuICovCi0gICAgLyogTm90aWNlIHRoaXMgbmV3IG1ldGhvZCBhc3N1bWVzIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoaXMgd2lsbCBicmVhayBpZiBldmVyIHdlCi0gICAgYXJlIG92ZXJ3cml0aW5nIGEgbGFyZ2VyIGZpbGUuICovCi0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5nZXRPcHRpb24oCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZSwgKE00T1NBX0RhdGFPcHRpb24gKikgJm1vb3ZQb3MpKTsKLSAgICAvKiBtb292UG9zIHdpbGwgYmUgdXNlZCBhZnRlciB3cml0aW5nIHRoZSBtb292LiAqLwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1vb3ZTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazMsIHNpemVvZihDb21tb25CbG9jazMpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNCwgc2l6ZW9mKENvbW1vbkJsb2NrNCksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5kdXJhdGlvbiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s1LCBzaXplb2YoQ29tbW9uQmxvY2s1KSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgaWYgKGJBdWRpbykKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNiwgc2l6ZW9mKENvbW1vbkJsb2NrNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtJZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazcsIHNpemVvZihDb21tb25CbG9jazcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tc1RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazdiaXMsIHNpemVvZihDb21tb25CbG9jazdiaXMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrMSwgc2l6ZW9mKEFNUkJsb2NrMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tZGlhU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazgsIHNpemVvZihDb21tb25CbG9jazgpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s5LCBzaXplb2YoQ29tbW9uQmxvY2s5KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazFfMSwgc2l6ZW9mKEFNUkJsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAvKmludmVydCB0aGUgdGFibGUgZGF0YSB0byBiaWdlbmRpYW4qLwotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgMiAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgLSAxKSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKQotICAgICAgICAgICAgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAvKiBzdHNkICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYkFBQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBQUNCbG9jazEsIHNpemVvZihBQUNCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRVZSQzhCbG9jazEsIHNpemVvZihFVlJDOEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qZXZyYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKkFNUjgqLwotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUjhCbG9jazEsIHNpemVvZihBTVI4QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphbXI4Ki8KLSAgICAgICAgfQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUsCi0gICAgICAgICAgICBzaXplb2YoQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlCi0gICAgICAgICAgICA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBEU0kgaW5zaWRlIHNhbXBsZSBkZXNjIGVudHJ5ICovCi0gICAgICAgIGlmIChiQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9lc2RzU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2swLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2swKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShhX0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMSksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoYV9EQ0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFBQ0Jsb2NrMiwgc2l6ZW9mKEFBQ0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUyNChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUgKiA1LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMywKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMyksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxvY2FsRHNpWzZdOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY2FsSTsKLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhFVlJDQmxvY2szXzEsIHNpemVvZihFVlJDQmxvY2szXzEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAgICAgLyogY29weSB0aGUgZGVmYXVsdCBibG9jayBpbiBhIGxvY2FsIHZhcmlhYmxlKi8KLSAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDY7IGxvY2FsSSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gRVZSQ0Jsb2NrM18yW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgbG9jYWxEc2lbNV0gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC8gMTYwKS8qRVZSQyAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobG9jYWxEc2ksIDYsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLypBTVI4Ki8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDggbG9jYWxEc2lbOV07Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jYWxJOwotCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkRTSUhlYWRlciwgc2l6ZW9mKEFNUkRTSUhlYWRlciksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgICAgICAvKiBjb3B5IHRoZSBkZWZhdWx0IGJsb2NrIGluIGEgbG9jYWwgdmFyaWFibGUqLwotICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgOTsgbG9jYWxJKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSBBTVJEZWZhdWx0RFNJW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgLyogQUxFUlQhIFRoZSBwb3RlbnRpYWwgb2YgdGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUgdG8gZXhwbG9kZSBpbiBvdXIgZmFjZQotICAgICAgICAgICAgaXMgZW5vcm1vdXMgd2hlbiBhbnl0aGluZyAoc2FtcGxlIHJhdGUgb3Igd2hhdGV2ZXIpIHdpbGwgY2hhbmdlLiBUaGlzCi0gICAgICAgICAgICBjYWxjdWxhdGlvbiB3b3VsZCBiZSBNVUNIIGJldHRlciBoYW5kbGVkIGJ5IHRoZSBWRVMgb3Igd2hhdGV2ZXIgZGVhbHMgd2l0aAotICAgICAgICAgICAgdGhlIGVuY29kZXIgbW9yZSBkaXJlY3RseS4gKi8KLSAgICAgICAgICAgIGxvY2FsRHNpWzhdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAvIDE2MCkvKkFNUiBOQiAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIE1vZGUgU2V0ICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gNTsgbG9jYWxJIDwgNzsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKGxvY2FsRHNpLCA5LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qZW5kIHRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHN6U2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE1LCBzaXplb2YoQ29tbW9uQmxvY2sxNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyowIHZhbHVlIGZvciBzYW1wbGVzaXplIG1lYW5zIG5vdCBjb25zdGFudCBBVSBzaXplKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICogNCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHNjU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE2LCBzaXplb2YoQ29tbW9uQmxvY2sxNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXQotICAgICAgICAgICAgPj4gMTIpICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW2ldICYgMHhGRkYpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihpICsgMSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3Rjb1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNywgc2l6ZW9mKENvbW1vbkJsb2NrMTcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtPZmZzZXQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0KLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrNCwgc2l6ZW9mKEFNUkJsb2NrNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgIH0KLQotICAgIGlmIChiVmlkZW8pCi0gICAgewotICAgICAgICAvKnRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazYsIHNpemVvZihDb21tb25CbG9jazYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrSWQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3LCBzaXplb2YoQ29tbW9uQmxvY2s3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfbXNUcmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3YmlzLCBzaXplb2YoQ29tbW9uQmxvY2s3YmlzKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBJbiB0aGUgdHJhY2sgaGVhZGVyIHdpZHRoIGFuZCBoZWlnaHQgYXJlIDE2LjE2IGZpeGVkIHBvaW50IHZhbHVlcywKLSAgICAgICAgc28gc2hpZnQgbGVmdCB0aGUgcmVndWxhciBpbnRlZ2VyIHZhbHVlIGJ5IDE2LiAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodAotICAgICAgICAgICAgPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21kaWFTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOCwgc2l6ZW9mKENvbW1vbkJsb2NrOCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazksIHNpemVvZihDb21tb25CbG9jazkpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2sxXzEsIHNpemVvZihWaWRlb0Jsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUDRXX2dldDMyX0xvKAotICAgICAgICAgICAgICAgICZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbaV0pLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QNFdfZ2V0MzJfSGkoCi0gICAgICAgICAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1tpXSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgLyogc3RzZCAqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYk1QNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTXA0dkJsb2NrMSwgc2l6ZW9mKE1wNHZCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazEsIHNpemVvZihIMjYzQmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjY0QmxvY2sxLCBzaXplb2YoSDI2NEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgIH0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTEsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUxNihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTE2KG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb1Jlc29sdXRpb25zLCBzaXplb2YoVmlkZW9SZXNvbHV0aW9ucyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIC8qIERTSSBpbnNpZGUgc2FtcGxlIGRlc2MgZW50cnkgKi8KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgaDI2MyBkc2kgZ2l2ZW4gdGhyb3VnaCB0aGUgYXBpIG11c3QgYmUgNyBieXRlcywgdGhhdCBpcywgaXQgc2hhbGwgbm90IGluY2x1ZGUKLSAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgYml0cmF0ZSBib3guIEhvd2V2ZXIsIGlmIHRoZSBiaXRyYXRlIGluZm9ybWF0aW9uIGlzIHNldCBpbiB0aGUgc3RyZWFtCi0gICAgICAgICAgICAgaGFuZGxlciwgYSBiaXRyYXRlIGJveCBpcyBhcHBlbmRlZCBoZXJlIHRvIHRoZSBkc2kgKi8KLSAgICAgICAgICAgIGlmICgoKE00T1NBX0ludDMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syX2JpdHIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihIMjYzQmxvY2syX2JpdHIpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qIGQyNjMgYm94IHdpdGggYml0ciBhdG9tICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMywgc2l6ZW9mKEgyNjNCbG9jazMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazQsIHNpemVvZihIMjYzQmxvY2s0KSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIC8qIFBpZXJyZSBMZWJlYXVwaW4gMjAwOC8wNC8yOTogdGhlIHR3byBmb2xsb3dpbmcgbGluZXMgdXNlZCB0byBiZSBzd2FwcGVkOwotICAgICAgICAgICAgICAgIEkgY2hhbmdlZCB0byB0aGlzIG9yZGVyIGluIG9yZGVyIHRvIGNvbmZvcm0gdG8gM0dQUC4gKi8KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syLCBzaXplb2YoSDI2M0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyogZDI2MyBib3ggKi8KLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2szLCBzaXplb2YoSDI2M0Jsb2NrMyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiTVA0VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ1ZmZlclNpemVEQiA9IDUgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGF2Z0JpdHJhdGU7IC8qYnVmZmVyU2l6ZURCIHNldCB0byA1IHRpbWVzIHRoZSBiaXRyYXRlKi8KLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkc1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazApLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazEsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazEpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0RDRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1wNHZCbG9jazMsIHNpemVvZihNcDR2QmxvY2szKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUyNChidWZmZXJTaXplREIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMiwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMiksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2szLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2szKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBwcHNMZW50Z2ggPSAwOyAvKiBQUFMgbGVuZ3RoICovCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgc3BzTGVudGdoID0gMDsgLyogU1BTIGxlbmd0aCAqLwotICAgICAgICAgICAgTTRPU0FfVUNoYXIgKnRtcERTSSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJOyAvKiBEU0kgKi8KLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBOdW1iZXJPZlBQUzsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBsQ250UFBTOwotCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgKGhlYWRlciArIERTSSkgc2l6ZSAqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfYXZjQ1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgaGVhZGVyICovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjRCbG9jazIsIHNpemVvZihIMjY0QmxvY2syKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjY0Ki8KLSAgICAgICAgICAgIC8qIFB1dCB0aGUgRFNJIChTUFMgKyBQUFMpIGludCB0aGUgM2dwIGZvcm1hdCovCi0gICAgICAgICAgICAvKiBTUFMgbGVuZ3RoIGluIEJFICovCi0KLSAgICAgICAgICAgIGlmICgoMHgwMSAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVswXSkgfHwKLSAgICAgICAgICAgICAgICAgKDB4NDIgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCIhISEgTTRNUDRXX2Nsb3NlV3JpdGUgRVJST1IgOiBpbnZhbGlkIEFWQ0MgMHglWCAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzFdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUiggTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpICk7LypoMjY0Ki8KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyplbmQgdHJhayovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c3pTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTUsIHNpemVvZihDb21tb25CbG9jazE1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKiA0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RzY1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNiwgc2l6ZW9mKENvbW1vbkJsb2NrMTYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0KLSAgICAgICAgICAgID4+IDEyKSArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVtpXSAmIDB4RkZGKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGkgKyAxLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdGNvU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE3LCBzaXplb2YoQ29tbW9uQmxvY2sxNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdl90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrT2Zmc2V0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIHZfdHJha09mZnNldCArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3Rzc1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s0LCBzaXplb2YoVmlkZW9CbG9jazQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiAqIDQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s1LCBzaXplb2YoVmlkZW9CbG9jazUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICB9Ci0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyptZGF0Ki8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtZGF0U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgLyp3cml0ZSBkYXRhLCBhY2NvcmRpbmcgdG8gdGhlIGludGVybGVhdmUgbW9kZSAoZGVmYXVsdCBpcyBub3QgaW50ZXJsZWF2ZWQpKi8KLSAgICBpZiAoYkludGVybGVhdmVBViA9PSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGlmIChiQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qaW4gdGhpcyBtb2RlLCB3ZSBoYXZlIGF1ZGlvIGFuZCB2aWRlbyB0byBpbnRlcmxlYXZlKi8KLSAgICB7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1heChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qc2tpcCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciwKLSAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGVtYmVkZGVkIHN0cmluZyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsIDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLQotICAgIC8qIFdyaXRlIHZlcyBjb3JlIHZlcnNpb24gKi8KLSAgICBjYW1jb2Rlcl9tYWogPSAoTTRPU0FfVUNoYXIpKG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC8gMTAwKTsKLSAgICBjYW1jb2Rlcl9taW4gPQotICAgICAgICAoTTRPU0FfVUNoYXIpKCggbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWopCi0gICAgICAgIC8gMTApOwotICAgIGNhbWNvZGVyX3JldiA9Ci0gICAgICAgIChNNE9TQV9VQ2hhcikobU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWogLSAxMAotICAgICAgICAqIGNhbWNvZGVyX21pbik7Ci0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJyAnLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfbWFqICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnLicsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9taW4gKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcuJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX3JldiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGludGVncmF0aW9uIHRhZyAqLwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyICopIiAtLSAiLCA0LAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypvdmVyd3JpdGUgbWRhdCBzaXplKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQgIT0gMCkKLSAgICAgICAgbWRhdFBvcz0gMTYgKyBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNDsKLSAgICBlbHNlCi0gICAgICAgIG1kYXRQb3MgPSAyNDsKLQotICAgIG1vb3ZQb3MgPSBtb292UG9zIC0gbWRhdFBvczsKLSAgICBtZGF0U2l6ZSA9IG1vb3ZQb3M7Ci0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKGZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZtZGF0UG9zKSk7IC8qc2VlayBhZnRlciBmdHlwLi4uKi8KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobWRhdFNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotY2xlYW51cDoKLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIGZpbGUgZXZlbiBpZiBhbiBlcnJvciBvY2N1cmVkICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVycjIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKG1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIyKTsKLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIFJlbW92ZSBzYWZldHkgZmlsZSBpZiBzdGlsbCBwcmVzZW50IChoZXJlIGl0IGlzIGNsZWFudXAgaW4gY2FzZSBvZiBlcnJvciBhbmQgTk9UIHRoZSBub3JtYWwKLSAgICByZW1vdmFsIG9mIHRoZSBzYWZldHkgZmlsZSB0byBmcmVlIGVtZXJnZW5jeSBzcGFjZSBmb3IgdGhlIG1vb3YpLiAqLwotCi0gICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUpCi0gICAgewotICAgICAgICBNNE9TQV9Db250ZXh0IHRlbXBDb250ZXh0OwotICAgICAgICBlcnIzID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IKLSAgICAgICAgICAgICE9IGVycjMpIC8qIE5vIHNlbnNlIGNsb3NpbmcgaWYgd2UgY291bGRuJ3Qgb3BlbiBpbiB0aGUgZmlyc3QgcGxhY2UuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycjMgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gTTRPU0FfTlVMTDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgLyogRGVsZXRlIGVtYmVkZGVkIHN0cmluZyAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZykKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIERlbGV0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKQotICAgIHsKLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNNE1QNFdfZnJlZUNvbnRleHQoKSBpcyBub3cgYSBwcml2YXRlIG1ldGhvZCwgY2FsbGVkIG9ubHkgZnJvbSBoZXJlKi8KLSAgICBlcnIzID0gTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogTTRNUDRXX2ZyZWVDb250ZXh0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENob29zZSB3aGljaCBlcnJvciBjb2RlIHRvIHJldHVybiAqLwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGdpdmUgcHJpb3JpdHkgdG8gbWFpbiBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnI9MHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEVycm9yIGZyb20gY2xvc2VXcml0ZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjI9MHgleCIsIGVycjIpOwotICAgICAgICByZXR1cm4gZXJyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRXJyb3IgZnJvbSBNNE1QNFdfZnJlZUNvbnRleHQgaXMgcmV0dXJuZWQgb25seSBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yIGFuZAotICAgICAgICAgIG5vIGNsb3NlIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjM9MHgleCIsIGVycjMpOwotICAgICAgICByZXR1cm4gZXJyMzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqdmFsdWVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICAvKiAgICBNNE1QNFdfV3JpdGVDYWxsQmFjayogICAgY2FsbEJhY2tQdHIgPSBNNE9TQV9OVUxMOyovCi0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLQotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7IC8qdGltZSBjb252ZXJzaW9uICEqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2VtYmVkZGVkU3RyaW5nKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gMTY7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywgMTYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICAxNik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gNjAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gNjA7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAwICovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgIDYwKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIC8qY2FsbEJhY2tQdHIgPSAoTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKSgqdmFsdWVQdHIpOwotICAgICAgICAqY2FsbEJhY2tQdHIgPSBtTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2s7Ci0gICAgICAgIGJyZWFrOyovCi0KLSAgICBjYXNlIChNNE1QNFdfcG9zdFdyaXRlQ2FsbEJhY2spOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAvKmNhbGxCYWNrUHRyID0gKE00TVA0V19Xcml0ZUNhbGxCYWNrKikoKnZhbHVlUHRyKTsKLSAgICAgICAgKmNhbGxCYWNrUHRyID0gbU1wNEZpbGVEYXRhUHRyLT5Qb3N0V3JpdGVDYWxsQmFjazsKLSAgICAgICAgYnJlYWs7Ki8KLQotICAgIGNhc2UgKE00TVA0V19tYXhBVXNpemUpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX0lPRCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfRVNEKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX3RyYWNrU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ciA9IChNNE1QNFdfU3RyZWFtSURzaXplICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+d2lkdGggPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoOwotICAgICAgICBzdHJlYW1JRHNpemVQdHItPmhlaWdodCA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0OwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX01PT1ZmaXJzdCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfdGJsQ29tcHJlcyk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gdmFsdWUgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgKnN0cmVhbUlEbWVtQWRkclB0cjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qIFZlcmlmeSBzdGF0ZSAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNUDRXX21heEZpbGVEdXJhdGlvbjoKLSAgICAgICAgY2FzZSBNNE1QNFdfRFNJOgotICAgICAgICAgICAgLyogdGhpcyBwYXJhbSBjYW4gYmUgc2V0IGF0IHRoZSBlbmQgb2YgYSByZWNvcmRpbmcgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSAhPSBNNE1QNFdfY2xvc2VkKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1QNFdfc2V0RnR5cEJveDoKLSAgICAgICAgICAgIC8qIHRoaXMgcGFyYW0gY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSBzdGFydGluZyBhbnkgd3JpdGUgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQsIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBpbiBnZW5lcmFsIHBhcmFtcyBjYW4gYmUgc2V0IGF0IG9wZW4gb3IgcmVhZHkgc3RhZ2UgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygoIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgfQotCi0gICAgLyogU2V0IG9wdGlvbiAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ7IC8qbWF5YmUgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gYWRkZWQgeWV0Ki8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRDsgLyptYXliZSB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLQotICAgICAgICAgICAgICAgICAgICAvKkluIE00TVA0V19vcGVuZWQgc3RhdGUsIG5vIHN0cmVhbSBpcyBwcmVzZW50IHlldCwgc28gb25seSBnbG9iYWwgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgdXBkYXRlZC4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZSA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMilzdHJlYW1JRHZhbHVlUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAvKnRpbWUgY29udmVyc2lvbiEqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4RmlsZVNpemUpOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZW1iZWRkZWRTdHJpbmcpOgotICAgICAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKXZhbHVlOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA+IDE2IGJ5dGVzLCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPCAxNiBieXRlcywgdGhlbiByZXR1cm4gTTRFUlJfUEFSQU1FVEVSCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygxNiwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJlbWJlZGRlZFN0cmluZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKil2YWx1ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPiA2MCBieXRlcywgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplIDwgNjAgYnl0ZXMsIHRoZW4gcGFkIHdpdGggMAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2MCwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnRlZ3JhdGlvblRhZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBpZiAobWVtQWRkclB0ci0+c2l6ZSA8IDYwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICA2MCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCBtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDYwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19DYW1jb2RlclZlcnNpb24pOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+UG9zdFdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEFVc2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemUgPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfSU9EKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0VTRCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfdHJhY2tTaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyID0gKE00TVA0V19TdHJlYW1JRHNpemUgKil2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKChzdHJlYW1JRHNpemVQdHItPnN0cmVhbUlEICE9IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpKQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPSBzdHJlYW1JRHNpemVQdHItPndpZHRoOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyLT5oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgLypzaGFsbCBub3Qgc2V0IHRoaXMgb3B0aW9uIGJlZm9yZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyB3ZXJlIGFkZGVkKi8KLSAgICAgICAgICAgIC8qbm9uc2Vuc2UgdG8gc2V0IHRoaXMgb3B0aW9uIGlmIG5vdCBpbiBjYXNlIGF1ZGlvK3ZpZGVvKi8KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19NT09WZmlyc3QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19WMl90YmxDb21wcmVzKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEZpbGVEdXJhdGlvbik6Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfc2V0RnR5cEJveCk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemU7Ci0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soKCAoTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZSktPm1ham9yX2JyYW5kICE9IDAsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCA9ICooTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBnbG9iYWwgcG9zaXRpb24gdmFyaWFibGVzIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21tb24gYW5kCi0gICAgICAgICAgICAgICAgIHVzZXIgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBzaXplID0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIHNpemVvZihNNE9TQV9VSW50MzIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPSA4LyptZGF0Ki8gKyAxNiArIHNpemU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSA9IDIxOC8qbWRhdCttb292K3NraXAqLyArIDE2ICsgc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19EU0kpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ciA9IChNNFNZU19TdHJlYW1JRG1lbUFkZHIgKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIE5lc3RlZCBzd2l0Y2ghIFdoZWUhICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRG1lbUFkZHJQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBEU0kgc2V0dGluZyA6IG9ubHkgb25jZSBhbGxvd2VkIG9uIGEgZ2l2ZW4gc3RyZWFtICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnRyYWNrVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgSDI2MyBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplID09IDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIE1QRUc0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1QNFYgc3BlY2lmaWMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplIDwgMTA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb246IGluIHNldCBvcHRpb24gRFNJIHNpemUgPSVkIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBIMjY0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGNhc2UgTTRNUDRXX01VTF9QUFNfU1BTOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTID0gKihNNE9TQV9JbnQ4ICopdmFsdWU7Ci0gICAgICAgICAgICAvKiBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0U3RhdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRNUDRXX1N0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKDApOgotICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcEN1cnJlbnRGaWxlU2l6ZSApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSyhwQ3VycmVudEZpbGVTaXplICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgKnBDdXJyZW50RmlsZVNpemUgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNGVjN2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmZmYjNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0ZST00ySVRPTU9OT18xNl9IXwotI2RlZmluZSBfRlJPTTJJVE9NT05PXzE2X0hfCi0KLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoICBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAgLyogX0ZST00ySVRPTU9OT18xNl9IXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OTc0ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlIG5hbWU6ICAgICAgICAgIExWTV9UeXBlcy5oCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzdGFuZGFyZCBMaWZlVmliZXMgdHlwZXMgZm9yIHVzZSBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgICovCi0vKiAgaW50ZXJmYWNlIG9mIGFsbCBMaWZlVmliZXMgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTFZNX1RZUEVTX0gKLSNkZWZpbmUgTFZNX1RZUEVTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KLQotI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCi0jZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCi0jZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3Ci0jZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKLSNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NwotCi0jZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGNhbGxiYWNrSWQgKi8KLSNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQgKi8KLQotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJhc2ljIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9DSEFSOyAgICAgICAgICAgLyogQVNDSUkgY2hhcmFjdGVyICovCi0KLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0lOVDg7ICAgICAgICAgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgY2hhciAgICAgICBMVk1fVUlOVDg7ICAgICAgICAgIC8qIFVuc2lnbmVkIDgtYml0IHdvcmQgKi8KLQotdHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBMVk1fSU5UMTY7ICAgICAgICAgIC8qIFNpZ25lZCAxNi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgc2hvcnQgICAgICBMVk1fVUlOVDE2OyAgICAgICAgIC8qIFVuc2lnbmVkIDE2LWJpdCB3b3JkICovCi0KLXR5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Ci0KLQotLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX0Zvcm1hdF9lbjsKLQotCi0vKiBXb3JkIGxlbmd0aCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNXzE2X0JJVCAgICAgID0gMCwKLSAgICBMVk1fMzJfQklUICAgICAgPSAxLAotICAgIExWTV9XT1JETEVOR1RIX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1dvcmRMZW5ndGhfZW47Ci0KLQotLyogTFZNIHNhbXBsaW5nIHJhdGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fRlNfODAwMCAgPSAwLAotICAgIExWTV9GU18xMTAyNSA9IDEsCi0gICAgTFZNX0ZTXzEyMDAwID0gMiwKLSAgICBMVk1fRlNfMTYwMDAgPSAzLAotICAgIExWTV9GU18yMjA1MCA9IDQsCi0gICAgTFZNX0ZTXzI0MDAwID0gNSwKLSAgICBMVk1fRlNfMzIwMDAgPSA2LAotICAgIExWTV9GU180NDEwMCA9IDcsCi0gICAgTFZNX0ZTXzQ4MDAwID0gOCwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCi0gICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0ZzX2VuOwotCi0KLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAotICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCi0gICAgTFZNX1RFTVBPUkFSWV9GQVNUICAgICAgICAgID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKLSAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQotfSBMVk1fTWVtb3J5VHlwZXNfZW47Ci0KLQotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9NZW1vcnlSZWdpb25fc3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTdGFuZGFyZCBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgTFZNX0lOVDMyICgqTFZNX0NhbGxiYWNrKSh2b2lkICAgICAgICAgICpwQ2FsbGJhY2tEYXRhLCAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLCAgIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGluIHRoZSBjYWxsYmFjaykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIEdlbmVyYWxQdXJwb3NlICk7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdG8gYmUgdXNlZCBhcyBjYWxsYmFjayBJRCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIExWTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZlNTk2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsICAgICAgICBNNEFEX0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgQXVkaW8gU2hlbGwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHRoYXQgYXVkaW8gZGVjb2RlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBRF9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRBRF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00QURfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEF1ZGlvIGRlY29kZXIgb3B0aW9ucy4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgZGVjb2RlciB2aWEKLSAqICAgICAgICAgICAgTTRBRF9nZXRPcHRpb25fZmN0L000QURfc2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmxhZyBvZiBwcmVzZW5jZSBvZiBwcm90ZWN0aW9uICovCi0gICAgTTRBRF9rT3B0aW9uSURfUHJvdGVjdGlvbkFic2VudCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIGJsb2MgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9OYkZyYW1lUGVyQmxvYyAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMiksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEFBQyBkZWNvZGVyIHVzZXIgcGFyYW1ldGVycyAqLwotICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDMpLAotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEFBQyBzdGVhbSB0eXBlICovCi0gICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTApLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgdXNlZCBieXRlcyBpbiB0aGUgbGF0ZXN0IGRlY29kZQotICAgICAodXNlZCBvbmx5IHdoZW4gZGVjb2RpbmcgQUFDIGZyb20gQURJRiBmaWxlKSAqLwotICAgIE00QURfa09wdGlvbklEX1VzZWRCeXRlcyAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTEpLAotCi0gICAgLyogUmVhZGVyIEludGVyZmFjZSAqLwotICAgIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDAxMiksCi0KLSAgICAvKiBBdWRpbyBBY2Nlc3MgVW5pdCAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvQVUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxMyksCi0KLSAgICAvKiBSZWFkZXIgZXJyb3IgY29kZSAqLwotICAgIE00QURfa09wdGlvbklEX0dldEF1ZGlvQVVFcnJDb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTQpLAotCi0gICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTUpLAotCi0gICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTYpLAotCi0gICAgLyogQXVkaW8gQVUgQ1RTICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNykKLQotfSBNNEFEX09wdGlvbklEOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRfa1Vua25vd24gPSAwLCAgICAvKiBVbmtub3duIHN0cmVhbSB0eXBlICovCi0gICAgTTRfa0FBQywgICAgICAgICAgICAvKiBNNF9rQUFDX01BSU4gb3IgTTRfa0FBQ19MQyBvciBNNF9rQUFDX1NTUiBvciBNNF9rQUFDX0xUUCAgICAqLwotICAgIE00X2tBQUNwbHVzLCAgICAgICAgLyogRGVjb2RlciB0eXBlIGlzIEFBQyBwbHVzICovCi0gICAgTTRfa2VBQUNwbHVzICAgICAgICAvKiBEZWNvZGVyIHR5cGUgaXMgZW5oYW5jZWQgQUFDIHBsdXMgKi8KLX0gTTRfQUFDVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXVkaW8gdHlwZXMgdXNlZCB0byBjcmVhdGUgZGVjb2RlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuIEVhY2ggZGVjb2RlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgZGVjb2RlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5Ci0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QURfa1R5cGVBTVJOQiA9IDAsCi0gICAgTTRBRF9rVHlwZUFNUldCLAotICAgIE00QURfa1R5cGVBQUMsCi0gICAgTTRBRF9rVHlwZU1QMywKLSAgICBNNEFEX2tUeXBlUENNLAotICAgIE00QURfa1R5cGVCQk11c2ljRW5naW5lLAotICAgIE00QURfa1R5cGVXTUEsCi0gICAgTTRBRF9rVHlwZVJNQSwKLSAgICBNNEFEX2tUeXBlQURQQ00sCi0gICAgTTRBRF9rVHlwZV9OQiAgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00QURfVHlwZSA7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBidWZmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIG1fZGF0YUFkZHJlc3M7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLSAgICBpbnQ2NF90ICAgICAgICAgbV90aW1lU3RhbXBVczsKLX0gTTRBRF9CdWZmZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9jcmVhdGVfZmN0KShNNEFEX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVzdHJveXMgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfZGVzdHJveV9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVjb2RlcyB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUgICAgUGFyc2VzIGFuZCBkZWNvZGVzIHRoZSBuZXh0IGF1ZGlvIGZyYW1lLCBmcm9tIHRoZSBnaXZlbiBidWZmZXIuCi0gKiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBwSW5wdXRCdWZmZXJTaXplIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYW1vdW50Ci0gKiAgICAgICAgICAgIG9mIGRhdGEgYWN0dWFsbHkgcmVhZC4KLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBpbnB1dEJ1ZmZlcjogICAgICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBkZWNvZGVkUENNQnVmZmVyOiAgICAoT1VUKSAgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgICAoSU4pICAgIE00T1NBX1RSVUUgaWYgYSBqdW1wIHdhcyBqdXN0IGRvbmUsIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3N0ZXBfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00QURfQnVmZmVyICpwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9CdWZmZXIgKnBEZWNvZGVkUENNQnVmZmVyLCBNNE9TQV9Cb29sIGp1bXBpbmcpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXRzIHRoZSBkZWNvZGVyIHZlcnNpb24KLSAqIEBub3RlICAgIFRoZSB2ZXJzaW9uIGlzIGdpdmVuIGluIGEgTTRfVmVyc2lvbkluZm8gc3RydWN0dXJlCi0gKgotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgIChPVVQpICAgICAgICBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBnaXZlbiBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2dldFZlcnNpb25fZmN0KShNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIEFBQyBjb3JlIGRlY29kZXIgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgIHRoZSBzdHJlYW0gcHJvcGVydGllcyBhbmQgdG8gdGhlIG9wdGlvbnMgdGhhdCBtYXkKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIHNldCB1c2luZyBNNEFEX3NldE9wdGlvbl9mY3QKLSAqIEBub3RlICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFBQyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZXNwZWNpYWxseSBieSB0aGUgQUFDIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4vT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfc3RhcnRfZmN0KSAgICAoTTRBRF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9yZXNldF9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBhdWRpbyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRF9zZXRPcHRpb25fZmN0KSAoTTRBRF9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgYXVkaW8gZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFEX2dldE9wdGlvbl9mY3QpIChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvZiBvbmUgYXVkaW8gZGVjb2RlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00QURfVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEFEX0ludGVyZmFjZQotewotCi0gICAgTTRBRF9jcmVhdGVfZmN0KiAgICAgICAgbV9wRmN0Q3JlYXRlQXVkaW9EZWM7Ci0gICAgTTRBRF9zdGFydF9mY3QqICAgICAgICAgICAgbV9wRmN0U3RhcnRBdWRpb0RlYzsKLSAgICBNNEFEX3N0ZXBfZmN0KiAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYzsKLSAgICBNNEFEX2dldFZlcnNpb25fZmN0KiAgICBtX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWM7Ci0gICAgTTRBRF9kZXN0cm95X2ZjdCogICAgICAgIG1fcEZjdERlc3Ryb3lBdWRpb0RlYzsKLSAgICBNNEFEX3Jlc2V0X2ZjdCogICAgICAgICAgICBtX3BGY3RSZXNldEF1ZGlvRGVjOwotICAgIE00QURfc2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjOwotICAgIE00QURfZ2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjOwotCi19IE00QURfSW50ZXJmYWNlOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypfX000QURfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MTQwY2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuaAotICogQGJyaWVmICAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UgdGhhdCBkbyBub3RoaW5nCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFEX05VTExfSF9fCi0jZGVmaW5lIF9fTTRBRF9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IHBvaW50ZXIgb24gYW4gTTRBRF9UeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBhZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBkZWNvZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gKgotICogQHJldHVybiA6IE00Tk9fRVJST1IgIGlmIE9LCi0gKiAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000QURfTlVMTF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTQxMzYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00QUlSX0FQSS5oCi0gKiBAYnJpZWYgIEFyZWEgb2YgSW50ZXJlc3QgUmVzaXplciAgQVBJCi0gKiBAbm90ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgTTRBSVJfQVBJX0gKLSNkZWZpbmUgTTRBSVJfQVBJX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gbGlzdHMgdGhlIGRpZmZlcmVudCBhY2NlcHRlZCBmb3JtYXQgZm9yIHRoZSBBSVIuCi0gKiBUbyBiZSBhdmFpbGFibGUsIHRoZSBhc3NvY2lhdGVkIGNvbXBpbGF0aW9uIGZsYWcgbXVzdCBiZSBkZWZpbmVkLCBlbHNlLAotICogdGhlIEFJUiB3aWxsIHJldHVybiBhbiBlcnJvciAoY29tcGlsYXRpb24gZmxhZyA6IE00QUlSX1hYWFhYWF9GT1JNQVRfU1VQUE9SVEVEKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rWVVWNDIwUCwKLSAgICBNNEFJUl9rWVVWNDIwQVAsCi0gICAgTTRBSVJfa0pQRwotfU00QUlSX0lucHV0Rm9ybWF0VHlwZSA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9Db29yZGluYXRlcwotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIFggYW5kIFkgY29vcmRpbmF0ZXMgaW4gYSBnaXZlbiBwaWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIG1feDsgICAgLyoqPCBYIGNvb3JkaW5hdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV95OyAgICAvKio8IFkgY29vcmRpbmF0ZSAqLwotfU00QUlSX0Nvb3JkaW5hdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfU2l6ZQotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaW1lbnNpb24gb2YgYSBnaXZlbiBwaWN0dXJlIGFyZWEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgLyoqPCBXaWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgLyoqPCBIZWlnaHQgKi8KLX1NNEFJUl9TaXplOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfUGFyYW1zCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGdldCBhIHJlc2l6ZWQgUk9JIChSZWdpb24gb2YgaW50ZXJlc3QpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfQ29vcmRpbmF0ZXMgICAgICAgIG1faW5wdXRDb29yZDsgICAgICAgICAgICAvKio8IFggYW5kIFkgcG9zaXRpb25uaW5nIGluIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgcGl4ZWwgKHRvcC1sZWZ0KSAqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9pbnB1dFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBpbnRlcmVzdGluZyBhcmVhIGluc2lkZSBpbnB1dCAod2lkdGggYW5kIGhlaWdodCkqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9vdXRwdXRTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgb3V0cHV0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPdXRwdXRTdHJpcGU7ICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2Ugd2lsbCBoYXZlIHRvIHByb3ZpZGUgb3V0cHV0IHBlciBzdHJpcGUgb3Igbm90ICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gICAgICAgIG1fb3V0cHV0T3JpZW50YXRpb247ICAgIC8qKjwgRGVzaXJlZCBvcmllbnRhdGlvbiBvZiB0aGUgQUlSIG91dHB1dCAqLwotfU00QUlSX1BhcmFtczsKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIEVSUk9SUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAxKQotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIGlucHV0IG9yIG91dHB1dCBzaXplIGlzIGluY29ycmVjdCAqLwotI2RlZmluZSBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAyKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpOwotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgICBwcm9jZXNzaW5nIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0Q29vcmQ6ICAgIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0U2l6ZTogICAgKElOKSBpbnB1dCBST0kgc2l6ZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAgIChJTikgb3V0cHV0IHNpemUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ6IHRoZSByZXF1ZXN0ZWQgaW5wdXQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgc2V0dGluZ3MgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5Ci0gKiAgICAgICAgICAgIHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4gSW4gc3RyaXBlCi0gKiAgICAgICAgICAgIG1vZGUsIGl0IGlzIGNhbGxlZCBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kCi0gKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgaXMgaW50ZXJuYWxseSBpbmNyZW1lbnRlZAotICogICAgICAgICAgICBhdCBlYWNoIHN0ZXAuCi0gKiAgICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUKLSAqICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwaWN0dXJlLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCi0gKiBAcGFyYW0gICAgcE91dDogICAgICAgIChJTi9PVVQpICBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvdXRwdXQgUGxhbmUocykuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpOwotCi0KLQotI2VuZGlmIC8qIE00QUlSX0FQSV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ3MTBmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNEFNUlJfQ29yZVJlYWRlci5oCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIEFNUiBwYXJzZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFQSSBkZWYuIGZvciBBTVIgUGFyc2VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFNUl9DT1JFUkVBREVSX0hfXwotI2RlZmluZSBfX000QU1SX0NPUkVSRUFERVJfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQU1SIHJlYWRlciBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FNUl9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDIpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRBTVJSX1N0YXRlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBTVIgcmVhZGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgIFRoZXNlIHN0YXRlcyBhcmUgdXNlZCBpbnRlcm5hbHksIGJ1dCBjYW4gYmUgcmV0cmlldmVkIGZyb20gb3V0c2lkZSB0aGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bXsKLSAgICBNNEFNUlJfa09wZW5pbmcgICAgPSAweDAxMDAsCi0gICAgTTRBTVJSX2tPcGVuZWQgICAgPSAweDAxMDEsCi0gICAgTTRBTVJSX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPSAweDAyMDEsCi0gICAgTTRBTVJSX2tDbG9zZWQgPSAweDMwMAotfU00QU1SUl9TdGF0ZTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLSogQGJyaWVmICAgIE00QU1SUl9PcGVuUmVhZCBwYXJzZXMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgQU1SIGFuZCBhbGxvY2F0ZXMgZGF0YSBzdHJ1Y3R1cmUKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGZpbGUgYW5kIGNyZWF0ZXMgYSBjb250ZXh0IGZvciBBTVIgIFBhcnNlci4KLSogICAgICAgICAgICAtIHNldHMgY29udGV4dCB0byBudWxsIGlmIGVycm9yIG9jY3VyZWQuCi0qIEBwYXJhbSAgICBwQ29udGV4dChPVVQpICAgICAgICA6IEFNUiBSZWFkZXIgY29udGV4dCBhbGxvY2F0ZWQgaW4gdGhlIGZ1bmN0aW9uCi0qIEBwYXJhbSAgICBwRmlsZURlc3NjcmlwdG9yKElOKTogRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICBwRmlsZUZ1bmN0aW9uKElOKSAgICA6IHBvaW50ZXIgdG8gZmlsZSBmdW5jdGlvbiBmb3IgZmlsZSBhY2Nlc3MKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBwQ29udGV4dCBhbmQvb3IgcEZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIDogZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybnMgICAgTTRBTVJSX0VSUl9BTVJfTk9UX0NPTVBMSUFOVCA6IFR0aGUgaW5wdXQgaXMgbm90IGEgQU1SIGZpbGUKLSogQHJldHVybnMgICAgTTRPU0FfRklMRSAgICAgICAgOiBTZWUgT1NBTCBmaWxlIFNwZWMuIGZvciBkZXRhaWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0qIEBicmllZiAgICBSZWFkcyB0aGUgbmV4dCBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBmaWxlCi0qIEBub3RlICAgICAgICBHZXQgdGhlIHN0cmVhbSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtLgotKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIGluIEFNUiBmaWxlLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtRGVzYyhPVVQpOiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV4dCByZWFkIHN0cmVhbQotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEFNUlJfV0FSX05PX01PUkVfU1RSRUFNIDogVGhlcmUgYXJlIG5vIG1vcmUgc3RyZWFtcyBpbiB0aGUgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLSogQGJyaWVmICAgIFByZXBhcmVzIHRoZSBBTVIgcmVhZGluZyBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBJZHMKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIHJlYWRlciByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtSURzKElOKSAgICA6IEFycmF5IG9mIHN0cmVhbSBJZHMgdG8gYmUgcHJlcGFyZWQuCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLSogQGJyaWVmICAgIFJlYWRzIHRoZSBhY2Nlc3MgdW5pdCBpbnRvIHRoZSBwcm92aWRpbmcgc3RyZWFtCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgbWVtb3J5IHRvIGRhdGFBZGRyZXNzIGZpbGVkIGFuZCBjb3BpZWQgdGhlIGRhdGEuCi0qICAgICAgICAgICAgLVRoZSBBcHBsaWNhdGlvbiBzaG91bGQgbm90IGZyZWUgdGhlIGRhdGFBZGRyZXNzIHBvaW50ZXIuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIFN0cmVhbUlEKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbQotKiBAcGFyYW0gICAgcEF1KElOL09VVCkgICAgICAgIDogQWNjZXNzIFVuaXQKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9OT19EQVRBX1lFVCAgICA6IHRoZXJlICAgIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotKiBAcmV0dXJucyAgICAgTTRXQVJfRU5EX09GX1NUUkVBTSAgICA6IFRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSogQHJldHVybnMgICAgIE00QU1SUl9FUlJfSU5WQUxJRF9GUkFNRV9UWVBFIDogY3VycmVudCBmcmFtZSBoYXMgbm8gdmFsaWQgZnJhbWUgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0qIEBicmllZiAgICBOb3RpZnkgdGhlIEFSTSBSZWFkZXIgdGhhdCBhcHBsaWNhdGlvbiB3aWxsIG5vIGxvbmdlciB1c2UgIkFVIgotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgcEF1LT5kYXRhQWRkcmVzcyBwb2ludGVyCi0qICAgICAgICAgICAgLUNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgYmFjayB0byByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0KLSogQHBhcmFtICAgIHBBdShJTikgICAgICAgICAgICA6IEFjY2VzcyBVbml0Ci0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSogICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19zZWVrQWNjZXNzTW9kZSAgICBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci0qIEBicmllZiAgICBUaGUgZnVuY3Rpb24gc2Vla3MgdGhlIHRhcmdldGVkIHRpbWUgaW4gdGhlIGdpdmUgc3RyZWFtIGJ5IHN0cmVhbUlkLgotKiBAbm90ZSAgICAgICAgRWFjaCBmcmFtZSBpcyBvZiAyMCBtcyBkdXJhdGlvbiwsIGJ1aWxkcyB0aGUgc2VlayB0YWJsZSBhbmQgcG9pbnRzCi0qICAgICAgICAgICAgdGhlIGZpbGUgcG9pbnRlciB0byBzdGFydGluZyBmb3IgdGhlIHJlcXVpcmVkIEFVLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBBcnJheSBvZiBzdHJlYW0gSURzLgotKiBAcGFyYW0gICAgdGltZShJTikgICAgICAgIDogdGFyZ2V0ZWQgdGltZQotKiBAcGFyYW0gICAgc2Vla01vZGUoSU4pICAgIDogU2VsZWN0cyB0aGUgc2VlayBtb2RlCi0qIEBwYXJhbSAgICBwT2J0YWluQ1RTKE9VVCkgICAgOiBSZXR1cm5lZCB0aW1lIG5lYXJlc3QgdG8gdGFyZ2V0LgotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgOiB0aW1lIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlICAgIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLSogQGJyaWVmICAgIEFNUiByZWFkZXIgY2xvc2VzIHRoZSBmaWxlCi0qIEBwYXJhbSAgICBDb250ZXh0KElOP09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0qIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBBTVIgcmVhZGVyCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIHBTdGF0ZShPVVQpICAgICAgICA6IENvcmUgQU1SIHJlYWRlciBzdGF0ZQotKiBAcGFyYW0gICAgc3RyZWFtSWQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtIDAgZm9yIGFsbAotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgOiAgICBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6ICAgIEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEFNUiByZWFkZXIKLSAqIEBwYXJhbSAgICB2ZXJzaW9uKE9VVCkgICAgOiB0aGUgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMKLSAqCi0gKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIDogICAgdmVyc2lvbiBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplICAgIChNNE9TQV9Db250ZXh0IENvbnRleHQsIE00T1NBX1VJbnQzMiAqcE1heEF1U2l6ZSkKLSAqIEBicmllZiAgICBDb21wdXRlcyB0aGUgbWF4aW11bSBhY2Nlc3MgdW5pdCBzaXplIG9mIGEgc3RyZWFtCi0gKgotICogQHBhcmFtICAgIENvbnRleHQgICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNYXhBdVNpemUgICAgKE9VVCkgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIGluIHRoZSBzdHJlYW0KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogT25lIG9mIHRoZSBpbnB1dCBwb2ludGVyIGlzIE00T1NBX05VTEwgKERlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzKi8KLSNlbmRpZiAvKl9fTTRBTVJfQ09SRVJFQURFUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2YTBmYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00Q29tbW9uX1R5cGVzLmgKLSAqIEBicmllZiAgZGVmaW5lcyBjb21tb24gc3RydWN0dXJlcwotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBNNENPTU1PTl9UWVBFU19ICi0jZGVmaW5lIE00Q09NTU9OX1RZUEVTX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00Q09NTU9OX01ldGFkYXRhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tVbmtub3duTWV0YURhdGFUeXBlLAotICAgIC8qIExvY2FsIGZpbGVzICovCi0gICAgTTRDT01NT05fa1RhZ0lEM3YxLCAgICAgICAgICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIFRBRyBJRDMgVjEgKi8KLSAgICBNNENPTU1PTl9rVGFnSUQzdjIsICAgICAgICAgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gVEFHIElEMyBWMiAqLwotICAgIE00Q09NTU9OX2tBU0ZDb250ZW50RGVzYywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gQVNGIGNvbnRlbnQgZGVzY3JpcHRpb24gICovCi0KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0TW92aWVCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKG1vdmllIGJveCkgKi8KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0VHJhY2tCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKHRyYWNrIGJveCkgKi8KLQotICAgIC8qIFN0cmVhbWluZyAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcFNlc3Npb24sICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKFNlc3Npb24gbGV2ZWwpICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwQXVkaW8sICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChtZWRpYSBhdWRpbyBsZXZlbCkgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBWaWRlbywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKG1lZGlhIHZpZGVvIGxldmVsKSAqLwotCi0gICAgTTRDT01NT05fa0pwZWdFeGlmICAgICAgICAgICAgICAgIC8qKjwgRVhJRiBpbiBKUEVHICovCi19IE00Q09NTU9OX01ldGFkYXRhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNFZQU19FbmNvZGluZ0Zvcm1hdAotICogQGJyaWVmICAgICAgICBUZXh0IGVuY29kaW5nIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVbmtub3duICAgID0gMCwgICAgICAvKio8IFVua25vd24gZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0QVNDSUkgICAgPSAxLCAgICAgICAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAgIC8qKjwgVVRGLTggZW5jb2RlZCBVbmljb2RlIC4gVGVybWluYXRlZCB3aXRoICQwMCAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVVEYxNiAgICA9IDMgICAgICAgICAvKio8IFVURi0xNiBlbmNvZGVkIFVuaWNvZGUuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgMDAgKi8KLX0gIE00Q09NTU9OX0VuY29kaW5nRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZQU19TdHJpbmcKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzdHJpbmcgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcFN0cmluZzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUZXh0IHNpemUgaW4gYnl0ZXMgICAgICAgICovCi0gICAgTTRDT01NT05fRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotCi19IE00Q09NTU9OX1N0cmluZzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZ2VuZXJpYyBidWZmZXIgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIG1fcEJ1ZmZlcjsgICAgICAgIC8qKjwgUG9pbnRlciB0byBidWZmZXIgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3NpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAgICAqLwotfSBNNENPTU1PTl9CdWZmZXI7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9OT05FLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9KUEcsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1BORywKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfQk1QLCAgIC8qIGJpdG1hcCwgd2l0aCBoZWFkZXIgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUkdCMjQsIC8qIHJhdyBSR0IgMjQgYml0cyAqLwotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9SR0I1NjUsIC8qIHJhdywgUkdCIDE2IGJpdHMgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfWVVWNDIwLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9NUEVHNF9JRnJhbWUgLyogUkM6IHRvIHN1cHBvcnQgUFYgYXJ0ICovCi0KLX0gTTRDT01NT05fTWltZVR5cGU7Ci0KLS8qIHBpY3R1cmUgdHlwZSBkZWZpbml0aW9uIGZyb20gaWQzdjIgdGFnKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyICAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV8zMl8zMl9JY29uICAgICAgICAgICAgPSAweDAxLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyX0ljb24gICAgICAgICAgICA9IDB4MDIsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRnJvbnRDb3ZlciAgICAgICAgICAgID0gMHgwMywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CYWNrQ292ZXIgICAgICAgICAgICA9IDB4MDQsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTGVhZmxldFBhZ2UgICAgICAgICAgICA9IDB4MDUsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTWVkaWEgICAgICAgICAgICAgICAgPSAweDA2LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0xlYWRBcnRpc3QgICAgICAgICAgICA9IDB4MDcsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQXJ0aXN0ICAgICAgICAgICAgICAgID0gMHgwOCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Db25kdWN0b3IgICAgICAgICAgICA9IDB4MDksCi0gICAgTTRDT01NT05fa1BpY1R5cGVfT3JjaGVzdHJhICAgICAgICAgICAgPSAweDBBLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0NvbXBvc2VyICAgICAgICAgICAgPSAweDBCLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0x5cmljaXN0ICAgICAgICAgICAgPSAweDBDLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX1JlY29yZGluZ0xvY2F0aW9uICAgID0gMHgwRCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdSZWNvcmRpbmcgICAgICAgID0gMHgwRSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdQZXJmb3JtYW5jZSAgICA9IDB4MEYsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTW92aWVTY3JlZW5DYXB0dXJlICAgID0gMHgxMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CcmlnaHRDb2xvdXJlZEZpc2ggICAgPSAweDExLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0lsbHVzdHJhdGlvbiAgICAgICAgPSAweDEyLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0FydGlzdExvZ28gICAgICAgICAgICA9IDB4MTMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfU3R1ZGlvTG9nbyAgICAgICAgICAgID0gMHgxNAotfSBNNENPTU1PTl9QaWN0dXJlVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNENPTU1PTl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgb3JpZW50YXRpb24gb2YgYSBmcmFtZSBhcyBkZXNjcmliZWQKLSAqICAgICAgICAgICAgaW4gdGhlIEVYSUYgc3RhbmRhcmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93biA9IDAsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbQotfU00Q09NTU9OX09yaWVudGF0aW9uIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRFWElGQ19Mb2NhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgSW1hZ2UgR1BTIGxvY2F0aW9uIChleGFtcGxlIDogNDiwNTIuMjEnICkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Zsb2F0ICAgIGRlZ3JlZXM7Ci0gICAgTTRPU0FfRmxvYXQgICAgbWluc2VjOwotfSBNNENPTU1PTl9Mb2NhdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGZpZWxkcyBvZiBhIGFsYnVtIGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWltZVR5cGUgICAgbV9taW1lVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdWlTaXplOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wRGF0YTsKLQotICAgIE00Q09NTU9OX1N0cmluZyAgICAgICAgbV9wRGVzY3JpcHRpb247Ci0KLX0gTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgbWV0YWRhdGEgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01ldGFkYXRhVHlwZSAgICBtX01ldGFkYXRhVHlwZTsKLQotICAgIC8qIE1ldGEgZGF0YSBmaWVsZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wVGl0bGU7ICAgICAgICAgICAgLyoqPCBUaXRsZSBmb3IgdGhlIG1lZGlhICAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBcnRpc3Q7ICAgICAgICAgICAgLyoqPCBQZXJmb3JtZXIgb3IgYXJ0aXN0ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEFsYnVtOyAgICAgICAgICAgIC8qKjwgQWxidW0gdGl0bGUgZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBdXRob3I7ICAgICAgICAgICAgLyoqPCBBdXRob3Igb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEdlbnJlOyAgICAgICAgICAgIC8qKjwgR2VucmUgKGNhdGVnb3J5IGFuZCBzdHlsZSkgb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcERlc2NyaXB0aW9uOyAgICAgICAgLyoqPCBDYXB0aW9uIG9yIGRlc2NyaXB0aW9uIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ29weVJpZ2h0czsgICAgICAgIC8qKjwgTm90aWNlIGFib3V0IG9yZ2FuaXphdGlvbiBob2xkaW5nIGNvcHlyaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1lZGlhIGZpbGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wUmVjb3JkaW5nWWVhcjsgICAgLyoqPCBSZWNvcmRpbmcgeWVhciBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFJhdGluZzsgICAgICAgICAgICAvKio8IE1lZGlhIHJhdGluZyAqLwotCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENsYXNzaWZpY2F0aW9uOyAgICAvKio8IENsYXNzaWZpY2F0aW9uIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BLZXlXb3JkczsgICAgICAgIC8qKjwgTWVkaWEga2V5d29yZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9jYXRpb247ICAgICAgICAvKio8IExvY2F0aW9uIGluZm9ybWF0aW9uICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFVybDsgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2Ugb2YgdGhlIHJlc291cmNlICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV91aVRyYWNrTnVtYmVyOyAgICAvKio8IFRyYWNrIG51bWJlciBmb3IgdGhlIG1lZGlhKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV91aUR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzICovCi0KLSAgICBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0ICAgIG1fYWxidW1BcnQ7ICAgIC8qKjwgQWxidW1BcnQgZGVzY3JpcHRpb24gKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgICAgICAgICAgICAgbV9wTW9vZDsgICAgLyoqPCBNb29kIG9mIHRoZSBtZWRpYSAqLwotCi0gICAgLyoqPCBNb2RpZnMgQUNPIDQvMTIvMDcgOiBhZGQgRXhpZiBzcGVjaWZpYyBpbmZvcyAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDcmVhdGlvbkRhdGVUaW1lOyAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BNYW51ZmFjdHVyZXI7ICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFNvZnR3YXJlOyAgICAgICAgICAgIC8qKjwgc29mdHdhcmUgdXNlZCAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG1fT3JpZW50YXRpb247ICAgICAgICAvKio8IE9yaWVudGF0aW9uIG9mIHRoZSBwaWN0dXJlICovCi0KLSAgICAvKio8IE1vZGlmcyBGUyAyOS8wOC8wOCA6IGFkZGl0aW9ubmFsIEV4aWYgaW5mb3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgICAgICAgICAvKio8IGltYWdlIGhlaWdodCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV90aHVtYm5haWxTaXplOyAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXRpdHVkZVJlZjsgICAgICAgIC8qKjwgTGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbV9sYXRpdHVkZTsgICAgICAgIC8qKjwgTGF0aXR1ZGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9uZ2l0dWRlUmVmOyAgICAvKio8IExvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBtX2xvbmdpdHVkZTsgICAgICAgIC8qKjwgTG9uZ2l0dWRlICAqLwotCi19IE00Q09NTU9OX01ldGFEYXRhRmllbGRzOwotCi0KLSNlbmRpZiAvKk00Q09NTU9OX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4Y2FiN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNERBX1R5cGVzLmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyB0eXBlIGRlZmluaXRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG1lZGlhIHNwZWNpZmljIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTREQV9UWVBFU19IX18KLSNkZWZpbmUgX19NNERBX1RZUEVTX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNF9TdHJlYW1UeXBlCi0gKiBAYnJpZWYgICAgICAgIFR5cGUgdXNlZCB0byBkZXNjcmliZSBhIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8gZGF0YSBmbG93KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERBX1N0cmVhbVR5cGVVbmtub3duICAgICAgICAgICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93IHR5cGUgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0ICAgICAgICAgICAgPSAwLCAgICAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyAgICAgICAgICAgID0gMSwgICAgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kICAgID0gMiwgICAgLyoqPCBBbXIgbmFycm93IGJhbmQgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kICAgICAgICA9IDMsICAgIC8qKjwgQW1yIHdpZGUgYmFuZCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBBQUMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01wMyAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTVAzIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NSnBlZyAgICAgICAgICAgID0gNiwgICAgLyoqPCBNSlBFRyB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBXYXYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01pZGkgICAgICAgICAgICA9IDgsICAgIC8qKjwgTWlkaSBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgICAgICAgID0gOSwgICAgLyoqPCBNUEVHLTQgQVZDIHZpZGVvIChoMjY0KSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUyAgICAgICAgICAgID0gMTAsICAgIC8qKjwgQUFDIEFEVFMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUYgICAgICAgICAgICA9IDExLCAgICAvKio8IEFBQyBBRElGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9XbWEgICAgICAgICAgICAgICAgPSAxMiwgICAgLyoqPCBXTUEgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb1dtdiAgICAgICAgICAgICAgICA9IDEzLCAgICAvKio8IFdNViB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUmVhbCAgICAgICAgICAgID0gMTQsICAgLyoqPCBSRUFMIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9SZWFsICAgICAgICAgICAgPSAxNSwgICAvKio8IFJFQUwgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgICAgICAgICAgICA9IDE2LCAgIC8qKjwgRXZyYyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVRpbWVkVGV4dCAgICAgICAgICAgID0gMjAsICAgIC8qKjwgVGltZWQgVGV4dCAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQmJhICAgICAgICAgICAgICAgID0gMjEsICAgIC8qKjwgQmVhdCBCcmV3IGF1ZGlvIGZvbWF0ICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9TbWFmICAgICAgICAgICAgPSAyMiwgICAgLyoqPCBTTUFGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9JbWVsb2R5ICAgICAgICAgICAgPSAyMywgICAgLyoqPCBJTUVMT0RZIGF1ZGlvKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1htZiAgICAgICAgICAgICAgICA9IDI0LCAgICAvKio8IFhNRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQnBjICAgICAgICAgICAgICAgID0gMjUsICAgIC8qKjwgQlBDIGF1ZGlvICovCi0KLSAgICAvKiBBRFBDTSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQURQY20gICAgICAgICAgICA9IDI2LCAgICAvKio8IEFEUENNICovCi0KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4ICAgICAgICA9IDI3Ci19IE00X1N0cmVhbVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgQmFzZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1UeXBlICAgIG1fc3RyZWFtVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cmVhbUlkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gSWQgKHVuaXF1ZSBudW1iZXIgZGVmaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0pICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIG1fZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzdHJlYW0gaW4gbWlsbGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9hdmVyYWdlQml0UmF0ZTsgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgYml0cmF0ZSBpbiBrYi9zICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fbWF4QVVTaXplOyAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gc2l6ZSBvZiBhbiBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgICAgICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBhYm92ZSAqLwotICAgIHZvaWQqICAgICAgICAgICAgbV9wVXNlckRhdGE7ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciBvbiBVc2VyIERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbGl6ZWQgYnkgdGhlIHVzZXIpICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgbV9iU3RyZWFtSXNPSzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHN0cmVhbSBoYXMgbm8gZXJyb3JzIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgaXMgZmluaXNoZWQgKi8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87ICAgICAgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHBvaW50ZXIgYWJvdmUgKi8KLSAgICAvLyBNUEVHNCAmIEFBQyBkZWNvZGVycyByZXF1aXJlIEVTRFMgaW5mbwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFU0RTSW5mbzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIG9uIE1QRUc0IG9yIEFBQyBFU0RTIGJveCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX0VTRFNJbmZvU2l6ZTsgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBNUEVHNCBvciBBQUMgRVNEUyBib3ggKi8KLX0gTTRfU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZpZGVvIHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgICAgICAvKio8IEF1ZGlvLVZpZGVvIHN0cmVhbSBjb21tb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV92aWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdmlkZW9IZWlnaHQ7ICAgICAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgIG1fYXZlcmFnZUZyYW1lUmF0ZTsgICAgICAgIC8qKjwgQXZlcmFnZSBmcmFtZSByYXRlIG9mIHRoZSB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZXM7ICAgICAgICAvKio8IFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1ZpZGVvU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhbiBhdWRpbyBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fbmJDaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLW1vbm8sIDItc3RlcmVvKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlRnJhbWVMZW5ndGg7ICAgICAgICAvKio8IFNpemUgb2YgZnJhbWUgc2FtcGxlcyBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlU2FtcGxlU2l6ZTsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgIC8qKjwgU2FtcGxlIGZyZXF1ZW5jeSBpbiBrSHogKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9BdWRpb1N0cmVhbUhhbmRsZXI7Ci0KLSNpZmRlZiBNNFZQU19TVVBQT1JUX1RURVhUCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1RleHRTdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHRleHQgc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tXaWR0aDsgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tIZWlnaHQ7ICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1hwb3M7ICAgICAgICAvKio8IFggcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1lwb3M7ICAgICAgICAvKio8IFkgcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgYmFja19jb2xfcmdiYVs0XTsgICAgLyoqPCB0aGUgYmFja2dyb3VuZCBjb2xvciBpbiBSR0JBICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICB1aUxlbmdodDsgICAgICAgICAgICAvKio8IHRoZSBzdHJpbmcgbGVuZ2h0IGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBkaXNwX2ZsYWc7ICAgICAgICAgICAgLyoqPCB0aGUgd2F5IHRleHQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGhvcml6X2p1c3RpZjsgICAgICAgIC8qKjwgdGhlIGhvcml6b250YWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgdmVydGlfanVzdGlmOyAgICAgICAgLyoqPCB0aGUgdmVydGljYWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIC8qIHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBzdHlsX3N0YXJ0X2NoYXI7ICAgIC8qKjwgdGhlIGZpcnN0IGNoYXJhY3RlciBpbXBhY3RlZCBieSBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgc3R5bF9lbmRfY2hhcjsgICAgICAgIC8qKjwgdGhlIGxhc3QgY2hhcmFjdGVyIGltcGFjdGVkIGJ5IHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBmb250SUQ7ICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGZvbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGZhY2Vfc3R5bGU7ICAgICAgICAgICAgLyoqPCB0aGUgdGV4dCBmYWNlLXN0eWxlOiBib2xkLCBpdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmVkLCBwbGFpbihkZWZhdWx0KSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgZm9udF9zaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBpbiBwaXhlbCBvZiBmb250ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICB0ZXh0X2NvbF9yZ2JhWzRdOyAgICAvKio8IHRoZSB0ZXh0IGNvbG9yIGluIFJHQkEgKi8KLSAgICAvKiBib3ggKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF90b3A7ICAgICAgICAgLyoqPCB0aGUgdG9wIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfbGVmdDsgICAgICAgIC8qKjwgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF9ib3R0b207ICAgICAgLyoqPCB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfcmlnaHQ7ICAgICAgIC8qKjwgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1RleHRTdHJlYW1IYW5kbGVyOwotCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQWNjZXNzVW5pdAotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYW4gYWNjZXNzIHVuaXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zdHJlYW1JRDsgICAgICAgLyoqPCBJZCBvZiB0aGUgc3RyZWFtIHRvIGdldCBhbiBBVSBmcm9tICovCi0gIE00T1NBX01lbUFkZHI4ICAgICAgICBtX2RhdGFBZGRyZXNzOyAgICAgIC8qKjwgUG9pbnRlciB0byBhIG1lbW9yeSBhcmVhIHdpdGggdGhlIGVuY29kZWQgZGF0YSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3NpemU7ICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGFBZHJlc3MgYXJlYSAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0NUUzsgICAgICAgICAgICAvKio8IENvbXBvc2l0aW9uIFRpbWUgU3RhbXAgZm9yIHRoZSBBY2Nlc3MgVW5pdCAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0RUUyA7ICAgICAgICAgICAvKio8IERlY29kZWQgVGltZSBTdGFtcCBmb3IgdGhlIEFjY2VzcyBVbml0ICovCi0gIE00T1NBX1VJbnQ4ICAgICAgICAgICAgbV9hdHRyaWJ1dGU7ICAgICAgIC8qKjwgUkFQIGluZm9ybWF0aW9uICYgQVUgY29ycnVwdGVkICovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fbWF4c2l6ZTsgICAgICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBBVSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAvKio8IFN0cnVjdHVyZSBzaXplICovCi19IE00X0FjY2Vzc1VuaXQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0jZW5kaWYgLyogX19NNERBX1RZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZTMwNjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00REVDT0RFUl9Db21tb24uaAotICogQGJyaWVmICBTaGVsbCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IGRlY29kZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNERFQ09ERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0vKiAtLS0tLSBFcnJvcnMgYW5kIFdhcm5pbmdzIC0tLS0tICovCi0KLS8qKgotICogV2FybmluZzogdGhlcmUgaXMgbm8gbmV3IGRlY29kZWQgZnJhbWUgdG8gcmVuZGVyIHNpbmNlIHRoZSBsYXN0IHJlbmRlcmluZwotICovCi0jZGVmaW5lIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNERFQ09ERVJfQ09NTU9OLCAweDAwMDEpCi0vKioKLSAqIFdhcm5pbmc6IHRoZSBkZWJsb2NraW5nIGZpbHRlciBpcyBub3QgaW1wbGVtZW50ZWQKLSAqLwotI2RlZmluZSBNNFdBUl9ERUJMT0NLSU5HX0ZJTFRFUl9OT1RfSU1QTEVNRU5URUQgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIpCi0KLQotLyogRXJyb3I6IFN0cmVhbSBIMjYzIHByb2ZpbGVzIChvdGhlciB0aGFuICAwKSBhcmUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDAwMSkKLS8qIEVycm9yOiBTdHJlYW0gSDI2MyBub3QgYmFzZWxpbmUgbm90IHN1cHBvcnRlZCAoU3VwcG9ydGVkIHNpemVzIGFyZSBDSUYsIFFDSUYgb3IgU1FDSUYpICovCi0jZGVmaW5lIE00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgMHgwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQVZDIGRlY29kZXIgcHJvZmlsZSBhbmQgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlCi0gKiBAbm90ZSAgICBUaGlzIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBkZWNvZGVyIHZpYSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xID0gMCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMWIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzMsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzJfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMl8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzNfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNF8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF80XzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzUsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzVfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlX2FuZF9MZXZlbF9PdXRfT2ZfUmFuZ2UgPSAyNTUKLX0gTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZGVjb2RlciBvcHRpb25zCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGRlY29kZXIgdmlhIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmVyc2lvbiAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDEpLAotICAgIC8qKgotICAgIEdldCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudGx5IGRlY29kZWQgdmlkZW8KLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9TaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAyKSwKLSAgICAvKioKLSAgICBTZXQgdGhlIGNvbnZlcnNpb24gZmlsdGVyIHRvIHVzZSBhdCByZW5kZXJpbmcKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAzKSwKLSAgICAvKioKLSAgICBBY3RpdmF0ZSB0aGUgRGVibG9ja2luZyBmaWx0ZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNCksCi0gICAgLyoqCi0gICAgR2V0IG5leCByZW5kZXJlZCBmcmFtZSBDVFMKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfTmV4dFJlbmRlcmVkRnJhbWVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUpLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZHVtbXkgdmlkZW8gZGVjb2RlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA2KSwKLSAgICAvKioKLSAgICBTZXQgdGhlIFlVViBkYXRhIHdpdGggY29sb3IgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGR1bW15IHZpZGVvIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDcpLAotCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwOCksCi0KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDkpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdXBwb3J0ZWQgdmlkZW8gZGVjb2RlcnMgYW5kIGNhcGFiaWxpdGllcyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKiBjb21tb24gdG8gTVBFRzQgZGVjb2RlcnMgKi8KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvICovCi0gICAgTTRERUNPREVSX01QRUc0X2tPcHRpb25JRF9EZWNvZGVyQ29uZmlnSW5mbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDEpLAotCi0gICAgLyogbGFzdCBkZWNvZGVkIGN0cyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FWQyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEpCi0vKiBMYXN0IGRlY29kZWQgY3RzICovCi0KLX0gTTRERUNPREVSX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gcmVhZCBmcm9tIHRoZSBNUEVHLTQgVmlkZW9PYmplY3RMYXllci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVByb2ZpbGU7ICAgICAgICAgICAgICAgIC8qKjwgcHJvZmlsZSBhbmQgbGV2ZWwgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpVGltZVNjYWxlOyAgICAgICAgICAgIC8qKjwgdGltZSBzY2FsZSBhcyBwYXJzZWQgaW4gVk9MIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVVzZU9mUmVzeW5jaE1hcmtlcjsgICAgLyoqPCBVc2FnZSBvZiByZXN5bmNocm9uaXphdGlvbiBtYXJrZXIgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiRGF0YVBhcnRpdGlvbjsgICAgICAgICAgICAvKio8IElmIDEgZGF0YSBwYXJ0aXRpb25pbmcgaXMgdXNlZC4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiVXNlT2ZSVkxDOyAgICAgICAgICAgICAgICAvKio8IFVzYWdlIG9mIFJWTEMgZm9yIHRoZSBzdHJlYW0gKi8KLQotfSBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm87Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9TaXplCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZpZGVvIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB2aWEgdGhlIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBkZWNvZGVkIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000REVDT0RFUl9WaWRlb1NpemUKLXsKLSAgICBNNE9TQV9VSW50MzIgICBtX3VpV2lkdGg7ICAgIC8qKjwgdmlkZW8gd2lkdGggIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlIZWlnaHQ7ICAgIC8qKjwgdmlkZW8gaGVpZ2h0IGluIHBpeGVscyAqLwotCi19IE00REVDT0RFUl9WaWRlb1NpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udmVyc2lvbiBmaWx0ZXIKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgIHBvaW50ZXIgYW5kIGl0cyB1c2VyIGRhdGEgdmlhIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgTTRERUNPREVSX2dldE9wdGlvbl9mY3QgICAgd2l0aCB0aGUgb3B0aW9uCi0gKiAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfT3V0cHV0RmlsdGVyCi17Ci0gICAgTTRPU0FfVm9pZCAgICptX3BGaWx0ZXJGdW5jdGlvbjsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgKm1fcEZpbHRlclVzZXJEYXRhOyAgICAvKio8IHVzZXIgZGF0YSBvZiB0aGUgZmlsdGVyICAgICAgICAqLwotCi19IE00REVDT0RFUl9PdXRwdXRGaWx0ZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX1ZpZGVvVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgICB2aWRlbyBkZWNvZGVyIGludGVyZmFjZS4gRWFjaCBkZWNvZGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICAgIFdoZW4gYSBkZWNvZGVyIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kCi0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQgPSAwLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTUpQRUcsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVXTVYsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVSRUFMLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUCwKLQotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlX05CICAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRERUNPREVSX1ZpZGVvVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgbVByb2ZpbGU7Ci0gICAgTTRPU0FfVUludDMyIG1MZXZlbDsKLX0gVmlkZW9Qcm9maWxlTGV2ZWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcHJvZmlsZUxldmVsOwotICAgIE00T1NBX1VJbnQzMiBwcm9maWxlTnVtYmVyOwotfSBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00X1N0cmVhbVR5cGUgY29kZWM7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKmNvbXBvbmVudDsKLSAgICBNNE9TQV9VSW50MzIgY29tcG9uZW50TnVtYmVyOwotfSBWaWRlb0RlY29kZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb0RlY29kZXIgKmRlY29kZXI7Ci0gICAgTTRPU0FfVUludDMyIGRlY29kZXJOdW1iZXI7Ci19IE00REVDT0RFUl9WaWRlb0RlY29kZXJzOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwR2xvYmFsSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlIHRoYXQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0KLSAqIEBwYXJhbSAgICBwRGF0YUludGVyZmFjZTogICAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGRlY29kZWQgZGF0YSBhcmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfY3JlYXRlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcEdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwRGF0YUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZGVzdHJveV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlY29kZXIKLSAqICAgICAgICAgIC10aGUgc2l6ZSAod2lkdGh4aGVpZ2h0KSBvZiB0aGUgaW1hZ2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAoSU4pICAgICAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAoSU4vT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCkoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSBjb252ZXJzaW9uIGZpbHRlciB0byB1c2UgYXQgcmVuZGVyaW5nCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX3NldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIERlY29kZSBBY2Nlc3MgVW5pdHMgdXAgdG8gYSB0YXJnZXQgdGltZQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UgZm9yIHdoaWNoCi0gKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGlvbiB0aW1lIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdG8gdGhlIHBhc3NlZCB0YXJnZXRlZCB0aW1lCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBUaW1lOiAgICAgICAgKElOL09VVCkgICAgSU46IFRpbWUgdG8gZGVjb2RlIHVwIHRvIChpbiBtaWxsaSBzZWNvbmRlcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlCi0gKiBAcGFyYW0gICB0b2xlcmFuY2U6ICAgICAgKElOKSAgICAgICAgV2UgbWF5IGRlY29kZSBhbiBlYXJsaWVyIGZyYW1lIHdpdGhpbiB0aGUgdG9sZXJhbmNlLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IHRvIGRlY29kZSAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9kZWNvZGVfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkp1bXAsIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZW5kZXJzIHRoZSB2aWRlbyBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGFjdHVhbGx5IHJlbmRlcmVkIGZyYW1lIChpbiBtcykKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmU6KE9VVCkgICAgICAgIE91dHB1dCBwbGFuZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGRhdGEgKGNvbnZlcnRlZCkKLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCAoaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gY2FuIHJldHVybgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgdG8gcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9yZW5kZXJfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyB2aWRlbyBkZWNvZGVyIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9mIG9uZSB2aWRlbyBkZWNvZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRERUNPREVSX1ZpZGVvVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLXsKLSAgICBNNERFQ09ERVJfY3JlYXRlX2ZjdCogICAgICAgIG1fcEZjdENyZWF0ZTsKLSAgICBNNERFQ09ERVJfZGVzdHJveV9mY3QqICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00REVDT0RFUl9nZXRPcHRpb25fZmN0KiAgICBtX3BGY3RHZXRPcHRpb247Ci0gICAgTTRERUNPREVSX3NldE9wdGlvbl9mY3QqICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNERFQ09ERVJfZGVjb2RlX2ZjdCogICAgICAgIG1fcEZjdERlY29kZTsKLSAgICBNNERFQ09ERVJfcmVuZGVyX2ZjdCogICAgICAgIG1fcEZjdFJlbmRlcjsKLX0gTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlOwotCi0jZW5kaWYgLypfX000REVDT0RFUl9DT01NT05fSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdkODU3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWRF9OdWxsLmgKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhICJudWxsIiB2aWRlbyBkZWNvZGVyLGkuZS4gYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90IGRvIGFjdHVhbCBkZWNvZGluZy4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZXRJbnRlcmZhY2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000REVDT0RFUl9OVUxMX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgaWYgT0sKLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKCBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRERUNPREVSX05VTExfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JhMDJhMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKLSAqIEBicmllZiAgICBWRVMgYXVkaW8gZW5jb2RlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IGF1ZGlvIGVuY29kZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWCAyCi0vKiBXQVJOSU5HOiB0aGlzIHZhbHVlIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIGdyYWJiZWQgKi8KLS8vI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgOTYwICAgIC8qIGltcG9zZWQgYnkgdGhlIEFBQyBlbmNvZGVyLiAqLwotI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgMTAyNCAgICAvKiBpbXBvc2VkIGJ5IHRoZSBBQUMgZW5jb2Rlci4gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00RU5DT0RFUl9BdWRpb19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBBQUMgc2hlbGwgZW5jb2RlciBvcHRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gLyogTWF4aW11bSBnZW5lcmF0ZWQgQVUgc2l6ZSAqLwotICAgIE00RU5DT0RFUl9BdWRpb19tYXhBVXNpemUgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELE00RU5DT0RFUl9BVURJTywgMHgwMSkKLQotfSBNNEVOQ09ERVJfQXVkaW9fT3B0aW9uSUQ7Ci0KLQotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazgwMDBIeiA9IDgwMDAsCi0gICAgTTRFTkNPREVSX2sxMTAyNUh6ID0gMTEwMjUsCi0gICAgTTRFTkNPREVSX2sxMjAwMEh6ID0gMTIwMDAsCi0gICAgTTRFTkNPREVSX2sxNjAwMEh6ID0gMTYwMDAsCi0gICAgTTRFTkNPREVSX2syMjA1MEh6ID0gMjIwNTAsCi0gICAgTTRFTkNPREVSX2syNDAwMEh6ID0gMjQwMDAsCi0gICAgTTRFTkNPREVSX2szMjAwMEh6ID0gMzIwMDAsCi0gICAgTTRFTkNPREVSX2s0NDEwMEh6ID0gNDQxMDAsCi0gICAgTTRFTkNPREVSX2s0ODAwMEh6ID0gNDgwMDAKLX0gTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBTVJOQiA9IDAsCi0gICAgTTRFTkNPREVSX2tBQUMsCi0gICAgTTRFTkNPREVSX2tBdWRpb05VTEwsICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa01QMywKLSAgICBNNEVOQ09ERVJfa0F1ZGlvX05CICAgICAgICAvKiBudW1iZXIgb2YgZW5jb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRFTkNPREVSX0F1ZGlvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa01vbm8gID0gMCwKLSAgICBNNEVOQ09ERVJfa1N0ZXJlbywKLSAgICBNNEVOQ09ERVJfa1N0ZXJlb05vSW50ZXJsZWF2ZQotfSBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzRfNzVfS0JQUyAgICA9IDQ3NTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181XzE1X0tCUFMgICAgPSA1MTUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNV85X0tCUFMgICAgPSA1OTAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNl83X0tCUFMgICAgPSA2NzAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN180X0tCUFMgICAgPSA3NDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN185NV9LQlBTICAgID0gNzk1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzhfS0JQUyAgICAgICAgPSA4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTBfMl9LQlBTICAgID0gMTAyMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMl8yX0tCUFMgICAgPSAxMjIwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2X0tCUFMgICAgPSAxNjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI0X0tCUFMgICAgPSAyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzMyX0tCUFMgICAgPSAzMjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQwX0tCUFMgICAgPSA0MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQ4X0tCUFMgICAgPSA0ODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzU2X0tCUFMgICAgPSA1NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzY0X0tCUFMgICAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzgwX0tCUFMgICAgPSA4MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzk2X0tCUFMgICAgPSA5NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzExMl9LQlBTICAgID0gMTEyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTI4X0tCUFMgICAgPSAxMjgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNDRfS0JQUyAgICA9IDE0NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2MF9LQlBTICAgID0gMTYwMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTkyX0tCUFMgICAgPSAxOTIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yMjRfS0JQUyAgICA9IDIyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI1Nl9LQlBTICAgID0gMjU2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMzIwX0tCUFMgICAgPSAzMjAwMDAKLX0gTTRFTkNPREVSX0F1ZGlvQml0cmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgY3VycmVudCBtb2RlIG9mIHRoZSBiaXRyYXRlIHJlZ3VsYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmUgPSAwLCAgICAvKio8IG5vIGJpdHJhdGUgcmVndWxhdGlvbiAqLwotICAgIE00RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyICAgICAgICAvKio8IGJldHRlciBxdWFsaXR5LCBidXQgbW9yZSBDUFUgY29uc3VtZWQgKi8KLX0gTTRFTkNPREVSX0FhY1JlZ3VsYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0FtclNJRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBTSUQgb2YgdGhlIEFNUiBlbmNvZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQW1yTm9TSUQgPSAwICAgICAvKio8IG5vIFNJRCAqLwotfSBNNEVOQ09ERVJfQW1yU0lEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQWFjUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZSBBQUMgZW5jb2Rlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uICAgIFJlZ3VsYXRpb247Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSGlnaFNwZWVkOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYlROUzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJQTlM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSVM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiTVM7Ci19IE00RU5DT0RFUl9BYWNQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZyBhdWRpby4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBzX000RU5DT0RFUl9BdWRpb1BhcmFtcwotewotICAgIE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBGcmVxdWVuY3k7ICAgIC8qKjwgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyICAgICAgICBDaGFubmVsTnVtOyAgICAvKio8IHRoZSBudW1iZSBvZiBjaGFubmVscyAobW9ubywgc3RlcmVvLCAuLikgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlICAgICAgICBCaXRyYXRlOyAgICAvKio8ICBiaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgIC8qKjwgIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdCwgQU1SLCBBQUMgLi4uICAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgTTRFTkNPREVSX0FhY1BhcmFtcyAgICAgICAgQWFjUGFyYW07Ci0gICAgICAgIE00RU5DT0RFUl9BbXJTSUQgICAgICAgIEFtclNJRDsKLSAgICB9IFNwZWNpZlBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHRoZSBhdWRpbyBlbmNvZGVyIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLX0gTTRFTkNPREVSX0F1ZGlvUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwSW5mbzsgICAgICAgIC8qKjwgdGhlIGJ1ZmZlciBhZHJlc3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgaW5mb1NpemU7ICAgIC8qKjwgdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCi19IE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGF0YSBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IHRoZSB0YWJsZSBvZiBidWZmZXJzICh1bnVzZWQgYnVmZmVycyBhcmUgc2V0IHRvIE5VTEwpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgcFRhYmxlQnVmZmVyW000RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVhdOwotICAgIC8qKjwgdGhlIHRhYmxlIG9mIHRoZSBzaXplIG9mIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGF0IHNhbWUgaW5kZXggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgcFRhYmxlQnVmZmVyU2l6ZVtNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYXTsKLX0gTTRFTkNPREVSX0F1ZGlvQnVmZmVyOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9pbml0KSAgICAgICAgKE00T1NBX0NvbnRleHQqIGhDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xlYW5VcCkgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfb3BlbikgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgKnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKmRlY1NwZWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZ3JhYmJlckNvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xvc2UpICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9zdGVwKSAgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciAqb3V0QnVmZmVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2dldE9wdGlvbikgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX09wdGlvbklEICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICp2YWx1ZVB0cik7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBhdWRpbyBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEFFX2luaXQqICAgICAgICBwRmN0SW5pdDsKLSAgICBNNEFFX2NsZWFuVXAqICAgIHBGY3RDbGVhblVwOwotICAgIE00QUVfb3BlbiogICAgICAgIHBGY3RPcGVuOwotICAgIE00QUVfY2xvc2UqICAgICAgICBwRmN0Q2xvc2U7Ci0gICAgTTRBRV9zdGVwKiAgICAgICAgcEZjdFN0ZXA7Ci0gICAgTTRBRV9nZXRPcHRpb24qICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNjQ2MDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVOQ09ERVJfY29tbW9uLmgKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCBlbmNvZGVycwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRFTkNPREVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogVmlkZW8gcHJlcHJvY2Vzc2luZyBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIKLQotLyogSU1BR0UgU1RBQiAqLwotLyogcGVyY2VudGFnZSBvZiBpbWFnZSBzdXBwcmVzc2VkIChjb21wdXRlZCBmcm9tIHRoZSBzdGFuZGFyZCBkaW1lbnNpb24pLiovCi0jZGVmaW5lIE00RU5DT0RFUl9TVEFCX0ZJTFRFUl9DUk9QX1BFUkNFTlRBR0UgMTAKLSAgICAgICAgLyogV0FSTklORzogdGFrZSB0aGUgaW5mZXJpb3IgZXZlbiBkaW1lbnNpb24sIGV4OiAxMCUgZm9yIFFDSUYgb3V0cHV0ID0+IDE5MngxNTggKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfT3Blbk1vZGUKLSAqIEBicmllZiAgICBEZWZpbml0aW9uIG9mIG9wZW4gbW9kZSBmb3IgdGhlIGVuY29kZXIuCi0gKiBAbm90ZSAgICBERUZBVUxUICA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW4oKSB3aGljaCB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKiAgICAgICAgICBBRFZBTkNFRCA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW5fYWR2YW5jZWQoKSB3aGljaCBhbGxvdyB0byBjdXN0b21pemUKLSAqICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX09QRU5fREVGQVVMVCwKLSAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRAotfSBNNEVOQ09ERVJfT3Blbk1vZGU7Ci0KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9GcmFtZVJhdGUKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgZW5jb2RlZCB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rNV9GUFMsCi0gICAgTTRFTkNPREVSX2s3XzVfRlBTLAotICAgIE00RU5DT0RFUl9rMTBfRlBTLAotICAgIE00RU5DT0RFUl9rMTJfNV9GUFMsCi0gICAgTTRFTkNPREVSX2sxNV9GUFMsCi0gICAgTTRFTkNPREVSX2syMF9GUFMsCi0gICAgTTRFTkNPREVSX2syNV9GUFMsCi0gICAgTTRFTkNPREVSX2szMF9GUFMsCi0gICAgTTRFTkNPREVSX2tWQVJJQUJMRV9GUFMsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFICAgICAgICAgICAgLyoqPCBBZHZhbmNlZCBlbmNvZGluZywgdXNlIHRpbWVzY2FsZSBpbmRpY2F0aW9uIHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBmcmFtZXJhdGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lUmF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gZm9ybWF0IG9mIHRoZSBncmFiYmluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0lZVVY0MjA9MCwgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00RU5DT0RFUl9rSVlVVjQyMiwgICAvKio8IFlVVjQyMiBwbGFuYXIgKi8KLSAgICBNNEVOQ09ERVJfa0lZVVlWLCAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00RU5DT0RFUl9rSVVZVlksICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNEVOQ09ERVJfa0lKUEVHLCAgICAgLyoqPCBKUEVHIGNvbXByZXNzZWQgZnJhbWVzICovCi0gICAgTTRFTkNPREVSX2tJUkdCNDQ0LCAgIC8qKjwgUkdCIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I1NTUsICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00RU5DT0RFUl9rSVJHQjU2NSwgICAvKio8IFJHQiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRFTkNPREVSX2tJUkdCMjQsICAgIC8qKjwgUkdCIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNEVOQ09ERVJfa0lSR0IzMiwgICAgLyoqPCBSR0IgMzIgYml0cyAgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I0NDQsICAgLyoqPCBCR1IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjU1NSwgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRFTkNPREVSX2tJQkdSNTY1LCAgIC8qKjwgQkdSIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1IyNCwgICAgLyoqPCBCR1IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjMyICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNEVOQ09ERVJfSW5wdXRGb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0Zvcm1hdAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTVBFRzQgPSAwLAotICAgIE00RU5DT0RFUl9rSDI2MywKLSAgICBNNEVOQ09ERVJfa0gyNjQsCi0gICAgTTRFTkNPREVSX2tKUEVHLAotICAgIE00RU5DT0RFUl9rTUpQRUcsCi0gICAgTTRFTkNPREVSX2tOVUxMLAotICAgIE00RU5DT0RFUl9rWVVWNDIwLCAgICAgICAgICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa1lVVjQyMiwgICAgICAgICAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0KLSAgICBNNEVOQ09ERVJfa1ZpZGVvX05CIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLX0gTTRFTkNPREVSX0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgZnJhbWUgV2lkdGguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX1NRQ0lGX1dpZHRoID0gMTI4LCAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9XaWR0aCA9IDE2MCwgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRFTkNPREVSX1FDSUZfV2lkdGggID0gMTc2LCAvKio8IFFDSUYgMTc2eDE0NCAqLwotICAgIE00RU5DT0RFUl9RVkdBX1dpZHRoICA9IDMyMCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX1dpZHRoICAgPSAzNTIsIC8qKjwgQ0lGIDM1MngyODggKi8KLSAgICBNNEVOQ09ERVJfVkdBX1dpZHRoICAgPSA2NDAsIC8qKjwgVkdBIDY0MHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfU1ZHQV9XaWR0aCAgPSA4MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9XaWR0aCAgID0gMTAyNCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9XaWR0aCAgPSAxMjgwLCAvKio8IFhWR0EgMTI4MHgxMDI0ICovCi0vKiArUFIgTFY1ODA3ICovCi0gICAgTTRFTkNPREVSX1dWR0FfV2lkdGggID0gODAwLCAvKio8IFdWR0EgODAwIHggNDgwICovCi0gICAgTTRFTkNPREVSX05UU0NfV2lkdGggID0gNzIwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aCAgID0gNjQwLCAgLyoqPCA2NDB4MzYwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl84NTRfNDgwX1dpZHRoICAgPSA4NDgsICAvKio8IDg0OHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGggID0gMTI4MCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aCAgPSAxMDg4LCAvKio8IDcyMHAgMTA4OHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9XaWR0aCAgID0gOTYwLCAgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoID0gMTkyMCAgLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNEVOQ09ERVJfRnJhbWVXaWR0aDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGZyYW1lIEhlaWdodC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0ID0gOTYsICAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9IZWlnaHQgPSAxMjAsIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00RU5DT0RFUl9RQ0lGX0hlaWdodCAgPSAxNDQsIC8qKjwgUUNJRiAxNzZ4MTQ0ICovCi0gICAgTTRFTkNPREVSX1FWR0FfSGVpZ2h0ICA9IDI0MCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX0hlaWdodCAgID0gMjg4LCAvKio8IENJRiAzNTJ4Mjg4ICovCi0gICAgTTRFTkNPREVSX1ZHQV9IZWlnaHQgICA9IDQ4MCwgLyoqPCBWR0EgMzQweDQ4MCAqLwotICAgIE00RU5DT0RFUl9TVkdBX0hlaWdodCAgPSA2MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9IZWlnaHQgICA9IDc2OCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9IZWlnaHQgID0gMTAyNCwgLyoqPCBYVkdBIDEyODB4MTAyNCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00RU5DT0RFUl9XVkdBX0hlaWdodCAgPSA0ODAsIC8qKjwgV1ZHQSA4MDAgeCA0ODAgKi8KLSAgICBNNEVOQ09ERVJfTlRTQ19IZWlnaHQgID0gNDgwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQgID0gMzYwLCAvKio8IDY0MHgzNjAgKi8KLSAgICBNNEVOQ09ERVJfODU0XzQ4MF9IZWlnaHQgID0gNDgwLCAvKio8IDg1NHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTI4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9IZWlnaHQgID0gNzIwLCAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodCA9IDEwODggLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lSGVpZ2h0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazI4X0tCUFMgID0gMjgwMDAsCi0gICAgTTRFTkNPREVSX2s0MF9LQlBTICA9IDQwMDAwLAotICAgIE00RU5DT0RFUl9rNjRfS0JQUyAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfazk2X0tCUFMgID0gOTYwMDAsCi0gICAgTTRFTkNPREVSX2sxMjhfS0JQUyA9IDEyODAwMCwKLSAgICBNNEVOQ09ERVJfazE5Ml9LQlBTID0gMTkyMDAwLAotICAgIE00RU5DT0RFUl9rMjU2X0tCUFMgPSAyNTYwMDAsCi0gICAgTTRFTkNPREVSX2szODRfS0JQUyA9IDM4NDAwMCwKLSAgICBNNEVOQ09ERVJfazUxMl9LQlBTID0gNTEyMDAwLAotICAgIE00RU5DT0RFUl9rODAwX0tCUFMgPSA4MDAwMDAKLQotfSBNNEVOQ09ERVJfQml0cmF0ZTsKLQotLyogSU1BR0UgU1RBQiAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfU3RhYk1vZGUKLSAqIEBicmllZiAgICAgICAgVGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgc3RhYmlsaXphdGlvbiBmaWx0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tTdGFiT2ZmID0gMCwgICAgICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJDZW50ZXJlZCwgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGFuZCBvdXRwdXQgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMuIE91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lsbCBoYXZlIGJsYWNrIGJvcmRlcnMgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJHcmFiTW9yZSAgICAgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGRpbWVuc2lvbnMgbXVzdCBiZSBiaWdnZXIgdGhhbiBvdXRwdXQuIFRoZSByYXRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluZGljYXRlZCBieSBNNEVOQ09ERVJfU1RBQl9GSUxURVJfQ1JPUF9QRVJDRU5UQUdFICovCi0KLX0gTTRFTkNPREVSX1N0YWJNb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlCi0gKiBAYnJpZWYgICAgICAgIFZhbHVlcyB0byBkcml2ZSB0aGUgZW5jb2RlciBiZWhhdmlvdXIgKHR5cGUgb2YgZnJhbWVzIHByb2R1Y2VkKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTm9ybWFsRnJhbWUgPSAwLCAgIC8qKjwgbGV0IHRoZSBlbmNvZGVyIGRlY2lkZSB3aGljaCB0eXBlIG9mIGZyYW1lIHRvIGVuY29kZSAqLwotICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lICAgPSAxLCAgIC8qKjwgZm9yY2UgZW5jb2RlciB0aGUgZmx1c2ggYWxsIGl0cyBidWZmZXJzIGJlY2F1c2UgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBmcmFtZSAgKi8KLSAgICBNNEVOQ09ERVJfa0lGcmFtZSAgICAgID0gMiAgICAvKio8IGZvcmNlIGVuY29kZXIgdG8gZ2VuZXJhdGUgYW4gSSBmcmFtZSAqLwotCi19IE00RU5DT0RFUl9GcmFtZU1vZGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9QYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBJbnB1dCAqLwotICAgIE00RU5DT0RFUl9JbnB1dEZvcm1hdCAgICBJbnB1dEZvcm1hdDsgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0IChncmFiYmluZykgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBJbnB1dEZyYW1lV2lkdGg7ICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKGdyYWJiaW5nKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBJbnB1dEZyYW1lSGVpZ2h0OyAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAoZ3JhYmJpbmcpICovCi0KLSAgICAvKiBPdXRwdXQgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRFTkNPREVSX0JpdHJhdGUgICAgICAgIEJpdHJhdGU7ICAgICAgICAgICAgLyoqPCBCaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICAgICBGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCBGcmFtZXJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMsIE1QRUc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUpQRUcgLi4uICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9Qcm9maWxlOyAvKiogdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9MZXZlbDsgICAvKiogdmlkZW8gbGV2ZWwgKi8KLX0gTTRFTkNPREVSX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWR2YW5jZWQgc2V0dGluZ3MgYXZhaWxhYmxlIGZvciBNUEVHLTQgZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBJbnB1dCBwYXJhbWV0ZXJzIChncmFiYmVyIGNvdXBsZWQgd2l0aCBlbmNvZGVyKTogKi8KLSAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgSW5wdXRGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgSW5wdXRGcmFtZUhlaWdodDsgICAgICAgICAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAqLwotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBIMjYzIGFuZCBNUEVHLTQ6ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBGcmVlIHZhbHVlIGZvciB0aGUgYml0cmF0ZSAqLwotICAgIC8qKjwgRnJhbWVyYXRlIChpZiBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFIHVzZSB1aVJhdGVGYWN0b3IgJiB1aVRpbWVTY2FsZSBpbnN0ZWFkKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZVJhdGUgICAgICAgIEZyYW1lUmF0ZTsKLSAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdDogSDI2MyBvciBNUEVHNCAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvUHJvZmlsZTsgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb0xldmVsOyAgIC8qKiBvdXRwdXQgdmlkZW8gbGV2ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUhvcml6b250YWxTZWFyY2hSYW5nZTsgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnRpY2FsU2VhcmNoUmFuZ2U7ICAgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICAvKio8IFNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKDB4N0ZGRiBpLmUuIGxldCBlbmdpbmUgZGVjaWRlIHdoZW4gdG8gcHV0IGFuIEkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlTdGFydGluZ1F1YW50aXplclZhbHVlOwotICAgIC8qKjwgRW5hYmxlIGlmIHByaW9yaXR5IGlzIHF1YWxpdHksIERpc2FibGUgaWYgcHJpb3JpdHkgaXMgZnJhbWVyYXRlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSW50ZXJuYWxSZWd1bGF0aW9uOwotICAgIC8qKjwgUmF0aW8gYmV0d2VlbiB0aGUgZW5jb2RlciBmcmFtZSByYXRlIGFuZCB0aGUgYWN0dWFsIGZyYW1lIHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aVJhdGVGYWN0b3I7Ci0gICAgLyoqPCBJIGZyYW1lcyBwZXJpb2RpY2l0eSwgc2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpSVZvcFBlcmlvZDsKLSAgICAvKio8IE1vdGlvbiBlc3RpbWF0aW9uIFtkZWZhdWx0PTAgKGFsbCB0b29scyksIGRpc2FibGU9OCAobm8gdG9vbCldICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgdWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHM7Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5ncyBmb3IgTVBFRy00IG9ubHk6ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlUaW1lU2NhbGU7ICAgICAgICAgICAgICAgIC8qKjwgRnJlZSB2YWx1ZSBmb3IgdGhlIHRpbWVzY2FsZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkVycm9yUmVzaWxpZW5jZTsgICAgICAgICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAqLwotICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAoaWYgZW5hYmxlZCwgYkVycm9yUmVzaWxpZW5jZSBzaG91bGQgYmUgZW5hYmxlZCB0b28hKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkRhdGFQYXJ0aXRpb25pbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkFjUHJlZGljdGlvbjsgICAgICAgICAgIC8qKjwgQUMgcHJlZGljdGlvbiBbZGVmYXVsdD0xLCBkaXNhYmxlPTBdICovCi0KLX0gTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nIHN0aWxsCi0gKiAgICAgICAgICAgIHBpY3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgUXVhbGl0eTsgICAgICAgICAgICAvKio8IEJpdHJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIElucHV0Rm9ybWF0OyAgICAgICAgLyoqPCBZVVYgNDIwIG9yIDQyMiAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzLCBNUEVHNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KUEVHIC4uLiAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFByZVByb2Nlc3NOZWVkZWQ7ICAgIC8qKjwgSXMgdGhlIGNhbGwgdG8gdGhlIFZQUCBpcyBuZWNlc3NhcnkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIEVuY29kaW5nUGVyU3RyaXBlczsgICAgLyoqPCBJcyBlbmNvZGluZyBwZXIgc3RyaXBlcyAqLwotCi19IE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgdGhlIHNlcXVlbmNlIGhlYWRlciBpcyBwdXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwQnVmOyAgICAgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YSAqLwotCi19IE00RU5DT0RFUl9IZWFkZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICBNNEVOQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKjwgc2V0IHRoZSBmcmFnbWVudCBzaXplLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfVUludDMyIHR5cGUgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX1ZpZGVvRnJhZ21lbnRTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDAxKSwKLQotICAgIC8qKjwgc2V0IHRoZSBzdGFiaWxpemF0aW9uIGZpbHRlcmluZywgb3B0aW9uIHZhbHVlIGlzIE00RU5DT0RFUl9TdGFiTW9kZSB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbWFnZVN0YWJpbGl6YXRpb24gICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMiksCi0KLSAgICAvKio8IHByZXZlbnQgd3JpdHRpbmcgb2YgYW55IEFVLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfQm9vbCB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbnN0YW50U3RvcCAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMyksCi0KLSAgICAvKio8IGdldCB0aGUgRFNJIChlbmNvZGVyIGhlYWRlcikgZ2VuZXJhdGVkIGJ5IHRoZSBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA0KSwKLS8qKyBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNSksCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9IMjY0UHJvY2Vzc05BTFVDb250ZXh0ICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA2KQotLyotQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLX0gTTRFTkNPREVSX09wdGlvbklEOwotCi0vKisgQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QpKE00T1NBX1ZvaWQqYWluc3RhbmNlLE00T1NBX1VJbnQ4KiBpbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSk7Ci0vLyotIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi0KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRFTkNPREVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfaW5pdCkgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX29wZW4pICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFBhcmFtcyAgICAgLyogQ2FuIGJlIE00RU5DT0RFUl9QYXJhbXMsIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtcyAqLwotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9zdGFydCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc3RvcCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfcGF1c2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3Jlc3VtZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfY2xvc2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2NsZWFudXApIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9lbmNvZGUpICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5QbGFuZSwKLSAgICAgICAgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfZ2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX000RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEVOQ09ERVJfaW5pdCogICAgICAgICAgICAgICAgcEZjdEluaXQ7Ci0gICAgTTRFTkNPREVSX29wZW4qICAgICAgICAgICAgICAgIHBGY3RPcGVuOwotCi0gICAgTTRFTkNPREVSX3N0YXJ0KiAgICAgICAgICAgIHBGY3RTdGFydDsgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0gICAgTTRFTkNPREVSX3N0b3AqICAgICAgICAgICAgICAgIHBGY3RTdG9wOyAgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfcGF1c2UqICAgICAgICAgICAgcEZjdFBhdXNlOyAgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLSAgICBNNEVOQ09ERVJfcmVzdW1lKiAgICAgICAgICAgIHBGY3RSZXN1bWU7ICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfY2xvc2UqICAgICAgICAgICAgcEZjdENsb3NlOwotICAgIE00RU5DT0RFUl9jbGVhbnVwKiAgICAgICAgICAgIHBGY3RDbGVhbnVwOwotCi0gICAgTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSogICAgIHBGY3RSZWd1bEJpdFJhdGU7Ci0gICAgTTRFTkNPREVSX2VuY29kZSogICAgICAgICAgICBwRmN0RW5jb2RlOyAgICAgICAgIC8qIFN0YW5kYWxvbmUgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX3NldE9wdGlvbiogICAgICAgIHBGY3RTZXRPcHRpb247Ci0gICAgTTRFTkNPREVSX2dldE9wdGlvbiogICAgICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEVOQ09ERVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MDhmYzguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRPU0FfQ29yZUlELmgKLSAqIEBicmllZiAgZGVmaW5lcyB0aGUgdW5pcXVlcyBjb21wb25lbnQgaWRlbnRpZmllcnMgdXNlZCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKLSAqICAgICAgICAgYW5kIG9wdGlvbklEIG1lY2hhbmlzbQotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000T1NBX0NPUkVJRF9IX18KLSNkZWZpbmUgX19NNE9TQV9DT1JFSURfSF9fCi0KLS8qIENvcmVJZCBhcmUgZGVmaW5lZCBvbiAxNCBiaXRzICovCi0vKiB3ZSBzdGFydCBmcm9tIDB4MDEwMCwgbG93ZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igb3NhbCBjb3JlIGNvbXBvbmVudHMgKi8KLQotLyogcmVhZGVyIHNoZWxscyovCi0jZGVmaW5lIE00UkVBREVSX0NPTU1PTiAgICAgMHgwMTAwCi0jZGVmaW5lIE00UkVBREVSX0FWSSAgICAgICAgMHgwMTAxCi0jZGVmaW5lIE00UkVBREVSX0FNUiAgICAgICAgMHgwMTAyCi0jZGVmaW5lIE00UkVBREVSXzNHUCAgICAgICAgMHgwMTAzCi0jZGVmaW5lIE00UkVBREVSX05FVCAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIE00UkVBREVSXzNHUF9IVFRQICAgMHgwMTA1Ci0jZGVmaW5lIE00UkVBREVSX01QMyAgICAgICAgMHgwMTA2Ci0jZGVmaW5lIE00UkVBREVSX1dBViAgICAgICAgMHgwMTA3Ci0jZGVmaW5lIE00UkVBREVSX01JREkgICAgICAgMHgwMTA4Ci0jZGVmaW5lIE00UkVBREVSX0FTRiAgICAgICAgMHgwMTA5Ci0jZGVmaW5lIE00UkVBREVSX1JFQUwgICAgICAgIDB4MDEwQQotI2RlZmluZSBNNFJFQURFUl9BQUMgICAgICAgIDB4MDEwQgotI2RlZmluZSBNNFJFQURFUl9GTEVYICAgICAgICAweDAxMEMKLSNkZWZpbmUgTTRSRUFERVJfQkJBICAgICAgICAweDAxMEQKLSNkZWZpbmUgTTRSRUFERVJfU1lOVEhFU0lTX0FVRElPICAgIDB4MDEwRQotI2RlZmluZSBNNFJFQURFUl9KUEVHICAgICAgICAweDAxMEYKLQotCi0vKiB3cml0ZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRXUklURVJfQ09NTU9OICAgICAweDAxMTAKLSNkZWZpbmUgTTRXUklURVJfQVZJICAgICAgICAweDAxMTEKLSNkZWZpbmUgTTRXUklURVJfQU1SICAgICAgICAweDAxMTIKLSNkZWZpbmUgTTRXUklURVJfM0dQICAgICAgICAweDAxMTMKLSNkZWZpbmUgTTRXUklURVJfSlBFRyAgICAgICAgMHgwMTE2Ci0jZGVmaW5lIE00V1JJVEVSX01QMyAgICAgICAgMHgwMTE3Ci0KLS8qIGRlY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00REVDT0RFUl9DT01NT04gICAgMHgwMTIwCi0jZGVmaW5lIE00REVDT0RFUl9KUEVHICAgICAgMHgwMTIxCi0jZGVmaW5lIE00REVDT0RFUl9NUEVHNCAgICAgMHgwMTIyCi0jZGVmaW5lIE00REVDT0RFUl9BVURJTyAgICAgMHgwMTIzCi0jZGVmaW5lIE00REVDT0RFUl9BVkMgICAgICAgMHgwMTI0Ci0jZGVmaW5lIE00REVDT0RFUl9NSURJICAgICAgMHgwMTI1Ci0jZGVmaW5lIE00REVDT0RFUl9XTUEgICAgICAgIDB4MDEyNgotI2RlZmluZSBNNERFQ09ERVJfV01WICAgICAgICAweDAxMjcKLSNkZWZpbmUgTTRERUNPREVSX1JNViAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIE00REVDT0RFUl9STUEgICAgICAgIDB4MDEyOQotI2RlZmluZSBNNERFQ09ERVJfQUFDICAgICAgIDB4MDEyQQotI2RlZmluZSBNNERFQ09ERVJfQkVBVEJSRVcgIDB4MDEyQgotI2RlZmluZSBNNERFQ09ERVJfRVhURVJOQUwgIDB4MDEyQwotCi0vKiBlbmNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNEVOQ09ERVJfQ09NTU9OICAgIDB4MDEzMAotI2RlZmluZSBNNEVOQ09ERVJfSlBFRyAgICAgIDB4MDEzMQotI2RlZmluZSBNNEVOQ09ERVJfTVBFRzQgICAgIDB4MDEzMgotI2RlZmluZSBNNEVOQ09ERVJfQVVESU8gICAgIDB4MDEzMwotI2RlZmluZSBNNEVOQ09ERVJfVklEX05VTEwgIDB4MDEzNAotI2RlZmluZSBNNEVOQ09ERVJfTUpQRUcgICAgICAgIDB4MDEzNQotI2RlZmluZSBNNEVOQ09ERVJfTVAzICAgICAgICAweDAxMzYKLSNkZWZpbmUgTTRFTkNPREVSX0gyNjQgICAgICAgIDB4MDEzNwotI2RlZmluZSBNNEVOQ09ERVJfQUFDICAgICAgICAweDAxMzgKLSNkZWZpbmUgTTRFTkNPREVSX0FNUk5CICAgICAgICAweDAxMzkKLSNkZWZpbmUgTTRFTkNPREVSX0FVRF9OVUxMICAweDAxM0EKLSNkZWZpbmUgTTRFTkNPREVSX0VYVEVSTkFMICAweDAxM0IKLQotLyogY29yZXMgKi8KLSNkZWZpbmUgTTRKUEdfREVDT0RFUiAgICAgICAweDAxNDAKLSNkZWZpbmUgTTRKUEdfRU5DT0RFUiAgICAgICAweDAxNDEKLQotI2RlZmluZSBNNE1QNF9ERUNPREVSICAgICAgIDB4MDE0MgotI2RlZmluZSBNNE1QNF9FTkNPREVSICAgICAgIDB4MDE0MwotCi0jZGVmaW5lIE00QVZJX0NPTU1PTiAgICAgICAgMHgwMTQ0Ci0jZGVmaW5lIE00QVZJX1JFQURFUiAgICAgICAgMHgwMTQ1Ci0jZGVmaW5lIE00QVZJX1dSSVRFUiAgICAgICAgMHgwMTQ2Ci0KLSNkZWZpbmUgTTRIVFRQX0VOR0lORSAgICAgICAweDAxNDcKLQotI2RlZmluZSBNNE9TQV9UTVBGSUxFICAgICAgIDB4MDE0OAotI2RlZmluZSBNNFRPT0xfVElNRVIgICAgICAgIDB4MDE0OQotCi0jZGVmaW5lIE00QU1SX1JFQURFUiAgICAgICAgMHgwMTRBCi0KLSNkZWZpbmUgTTRNUDNfUkVBREVSICAgICAgICAweDAxNEIKLQotI2RlZmluZSBNNFdBVl9SRUFERVIgICAgICAgIDB4MDE0QwotI2RlZmluZSBNNFdBVl9XUklURVIgICAgICAgIDB4MDE0RAotI2RlZmluZSBNNFdBVl9DT01NT04gICAgICAgIDB4MDE0RQotCi0jZGVmaW5lIE00QURUU19SRUFERVIgICAgICAgIDB4MDE0RgotI2RlZmluZSBNNEFESUZfUkVBREVSICAgICAgICAweDAxNkEKLQotI2RlZmluZSBNNFNQUyAgICAgICAgICAgICAgIDB4MDE1MAotI2RlZmluZSBNNEVYSUZfREVDT0RFUiAgICAgIDB4MDE1MQotI2RlZmluZSBNNEVYSUZfRU5DT0RFUiAgICAgIDB4MDE1MgotI2RlZmluZSBNNEdJRl9ERUNPREVSICAgICAgIDB4MDE1MwotI2RlZmluZSBNNEdJRl9FTkNPREVSICAgICAgIDB4MDE1NAotI2RlZmluZSBNNFBOR19ERUNPREVSICAgICAgIDB4MDE1NQotI2RlZmluZSBNNFBOR19FTkNPREVSICAgICAgIDB4MDE1NgotI2RlZmluZSBNNFdCTVBfREVDT0RFUiAgICAgIDB4MDE1NwotI2RlZmluZSBNNFdCTVBfRU5DT0RFUiAgICAgIDB4MDE1OAotCi0jZGVmaW5lIE00QU1SX1dSSVRFUiAgICAgICAgMHgwMTU5ICAgIC8qKjwgbm8gcm9vbSB0byBwdXQgaXQgYWxvbmcgTTRBTVJfUkVBREVSICovCi0KLQotI2RlZmluZSBNNEFWQ19ERUNPREVSICAgICAgIDB4MDE1QQotI2RlZmluZSBNNEFWQ19FTkNPREVSICAgICAgIDB4MDE1QgotCi0jZGVmaW5lIE00QVNGX1JFQURFUiAgICAgICAgMHgwMTVDCi0jZGVmaW5lIE00V01EUk1fQUdFTlQgICAgICAgIDB4MDE1RAotI2RlZmluZSBNNE1JRElfUkVBREVSICAgICAgICAweDAxNjIgICAgLyoqPCBubyByb29tIGJlZm9yZSB0aGUgcHJlc2VudGVycyAqLwotI2RlZmluZSBNNFJNX1JFQURFUiAgICAgICAgIDB4MTYzCi0jZGVmaW5lIE00Uk1WX0RFQ09ERVIgICAgICAgIDB4MTY0Ci0jZGVmaW5lIE00Uk1BX0RFQ09ERVIgICAgICAgIDB4MTY1Ci0KLSNkZWZpbmUgTTRUT09MX1hNTCAgICAgICAgICAgIDB4MDE2NgotI2RlZmluZSBNNFRPT0xfRUZSICAgICAgICAgICAgMHgwMTY3ICAgIC8qKjwgRGVjcnlwdGlvbiBtb2R1bGUgZm9yIFZpZGVvIEFydGlzdCAqLwotI2RlZmluZSBNNElBTF9GVE4gICAgICAgICAgICAweDAxNjggICAgLyogRlROIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJQUwgKi8KLSNkZWZpbmUgTTRGVE4gICAgICAgICAgICAgICAgMHgwMTY5ICAgIC8qIEZUTiBsaWJyYXJ5ICovCi0KLS8qIHByZXNlbnRlciAqLwotI2RlZmluZSBNNFBSRVNFTlRFUl9BVURJTyAgIDB4MDE2MAotI2RlZmluZSBNNFBSRVNFTlRFUl9WSURFTyAgIDB4MDE2MQotCi0vKiBoaWdoIGxldmVsIGludGVyZmFjZXMgKHZwcywgZXRjLi4pKi8KLSNkZWZpbmUgTTRWUFMgICAgICAgICAgICAgICAweDAxNzAKLSNkZWZpbmUgTTRWVFMgICAgICAgICAgICAgICAweDAxNzEKLSNkZWZpbmUgTTRWWFMgICAgICAgICAgICAgICAweDAxNzIKLSNkZWZpbmUgTTRDQUxMQkFDSyAgICAgICAgICAweDAxNzMKLSNkZWZpbmUgTTRWRVMgICAgICAgICAgICAgICAweDAxNzQKLSNkZWZpbmUgTTRQUkVQUk9DRVNTX1ZJREVPICAweDAxNzUKLSNkZWZpbmUgTTRHUkFCX0FVRElPICAgICAgICAweDAxNzYKLSNkZWZpbmUgTTRHUkFCX1ZJREVPICAgICAgICAweDAxNzcKLSNkZWZpbmUgTTRWU1NBVkkgICAgICAgICAgICAweDAxNzgKLSNkZWZpbmUgTTRWU1MzR1BQICAgICAgICAgICAweDAxNzkKLSNkZWZpbmUgTTRQVE8zR1BQICAgICAgICAgICAweDAxN0EKLSNkZWZpbmUgTTRQVlhfUEFSU0VSICAgICAgICAweDAxN0IKLSNkZWZpbmUgTTRWQ1MgICAgICAgICAgICAgICAgMHgwMTdDCi0jZGVmaW5lIE00TUNTICAgICAgICAgICAgICAgIDB4MDE3RAotI2RlZmluZSBNNE1OTUMgICAgICAgICAgICAgICAgMHgwMTgwICAgIC8qKjwgbW5tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTTRUVEVYVF9QQVJTRVIgICAgICAweDAxODEgICAgLyoqPCB0aW1lZCB0ZXh0ICovCi0jZGVmaW5lIE00TU0gICAgICAgICAgICAgICAgMHgwMTgyICAgIC8qKjwgTXVzaWMgbWFuYWdlciAqLwotI2RlZmluZSBNNE1EUCAgICAgICAgICAgICAgICAweDAxODMgICAgLyoqPCBNZXRhZGF0YSBwYXJzZXIgKi8KLSNkZWZpbmUgTTRNTVNRTENPUkUgICAgICAgICAgICAweDAxODQKLSNkZWZpbmUgTTRWUFNJTCAgICAgICAgICAgICAgICAweDAxODUKLSNkZWZpbmUgTTRGSUxFSUwgICAgICAgICAgICAweDAxODYgLyogSUwgZmlsZSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgTTRNVSAgICAgICAgICAgICAgICAweDAxODcKLSNkZWZpbmUgTTRWRUUgICAgICAgICAgICAgICAgMHgwMTg4ICAvKio8IFZpZGVvIGVmZmVjdCBlbmdpbmUgKi8KLSNkZWZpbmUgTTRWQSAgICAgICAgICAgICAgICAweDAxODkgLyogVmlkZW9BcnRpc3QgKi8KLSNkZWZpbmUgTTRKVFMgICAgICAgICAgICAgICAgMHgwMThBCi0jZGVmaW5lIE00SlRTSUwgICAgICAgICAgICAgICAgMHgwMThCCi0jZGVmaW5lIE00QUlSICAgICAgICAgICAgICAgIDB4MDE4QyAgLyoqPCBBSVIgKi8KLSNkZWZpbmUgTTRTUEUgICAgICAgICAgICAgICAgMHgwMThEICAvKio8IFN0aWxsIHBpY3R1cmUgZWRpdG9yICovCi0jZGVmaW5lIE00VlMgICAgICAgICAgICAgICAgMHgwMThFICAgIC8qKjwgVmlkZW8gU3R1ZGlvICh4VlNTKSAqLwotI2RlZmluZSBNNFZFU0lMICAgICAgICAgICAgICAgIDB4MDE4RiAgICAvKio8IFZFUyBpbCAqLwotI2RlZmluZSBNNElEMyAgICAgICAgICAgICAgICAweDAxOTAgICAgLyoqPCBJRDMgVGFnIE1vZHVsZSAqLwotI2RlZmluZSBNNFNDICAgICAgICAgICAgICAgIDB4MDE5MSAgICAvKio8IE1lZGlhIFNjYW5uZXIgKi8KLSNkZWZpbmUgTTRURyAgICAgICAgICAgICAgICAweDAxOTIgIC8qKjwgVGh1bWJuYWlsIEdlbmVyYXRvciovCi0jZGVmaW5lIE00VFMgICAgICAgICAgICAgICAgMHgwMTkzICAgIC8qKjwgVGh1bWJuYWlsIHN0b3JhZ2UgKi8KLSNkZWZpbmUgTTRNQiAgICAgICAgICAgICAgICAweDAxOTQgICAgLyoqPCBNZWRpYSBicm93c2VyICovCi0KLS8qIGhpZ2ggbGV2ZWwgYXBwbGljYXRpb24gKHRlc3Qgb3IgY2xpZW50IGFwcCkgKi8KLSNkZWZpbmUgTTRBUFBMSSAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgTTRWQV9BUFBMSSAgICAgICAgICAgIDB4MDIwMSAgICAvKio8IFZpZGVvIEFydGlzdCB0ZXN0IGFwcGxpY2F0aW9uICovCi0KLS8qIGV4dGVybmFsIGNvbXBvbmVudHMgKEhXIHZpZGVvIGNvZGVjcywgZXRjLikgKi8KLSNkZWZpbmUgTTRWRF9FWFRFUk5BTCAgICAgICAgMHgwMzAwCi0jZGVmaW5lIE00VkVfRVhURVJOQUwgICAgICAgIDB4MDMwMQotCi0KLS8qIHByaW9yaXR5IHRvIGNvbWJpbmUgd2l0aCBtb2R1bGUgaWRzICovCi0jZGVmaW5lIE00SElHSF9QUklPUklUWSAgICAgMHhDMDAwCi0jZGVmaW5lIE00TUVESVVNX1BSSU9SSVRZICAgMHg4MDAwCi0jZGVmaW5lIE00TE9XX1BSSU9SSVRZICAgICAgMHg0MDAwCi0jZGVmaW5lIE00REVGQVVMVF9QUklPUklUWSAgMHgwMDAwCi0KLQotI2VuZGlmIC8qX19NNE9TQV9DT1JFSURfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhZmM1MGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRXQVZfV2F2UmVhZGVyLmgKLSAqIEBicmllZiAgIFdBViBSZWFkZXIgZGVjbGFyYXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgb2YgdGhlIFdBViByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PX1NQQUNFX0FWQUlMICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UENNQ19XQVJfRU5EX09GX1NUUkVBTSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V0FWX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V0FWQ19EZWNvZGVyU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGVjb2RlciBTcGVjaWZpYyBpbmZvcm1hdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBXQVYgcmVhZGVyIHRvIHN0b3JlIGFsbAotICogICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mb3JtYXRpb25zOgotICogICAgICAgICAgICAgIC0gU2FtcGxlIEZyZXF1ZW5jeQotICogICAgICAgICAgICAgIC0gQXZlcmFnZSBCeXRlcyBwZXIgc2Vjb25kCi0gKiAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgKDEgb3IgMikKLSAqICAgICAgICAgICAgICAtIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgKDggb3IgMTYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBTYW1wbGVGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgIEF2Z0J5dGVzUGVyU2VjOwotICAgIE00T1NBX1VJbnQzMiAgICBEYXRhTGVuZ3RoOwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOwotICAgIE00T1NBX1VJbnQxNiAgICBCaXRzUGVyU2FtcGxlOwotfSBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFdBVlJfU3RhdGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIFN0YXRlcwotICogQG5vdGUgICAgVGhlIHN0YXRlIGF1dG9tYXRvbiBpcyBkb2N1bWVudGVkIHNlcGFyYXRlbHkKLSAqICAgICAgICAgIGNvbnN1bHQgdGhlIGRlc2lnbiBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFBDTVJfa0luaXQgICAgPSAweDAwMDAsCi0gICAgTTRQQ01SX2tPcGVuaW5nID0gMHgwMTAwLAotICAgIE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgPSAweDAxMDEsCi0gICAgTTRQQ01SX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00UENNUl9rUmVhZGluZ19uZXh0QVUgID0gMHgwMjAxLAotICAgIE00UENNUl9rQ2xvc2VkICA9IDB4MDMwMAotfSBNNFBDTVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRXQVZSX09wdGlvbklECi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBvcHRpb25zCi0gKiBAbm90ZSAgICBPbmx5IG9uZSBvcHRpb24gaXMgYXZhaWxhYmxlOgotICogICAgICAgICAgLSBNNFdBVlJfa1BDTWJsb2NrU2l6ZTogc2V0cyB0aGUgc2l6ZSBvZiB0aGUgUENNIGJsb2NrIHRvIHJlYWQKLSAqICAgICAgICAgICAgZnJvbSBXQVYgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRQQ01SX2tQQ01ibG9ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00V0FWX1JFQURFUiwgMHgwMSkKLX0gTTRQQ01SX09wdGlvbklEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdBVlJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBXQVYgUmVhZGVyIGNhbGxzIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjSW5mbzsvKio8IFBvaW50ZXIgdG8gdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgY29udGFpbmVkIGluIHBTdHJlYW1EZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHVzZWQgdG8gZnJlZS4uLikgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgbV9wRmlsZVJlYWRGdW5jOy8qKjwgVGhlIE9TQUwgc2V0IG9mIHBvaW50ZXIgdG8gZnVuY3Rpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIG1hbmFnZW1lbnQgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgbV9maWxlQ29udGV4dDsgIC8qKjwgVGhlIGNvbnRleHQgbmVlZGVkIGJ5IE9TQUwgdG8gbWFuYWdlIEZpbGUgKi8KLSAgICBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyAgbV9kZWNvZGVyQ29uZmlnOy8qKjwgU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgZGVjb2RlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgLyoqPCBzdGF0ZSBvZiB0aGUgd2F2IHJlYWRlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX21pY3JvU3RhdGU7ICAgLyoqPCBzdGF0ZSBvZiB0aGUgcmVhZCB3YXYgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fYmxvY2tTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHJlYWQgYmxvY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9vZmZzZXQ7ICAgICAgIC8qKjwgT2Zmc2V0IG9mIHRoZSBQQ00gcmVhZCAoaS5lIG1fb2Zmc2V0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGhvdXQgd2F2IGhlYWRlcikgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgbV9wQXVCdWZmZXI7ICAgIC8qKjwgUmUtdXNlZCBidWZmZXIgZm9yIEFVIGNvbnRlbnQgc3RvcmFnZSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgICBtX2RhdGFTdGFydE9mZnNldDsvKio8IG9mZnNldCBvZiB0aGUgcGNtIGRhdGEgYmVnaW5uaW5nIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlICovCi19IE00UENNUl9Db250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBQcm90b3R5cGVzIG9mIGFsbCBXQVYgcmVhZGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pOwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKTsKLU00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpOwotTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLU00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci1NNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKTsKLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSk7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyYTVhMDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UkVBREVSXzNncENvbS5oCi0gKiBAYnJpZWYgICAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIDNncCByZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2VuZXJpYyBzaGVsbCBpbnRlcmZhY2UgcmV0cmlldmluZyBmdW5jdGlvbgotICogICAgICAgICAgICBvZiB0aGUgM0dQIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000UkVBREVSXzNHUENPTV9IX18KLSNkZWZpbmUgX19NNFJFQURFUl8zR1BDT01fSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBFcnJvcjogRnVuY3Rpb24gTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KLSAqLwotI2RlZmluZSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSXzNHUCwgMHgwMDAwMDEpCi0KLS8qKgotICogRXJyb3I6IE5vIHZpZGVvIHN0cmVhbSBIMjYzIGluIGZpbGUuCi0gKi8KLSNkZWZpbmUgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAyKQotCi0vKioKLSAqIFRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIHNlZW1zIHRvIGJlIGludmFsaWQgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhWSURFT1NUUkVBTSAgNQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYQVVESU9TVFJFQU0gIDUKLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWFRFWFRTVFJFQU0gICA1Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBtX3BGRkNvbnRleHQ7ICAgIC8qKjwgY29yZSBmaWxlIGZvcm1hdCBjb250ZXh0ICovCi0KLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fQXVkaW9TdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhBVURJT1NUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BBdWRpb1N0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLQotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9WaWRlb1N0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWFZJREVPU1RSRUFNXTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fcFZpZGVvU3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotCi0jaWZkZWYgTTRWUFNfU1VQUE9SVF9UVEVYVAotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9UZXh0U3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYVEVYVFNUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BUZXh0U3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotfSBNNFJFQURFUl9Db20zR1BfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfM0dQX0J1ZmZlciAoYnV0IG5vdGhpbmcgc3BlY2lmaWMgdG8gM0dQLCBub3IgdG8gYSByZWFkZXIgISkKLSAqIEBicmllZiAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4Y2hhbmdlIGRhdGEgKHNob3VsZCBiZSBpbiBPU0FMKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgICAgLyoqPCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgZGF0YUFkZHJlc3M7ICAgIC8qKjwgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAqLwotfSBNNFJFQURFUl8zR1BfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00UkVBREVSXzNHUF9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSByZWFkZXIgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgM0dQIGZvcm1hdC4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgM0dQIHJlYWRlciB2aWEgTTRSRUFERVJfM0dQX2dldE9wdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvIGZvciBIMjYzLAotICAgICAqIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGEgcG9pbnRlciB0byBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgYWxsb2NhdGVkIGJ5IGNhbGxlciAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfSDI2M1Byb3BlcnRpZXMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFB1cnBsZSBMYWJzIGRybSBpbmZvcm1hdGlvbiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDAyKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgRmFzdCBvcGVuIG1vZGUgKE9ubHkgdGhlIGZpcnN0IEFVIG9mIGVhY2ggc3RyZWFtIHdpbGwgYmUgcGFyc2VkIC0+IGxlc3MgQ1BVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyBSQU0pLiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDAzKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQXVkaW8gb25seSBtb2RlICh0aGUgdmlkZW8gc3RyZWFtIHdvbid0IGJlIG9wZW5lZCkgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0F1ZGlvT25seSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwNCksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFZpZGVvIG9ubHkgbW9kZSAodGhlIGF1ZGlvIHN0cmVhbSB3b24ndCBiZSBvcGVuZWQpICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHkgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDUpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXh0IHZpZGVvIENUUyAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfZ2V0TmV4dFZpZGVvQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDYpCi0KLX0gTTRSRUFERVJfM0dQX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gYWJvdXQgSDI2MyBzdHJlYW0gcmVhZCBmcm9tIHRoZSAzR1AgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgdGhlIHByb2ZpbGUgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlQcm9maWxlOwotICAgIC8qKjwgdGhlIGxldmVsIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbCBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpTGV2ZWw7Ci0KLX0gTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSAzZ3AgZmlsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBQb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChPVVQpICAgIFBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBObyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByZXBhcmUgdGhlICBhY2Nlc3MgdW5pdCAoQVUpCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9Db20zR1BfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW5zIHVwIHRoZSBzdHJlYW0gaGFuZGxlcgotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSByZWFkZXIgc2hlbGwKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOL09VVCkgU3RyZWFtIGhhbmRsZXIKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2NsZWFuVXBIYW5kbGVyKE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRSRUFERVJfM0dQQ09NX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmU3Zjk3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9BbXIuaAotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgYW1yIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfQU1SX0hfXwotI2RlZmluZSBfX000UkVBREVSX0FNUl9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfQU1SX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4NjNhN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQ29tbW9uLmgKLSAqIEBicmllZiAgU2hlbGwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IHJlYWRlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotCi0vKiBFUlJPUlMgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLQotLyogV0FSTklOR1MgKi8KLSNkZWZpbmUgTTRXQVJfUkVBREVSX05PX01FVEFEQVRBICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLSNkZWZpbmUgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMikKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBtZWRpYSByZWFkZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICBtZWRpYSByZWFkZXIgaW50ZXJmYWNlLiBFYWNoIHJlYWRlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgV2hlbiBhIHJlYWRlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZAotICogICAgICAgICAgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93biBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUFAgICAgICAgICAgICA9IDAsICAgIC8qKjwgM0dQUCBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVZJICAgICAgICAgICAgPSAxLCAgICAvKio8IEFWSSBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQU1SICAgICAgICAgICAgPSAyLCAgICAvKio8IEFNUiBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlTVAzICAgICAgICAgICAgPSAzLCAgICAvKio8IE1QMyBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUlRTUCAgICAgICAgICAgID0gNCwgICAgLyoqPCBSVFNQIG5ldHdvcmsgYWNjZXNzZWQgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BQSFRUUCAgICAgICAgPSA1LCAgICAvKio8IFByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVQVkhUVFAgICAgICAgID0gNiwgICAgLyoqPCBQYWNrZXQgVmlkZW8gSFRUUCBwcm9wcmlldGFyeSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVdBViAgICAgICAgICAgID0gNywgICAgLyoqPCBXQVYgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUEVYVEhUVFAgICAgPSA4LCAgICAvKio8IEFuIGV4dGVybmFsIHByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBQUMgICAgICAgICAgICA9IDksICAgIC8qKjwgQURUUyBhbmQgQURJRiBBQUMgc3VwcG9ydCAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVSRUFMICAgICAgICAgICAgPSAxMCwgICAgLyoqPCBSRUFMIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVNGICAgICAgICAgICAgPSAxMSwgICAgLyoqPCBBU0YgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVGTEVYVElNRSAgICAgICAgPSAxMiwgICAgLyoqPCBGbGV4VGltZSBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUJCQSAgICAgICAgICAgID0gMTMsICAgIC8qKjwgQmVhdGJyZXcgYXVkaW8gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVTWU5USEFVRElPICAgID0gMTQsICAgIC8qKjwgU3ludGhlc2lzIGF1ZGlvIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUENNICAgICAgICAgICAgPSAxNSwgICAgLyoqPCBQQ00gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVKUEVHICAgICAgICAgICAgPSAxNiwgICAgLyoqPCBKUEVHIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlR0lGICAgICAgICAgICAgPSAxNywgICAgLyoqPCBHSUYgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBRElGICAgICAgICAgICAgPSAxOCwgICAgLyoqPCBBQUMtQURUUyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFEVFMgICAgICAgICAgICA9IDE5LCAgICAvKio8IEFBQy1BRFRTIE1lZGlhIHR5cGUgKi8KLQotICAgIE00UkVBREVSX2tNZWRpYVR5cGVfTkIgIC8qIG51bWJlciBvZiByZWFkZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00UkVBREVSX01lZGlhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSBmYW1pbHkgb2YgYSBzdHJlYW0KLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSB3aGF0IGtpbmQgb2Ygc3RyZWFtCi0gKiAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgdmlhIGdldE5leHRTdHJlYW0oKSBmdW5jdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duICAgPSAtMSwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyAgICAgPSAwLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvICAgICA9IDEsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VGV4dCAgICAgID0gMgotfSBNNFJFQURFUl9NZWRpYUZhbWlseTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcmVhZGVyIG9wdGlvbnMKLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBhIHJlYWRlciB2aWEgTTRSRUFERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIG1vdmllIChpbiBtcykKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAwKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSByZWFkZXIKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAxKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgY29weXJpZ2h0IGZyb20gdGhlIG1lZGlhIChpZiBwcmVzZW50KQotICAgIChjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIDNHUFAgb25seTogY29weXJpZ2h0IGdldCBmcm9tIHRoZSBjcHJ0IGF0b20gaW4gdGhlIHVkdGEgaWYgcHJlc2VudCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db3B5cmlnaHQ9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAyKSwKLQotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucyB0byB0aGUgcmVhZGVyICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAzKSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVXcml0ZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCA0KSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfTmV0RnVuY3Rpb24qKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYU5ldEZjdHNQdHIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNSksCi0KLSAgICAvKioKLSAgICBDcmVhdGlvbiB0aW1lIGluIHNlYy4gc2luY2UgbWlkbmlnaHQsIEphbi4gMSwgMTk3MCAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAoYXZhaWxhYmxlIG9ubHkgZm9yIDNHUFAgY29udGVudCwgaW5jbHVkaW5nIFBHRCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNiksCi0KLSAgICAvKioKLSAgICBCaXRyYXRlIGluIGJwcyAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRG91YmxlKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDcpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YxIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDgpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YyIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDkpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIEFjY2VzcyBVbml0IGluIHRoZSBBdWRpbyBzdHJlYW0gKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZBdWRpb0F1ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4QSksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgZnJhbWVzIHBlciBibG9jCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TmJmcmFtZVBlckJsb2MgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhCKSwKLQotICAgIC8qKgotICAgIEZsYWcgZm9yIHByb3RlY3Rpb24gcHJlc2VuY2UKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXRQcm90ZWN0UHJlc2VuY2UgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhDKSwKLQotICAgIC8qKgotICAgIFNldCBEUk0gQ29udGV4dAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldERSTUNvbnRleHQgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhEKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db250ZW50RGVzY3JpcHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhFKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9FeHRlbmRlZENvbnRlbnREZXNjcmlwdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweEYpLAotCi0gICAgLyoqCi0gICAgR2V0IEFzc2V0IDNncHAgRmllbGRzCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwQXNzZXRGaWVsZHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIG1heCBtZXRhZGF0YSBzaXplIHN1cHBvcnRlZCBpbiB0aGUgcmVhZGVyCi0gICAgT25seSByZWxldmFudCBpbiAzZ3AgcGFyc2VyIHRpbGwgbm93LCBidXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIHJlYWRlcnMKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NYXhNZXRhZGF0YVNpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl9DT01NT04sIDB4MTEpLAotCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTIpLAotICAgIC8qKgotICAgIEdldCAzZ3BwICdmdHlwJyBhdG9tCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMyksCi0KLQotICAgIC8qIHZhbHVlIGlzIE00T1NBX0Jvb2wqICovCi0gICAgLyogcmV0dXJuIHRoZSBkcm0gcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIGZpbGUqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9pc1Byb3RlY3RlZCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE0KSwKLQotICAgIC8qIHZhbHVlIGlzIGEgdm9pZCogKi8KLSAgICAvKiByZXR1cm4gdGhlIGFnZ3JlZ2F0ZSByaWdodHMgb2YgdGhlIGZpbGUqLwotICAgIC8qIFRoZSBidWZmZXIgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCBtdXN0IGJlIGJpZyBlbm91Z2gqLwotICAgIC8qIEJ5IGRlZmF1bHQsIHRoZSBzaXplIGZvciBXTURSTSBpcyA3NiBieXRlcyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9nZXRBZ2dyZWdhdGVSaWdodHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNSksCi0gICAgLyoqCi0gICAgR2V0IEFTRiBDb250ZW50IERlc2NyaXB0aW9uIE9iamVjdAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0V4dGVuZGVkQ29udGVudEVuY3J5cHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweDE2KSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgVmlkZW8gc3RyZWFtICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mVmlkZW9BdSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE3KSwKLQotICAgIC8qKgotICAgIENodW5rIG1vZGUgYWN0aXZhdGlvbiAgc2l6ZSBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0NodW5ja1NpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxOCksCi0KLSAgICAvKioKLSAgICBDaGVjayBpZiBBU0YgZmlsZSBjb250YWlucyB2aWRlbyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9oYXNWaWRlbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE5KSwKLQotICAgIC8qKgotICAgICBTZXQgc3BlY2lmaWMgcmVhZCBtb2RlIGZvciBSYW5kb20gQWNjZXNzIEpQRUcgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1JBTW9kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSX0NPTU1PTiwgMHgyMCksCi0KLSAgICAvKioKLSAgICBHZXQgVGh1bWJuYWlsIGJ1ZmZlciBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1RodW1ibmFpbCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIxKSwKLQotICAgIC8qKgotICAgIEdldCBGUERBVEEgYnVmZmVyIGluIGNhc2Ugb2YgSlBHIHJlYWRlciAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnRlBEYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjIpLAotCi0gICAgLyoqCi0gICAgR2V0IEpQRUcgaW5mbyAocHJvZ3Jlc3NpdmUsIHN1YnNhbXBsaW5nKSAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnSW5mbz0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjMpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotfSBNNFJFQURFUl9PcHRpb25JRDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQ29weVJpZ2h0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjb3B5UmlnaHQgZGVzY3JpcHRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBjb3B5UmlnaHQgb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAgICAgKGlmIHByZXNlbnQpIHZpYSB0aGUgZ2V0T3B0aW9uKCkgZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQ29weVJpZ2h0Ci17Ci0gICAgLyoqCi0gICAgUG9pbnRlciB0byBjb3B5cmlnaHQgZGF0YSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gICAgKi8KLSAgICBNNE9TQV9VSW50OCogICBtX3BDb3B5UmlnaHQ7Ci0KLSAgICAvKioKLSAgICBQb2ludGVyIHRvIGNvcHlyaWdodCBzaXplLiBUaGUgcENvcHlSaWdodFNpemUgbXVzdAotICAgIGJlIEluaXRpYWxpemVkIHdpdGggdGhlIHNpemUgYXZhaWxhYmxlIGluIHRoZSBwQ29weVJpZ2h0IGJ1ZmZlcgotICAgICovCi0gICAgTTRPU0FfVUludDMyICAgbV91aUNvcHlSaWdodFNpemU7Ci0KLX0gTTRSRUFERVJfQ29weVJpZ2h0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfU3RyZWFtRGF0YU9wdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgZ2VuZXJpYyBzdHJlYW0gZGF0YSBvcHRpb24KLSAqIEBub3RlICAgICAgICBJdCBpcyB1c2VkIGlzIHVzZWQgdG8gc2V0IG9yIGdldCBhIHN0cmVhbSBzcGVjaWZpYyBkYXRhIGRlZmluZWQKLSAqICAgICAgICAgICAgICBieSBhIHJlbGV2YW50IHJlYWRlciBvcHRpb24gSUQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX1N0cmVhbURhdGFPcHRpb24KLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgbV9wU3RyZWFtSGFuZGxlcjsgLyoqPCBpZGVudGlmaWVyIG9mIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgbV9wT3B0aW9uVmFsdWU7ICAgLyoqPCB2YWx1ZSBvZiB0aGUgZGF0YSBvcHRpb24gdG8gZ2V0IG9yIHRvIHNldCAqLwotCi19IE00UkVBREVSX1N0cmVhbURhdGFPcHRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRfRW5jb2RpbmdGb3JtYXQKLSAqIEBicmllZiAgICAgICAgVGV4dCBlbmNvZGluZyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vLyB0eXBlZGVmIGVudW0KLS8vIHsKLS8vICAgICBNNF9rRW5jRm9ybWF0VW5rbm93biAgICA9IDAsICAgIC8qKjwgVW5rbm93biBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRBU0NJSSAgICAgICAgPSAxLCAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAvKio8IFVURi04IGVuY29kZWQgVW5pY29kZSAuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0VVRGMTYgICAgICAgID0gMyAgIC8qKjwgVVRGLTE2IGVuY29kZWQgVW5pY29kZS4gVGVybWluYXRlZCB3aXRoICQwMCAwMCAgICAqLwotLyp9ICBNNF9FbmNvZGluZ0Zvcm1hdDsqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TdHJpbmdBdHRyaWJ1dGVzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RyaW5nIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8vIHR5cGVkZWYgc3RydWN0Ci0vLyB7Ci0vLyAgICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BTdHJpbmc7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0vLyAgICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGV4dCAgICAgICAgICAgICovCi0vLyAgICAgTTRfRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotLy8gfSBNNF9TdHJpbmdBdHRyaWJ1dGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgYnVmZmVyIGluIGFsbCByZWFkZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCogICBtX3BEYXRhOwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlCdWZmZXJTaXplOwotfSBNNFJFQURFUl9CdWZmZXI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlTZXNzaW9uSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU1lZGlhSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iSW5zdGFuY2U7Ci0gICAgTTRPU0FfQ2hhcioqICAgICAgICAgICAgbV9wSW5zdGFuY2U7Ci19IE00X1NkcEFzc2V0SW5zdGFuY2U7Ci0vKgotdHlwZWRlZiBlbnVtCi17Ci0gICAgIE00UkVBREVSX2tVbmtub3duRm9ybWF0ICAgID0gMCwKLSAgICAgTTRSRUFERVJfa1RhZ0lEM1YxLAotICAgICBNNFJFQURFUl9rVGFnSUQzVjIsCi0gICAgTTRSRUFERVJfa0FTRkNvbnRlbnREZXNjLAotICAgIE00UkVBREVSX2szR3BwQXNzZXRCb3hGcm9tVURUQSwKLSAgICBNNFJFQURFUl9rM0dwcEFzc2V0Qm94RnJvbVNEUCwKLSAgICBNNFJFQURFUl9rSnBlZ0V4aWYKLX0gTTRSRUFERVJfTWV0YURhdGFUeXBlOyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfM2dwQXNzZXRGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgYSAzZ3BwIGFzc2V0IGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NZXRhRGF0YUZpZWxkcyAgICBtX21ldGFkYXRhOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aVNlc3Npb25JRDsgICAgLyogRm9yIFNEUCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlNZWRpYUlEOyAgICAvKiBGb3IgU0RQICovCi0KLQotICAgIC8qIE5vdGU6IFRoZSB0d28gZm9sbG93aW5nIGZpZWxkcyB3ZXJlIGFkZGVkIGZvciBpbnRlcm5hbCB1c2UKLSAgICAgICAgKEZvciBNdXNpYyBtYW5hZ2VyIHByb2plY3QuLikgISEgKi8KLSAgICBNNF9TdHJlYW1UeXBlICAgICAgIG1fVmlkZW9TdHJlYW1UeXBlOyAgICAvKio8IFZpZGVvIHN0cmVhbSB0eXBlICovCi0gICAgTTRfU3RyZWFtVHlwZSAgICAgICBtX0F1ZGlvU3RyZWFtVHlwZTsgICAgLyoqPCBBdWRpbyBzdHJlYW0gdHlwZSAqLwotCi19IE00X01ldGFEYXRhRmllbGRzOwotCi0KLSNkZWZpbmUgTTRfTUVUQURBVEFfU1RSX05CICAgIDIyIC8qIG9uZSBzdHJpbmcgaW4gYWxidW0gYXJ0IHN0cnVjdHVyZSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iQnVmZmVyOwotICAgIE00X1NkcEFzc2V0SW5zdGFuY2UqICAgIG1fcEFzc2V0SW5mb0luc3Q7ICAgIC8qIFNldCBvZiAzZ3BwIGFzc2V0IGJveGVzICovCi0gICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydCAgICAgICAgbV9hbGJ1bUFydDsgICAgICAgICAgICAvKiBSQzogUFYgc3BlY2lmaWMgYWxidW0gYXJ0OmFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGJlY2F1c2UgdGhpcyB0eXBlIGlzIHVzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGJlbG93IGluIHN0cmVhbWluZyAqLwotCi19IE00UkVBREVSX25ldEluZm9zOwotCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcFRhZ0lEM0J1ZmZlclsyXTsgICAgICAgIC8qIFRhZyBJRDMgVjEsIFYyICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcEFzZkRlc2NDb250ZW50OyAgICAvKiBBU0YgZGVzY3JpcHRpb24gY29udGVudCBidWZmZXIgKi8KLSAgICAgICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BBc2ZFeHREZXNjQ29udGVudDsgLyogQVNGIGV4dGVuZGVkIGRlc2NyaXB0aW9uIGNvbnRlbnQgYnVmZmVyICovCi0gICAgfSBtX2FzZjsKLSAgICBNNF9NZXRhRGF0YUZpZWxkcyAgICBtX3BNZXRhZGF0YUZpZWxkczsgICAgICAvKiBBbHJlYWR5IHBhcnNlZCBhbmQgZmlsbGVkIDNncHAgYXNzZXQgZmllbGRzICovCi0gICAgTTRSRUFERVJfbmV0SW5mb3MgICAgbV9wQXNzZXRJbmZvSW5zdGFuY2U7ICAgLyogU2V0IG9mIDNncHAgYXNzZXQgYm94ZXMgaW4gdGhlIHNkcCBmaWxlICovCi0KLX0gTTRfTWV0YWRhdGFCdWZmZXI7Ci0KLQotCi0KLS8qKioqKioqKioqKiBSRUFERVIgR0xPQkFMIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBjcmVhdGUgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9jcmVhdGVfZmN0KSAgICAgICAgICAoTTRPU0FfQ29udGV4dCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZGVzdHJveV9mY3QpICAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiwgZm9yIHRoZSBuZXR3b3JrIHJlYWRlciwgc2VuZHMgdGhlIERFU0NSSUJFCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfb3Blbl9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9jbG9zZV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKE9VVCkgICAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZ2V0TmV4dFN0cmVhbV9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHN0YXJ0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgb25seSBuZWVkZWQgZm9yIG5ldHdvcmsgdW50aWwgbm93Li4uCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0YXJ0X2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgc3RvcCByZWFkaW5nCi0gKiBAbm90ZSAgICBvbmx5IG5lZWRlZCBmb3IgbmV0d29yayB1bnRpbCBub3cuLi4gKG1ha2VzIGEgcGF1c2UpCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0b3BfZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2dldE9wdGlvbl9mY3QpICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSBub3RoaW5nIGZvciB0aGUgbW9tZW50Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKElOKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zZXRPcHRpb25fZmN0KSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfanVtcF9mY3QpICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX3Jlc2V0X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgdGhlIHRpbWUgb2YgdGhlIGNsb3Nlc3QgUkFQIGFjY2VzcyB1bml0IGJlZm9yZSB0aGUgZ2l2ZW4gdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gc2VhcmNoCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIHNlYXJjaCBmcm9tIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgKGN0cykgb2YgdGhlIHByZWNlZGluZyBSQVAgQVUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfZ2V0UHJldlJhcFRpbWVfZmN0KSAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwVGltZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgbWVkaWEgcmVhZGVyIEdMT0JBTCBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBjcmVhdGlvbiBhbmQgY29udHJvbCBvZiBvbmUgcmVhZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRSRUFERVJfY3JlYXRlX2ZjdCogICAgICAgICAgICBtX3BGY3RDcmVhdGU7Ci0gICAgTTRSRUFERVJfZGVzdHJveV9mY3QqICAgICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00UkVBREVSX29wZW5fZmN0KiAgICAgICAgICAgICAgbV9wRmN0T3BlbjsKLSAgICBNNFJFQURFUl9jbG9zZV9mY3QqICAgICAgICAgICAgIG1fcEZjdENsb3NlOwotICAgIE00UkVBREVSX2dldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00UkVBREVSX3NldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0U2V0T3B0aW9uOwotICAgIE00UkVBREVSX2dldE5leHRTdHJlYW1fZmN0KiAgICAgbV9wRmN0R2V0TmV4dFN0cmVhbTsKLSAgICBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KiAgICAgIG1fcEZjdEZpbGxBdVN0cnVjdDsKLSAgICBNNFJFQURFUl9zdGFydF9mY3QqICAgICAgICAgICAgIG1fcEZjdFN0YXJ0OwotICAgIE00UkVBREVSX3N0b3BfZmN0KiAgICAgICAgICAgICAgbV9wRmN0U3RvcDsKLSAgICBNNFJFQURFUl9qdW1wX2ZjdCogICAgICAgICAgICAgIG1fcEZjdEp1bXA7Ci0gICAgTTRSRUFERVJfcmVzZXRfZmN0KiAgICAgICAgICAgICBtX3BGY3RSZXNldDsKLSAgICBNNFJFQURFUl9nZXRQcmV2UmFwVGltZV9mY3QqICAgIG1fcEZjdEdldFByZXZSYXBUaW1lOwotCi19IE00UkVBREVSX0dsb2JhbEludGVyZmFjZTsKLQotCi0vKioqKioqKioqKioqKiBSRUFERVIgREFUQSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2RlciAoYXVkaW8vdmlkZW8pLgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTi9PVVQpICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgICAgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2dldE5leHRBdV9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBtZWRpYSByZWFkZXIgREFUQSBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBkYXRhIGFjY2VzcyBmb3Igb25lIHJlYWRlciB0eXBlLih0aG9zZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBjYWxsZWQgZnJvbQotICogICAgICAgICAgICAgICAgYSBkZWNvZGVyKSBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfRGF0YUludGVyZmFjZQotewotICAgIE00UkVBREVSX2dldE5leHRBdV9mY3QqICAgbV9wRmN0R2V0TmV4dEF1OwotCi0gICAgLyoqCi0gICAgc3RvcmVzIHRoZSBjb250ZXh0IGNyZWF0ZWQgYnkgdGhlIE00UkVBREVSX2NyZWF0ZV9mY3QoKSBmdW5jdGlvbgotICAgIHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aG91dCAgZGVjb2RlcgotICAgICovCi0gICAgTTRPU0FfQ29udGV4dCBtX3JlYWRlckNvbnRleHQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi19IE00UkVBREVSX0RhdGFJbnRlcmZhY2U7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2VuZGlmIC8qX19NNFJFQURFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBmYzg1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFJFQURFUl9QY20uaAotICogQGJyaWVmICAgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSB3YXYgcmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgb2YgdGhlIHdhdiByZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfUENNX0hfXwotI2RlZmluZSBfX000UkVBREVSX1BDTV9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000UkVBREVSX1BDTV9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTAzNjdjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQuaAotICogQGJyaWVmICAgICAgICBBY2Nlc3MgdW5pdCBtYW5pcHVsYXRpb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSwKLSAqICAgICAgICAgICAgICAgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGl0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19BQ0NFU1NVTklUX0gKLSNkZWZpbmUgTTRTWVNfQUNDRVNTVU5JVF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotCi0vKiogVGhlIGF0dHJpYnV0ZSBvZiBhIGZyYWdtZW50Ki8KLXR5cGVkZWYgZW51bSB7Ci0gIE00U1lTX2tGcmFnQXR0ck9rICAgICAgICA9IDAxLCAvKio8IFRoZSBmcmFnbWVudCBpcyBjb3JyZWN0LCB0aGVyZSBpcyBubyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJDb3JydXB0ZWQgPSAwMiwgLyoqPCBUaGUgZnJhZ21lbnQgaXMgY29ycnVwdGVkICh0aGVyZSBpcyBhdCBsZWFzdCBhIGJpdCBvciBieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Igc29tZXdoZXJlIGluIHRoZSBmcmFnbWVudCAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJMb3N0ICAgICAgPSAwMyAgLyoqPCBUaGUgZnJhZ21lbnQgaXMgbG9zdCwgc28gdGhlIHNpemUgbXVzdCBiZSAwLiovCi19IE00U1lTX0ZyYWdBdHRyOwotCi0KLS8qKiBBIEZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYWNjZXNzIHVuaXQuIEl0IGNhbiBiZSBkZWNvZGVkIHdpdGhvdXQgZGVjb2RpbmcgdGhlIG90aGVycyovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX01lbUFkZHI4ICBmcmFnQWRkcmVzczsgICAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIEFsbCBmcmFnbWVudHMgb2YgdGhlIHNhbWUgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5Ki8KLSAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgIC8qKjwgVGhlIHNpemUgb2YgdGhlIGZyYWdtZW50LiBJdCBtdXN0IGJlIDAgaWYgZnJhZ21lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnZ2VkICdsb3N0JyovCi0gIE00U1lTX0ZyYWdBdHRyICBpc0NvcnJ1cHRlZDsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhpcyBmcmFnbWVudCovCi19IE00U1lTX0ZyYWc7Ci0KLS8qKjwgVGhlIGF0dHJpYnV0ZSBvZiBhbiBhY2Nlc3MgdW5pdCovCi10eXBlZGVmIE00T1NBX1VJbnQ4IE00U1lTX0FVX0F0dHI7Ci0KLSNkZWZpbmUgQVVfQ29ycnVwdGVkICAgMHgwMSAvKio8IEF0IGxlYXN0IG9uZSBmcmFnbWVudCBvZiB0aGUgYWNjZXNzIHVuaXQgaXMgZmxhZ2dlZCBjb3JydXB0ZWQuKi8KLSNkZWZpbmUgQVVfUF9GcmFtZSAgICAgMHgwMiAvKio8IFRoZSBhY2Nlc3MgdW5pdCBpcyBhIFBfZnJhbWUqLwotI2RlZmluZSBBVV9SQVAgICAgICAgICAweDA0IC8qKjwgVGhlIGFjY2VzcyB1bml0IGlzIGEgcmFuZG9tIGFjY2VzcyBwb2ludC4qLwotCi0KLS8qKiBBbiBhY2Nlc3MgdW5pdCBpcyB0aGUgc21hbGxlc3QgcGllY2Ugb2YgZGF0YSB3aXRoIHRpbWluZyBpbmZvcm1hdGlvbi4qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgc3RyZWFtIDsKLSAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIGRhdGFBZGRyZXNzOyAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIFRoZSBzaXplIG9mIHRoaXMgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBzaXplKSBtdXN0IGJlIGEgMzItYml0cyBpbnRlZ2VyIG11bHRpcGxlKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAvKio8IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhQWRkcmVzcy4gVGhlIHNpemUgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGNoIGEgMzItYml0cyB3b3JkIGJvdW5kYXJ5LiovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBDVFM7ICAgICAgICAgLyoqPCBUaGUgQ29tcG9zaXRpb24gVGltZSBTdGFtcCovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBEVFM7ICAgICAgICAgLyoqPCBUaGUgRGVjb2RlZCBUaW1lIFN0YW1wKi8KLSAgTTRTWVNfQVVfQXR0ciAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhlIGFjY2VzcyB1bml0Ki8KLSAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG5iRnJhZzsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhZ21lbnRzLiBJdCBjYW4gYmUgMCBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZnJhZ21lbnQuKi8KLSAgTTRTWVNfRnJhZyoqICAgICAgICAgICAgICAgIGZyYWc7ICAgICAgICAvKio8IEFuIGFycmF5IG9mICduYkZyYWcnIGZyYWdtZW50cy4gSXQgc3RvcmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzIHN0cnVjdHVyZS4gVGhlIG9yaWdpbmFsIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIGZyYWcgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIE00U1lTX0ZyYWcqIGZyYWdbXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gTTRTWVNfRnJhZyoqIGZyYWcgc2luY2UgdGhlIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIHN1Y2ggc3ludGF4IGlzIG9ubHkgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQyBjb21waWxlci4gKi8KLX0gTTRTWVNfQWNjZXNzVW5pdDsKLQotLyogRXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfQVVfTk9fTU9SRV9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FVX0JVRkZFUl9PVkVSRkxPVyAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAyKQotI2RlZmluZSBNNEVSUl9BVV9CQURfSU5ERVggICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMykKLSNkZWZpbmUgTTRFUlJfTk9UX0VOT1VHSF9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDQpCi0KLQotCi0jZW5kaWYgLypNNFNZU19BQ0NFU1NVTklUX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWIwY2U3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNFNZU19TdHJlYW0uaAotICogQGJyaWVmICAgICAgICBTdHJlYW0gbWFuaXB1bGF0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJlYW0gc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19TVFJFQU1fSAotI2RlZmluZSBNNFNZU19TVFJFQU1fSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00U1lTX1N0cmVhbUlEOwotCi0vKiogVGhlIHN0cmVhbVR5cGUgdHlwZSBwcm92aWRlcyBhIHdheSB0byBkaXN0aW5ndWlzaCBhbGwgc3RyZWFtcyAoQUFDLCBBTVIsIFlVVjQyMCwgTVBFRy00IFZpZGVvLAotICAgICBIMjYzKS4gU3RyZWFtIHR5cGVzIGNhbiBiZSBzb3J0ZWQgaW4gMiB3YXlzOgotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmF3IGRhdGEsIG90aGVycyBhcmUgZW5jb2RlZAotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmVsYXRlZCB0byBhbiBhdWRpbyBtZWRpYSwgYSB2aWRlbyBtZWRpYS4uLgotQG4gU28gYSBzcGVjaWZpYyBuYW1pbmcgY29udmVudGlvbiBoYXMgYmVlbiBkZXNpZ25lZCB0byBhbGxvdyBhIHF1aWNrIHBhcnNpbmcgb2YgdGhlIHN0cmVhbVR5cGUKLSAgICB2YWx1ZSB0byByZXR1cm4gdGhlIGFib3ZlIGNhdGVnb3JpZXMuIFN0cmVhbVR5cGUgaXMgYW4gdW4tc2lnbmVkIGludGVnZXIgb24gMTYgYml0cy4KLUBhcmcgICBUaGUgZmlyc3QgYnl0ZSAoTVNCKSBkZWZpbmVzIHRoZSBjb2RlYyB0eXBlLiBJdCBjYW4gYmUgZWl0aGVyIEF1ZGlvLFZpZGVvLCBQaWN0dXJlLAotICAgICAgICAgVGV4dCBvciBTY2VuZS4KLUBhcmcgICBUaGUgc2Vjb25kIGJ5dGUgKExTQikgZGVmaW5lcyB0aGUgc3ViLWNvZGVjcyB0eXBlIChpZSBZVVY0MjAsIFBDTV8xNiBiaXRzLCBBTVIuLi4pLgotICAgICAgICBNb3Jlb3ZlciBpZiB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAweDgwIHRoZSBzdHJlYW0gaXMgYSByYXcgc3RyZWFtLCBlbHNlIHRoZSBzdHJlYW0KLSAgICAgICAgaXMgYW4gZW5jb2RlZCBvbmUKLUBuICAgMHgwMDAwIGlzIGEgZm9yYmlkZGVuIHZhbHVlLCBpdCBkZXNjcmliZXMgYW4gdW5rbm93biBzdHJlYW0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgIE00U1lTX2tVbmtub3duICAgICAgID0gMHgwMDAwLAotICAgLyogU3RyZWFtIHR5cGUgZGVmaW5pdGlvbgotICAgICAgIDB4WVlaWiAgIDogWVkgaXMgdGhlIGNvZGVjIHR5cGUgKEF1ZGlvLCBWaWRlbywgUGljdHVyZSwgU2NlbmUgLi4uKQotICAgICAgICAgICAgICAgICAgWlogaXMgdGhlIHN1Yi1jb2RlYyB0eXBlIChBQUMsIEFNUiAsIC4uLikKLSAgICAgICAgICAgICAgICAgICAgIGlmIFpaIGlzIGdyZWF0ZXIgdGhhbiAweDgwIGl0IGlzIGEgcmF3IGZvcm1hdCovCi0KLSAgIC8qIEF1ZGlvIG9uZXMgICA6IFJhbmdlIGZyb20gWzB4MDEwMC0weDAxRkZdKi8KLSAgIE00U1lTX2tBdWRpb1Vua25vd24gID0gMHgwMTAwLAotICAgTTRTWVNfa0FBQyAgICAgICAgICAgPSAweDAxMDEsCi0gICBNNFNZU19rQ0VMUCAgICAgICAgICA9IDB4MDEwMiwKLSAgIE00U1lTX2tBTVIgICAgICAgICAgID0gMHgwMTAzLAotICAgTTRTWVNfa0FNUl9XQiAgICAgICAgPSAweDAxMDQsCi0gICBNNFNZU19rTVAzICAgICAgICAgICA9IDB4MDEwNSwKLSAgIE00U1lTX2tNSURJICAgICAgICAgID0gMHgwMTA2LAotICAgTTRTWVNfa1dNQSAgICAgICAgICAgPSAweDAxMDcsCi0gICBNNFNZU19rUkVBTEFVRElPICAgICA9IDB4MDEwOCwKLSAgIE00U1lTX2tFVlJDICAgICAgICAgICAgPSAweDAxMDksCi0gICBNNFNZU19rUENNXzE2Yml0c1MgICA9IDB4MDE4MSwgLyogUENNIDE2IGJpdHMgU2lnbmVkICovCi0gICBNNFNZU19rUENNXzE2Yml0c1UgICA9IDB4MDE4MiwgLyogUENNIDE2IGJpdHMgVW4tc2lnbmVkICovCi0gICBNNFNZU19rUENNXzhiaXRzVSAgICA9IDB4MDE4MywgLyogUENNICA4IGJpdHMgVW4tc2lnbmVkICovCi0vKiBGaXhBQSAyMDA4LzAzLzAzIHR5cGVzOiBNNFNZU19rUENNXzE2Yml0c1MsIE00U1lTX2tQQ01fMTZiaXRzVSBhbmQgTTRTWVNfa1BDTV84Yml0c1UKLSAgIGFyZSBub3cgb25seSB1c2VkIGJ5IEF1ZGlvTWl4ZXIgYW5kIFJlYWRlckFWSSA9PiBBbiB1cGRhdGUgaXMgbmVjZXNzYXJ5IGluIHRoZSBmdXR1cmUgZm9yIHVzZQotICAgdHlwZSBNNFNZU19rUENNICovCi0gICBNNFNZU19rWE1GICAgICAgICAgICAgPSAweDAxODQsCi0gICBNNFNZU19rU01BRiAgICAgICAgICA9IDB4MDE4NSwKLSAgIE00U1lTX2tJTUVMICAgICAgICAgID0gMHgwMTg2LAotICAgTTRTWVNfa0JCQSAgICAgICAgICAgID0gMHgwMTg3LAotICAgTTRTWVNfa0JQQyAgICAgICAgICAgID0gMHgwMTg4LAotICAgTTRTWVNfa0FEUENNICAgICAgICAgPSAweDAxODksICAvKiBBRFBDTSBhZGRlZCAqLwotICAgTTRTWVNfa1BDTSAgICAgICAgICAgPSAweDAxOTAsICAvKiBzdHJlYW0gdHlwZSBhZGRlZDogUENNOyAgUFIyNTY5IGZpeEFBICovCi0gICBNNFNZU19rQXVkaW9BbGwgICAgICAgID0gMHgwMUZGLCAgLyogYWxsIGF1ZGlvIHN0cmVhbXMgKi8KLQotICAgLyogVmlkZW8gb25lcyAgIDogUmFuZ2UgWzB4MDIwMC0weDAyRkZdKi8KLSAgIE00U1lTX2tWaWRlb1Vua25vd24gID0gMHgwMjAwLAotICAgTTRTWVNfa01QRUdfNCAgICAgICAgPSAweDAyMDEsCi0gICBNNFNZU19rSDI2MyAgICAgICAgICA9IDB4MDIwMiwKLSAgIE00U1lTX2tIMjYzcHAgICAgICAgID0gMHgwMjAzLAotICAgTTRTWVNfa0gyNjQgICAgICAgICAgPSAweDAyMDQsCi0gICBNNFNZU19rUkVBTFZJREVPICAgICA9IDB4MDIwNSwKLSAgIE00U1lTX2tZVVY0MjAgICAgICAgID0gMHgwMjgxLAotICAgTTRTWVNfa1JHQjMyICAgICAgICAgPSAweDAyODIsCi0gICBNNFNZU19rQkdSMzIgICAgICAgICA9IDB4MDI4MywKLSAgIE00U1lTX2tSR0IyNCAgICAgICAgID0gMHgwMjg0LAotICAgTTRTWVNfa0JHUjI0ICAgICAgICAgPSAweDAyODUsCi0gICBNNFNZU19rVmlkZW9BbGwgICAgICAgID0gMHgwMkZGLCAgLyogYWxsIHZpZGVvIHN0cmVhbXMgKi8KLQotICAvKiBQaWN0dXJlIG9uZXMgOiBSYW5nZSBbMHgwMzAwLTB4MDNGRl0qLwotICAgTTRTWVNfa1BpY3R1cmVVbmtub3duID0gMHgwMzAwLAotICAgTTRTWVNfa0pQRUcgICAgICAgICAgID0gMHgwMzAxLAotICAgTTRTWVNfa0dJRiAgICAgICAgICAgID0gMHgwMzAyLAotICAgTTRTWVNfa0JNUCAgICAgICAgICAgID0gMHgwMzgzLAotICAgTTRTWVNfa1N0aWxsQWxsICAgICAgICAgPSAweDAzRkYsICAvKiBhbGwgc3RpbGwgcGljdHVyZSBzdHJlYW1zICovCi0KLSAgIC8qIFRleHQgb25lcyAgICA6IFJhbmdlIFsweDA0MDAtMHgwNEZGXSovCi0gICBNNFNZU19rVGV4dFVua25vd24gID0gMHgwNDAwLAotICAgTTRTWVNfa1RpbWVkVGV4dCAgICA9IDB4MDQwMSwKLSAgIE00U1lTX2tVVEY4ICAgICAgICAgPSAweDA0ODEsCi0gICBNNFNZU19rVVRGMTYgICAgICAgID0gMHgwNDgyLAotICAgTTRTWVNfa1VDUzIgICAgICAgICA9IDB4MDQ4MywKLSAgIE00U1lTX2tUZXh0QWxsICAgICAgID0gMHgwNEZGLCAgLyogYWxsIHRleHQgc3RyZWFtcyAqLwotCi0gICAvKiBTY2VuZSAmIEdyYXBoaWNzIG9uZXMgICA6IFJhbmdlIFsweDA1MDAtMHgwNUZGXSovCi0gICBNNFNZU19rU2NlbmVVbmtub3duICA9IDB4MDUwMCwKLSAgIE00U1lTX2tTTUlMICAgICAgICAgID0gMHgwNTAxLAotICAgTTRTWVNfa0JJRlMgICAgICAgICAgPSAweDA1MDIsCi0gICBNNFNZU19rU2NlbmVBbGwgICAgICAgID0gMHgwNUZGLCAgLyogYWxsIHNjZW5lIHN0cmVhbXMgKi8KLQotICAgLyogaGludGVkIG9uZXMgICA6IFJhbmdlIFsweDA2MDAtMHgwNkZGXSovCi0gICBNNFNZU19rSGludGVkVW5rbm93biA9IDB4MDYwMCwKLSAgIE00U1lTX2tSVFAgICAgICAgICAgID0gMHgwNjAxLAotICAgTTRTWVNfa01QRUcyX1RTICAgICAgPSAweDA2MDIsCi0gICBNNFNZU19rSGludGVkQWxsICAgICAgICA9IDB4MDZGRiwgIC8qIGFsbCBwYWNrZXRpemVkIHN0cmVhbXMgKi8KLQotICAgLyogTVBFRy00IHN5c3RlbSBvbmVzIDogUmFuZ2UgWzB4MDcwMC0weDA3RkZdKi8KLSAgIE00U1lTX2tTeXNVbmtub3duICAgID0gMHgwNzAwLAotICAgTTRTWVNfa09EUyAgICAgICAgICAgPSAweDA3MDEsCi0gICBNNFNZU19rSVBNUCAgICAgICAgICA9IDB4MDcwMiwKLSAgIE00U1lTX2tPQ0kgICAgICAgICAgID0gMHgwNzAzLAotICAgTTRTWVNfa1N5c0FsbCAgICAgICAgPSAweDA3RkYgLyogYWxsIHN5c3RlbSBzdHJlYW1zKi8KLX0gTTRTWVNfU3RyZWFtVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00U1lTX1N0cmVhbUlEICAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICB2YWx1ZSA7Ci19IE00U1lTX1N0cmVhbUlEVmFsdWUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNFNZU19TdHJlYW1JRCAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICBzaXplIDsKLSAgIE00T1NBX01lbUFkZHIzMiAgIGFkZHIgOwotfSBNNFNZU19TdHJlYW1JRG1lbUFkZHIgOwotCi0vKiogVGhpcyBzdHJ1Y3VyZSBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB0byBhIHN0cmVhbSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQ7ICAgIC8qKjwgVGhlIElEIG9mIHRoZSBzdHJlYW0uIEl0IG11c3QgYmUgdW5pcXVlIGZvciBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZSBpbiBhIE1QNCBmaWxlLCB0d28gdHJhY2tzIGNhbiBub3QgaGF2ZSB0d28gdGltZXMgdGhlIHNhbWUgSUQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpcyBmb3JiaWRkZW4uKi8KLSAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlOyAgICAvKio8IFRoZSBzdHJlYW0gdHlwZSBvZiB0aGUgc3RyZWFtKi8KLSAgTTRPU0FfVUludDggICAgICBwcm9maWxlTGV2ZWw7ICAvKio8IFRoZSBwcm9maWxlICYgbGV2ZWwgb2YgYSBzdHJlYW0uIEl0IGlzIHJlbGF0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAmIHRoZSBkZWZpbml0aW9uIGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIGJvZGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gTVBFRy00IFZpZGVvICYgTVBFRy00IEF1ZGlvKS4gU29tZSB2YWx1ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUtZGVmaW5lZDogMHhGRT11c2VyUHJpdmF0ZSAweEZGPW5vIFByb2ZpbGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwgc3BlY2lmaWVkKi8KLSAgTTRPU0FfVUludDMyICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgIC8qKjwgVGhlIGRlY29kZXIgY29uZmlndXJhdGlvbi4gVGhlc2UgYnl0ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gaW5pdGlhbGlzZSBhIGRlY29kZXIuKi8KLSAgTTRPU0FfTWVtQWRkcjMyICBkZWNvZGVyU3BlY2lmaWNJbmZvOyAvKio8IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mby4qLwotICBNNE9TQV9VSW50MzIgICAgIHRpbWVTY2FsZTsgICAgIC8qKjwgVGhlIHRpbWUgc2NhbGUgb2YgdGhlIHN0cmVhbS4gSXQgbWVhbnMgdGhhdCBhbGwgdGltaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0gYXJlIGNvbXB1dGVkIGluIHRoaXMgdGltZXNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGllIHRpbWVTY2FsZSA9IDgwMDAsIG1lYW5zIHRoZXJlIGFyZSA4MDAwIHRpY2tzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHNlY29uZCkqLwotICBNNE9TQV9UaW1lICAgICAgIGR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgc3RyZWFtIGR1cmF0aW9uIG9mIHRoaXMgc3RyZWFtLiBUaGUgdGltZSB1bml0IGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgc2NhbGUuIFRoZSB2YWx1ZSBjYW4gYmUgc2V0IHRvIE00U1lTX1Vua25vd25UaW1lIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGR1cmF0aW9uIGlzIG5vdCBrbm93bi4qLwotICBNNE9TQV9JbnQzMiAgICAgIGF2ZXJhZ2VCaXRyYXRlOyAgLyoqPCBUaGUgYXZlcmFnZSBiaXRyYXRlIChpbiBiaXQgcGVyIHNlY29uZCkgb2YgdGhpcyBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdmVyYWdlIGJpdHJhdGUgaXMgY29tcHV0ZWQgb24gdGhlIHN0cmVhbSBkdXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgdmFsdWUgbWVhbnMgZWl0aGVyIHRoZXJlIGlzIG5vIGF2ZXJhZ2UgYml0cmF0ZSBvciBubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIGJpdHJhdGUgaXMgcHJvdmlkZWQuKi8KLSAgTTRPU0FfSW50MzIgICAgICBtYXhCaXRyYXRlOyAgICAgIC8qKjwgVGhlIG1heGltdW0gYml0cmF0ZSAoaW4gYml0IHBlciBzZWNvbmQpIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBiaXRyYXRlIGlzIGNvbXB1dGVkIG9uIGEgc2xpZGluZyB3aW5kb3cgb2YgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQuIC0xIHZhbHVlIG1lYW5zIGVpdGhlciB0aGVyZSBpcyBubyBtYXguIGJpdHJhdGUgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gbWF4LiBiaXRyYXRlIGlzIHByb3ZpZGVkLiovCi19IE00U1lTX1N0cmVhbURlc2NyaXB0aW9uOwotCi10eXBlZGVmIGVudW0gewotICAgTTRTWVNfa1ByZXZpb3VzUkFQICAgICAgPSAweDAxICwKLSAgIE00U1lTX2tOZXh0UkFQICAgICAgICAgID0gMHgwMiAsCi0gICBNNFNZU19rQ2xvc2VzdFJBUCAgICAgICA9IDB4MDMgLAotICAgTTRTWVNfa05vUkFQcHJldmlvdXMgICAgPSAweDExICwKLSAgIE00U1lTX2tOb1JBUG5leHQgICAgICAgID0gMHgxMiAsCi0gICBNNFNZU19rTm9SQVBjbG9zZXN0ICAgICA9IDB4MTMgLAotICAgTTRTWVNfa0JlZ2lubmluZyAgICAgICAgPSAweDIwCi19IE00U1lTX1NlZWtBY2Nlc3NNb2RlIDsKLQotI2VuZGlmIC8qTTRTWVNfU1RSRUFNX0gqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxNmI4ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VE9PTF9WZXJzaW9uSW5mby5oCi0gKiBAYnJpZWYgIGRlZmluZXMgYSBjb21tb24gdmVyc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFRPT0xfVkVSU0lPTklORk9fSF9fCi0jZGVmaW5lIF9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmVyc2lvbkluZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHZlcnNpb24gb2YgY29yZSBjb21wb25lbnQKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB0eXBpY2FsbHkgdXNlZCB0byByZXRyaWV2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgICAgICAgICAgICAgICBvZiBhIGNvbXBvbmVudCB2aWEgZ2V0T3B0aW9uIGZ1bmN0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNF9WZXJzaW9uSW5mbwotewotICAgIE00T1NBX1VJbnQzMiBtX21ham9yOyAgICAgICAgLyptYWpvciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX21pbm9yOyAgICAgICAgLyptaW5vciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX3JldmlzaW9uOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0KLSAgICAvKiBTdHJ1Y3R1cmUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiBtX3N0cnVjdFNpemU7Ci0KLX0gTTRfVmVyc2lvbkluZm87Ci0KLQotI2VuZGlmIC8qX19NNFRPT0xfVkVSU0lPTklORk9fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwYmZjYjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogLS0tLS0gRFNJIGJpdHN0cmVhbSBwYXJzZXIgLS0tLS0gKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdG8gY2xpZW50cyBvZiB0aGUgc2hlbGwgdG8gYWxsb3cgdGhlbSB0byBhbmFseXNlIGNsaXBzCi0odXNlZnVsIGZvciB2aWRlbyBlZGl0aW5nKSB3aXRob3V0IGhhdmluZyB0byBpbnN0YW5jaWF0ZSBhIGRlY29kZXIsIHdoaWNoIGNhbiBiZSB1c2VmdWwgcHJlY2lzZWx5Ci1pZiBIVyBkZWNvZGVycyBhcmUgYSBwb3NzaWJpbGl0eS4gKi8KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEY2ksCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSk7Ci0KLU00T1NBX0VSUiBnZXRBVkNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldE1QRUc0UHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4IHByb2ZpbGVBbmRMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZEX0VYVEVSTkFMX0lOVEVSRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NhMzZhYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VkRfVE9PTFNfSF9fCi0jZGVmaW5lIF9fTTRWRF9UT09MU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0vKiAtLS0tLSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9ieXRlOwotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1faW5kZXg7Ci0gICAgTTRPU0FfTWVtQWRkcjggaW47Ci0KLX0gTTRWU19CaXRzdHJlYW1fY3R4dDsKLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKTsKLU00T1NBX0VSUiBNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9UT09MU19IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdmNzZjYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uaAotICogQGJyaWVmCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000VkZMX1RSQU5TSVRJT05fSF9fCi0jZGVmaW5lIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJbnQzMjsKLQotdHlwZWRlZiAgICBzdHJ1Y3QgU19NNFZpQ29tSW1hZ2VQbGFuZQotewotICAgIFVJbnQzMiAgICAgICAgdV93aWR0aDsgICAgICAgICAgICAvKiBhY3RpdmUgd2lkdGgsIGluIHBpeGVscyAqLwotICAgIFVJbnQzMiAgICAgICAgdV9oZWlnaHQ7ICAgICAgICAgICAgLyogYWN0aXZlIGhlaWdodCwgaW4gbGluZXMgKi8KLSAgICBVSW50MzIgICAgICAgIHVfdG9wbGVmdDsgICAgICAgICAgICAvKiBpbmRleCBvZiAxc3QgYWN0aXZlIHBpeGVsICovCi0gICAgVUludDMyICAgICAgICB1X3N0cmlkZTsgICAgICAgICAgICAvKiBsaW5lIHN0cmlkZSwgaW4gYnl0ZXMgKi8KLSAgICBVSW50OCAgICAgICAgKnBhY19kYXRhOyAgICAgICAgICAgIC8qIGJ1ZmZlciBhZGRyZXNzICovCi19ICAgIE00VmlDb21JbWFnZVBsYW5lOwotCi10eXBlZGVmIHN0cnVjdCBTX000VkZMX21vZGlmTHVtUGFyYW0KLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBsdW1fZmFjdG9yOwotICAgIHVuc2lnbmVkIHNob3J0IGNvcHlfY2hyb21hOwotfSBNNFZGTF9Nb2RpZkx1bVBhcmFtOwotCi0jZGVmaW5lICAgICBNNFZJRklfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgICAgIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVCAgICAgOAotI2RlZmluZSAgICAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEggICAgICA5Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX01vZGlmTHVtUGFyYW0gKmx1bV9wYXJhbSwgdm9pZCAqdXNlcl9kYXRhKTsKLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLCB2b2lkICp1c2VyX2RhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VSW50MzIgUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICBCbGVuZHMgdHdvIFlVViA0OjI6MCBQbGFuYXIgaW1hZ2VzLgotICogQG5vdGUgICAgQmxlbmRzIFlVVjQyMCBwbGFuYXIgaW1hZ2VzLAotICogICAgICAgICAgTWFwIHRoZSB2YWx1ZSBvZiBwcm9ncmVzcyBmcm9tICgwIC0gMTAwMCkgdG8gKDAgLSAxMDI0KQotICogICAgICAgICAgU2V0IHRoZSByYW5nZSBvZiBibGVuZGluZ2ZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgMS4gZnJvbSAwIHRvIChQcm9ncmVzcyA8PCAxKSAgICAgICAgICAgIDtmb3IgUHJvZ3Jlc3MgPD0gNTEyCi0gKiAgICAgICAgICAgICAgICAgIDIuIGZyb20gKCggUHJvZ3Jlc3MgLSA1MTIpPDwgMSkgdG8gMTAyNCA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBTZXQgdGhlIGluY3JlbWVudCBvZiBibGVuZGluZ2ZhY3RvciBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBpbWFnZSByb3cgYnkgdGhlIGZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlLTEpIC8gKGltYWdlIHdpZHRoLTEpICA7Zm9yIHdpZHRoID49IHJhbmdlCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZSkgLyAoaW1hZ2Ugd2lkdGgpICAgICAgO290aGVyd2lzZQotICogICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaSkgcm93IG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCg9IGopIGNvbHVtbiBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZyb20gdHdvIGlucHV0IFlVVjQ6MjowIGltYWdlcyBhbmQKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBmb3VyIFkgc2FtcGxlIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZvciBvdXRwdXQgWVVWNDoyOjAgaW1hZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcsCi0gKiAgICAgICAgICAgICAgICAgIE91dChpLGopID0gYmxlbmRpbmdmYWN0b3IoaSxqKSAqIEluMShpLGopKyAobCAtIGJsZW5kaW5nZmFjdG9yKGksaikpICogSW4yKGksaikKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSAgVXNlciBTcGVjaWZpYyBQYXJhbWV0ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZUluMTogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluMjogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIFByb2dyZXNzOiAgKElOKSAgUHJvZ3Jlc3MgdmFsdWUgKHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEwMDApCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZU91dCwgVUludDMyIFByb2dyZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8vIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjA3NjE2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9DbGlwLmgKLSAqIEBicmllZiAgICAgICAgR2xvYmFsIFRhYmxlIGRlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2xpcHBpbmcgYW5kIERpdmlzaW9uIHRhYmxlIGFkZHJlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgICAgX000VklGSV9DTElQX0hfCi0jZGVmaW5lICAgIF9NNFZJRklfQ0xJUF9IXwotCi0vKiBDbGlwcGluZyBtYXRyaXggZm9yIFJHQiB2YWx1ZXMgKi8KLUVYVEVSTiBDTlNUIE00VklGSV9VSW50OCAgICAqTTRWSUZJX0NsaXBUYWJsZV96ZXJvOwotLyogRGl2aXNpb24gdGFibGUgZm9yICg2NTUzNS94KTsgeCA9IDAgdG8gNTEyICovCi1FWFRFUk4gQ05TVCBNNFZJRklfVUludDE2ICAgICpNNFZJRklfRGl2VGFibGVfemVybzsKLQotI2VuZGlmIC8qIF9NNFZJRklfQ0xJUF9IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5oICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDU5MWU1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfRGVmaW5lcy5oCi0gKiBAYnJpZWYgICAgICAgIE1hY3JvIERlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgdGhlIG1hY3JvIHVzZWQgaW4gdGhlIGZpbHRlciBsaWJyYXJ5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfREVGSU5FU19IXwotI2RlZmluZSBfTTRWSUZJX0RFRklORVNfSF8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNyb3MgdXNlZCBmb3IgY29sb3IgdHJhbnNmb3JtIFJHQjU2NSB0byBZVVYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ1NUX1JHQl8xNl9TSVpFIDIKLSNkZWZpbmUgWTE2KHIsIGcsIGIpIENMSVAoICAoICggKDgwNTkzICogcikrKDc3ODU1ICogZykrKDMwNzI4ICogYikpID4+IDE1KSkKLSNkZWZpbmUgVTE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggLSg0NTQ4MyAqIHIpLSg0MzkzNiAqIGcpKygxMzQ3NzEgKiBiKSkgPj4gMTUgKSkKLSNkZWZpbmUgVjE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggKDEzNDc3MSAqIHIpLSg1NTUzMiAqIGcpLSgyMTkxNyAqIGIpKSA+PiAxNSAgKSkKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgTWFjcm9zIHVzZWQgZm9yIGNvbG9yIHRyYW5zZm9ybSBZVVYgdG8gUkdCCi0gKiAgICBCID0gMS4xNjQoWSAtIDE2KSAgICAgICAgICAgICAgICAgICsgMi4wMTgoVSAtIDEyOCkKLSAqICBHID0gMS4xNjQoWSAtIDE2KSAtIDAuODEzKFYgLSAxMjgpIC0gMC4zOTEoVSAtIDEyOCkKLSAqICBSID0gMS4xNjQoWSAtIDE2KSArIDEuNTk2KFYgLSAxMjgpCi0gKiAgQWJvdmUgQ29udmVyc2lvbiBGb3JtdWxhIGlzIGltcGxlbWVudGVkIGZvciBmaXhlZCBwb2ludCBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBDU1RfUkdCXzI0X1NJWkUgMwotCi0jaWZkZWYgX19SR0JfVjFfXwotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDM3LFV4LFZ4KSBcCi0gICAgUnggPSBDTElQKCgoWXgzNyArIChWeCAqIDUxKSArIDE2KSA+PiA1KSAtIDIyMyk7IFwKLSAgICBHeCA9IENMSVAoKChZeDM3IC0gKChVeCsoVng8PDEpKSAqIDEzKSArMTYpID4+IDUpICsgMTM1KTsgXAotICAgIEJ4ID0gQ0xJUCgoKFl4MzcgKyAoVXggKiA2NSkgKyAxNikgPj4gNSkgLSAyNzcpCi0jZWxzZQotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDI1NjgsVXgsVngpIFwKLSAgICBSeCA9IENMSVAoKChZeDI1NjggKyAgICAgICAgICAgICAgICAgKFZ4ICogMHgzMzQzKSArIChNNFZJRklfSW50MzIpMHhmZmU0MDgwMCkgPj4gMTMpKTsgXAotICAgIEd4ID0gQ0xJUCgoKFl4MjU2OCAtIChVeCAqIDB4MGM5MikgLSAoVnggKiAweDFhMWUpICsgKE00VklGSV9JbnQzMikweDAwMTEwMTgwKSA+PiAxMykpOyBcCi0gICAgQnggPSBDTElQKCgoWXgyNTY4ICsgKFV4ICogMHg0MGNmKSAgICAgICAgICAgICAgICAgICAgKyAoTTRWSUZJX0ludDMyKTB4ZmZkZDQyMDApID4+IDEzKSk7Ci0jZW5kaWYgLyogX19SR0JfVjFfXyAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgUGFja2luZyBhbmQgVW5wYWNraW5nIGlzIGRpZmZlcmVudCBmb3IgbGl0dGxlIGFuZCBiaWcgZW5kaWFuCi0gKiAgciwgZywgYiwgUngsIEd4LCBCeCBhcmUgOCBiaXQgY29sb3IgdmFsdWUKLSAqICAgIGEsIGRhdGEgYXJlIDE2IGJpdCBwaXhlbCB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyogUGFjayBjb21wdXRhdGlvbnMgY29tbW9uIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuIG1vZGVzICovCi0jZGVmaW5lICAgIFBBQ0tfQkdSMjQocmdiX3B0cixSeCxHeCxCeCkge3JnYl9wdHJbMF0gPSAoTTRWSUZJX1VJbnQ4KUJ4OyByZ2JfcHRyWzFdID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OClHeDsgcmdiX3B0clsyXSA9IChNNFZJRklfVUludDgpUng7fQotI2RlZmluZSAgICBQQUNLX1JHQjI0KHJnYl9wdHIsUngsR3gsQngpIHtyZ2JfcHRyWzBdID0gKE00VklGSV9VSW50OClSeDsgcmdiX3B0clsxXSA9XAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpR3g7IHJnYl9wdHJbMl0gPSAoTTRWSUZJX1VJbnQ4KUJ4O30KLQotI2lmZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgICAgUEFDS19SR0I1NjUoYSwgUngsIEd4LCBCeCkgKCgoUnggPj4gMykgPDwgKDExICsgKGEpKSlcCi0gICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSAgICBQQUNLX0JHUjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoMTEgKyAoYSkpKVwKLSAgICAgICAgICAgICAgICAgfCAoKEd4ID4+IDIpIDw8ICg1ICsgKGEpKSkgfCAoKFJ4ID4+IDMpIDw8IChhKSkpCi0jZGVmaW5lIEdFVF9SR0I1NjUociwgZywgYiwgZGF0YSkge2IgPSAoKGRhdGEpICYgMzEpOyBnID1cCi0gICAgICAgICAgICAgICAgICAgICAoKGRhdGEgPj4gNSkgJiA2Myk7IHIgPSAoKGRhdGEgPj4gMTEpICYgMzEpO30KLSNkZWZpbmUgR0VUX0JHUjU2NShiLCBnLCByLCBkYXRhKSBcCi0gICAgciA9ICgoZGF0YSkgJiAzMSk7IFwKLSAgICBnID0gKChkYXRhID4+IDUpICYgNjMpOyBcCi0gICAgYiA9ICgoZGF0YSA+PiAxMSkgJiAzMSApOwotI2Vsc2UgLyogTElUVExFIGVuZGlhbjogMHgxMjM0NTY3OCAtPiA3OCA1NiAzNCAxMiAqLwotI2RlZmluZSAgICBQQUNLX1JHQjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoOCArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKCgoR3ggPj4gMikmMHg3KSA8PCAoMTMgKyAoYSkpKSB8ICgoR3ggPj4gNSkgPDwgKGEpKSB8ICgoUnggPj4gMykgPDwgKDMgKyBhKSkpCi0jZGVmaW5lICAgIFBBQ0tfQkdSNTY1KGEsIFJ4LCBHeCwgQngpICgoKFJ4ID4+IDMpIDw8ICgxMSArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSBHRVRfUkdCNTY1KHIsIGcsIGIsIGRhdGEpIHsgYiA9IChNNFZJRklfVUludDgpKCgoZGF0YSkgJiAweDFGMDApID4+IDgpOyBnID1cCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCkoKCgoZGF0YSkgJiAweDcpIDw8IDMpIHwgKCgoZGF0YSkgJiAweEUwMDApID4+IDEzKSk7IHIgPVwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoKGRhdGEpICYgMHhGOCkgPj4gMyk7fQotI2RlZmluZSBHRVRfQkdSNTY1KGIsIGcsIHIsIGRhdGEpIFwKLSAgICBiID0gKChkYXRhKSAmIDMxKTsgXAotICAgIGcgPSAoKGRhdGEgPj4gNSkgJiA2Myk7IFwKLSAgICByID0gKChkYXRhID4+IDExKSAmIDMxICk7Ci0jZW5kaWYgLyogQklHX0VORElBTiAqLwotCi0KLSNkZWZpbmUgQ1NUX1JHQl8yNF9TSVpFIDMKLSNkZWZpbmUgWTI0KHIsZyxiKSBDTElQKCggKCAoMTk1OTUgKiByKSArICgzODQ3MCAqIGcpICsgKDk0MzcgKiBiKSApID4+MTYpKQotI2RlZmluZSBVMjQocixnLGIpIENMSVAoMTI4ICsgKCAoIC0oMTEwNTkgKiByKSAtICgyMTcwOSAqIGcpICsgKDMyNzY4ICogYikpID4+MTYpKQotI2RlZmluZSBWMjQocixnLGIpIENMSVAoMTI4ICsgKCAoICgzMjc2OCAqIHIpIC0gKDI3NDI2ICogZykgLSAoNTMyOSAqIGIpKSAgPj4xNikpCi0jZGVmaW5lIEdFVF9SR0IyNChyLGcsYixzLG8pIHIgPSBzW29dOyBnID0gc1tvICsgMV07IGIgPSBzW28gKyAyXTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNybyBmb3IgY2xpcHBpbmcgdXNpbmcgdGhlIGNsaXBwaW5nIG1hdHJpeCBmb3IgUkdCIHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIENsaXAgZnVuY3Rpb24gZW5zdXJlcyB2YWx1ZXMgd2l0aCByYW5nZSBvZiAwIGFuZCAyNTUgKi8KLSNkZWZpbmUgICAgICAgIENMSVAoeCkgICAgKihNNFZJRklfQ2xpcFRhYmxlX3plcm8gKyAoeCkpCi0jZGVmaW5lICAgICAgICBDTElQX09WRiAgICAgICAgNTAwCi0jZGVmaW5lICAgICBDTElQX0xVVF9TSVpFICAgICAoMjU2ICsgMiAqIENMSVBfT1ZGKQotLyoqIERpdmlzaW9uIHRhYmxlIGZvciBSR0I1NjUgdG8gSExTIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgICAgICAgIERJVkNMSVAoeCkgICAgKihNNFZJRklfRGl2VGFibGVfemVybyArICh4KSkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBFbmRpYW5uZXNzIChkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgTGl0dGxlIEVuZGlhbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZiAoIWRlZmluZWQoTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoQklHX0VORElBTikpCi0vKiogRGVmYXVsdCBlbmRpYW4gc2V0dGluZyAqLwotI2RlZmluZSBMSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBPdGhlciBtYWNyb3MgYW5kIGRlZmluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIFlVViBwbGFuZSBpbmRleCAqLwotI2RlZmluZSBQTEFORVMgICAgMwotI2RlZmluZSBZUGxhbmUgICAgMAotI2RlZmluZSBVUGxhbmUgICAgMQotI2RlZmluZSBWUGxhbmUgICAgMgotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAgICghKGEgJiAweDAxKSkKLSNlbmRpZgotCi0vKiBVc2VkIGZvciBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAqLwotI2lmbmRlZiBNQVhfU0hPUlQKLSNkZWZpbmUgTUFYX1NIT1JUICAgIDB4MTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogX000VklGSV9ERUZJTkVTX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9EZWZpbmVzLmggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkMmZjOWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9GaWx0ZXJzQVBJLmgKLSAqIEBicmllZiAgICAgICAgRXh0ZXJuYWwgQVBJIGFuZCBEYXRhIGRlZmluaXRpb25zIGZvciB0aGUgdmlkZW8gZmlsdGVyIGxpYnJhcnkKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbmQgZGVjbGFyZXMgZGF0YSBjb21tb24gdG8gdGhlIHZpZGVvIGZpbHRlciBsaWJyYXJ5OgotICogICAgICAgICAgICAgICAgICAgIC0jIGRhdGEgdHlwZXMKLSAqICAgICAgICAgICAgICAgICAgICAtIyBlcnJvciBjb2RlcwotICogICAgICAgICAgICAgICAgICAgIC0jIGV4dGVybmFsIEFQSSdzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgQVBJIGxldmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jZGVmaW5lIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotZXh0ZXJuICJDIiB7Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0gICAgLyoqCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgICAgICAgICAgICAgICAgIERhdGEgdHlwZXMgZGVmaW5pdGlvbgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTTRWSUZJX1VJbnQ4OwotICAgIHR5cGVkZWYgY2hhciBNNFZJRklfSW50ODsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE00VklGSV9VSW50MTY7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIE00VklGSV9VSW50MzI7Ci0gICAgdHlwZWRlZiBzaG9ydCBNNFZJRklfSW50MTY7Ci0gICAgdHlwZWRlZiBsb25nIE00VklGSV9JbnQzMjsKLSAgICB0eXBlZGVmIGZsb2F0IE00VklGSV9GbG9hdDsKLSAgICB0eXBlZGVmIGRvdWJsZSBNNFZJRklfRG91YmxlOwotICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBNNFZJRklfRXJyb3JDb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGVzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRWSUZJX09LICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNFZJRklfSU5WQUxJRF9QQVJBTSAgICAgICAgICAgIDcKLSNkZWZpbmUgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUICAgICAgICA4Ci0jZGVmaW5lIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIICAgICAgICA5Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgT3RoZXIgYmFzaWMgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ05TVCAgICBjb25zdAotI2RlZmluZSBFWFRFUk4gICAgZXh0ZXJuCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgIDAKLSNkZWZpbmUgVFJVRSAgICAhRkFMU0UKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlcyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9JbWFnZVBsYW5lCi0gKiBAYnJpZWYgICAgICAgIFRleHR1cmUgKFlVVikgcGxhbmVzIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIGltYWdlIHBsYW5lcyBmb3IgdGhlIG91dHB1dCB0ZXh0dXJlczoKLSAqICAgICAgICAgICAgICAgIHNpemVzIChpbiBwaXhlbHMpIGFyZSBsdW1hIHBsYW5lIHNpemVzLCB0aGUgMyBwb2ludGVycyBwb2ludAotICogICAgICAgICAgICAgICAgdG8gdGhlIFksIFUgYW5kIFYgYnVmZmVycyB3aGljaCBzdG9yZSBkYXRhIGluIHBsYW5hciBmb3JtYXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfVUludDMyIHVfd2lkdGg7ICAgLyoqPCBXaWR0aCBvZiBsdW1hIGluIHBpeGVsIHVuaXQgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X2hlaWdodDsgIC8qKjwgSGVpZ2h0IG9mIGx1bWEgaW4gcGl4ZWwgdW5pdCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfdG9wbGVmdDsgLyoqPCBQb2ludGVyIHRvIGZpcnN0IHRleHR1cmUgYWN0aXZlIHBpeGVsICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV9zdHJpZGU7ICAvKio8IFN0cmlkZSB2YWx1ZSAqLwotICAgICAgICBNNFZJRklfVUludDggKnBhY19kYXRhOyAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhICovCi0gICAgICAgIH0gTTRWSUZJX0ltYWdlUGxhbmU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9GcmFtaW5nRGF0YQotICogQGJyaWVmICAgICAgICBEYXRhIG5lY2Vzc2FyeSB0byBhZGQgYW4gb3ZlcmxheSBvbiBhbiBpbWFnZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIHBvc2l0aW9uIGFuZCB0aGUgZGF0YSBvZiB0aGUgb3ZlcmxheQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feFBvc1N0ZXA7IC8qKjwgWCBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MC8rNTAlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIG1lYW5zIG92ZXJsYXkgaXMgY2VudGVyZWQgdnMgbWFpbiBwaWN0dXJlIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFggYWJzY2lzc2EuICovCi0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feVBvc1N0ZXA7IC8qKjwgWSBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTAvKzUwJS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBtZWFucyBvdmVybGF5IGlzIGNlbnRlcmVkIHZzIG1haW4gcGljdHVyZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGFic2Npc3NhLiAqLwotCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgbV9pbWFnZVBsYW5lOyAvKio8IFBvaW50ZXIgdG8gdGhlIGZyYW1pbmcgaW1hZ2Ugd2l0aCBhbHBoYSBjaGFubmVsICovCi0gICAgICAgIH0gTTRWSUZJX0ZyYW1pbmdEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfSExTb2Zmc2V0Ci0gKiBAYnJpZWYgICAgICAgIEhMUyBvZmZzZXQgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaGF2ZSB0aGUgaHVlLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgdmFsdWUKLSAqICAgICAgICAgICAgICAgIGZvciBxdWFsaXR5IGVuaGFuY2VtZW50LiBSYW5nZSBvZiB2YWx1ZXMgbmVjY2Vzc2FyaWx5IGJlCi0gKiAgICAgICAgICAgICAgICBodWUgPSAtMzYwIHRvIDM2MCwgc2F0ID0gMCB0byAxMDAgYW5kIGxpZ2h0ID0gMCB0MCAxMDAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSW50MTYgaHVlOyAgIC8qKjwgSHVlIG9mZnNldCAqLwotICAgICAgICBNNFZJRklfSW50MTYgc2F0OyAgIC8qKjwgU2F0dXJhdGlvbiBvZmZzZXQgKi8KLSAgICAgICAgTTRWSUZJX0ludDE2IGxpZ2h0OyAvKio8IExpZ2h0IG9mZnNldCAqLwotICAgICAgICB9IE00VklGSV9ITFNvZmZzZXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9UcmFuZm9ybWF0aW9uCi0gKiBAYnJpZWYgICAgICAgIEltYWdlIFRyYW5mb3JtYXRpb24gU3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgSW1hZ2UgVHJhbmZvcm1hdGlvbiBSZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICByb3RhdGlvbiA6IDEgLT4gKzkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgLT4gLTkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gIE5vIFJvdGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0ludDMyIGkzMl9yb3RhdGlvbjsgLyoqPCBSb3RhdGlvbiBGbGFnICAgICAgICAqLwotICAgICAgICB9IE00VklGSV9UcmFuZm9ybWF0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfcENvbnRleHQKLSAqIEBicmllZiAgICAgICAgTmV3IFN0cnVjdHVyZXMKLSAqIEBub3RlICAgICAgICAtIyBTdHJ1Y3R1cmUgb2YgTTRWSUZJX0hMU29mZnNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9ITFNvZmZzZXQgaGxzT2Zmc2V0OyAvKio8IEhMUyBvZmZzZXQgc3RydWN0dXJlICovCi0gICAgICAgIH0gTTRWSUZJX3BDb250ZXh0OwotCi0gICAgLyoKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgQVBJIGZ1bmN0aW9ucwotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICAvKio8IEVmZmVjdCBmaWx0ZXJzICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXBpYVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbnRyYXN0WVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTmVnYXRpdmVZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GbGlwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTWlycm9yWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yUllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yR1lVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yQllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0ZyYW1pbmdSR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GcmFtaW5nWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEh1ZUluWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbGRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9XYXJtWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKiAgICAgICAgICAgICAgICBBRFMgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLQotLyogICAgICAgIEdlbmVyaWMgQVJNIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNpZiBkZWZpbmVkIEFEU19BUk0KLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgUkdCODg4dG9SR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBSR0I1NjV0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgQURTX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIFlVVjQyMHRvWVVWNDIwIGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiArOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUkFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiAtOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhckFkc0FybTlFCi0vKiAgICAgICAgICAgICAgICBHQ0MgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBHZW5lcmljIEFSTSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0KLSNlbGlmIGRlZmluZWQgR0NDX0FSTQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgR0NDX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RQotCi0vKiBUSSBDQ1MgYXNzZW1ibHkgZmlsZXMgKi8KLSNlbGlmIGRlZmluZWQgVEk0MTFfQVJNOUUKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJlc2l6ZWQgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUmVzaXplZCBSR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgYW5kIFJvdGF0ZWQgKC05MCkgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBhbmQgUm90YXRlZCAoKzkwKSBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIFlVVjQyMChQbGFuYXIpICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uIHdpdGggcm90YXRpb24oLTkwKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gd2l0aCByb3RhdGlvbigrOTApICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRUaTQxMUFybTlFCi0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUlRpNDExQXJtOUUKLQotLyogICAgICAgIEFOU0kgQyBGdW5jdGlvbnMgICAgICAgICovCi0jZWxzZQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCUkc1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQlJHODg4IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotICAgIC8qKiBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBSR0IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1lVVjQyMCBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gKzkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uIC05MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBJbWFnZSBhbmQgc3RvcmVzIGluIFlVVjQyMiBJbnRlcmxlYXZlZCBmb3JtYXQKLSAgICAgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMkludGVybGVhdmVkKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSNlbmRpZgotCi0gICAgLyoqIGRlZmluaXRpb24gb2YgdGhlIGNvbnZlcnRlciBmdW5jdGlvbiB0eXBlcyAqLwotCi0gICAgdHlwZWRlZiBNNFZJRklfVUludDggTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUodm9pZAotICAgICAgICAqcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBpbiwgTTRWSUZJX0ltYWdlUGxhbmUqIG91dCk7Ci0KLSAgICAvKiogZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc2luZyBmdW5jdGlvbiB0eXBlcyAqLwotICAgIHR5cGVkZWYgTTRWSUZJX1VJbnQ4IE00VklGSV9QcmVwcm9jZXNzRnVuY3Rpb25UeXBlKHZvaWQKLSAgICAgICAgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogaW4sIE00VklGSV9JbWFnZVBsYW5lKiBvdXQpOwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCi19Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX000VklGSV9GSUxURVJTQVBJX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9GaWx0ZXJzQVBJLmggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NWNhMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlBQX0FQSS5oCi0gKiBAYnJpZWYgICAgVmlkZW8gcHJlcHJvY2Vzc2luZyBBUEkgcHVibGljIGZ1bmN0aW9ucyBwcm90b3R5cGVzLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWUFBfQVBJX0gKLSNkZWZpbmUgTTRWUFBfQVBJX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCB0eXBlcyAqLwotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCBlcnJvcnMgKi8KLQotLyoqCi0gKiAgICBJbmNsdWRlIFZpZGVvIGZpbHRlcnMgaW50ZXJmYWNlIGRlZmluaXRpb24gKGZvciB0aGUgTTRWSUZJX0ltYWdlUGxhbmUgdHlwZSkgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdWJsaWMgdHlwZSBvZiB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBleGVjdXRpb24gY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRWUFBfQ29udGV4dDsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWUFBfa0lZVVY0MjA9MCwgICAgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00VlBQX2tJWVVWNDIyLCAgICAgICAgLyoqPCBZVVY0MjIgcGxhbmFyICovCi0gICAgTTRWUFBfa0lZVVlWLCAgICAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00VlBQX2tJVVlWWSwgICAgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGNocm9tYSBmaXJzdCAqLwotICAgIE00VlBQX2tJSlBFRywgICAgICAgIC8qKjwgSlBFRyBjb21wcmVzc2VkIGZyYW1lcyAqLwotICAgIE00VlBQX2tJUkdCNDQ0LCAgICAgICAgLyoqPCBSR0IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00VlBQX2tJUkdCNTU1LCAgICAgICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00VlBQX2tJUkdCNTY1LCAgICAgICAgLyoqPCBSR0IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00VlBQX2tJUkdCMjQsICAgICAgICAvKio8IFJHQiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRWUFBfa0lSR0IzMiwgICAgICAgIC8qKjwgUkdCIDMyIGJpdHMgICovCi0gICAgTTRWUFBfa0lCR1I0NDQsICAgICAgICAvKio8IEJHUiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRWUFBfa0lCR1I1NTUsICAgICAgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRWUFBfa0lCR1I1NjUsICAgICAgICAvKio8IEJHUiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRWUFBfa0lCR1IyNCwgICAgICAgIC8qKjwgQkdSIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNFZQUF9rSUJHUjMyICAgICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByb3RvdHlwZSBvZiB0aGUgbWFpbiB2aWRlbyBwcmVwcm9jZXNzaW5nIGZ1bmN0aW9uCi0gKiBAbm90ZSAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBWUFAuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00VlBQX2FwcGx5X2ZjdCkgKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2luaXRWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCogcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBWaWRlbyBQcmVwcm9jZXNzaW5nIGNvbXBvbmVudC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChPVVQpIEV4ZWN1dGlvbiBjb250ZXh0IGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9pbml0VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfYXBwbHlWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBQbGFuZUluIG9yIHBQbGFuZU91dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IFZpZGVvIFByZXByb2Nlc3NpbmcgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9hcHBseVZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgZnJlZXMgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBjb21wb25lbnQuCi0gKiAgICAgICAgICAgIEFueSBmdXJ0aGVyIHVzYWdlIG9mIHRoZSBjb250ZXh0IHdpbGwgbGVhZCB0byB1bnByZWRpY3RhYmxlIHJlc3VsdC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9zZXRWaWRlb1ByZXByb2Nlc3NpbmdNb2RlKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VkVTX0lucHV0VmlkZW9Gb3JtYXQgZm9ybWF0KQotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFwcGx5IHRoZSB2aWRlbyBwcmVwcm9jZXNzaW5nIHRvIHRoZSBpbnB1dCBwbGFuZS4gUmVzdWx0IGlzIHB1dCBpbnRvIHRoZQotICogICAgICAgICAgIG91dHB1dCBwbGFuLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIGZvcm1hdCAgOiAgICAoSU4pIEZvcm1hdCBvZiBpbnB1dCBwbGFuZSAocmdiLCB5dXYsIC4uLikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfc2V0VmlkZW9QcmVwcm9jZXNzaW5nTW9kZShNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0IGZvcm1hdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlZmluaXRpb24gb2YgdGhlIGVycm9ycyBzcGVjaWZpYyB0byB0aGlzIG1vZHVsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKjwgSW5wdXQgYW5kIG91dHB1dCBwbGFuZXMgaGF2ZSBpbmNvbXBhdGlibGUgcHJvcGVydGllcyAqLwotI2RlZmluZSBNNFZQUF9FUlJfSU1DT01QQVRJQkxFX0lOX0FORF9PVVRfUExBTkVTICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgIE00UFJFUFJPQ0VTU19WSURFTywgMHgwMDAwMDEpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogTTRWUFBfQVBJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJiN2I4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00V1JJVEVSX2NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVkVTIHdyaXRlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IHdyaXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRXUklURVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000V1JJVEVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiICAgLyogZm9yIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIiAgIC8qIGZvciBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqLwotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiICAgICAgIC8qIGZvciBNNFdSSVRFUl9DT01NT04gKi8KLQotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIiAgICAgICAvKiBmb3IgTTRTWVNfU3RyZWFtSUQgKi8KLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiICAgLyogZm9yIE00U1lTX0FjY2Vzc1VuaXQgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00V0FSX1dSSVRFUl9TVE9QX1JFUSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V1JJVEVSX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIG91dHB1dCBmaWxlIGZvcm1hdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9rVW5rbm93bj0tMSwKLSAgICBNNFdSSVRFUl9rM0dQUD0wLCAgICAgICAgICAgIC8qKjwgM0dQUCBjb21wbGlhbnQgZmlsZSAqLwotICAgIE00V1JJVEVSX2tBVkk9MSwgICAgICAgICAgICAvKio8IEFWSSBmaWxlICovCi0gICAgTTRXUklURVJfa0FNUj0yLCAgICAgICAgICAgIC8qKjwgQU1SIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rTkVUV09SSzNHUFA9MywgICAgLyoqPCAzR1BQIHZpYSBUQ1AgKi8KLSAgICBNNFdSSVRFUl9rUENNPTQsICAgICAgICAgICAgLyoqPCBQQ00gZmlsZSAqLwotICAgIE00V1JJVEVSX2tKUEVHPTUsICAgICAgICAgICAgLyoqPCBKUEVHIEVYSUYgd3JpdGVyICovCi0gICAgTTRXUklURVJfa01QMz02LCAgICAgICAgICAgIC8qKjwgTVAzIHdyaXRlciAqLwotCi0gICAgTTRXUklURVJfa1R5cGVfTkIgIC8qIG51bWJlciBvZiB3cml0ZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00V1JJVEVSX091dHB1dEZpbGVUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgTTRXUklURVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLiBBbGwgdGhlIHJldXR1cm5lZCB2YWx1ZXMgYXJlIGluCi0gKiAgICAgICAgICAgTTRPU0FfVUludDMyIHR5cGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFdSSVRFUl9rTWF4QVVTaXplICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUR8TTRfV1JJVEUsIE00V1JJVEVSX0NPTU1PTiwgMHgwMSksCi0gICAgTTRXUklURVJfa01heENodW5ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEfE00X1dSSVRFLCBNNFdSSVRFUl9DT01NT04sIDB4MDIpLAotICAgIE00V1JJVEVSX2tGaWxlU2l6ZSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgICAgICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDAzKSwgIC8qKjwgRmlsZSBzaXplIGlmIHRoZSBwcm9jZXNzIHdhcyBlbmRlZCB3aGVuIHdlIGNhbGwgdGhlIG1ldGhvZCAqLwotICAgIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDQpLCAgICAvKio8IEZpbGUgc2l6ZSBpZiB0aGUgcHJvY2VzcyB3YXMgZW5kZWQgd2hlbiB3ZSBjYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZXN0aW1hdGVkIHNpemUgZm9yIGF1ZGlvICovCi0gICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA1KSwgICAgLyoqPCBTdHJpbmcgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZShTVyAtIFZFUykgKi8KLSAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDYpLCAgICAvKio8IFZlcnNpb24gZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNyksICAgIC8qKjwgU3RyaW5nIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKGNoYXJbNjBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlZ3JhdGlvbiBwdXJwb3NlKSAqLwotICAgIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDgpLCAgICAvKio8IE1heGltdW0gZmlsZSBzaXplIGxpbWl0YXRpb24gKi8KLSAgICBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDkpLCAgICAvKio8IE1heGltdW0gZmlsZSBkdXJhdGlvbiBsaW1pdGF0aW9uICovCi0gICAgTTRXUklURVJfa1NldEZ0eXBCb3ggICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBBKSwgICAgLyoqPCBTZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBNNFdSSVRFUl9rTWV0YURhdGEgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQiksICAgIC8qKjwgQWRkaXRpb25uYWwgaW5mb3JtYXRpb24gdG8gc2V0IGluIHRoZSBmaWxlICovCi0gICAgTTRXUklURVJfa0RTSSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBDKSwgICAgLyoqPCBUbyBzZXQgRFNJIG9mIHRoZSBmaWxlIChEZWNvZGVyIHNwZWNpZmMgaW5mbykgKi8KLSAgICBNNFdSSVRFUl9rSnBlZ1Jlc2VydmVGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEQpLCAgICAvKio8IFJlc2VydmUgc29tZSBzcGFjZSBpbiB0aGUgZmlsZSBmb3IgSlBFRyBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBkYXRhICovCi0gICAgTTRXUklURVJfa0pwZWdTZXRGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEUpLCAgICAvKio8IFdyaXRlIEZhc3QgUHJvY2Vzc2luZyBEYXRhIGluIHRoZSBmaWxlKi8KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotICAgIE00V1JJVEVSX2tNVUxfUFBTX1NQUyAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIE00V1JJVEVSX0NPTU1PTiwgMHgwRikKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotfSBNNFdSSVRFUl9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgYW4gaGVhZGVyIGlzIHB1dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBCdWY7ICAgICAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhICovCi19IE00V1JJVEVSX0hlYWRlcjsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgdmlkZW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAqICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgV2lkdGggKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgZnBzOyAgICAgICAgICAgICAgICAvKio8IFRhcmdldHRlZCBmcmFtZXJhdGUgb2YgdGhlIHZpZGVvICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgb2YgdGhlIHZpZGVvIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIgc2V0IHRvIE5VTEwgaWYgbm8gaGVhZGVyIHByZXNlbnQgKi8KLX0gTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgYXVkaW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iU2FtcGxlc1BlclNlYzsgICAgLyoqPCBOdW1iZXIgb2YgU2FtcGxlcyBwZXIgc2Vjb25kICovCi0gICAgTTRPU0FfVUludDE2ICAgIG5iQml0c1BlclNhbXBsZTsgICAgLyoqPCBOdW1iZXIgb2YgQml0cyBpbiAxIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlIGF1ZGlvc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyIHNldCB0byBOVUxMIGlmIG5vIERTSSBwcmVzZW50ICovCi19IE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFdSSVRFUl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBvcmllbnRhdGlvbiBvZiBhIGZyYW1lIGFzIGRlc2NyaWJlZAotICogICAgICAgICAgICBpbiB0aGUgRVhJRiBzdGFuZGFyZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblVua25vd24gPSAwLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblRvcFJpZ2h0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uQm90dG9tUmlnaHQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uTGVmdFRvcCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblJpZ2h0VG9wLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25MZWZ0Qm90dG9tCi19TTRXUklURVJfT3JpZW50YXRpb24gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9NZXRhRGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBtZXRhIGRhdGEgdG8gc3RvcmUgaW4gdGhlIGVuY29kZWQgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBQaG9uZU1hbnVmYWN0dXJlciA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgUGhvbmVNb2RlbCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQXJ0aXN0IDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFNvZnR3YXJlIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDcmVhdGlvbkRhdGU7Ci0gICAgTTRXUklURVJfT3JpZW50YXRpb24gICAgT3JpZW50YXRpb24gOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgV2lkdGggOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEhlaWdodCA7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBUaHVtYm5haWxXaWR0aCA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgVGh1bWJuYWlsSGVpZ2h0IDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFRodW1ibmFpbFByZXNlbmNlIDsKLX1NNFdSSVRFUl9NZXRhRGF0YTsKLQotCi10eXBlZGVmIHZvaWQqIE00V1JJVEVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9vcGVuV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCogaENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0RmlsZURlc2NyaXB0b3IsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlcixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wRmlsZURlc2NyaXB0b3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkZXJQb2ludGVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9hZGRTdHJlYW0pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbipzdHJlYW1EZXNjcmlwdGlvbik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfc3RhcnRXcml0aW5nKSAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2Nsb3NlV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX3NldE9wdGlvbikgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfZ2V0T3B0aW9uKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRXUklURVJfb3BlbldyaXRlKiAgICAgICAgICAgICBwRmN0T3BlbjsKLSAgICBNNFdSSVRFUl9hZGRTdHJlYW0qICAgICAgICAgICAgICAgIHBGY3RBZGRTdHJlYW07Ci0gICAgTTRXUklURVJfc3RhcnRXcml0aW5nKiAgICAgICAgICBwRmN0U3RhcnRXcml0aW5nOwotICAgIE00V1JJVEVSX2Nsb3NlV3JpdGUqICAgICAgICAgICAgcEZjdENsb3NlV3JpdGU7Ci0gICAgTTRXUklURVJfc2V0T3B0aW9uKiAgICAgICAgICAgICAgICBwRmN0U2V0T3B0aW9uOwotICAgIE00V1JJVEVSX2dldE9wdGlvbiogICAgICAgICAgICAgICAgcEZjdEdldE9wdGlvbjsKLX0gTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlOwotCi10eXBlZGVmIE00T1NBX0VSUiAgTTRXUklURVJfc3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLXR5cGVkZWYgTTRPU0FfRVJSICBNNFdSSVRFUl9wcm9jZXNzQVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIHRvIHdyaXRlIGRhdGEgd2l0aCBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfRGF0YUludGVyZmFjZQotewotICAgIE00V1JJVEVSX3N0YXJ0QVUqICAgIHBTdGFydEFVOwotICAgIE00V1JJVEVSX3Byb2Nlc3NBVSogcFByb2Nlc3NBVTsKLQotICAgIE00V1JJVEVSX0NvbnRleHQgICAgcFdyaXRlckNvbnRleHQ7Ci0KLX0gTTRXUklURVJfRGF0YUludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFdSSVRFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg3NTQ1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9CaXRTdHJlYW1QYXJzZXIuaAotICogQGJyaWVmICBNUEVHLTQgRmlsZSBGb3JtYXQgYml0IHN0cmVhbSB1dGlsaXR5Ci0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIHRvIHBhcnNlIE1QRUcgc3BlY2lmaWMKLSAqICAgICAgICAgZGF0YSBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fCi0jZGVmaW5lIF9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9Jbml0LgotKgotKiBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgYW5kIGluaXRpYWxpemVzIGludGVybmFsIGRhdGEKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlIC0gQUxMT0NBVEVEIEJZIFRIRQotKiAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04gKE00T1NBX05VTEwgaWYgYWxsb2NhdGlvbiBmYWlscykKLSogQHBhcmFtIGJpdFN0cmVhbSAgOiBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSAtIG11c3QgYmUgMzIgYml0cyBhcyBhY2Nlc3MgYXJlIDMyIGJpdHMKLSogQHBhcmFtIHNpemUgICAgICAgIDogVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX0luaXQodm9pZCoqIHBDb250ZXh0LCB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW4gdXAgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9DbGVhblVwKHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBsZW5ndGggICAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXRzIHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiBAcmV0dXJuICAgIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX1Nob3dCaXRzKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbmNyZW1lbnQgdGhlIGJpdHN0cmVhbSBwb2ludGVyIG9mIDxsZW5ndGg+IGJpdHMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9GbHVzaEJpdHModm9pZCogcENvbnRleHQsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEl0IGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSAqIEBwYXJhbSBsZW5ndGggICAgICAgIDogVGhlIG51bWJlciBvZiBiaXQgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBAcmV0dXJucyB0aGUgcmVhZCBiaXRzCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRCaXRzKHZvaWQqIHBDb250ZXh0LE00T1NBX0ludDMyIGJpdFBvcywgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0IHJlc2V0cyB0aGUgYml0c3RyZWFtIGluZGV4ZXMuCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX1Jlc3RhcnQodm9pZCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqIEBub3RlICAgIEl0IHNob3VsZCBiZSB1c2VkIGNhcmVmdWxseSBhcyB0aGUgcG9pbnRlciBpcyBpbiB0aGUgYml0c3RyZWFtIGl0c2VsZgotICogICAgICAgICAgICBhbmQgbm8gY29weSBpcyBtYWRlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSovCi1NNE9TQV9VSW50OCogIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRDdXJyZW50Yml0U3RyZWFtUG9pbnRlcih2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSBnZXRzIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qCi0qIEByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSovCi1NNE9TQV9JbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCk7Ci0KLXZvaWQgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfSW5pdCh2b2lkKiogcENvbnRleHQsIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpOwotCi0vKioKLSogZ2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyIHJldHVybnMgYSBkZWNvZGVkIHNpemUgdmFsdWUgZnJvbSBhbiBlbmNvZGVkIG9uZSAoU0RMKQotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSogQHBhcmFtIHZhbCA6IGVuY29kZWQgdmFsdWUKLSoKLSogQHJldHVybnMgc2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSovCi0KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwgTTRPU0FfVUludDMyIHZhbCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVjb2RlIGFuIE1QRUc0IFN5c3RlbXMgZGVzY3JpcHRvciBzaXplIGZyb20gYW4gZW5jb2RlZCBTREwgc2l6ZSBkYXRhLgotICogQG5vdGUgICAgVGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBiaXRzdHJlYW0gbG9jYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiAgICBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tU3RyZWFtKHZvaWQqIHBDb250ZXh0KTsKLQotI2VuZGlmIC8qX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzYwYTdkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9Db21tb24uaAotICogQGJyaWVmICBDb21tb24gZGF0YSBzdHJ1Y3R1cmUgYmV0d2VlbiBzaGVsbHMKLSAqIEBub3RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBfcGFyYW1ldGVyU2V0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgYXZjCi0gKiAgICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfcGFyYW1ldGVyU2V0Ci17Ci0gICAgTTRPU0FfVUludDE2IG1fbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMqLwotICAgIE00T1NBX1VJbnQ4KiBtX3BQYXJhbWV0ZXJTZXRVbml0OyAgIC8qIEFycmF5IG9mIGl0ZW1zKi8KLX0gUGFyYW1ldGVyU2V0IDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX2F2Y1NwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2Ygc3BlY2lmaWMgaW5mbyBmb3IgdGhlIGF2YyBkZWNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8KLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9uYWxVbml0TGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIE5BTFVuaXRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIGEgQVZDIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyAgIC8qIE51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgICAgLyogTnVtYmVyIG9mIHBpY3R1cmUgcGFyYW1ldGVyIHNldHMqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ7ICAgICAgICAvKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi0gICAgUGFyYW1ldGVyU2V0ICAgICptX3BQaWN0dXJlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogUGljdHVyZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi19IEF2Y1NwZWNpZmljSW5mbyA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N5bnRoZXNpc0F1ZGlvSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBzcGVjaWZpYyBwb2ludGVycyB1c2VkIGZvciBzeW50aGVzaXMgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3N5bnRoZXNpc0F1ZGlvSW5mbwotewotICAgIE00T1NBX1ZvaWQqICAgICAgICBtX3BJbnB1dEJ1ZjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRJbmZvOwotICAgIE00T1NBX1VJbnQxNiAgICBtX3VpTmJTdWJGcmFtZVBlclN0ZXA7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fdWlVc2VkQnl0ZXM7Ci19IE00X1N5bnRoZXNpc0F1ZGlvSW5mbzsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIHN0YXRlcyBtb2RlcyBmb3IgRG93biBzYW1wbGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rRFNfT0ZGICAgID0gMCwgICAgICAgIC8qKjwgTm8gRG93biBzYW1wbGluZyAqLwotICAgIEFBQ19rRFNfQllfMiAgID0gMSwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gQUFDIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBIRV9BQUMgYW5kIGlucHV0IGlzIEFBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLihObyBkb3duc2FtcGluZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBIRV9BQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcSAoRG93bnNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyBpbiBTQlIgdG9vbCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHByb2ZpbGUgPSBIRV9BQUNfdjIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkICovCi0gICAgQUFDX2tEU19CWV8zICAgPSAyLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDMgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzQgICA9IDMsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgNCAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotICAgIEFBQ19rRFNfQllfOCAgID0gNCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDggIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLQotfSBNNF9BQUNEb3duc2FtcGxpbmdNb2RlOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNPdXRwdXRNb2RlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3V0cHV0IG1vZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa01vbm8gICAgICA9IDAsICAgIC8qKjwgT3V0cHV0IGlzIE1vbm8gICovCi0gICAgQUFDX2tTdGVyZW8gICAgPSAxICAgICAvKio8IE91dHB1dCBpcyBTdGVyZW8gKi8KLX0gTTRfQUFDT3V0cHV0TW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRGVjUHJvZmlsZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFBQyBkZWNvZGVyIHByb2ZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0FBQyAgICAgICA9IDAsICAgICAgICAvKio8IEFBQyBwcm9maWxlIChvbmx5IEFBQyBMQyBvYmplY3QgYXJlIHN1cHBvcnRlZCkgKi8KLSAgICBBQUNfa0hFX0FBQyAgICA9IDEsICAgICAgICAvKio8IEhFIEFBQyBvciBBQUMrIHByb2ZpbGUgKFNCUiBpbiBMUCBNb2RlKSAgKi8KLSAgICBBQUNfa0hFX0FBQ192MiA9IDIgICAgICAgIC8qKjwgSEUgQUFDIHYyIG9yIEVuaGFuY2VkIEFBQysgcHJvZmlsZSAoU0JSIFRvb2wgaW4gSFEgTW9kZSkgKi8KLX0gTTRfQUFDRGVjUHJvZmlsZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BYWNEZWNvZGVyQ29uZmlnCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3BlY2lmaWMgc2V0dGluZ3MgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICB0aGUgdXNlciByZXF1aXJlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X0FBQ0RlY1Byb2ZpbGUgICAgICAgIG1fQUFDRGVjb2RlclByb2ZpbGU7Ci0gICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZSAgICBtX0Rvd25TYW1wbGluZ01vZGU7Ci0gICAgTTRfQUFDT3V0cHV0TW9kZSAgICAgICAgbV9PdXRwdXRNb2RlOwotCi19IE00X0FhY0RlY29kZXJDb25maWc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHVzZXIncyBkYXRhIG5lZWRlZCB0byBkZWNvZGUgdGhlCi0gKiAgICAgICAgICAgIEFBQ3BsdXMgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGUgZmllbGQgbV9wRmlyc3RBVSBpcyB1c2VkIGluIGNhc2Ugb2YgbG9jYWwgZmlsZXMgICAgYW5kCi0gKiAgICAgICAgICAgIHRoZSBmaWVsZCBtX2JJc1NickVuYWJsZWQgaXMgdXNlZCBpbiBzdHJlYW1pbmcgY2FzZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcEZpcnN0QVU7ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZpcnN0IEFVIGZyb20gd2hlcmUgU0JSIGRhdGEgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgKGxvY2FsIGZpbGUgY2FzZSkqLwotICBNNE9TQV9Cb29sICAgICAgICAgICAgbV9iSXNTYnJFbmFibGVkOyAgICAgICAgLyoqPCBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHN0cmVhbSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ3BsdXMgKHN0cmVhbWluZyBjYXNlKSovCi0gIE00X0FhY0RlY29kZXJDb25maWcqICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnOy8qKjwgRGVjb2RlciBzcGVjaWZpYyB1c2VyIHNldHRpbmcgKi8KLQotfSBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhOwotCi0jZW5kaWYgLyogX19NNF9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZTA4MjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNF9VdGlscy5oCi0gKiBAYnJpZWYgICAgVXRpbGl0aWVzCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IG1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9VVElMU19IX18KLSNkZWZpbmUgX19NNF9VVElMU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiAgICBNNF9NZWRpYVRpbWUgZGVmaW5pdGlvbgotICAgIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgc29tZSBzaGVsbCBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLXR5cGVkZWYgTTRPU0FfRG91YmxlICAgIE00X01lZGlhVGltZTsKLQotLyogICAgR0VUX01FTU9SWTMyIG1hY3JvIGRlZmluaXRpb24KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgdGhlIDNHUCByZWFkZXIqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKCAoKCh4KSYweGZmKTw8MjQpIHwgKCgoeCkmMHhmZjAwKTw8OCkgfFwKLSAgICAgKCgoeCkmMHhmZjAwMDApPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDApPj4yNCkgKQotI2VuZGlmIC8qX19CSUdfRU5ESUFOKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRfVVRJTFNfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3ZDAzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKLSAqIEBicmllZiAgICBWaWRlbyBFZGl0aW5nIChWU1MzR1BQLCBNQ1MsIFBUTzNHUFApIGNvbW1vbiBkZWZpbml0aW9ucwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgVmVyc2lvbiAqLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICAgIDMKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAgICAxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04gICAgMAotCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRSAweDdmZmZmZmZmCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUwgMHg3ZmZmZmZmZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgZm9ybWF0IHR5cGUgdG8gYmUgdXNlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgICAgICAgID0gMCwgICAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgJiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICAgICAgICAgPSAxLCAgICAgIC8qKjwgTVA0ICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICAgICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgICAgICAgICA9IDIsICAgICAgLyoqPCBBTVIgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyAgICAgICAgID0gMywgICAgICAvKio8IE1QMyAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNICAgICAgICAgPSA0LCAgICAgIC8qKjwgUENNIFJBVyBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICBSQyAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcgICAgICAgICA9IDUsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEpQRyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBBTkQgT1VUUFVUICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCAgICAgICAgID0gNiwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQk1QIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfR0lGICAgICAgICAgPSA3LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBHSUYgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcgICAgICAgICA9IDgsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IFBORyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICAgID0gOSwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQVJHQjg4ODggZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgICAgICAgICA9IDEwLCAgICAgLyoqPCBNNFYgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkID0gMjU1ICAgICAvKio8IFVuc3VwcG9ydGVkIGZpbGUgbWVkaWEgdHlwZSAgICAgICAgICAgKi8KLX0gTTRWSURFT0VESVRJTkdfRmlsZVR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvID0gMCwgLyoqPCBWaWRlbyBub3QgcHJlc2VudCAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjYzID0gMSwgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjQgPSAyLCAgICAvKio8IEgyNjQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTVBFRzQgPSAzLCAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPSAyNTQsICAvKio8IERvIG5vdCBjYXJlIHZpZGVvIHR5cGUsIHVzZSBOVUxMIGVuY29kZXIgKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbyA9IDI1NSAgICAvKio8IFVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSB0eXBlICovCi19IE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBhdWRpbyBmb3JtYXQuCi0gKiBAbm90ZSAgICBIRV9BQUMsIEhFX0FBQ192MiBhbmQgTVAzIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gICAgICAgICAgICA9IDAsICAgIC8qKjwgQXVkaW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rQU1SX05CICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQU1SIE5hcnJvdyBCYW5kIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FBQyAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEFBQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICAgICAgICAgICAgID0gNCwgICAgLyoqPCBFbmhhbmNlZCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QMyAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tFVlJDICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFVlJDIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa1BDTSAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFBDTSBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8gICAgICAgICAgID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSBhdWRpbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW8gICAgPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgb3V0cHV0IGZyYW1lIHNpemVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tTUUNJRj0wLCAvKio8IFNRQ0lGIDEyOHg5NiAgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVFWR0EsICAgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FDSUYsICAgIC8qKjwgUUNJRiAgMTc2eDE0NCAqLwotICAgIE00VklERU9FRElUSU5HX2tRVkdBLCAgICAvKio8IFFWR0EgIDMyMHgyNDAgKi8KLSAgICBNNFZJREVPRURJVElOR19rQ0lGLCAgICAgLyoqPCBDSUYgICAzNTJ4Mjg4ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1ZHQSwgICAgIC8qKjwgVkdBICAgNjQweDQ4MCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00VklERU9FRElUSU5HX2tXVkdBLCAgICAvKio8IFdWR0EgODAweDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2tOVFNDLCAgICAvKio8IE5UU0MgNzIweDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRWSURFT0VESVRJTkdfazY0MF8zNjAsICAvKio8IDY0MHgzNjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rODU0XzQ4MCwgIC8qKjwgODU0eDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMjgwXzcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazEwODBfNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rOTYwXzcyMCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCAvKio8MTA4MHAgMTkyMHgxMDgwKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvZnJhbWVyYXRlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2s1X0ZQUyA9IDAsCi0gICAgTTRWSURFT0VESVRJTkdfazdfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTJfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjBfRlBTLAotICAgIE00VklERU9FRElUSU5HX2syNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazMwX0ZQUwotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY2llcwotICogQG5vdGUgICAgOCBrSHogaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGZyZXF1ZW5jeSBmb3IgQU1SLU5CIG91dHB1dAotICogQG5vdGUgICAgMTYga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFBQyBvdXRwdXQKLSAqIEBub3RlICAgIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0byB1c2UgdGhlIERlZmF1bHQgdmFsdWUgd2hlbiBzZXR0aW5nIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0YgICAgPSAwLCAgICAvKio8IERlZmF1bHQgQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvciBzZWxlY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIG91dHB1dCBmb3JtYXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rODAwMF9BU0YgICAgPSA4MDAwLCAgICAvKio8IE5vdGU6IERlZmF1bHQgYXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUi1OQiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGICAgID0gMTEwMjUsCi0gICAgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRiAgICA9IDEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0YgICAgPSAxNjAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUFDIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2syMjA1MF9BU0YgICAgPSAyMjA1MCwKLSAgICBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGICAgID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRiAgICA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0YgICAgPSA0NDEwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGICAgID0gNDgwMDAKLQotfSBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgYXVkaW8gb3IgdmlkZW8gYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgPSAtMSwgICAgIC8qIG5vIHJlZ3VsYXRpb24gKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSA9IDAsICAgLyogdW5kZWZpbmVkICovCi0gICAgTTRWSURFT0VESVRJTkdfazhfS0JQUyA9IDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTID0gOTIwMCwgICAgICAgIC8qIGV2cmMgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgPSAxMjIwMCwgICAgICAvKiBhbXIgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxNl9LQlBTID0gMTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFMgPSAyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUyA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0MF9LQlBTID0gNDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFMgPSA0ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTZfS0JQUyA9IDU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTID0gNjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwX0tCUFMgPSA4MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOTZfS0JQUyA9IDk2MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxMTJfS0JQUyA9IDExMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE2MF9LQlBTID0gMTYwMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjI0X0tCUFMgPSAyMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syODhfS0JQUyA9IDI4ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzIwX0tCUFMgPSAzMjAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTID0gMzg0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMgPSA4MDAwMDAsCi0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICBNNFZJREVPRURJVElOR19rMl9NQlBTID0gMjAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNV9NQlBTID0gNTAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOF9NQlBTID0gODAwMDAwMCwKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotfSBNNFZJREVPRURJVElOR19CaXRyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklERU9FRElUSU5HX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgICAgLyogZ2VuZXJhbGx5ICcwMDAwJyBvciAneC54ICcgICovCi0gICAgTTRPU0FfVUludDMyICAgIG5iQ29tcGF0aWJsZUJyYW5kczsgICAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000VklERU9FRElUSU5HX01BWF9DT01QQVRJQkxFX0JSQU5EU107IC8qIGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGNvbXBhdGlibGUgYnJhbmRzICovCi0KLX0gTTRWSURFT0VESVRJTkdfRnR5cEJveDsKLQotLyogU29tZSB1c2VmdWwgYnJhbmRzICovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzAwMDAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0cyQSAgMHgzMzY3MzI2MQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A0ICAweDMzNjc3MDM0Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDUgIDB4MzM2NzcwMzUKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNiAgMHgzMzY3NzAzNgotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9BVkMxICAweDYxNzY2MzMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0VNUCAgIDB4NjU2RDcwMjAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfSVNPTSAgMHg2OTczNkY2RAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQxICAweDZENzAzNDMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX01QNDIgIDB4NkQ3MDM0MzIKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfVkZKMSAgMHg3NjY2NkEzMQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGlucHV0IGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiQW5hbHlzZWQ7ICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgZmlsZSBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gYWxyZWFkeSBhbmFseXNlZCBvciBub3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uWzNdOyAgICAgICAgICAvKio8IFZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBjbGlwIGFuYWx5c2lzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwRHVyYXRpb247ICAgICAgLyoqPCBDbGlwIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgKi8KLSAgICBNNFZJREVPRURJVElOR19GdHlwQm94ICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgICAvKio8IDNncCAnZnR5cCcgYXRvbSwgbWFqb3JfYnJhbmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCB1c2VkICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKio8IFZpZGVvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgICAvKio8IFZpZGVvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgLyoqPCBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAvKio8IFZpZGVvIGZyYW1lIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgLyoqPCBWaWRlbyBmcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAvKio8IFZpZGVvIHRpbWUgc2NhbGUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICBmQXZlcmFnZUZyYW1lUmF0ZTsgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyIHVpVmlkZW9MZXZlbDsgICAvKio8IHZpZGVvIGxldmVsKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvUHJvZmlsZTsgLyoqPCB2aWRlbyBwcm9maWxlICovCi0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRkYXRhUGFydGl0aW9uOyAvKio8IE1QRUctNCB1c2VzIGRhdGEgcGFydGl0aW9uaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cnZsYzsgICAgICAgICAgLyoqPCBNUEVHLTQgdXNlcyBSVkxDIHRvb2wgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRyZXN5bmNoTWFya2VyOyAvKio8IE1QRUctNCBzdHJlYW0gdXNlcyBSZXN5bmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VyICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb0R1cmF0aW9uOyAvKio8IEF1ZGlvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgICAvKio8IEF1ZGlvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoODAwMCBmb3IgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUMrLCBlQUFDKyBzdHJlYW1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWNvZGVkUGNtU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBkYXRhICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlZGl0aW5nIGNvbXBhdGliaWxpdHkgY2hhcnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0VkaXRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RyZWFtIGNhbiBiZSBkZWNvZGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgcHJvcGVydGllcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFN0aWxsIFBpY3R1cmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVN0aWxsUGljV2lkdGg7ICAgICAgICAvKio8IEltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY0hlaWdodDsgICAgICAgLyoqPCBJbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2U7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEltYWdlRGF0YTsKLQotICAgIE00T1NBX0ludDMyICAgICB2aWRlb1JvdGF0aW9uRGVncmVlczsgICAgICAgIC8qKjwgVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXM7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjFjOGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NT05PVE8ySV8xNl9IXwotI2RlZmluZSBfTU9OT1RPMklfMTZfSF8KLQotCi12b2lkIE1vbm9UbzJJXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmICAvKiBfTU9OT1RPMklfMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWI2MmUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQURFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5hbXIgZmlsZXMgKi8KLQotLyogLS0tLS0gM0dQUCAgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDQsIC4zZ3AgZmlsZXMgKi8KLQotCi0vKiAtLS0tLSBNUDMgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDMgZmlsZXMgKi8KLQotLyogLS0tLS0gUkFXIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAucGNtIGZpbGVzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVDT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSAgQU1SIE5CIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQU1SIE5CIHN0cmVhbXMgKi8KLQotLyogLS0tLS0gQUFDIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQUFDLCBBQUMrIGFuZCBlQUFDKyBzdHJlYW1zICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotCi0vKiAtLS0tLSBNUDQvSDI2MyB2aWRlbyBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IG1wZWc0IGFuZCBIMjYzIGRlY29kZXJzICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotI2RlZmluZSBHRVRfREVDT0RFUl9DT05GSUdfSU5GTwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgICAgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEgyNjQgZGVjb2RlcnMgKi8KLQotLyogLS0tLS0gTVAzIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBNUDMgZGVjb2RlcnMgKi8KLQotCi0vKiAtLS0tLSBOVUxMIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAgICAgICAgLyoqIFtkZWZhdWx0XSBTdXBwb3J0IFBDTSByZWFkaW5nICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUklURVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotCi0vKiAtLS0tLSAzZ3Agd3JpdGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNhcHN1bGF0aW5nIGluIDNncCBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbXIsYWFjfSB4IHttcGVnNCxoMjYzfSAqLwotCi0KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOQ09ERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gbXBlZzQgJiBoMjYzIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIG1wZWc0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2MyBmb3JtYXQge3l1dixyZ2J9ICovCi0KLS8qIC0tLS0tIGgyNjQgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0KLS8qIC0tLS0tIGFtciBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYW1yIDEyLjIgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0vKiAtLS0tLSBhYWMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYWFjIGZvcm1hdCB7YW1yLHdhdn0gKi8KLQotCi0vKiAtLS0tLSBtcDMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVAzICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXAzIGZvcm1hdCB7bXAzfSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRUFUVVJFUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tIFZTUzNHUFAgJiB4VlNTIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMgLyoqPCBbZGVmYXVsdF0gaWYgZGVmaW5lZCwgaW1wbGVtZW50YXRpb24gaXMgeFZTUyBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIFZTUzNHUFAgKi8KLQotLyogLS0tLS0gU1BTIC0tLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0vLyNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgR0lGIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0pQRUdfTk9UX1NVUFBPUlRFRCAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEpQRUcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgUE5HIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19XQk1QX05PVF9TVVBQT1JURUQgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFdCTVAgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19CR1I1NjVfQ09MT1JfT1VUUFVUIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IEJHUjI0KSAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFjZmNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICVuYW1lOiAgICAgICAgICBTU1JDLmggJSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgICBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3Mgb2YgdGhlIFNSQyBhcmUgYnkgZGVmYXVsdCBibG9ja3Mgb2YgNDAgbXMuICBUaGlzIG1lYW5zIHRoYXQKLSAgICB0aGUgZm9sbG93aW5nIGRlZmF1bHQgYmxvY2sgc2l6ZXMgYXJlIHVzZWQ6Ci0KLSAgICAgICAgICBGcyAgICAgRGVmYXVsdCBCbG9jayBzaXplCi0gICAgICAgIC0tLS0tICAgICAgICAtLS0tLS0tLS0tCi0gICAgICAgICA4MDAwICAgICAgICAgICAzMjAKLSAgICAgICAgMTEwMjUgICAgICAgICAgIDQ0MQotICAgICAgICAxMjAwMCAgICAgICAgICAgNDgwCi0gICAgICAgIDE2MDAwICAgICAgICAgICA2NDAKLSAgICAgICAgMjIwNTAgICAgICAgICAgIDg4MgotICAgICAgICAyNDAwMCAgICAgICAgICAgOTYwCi0gICAgICAgIDMyMDAwICAgICAgICAgIDEyODAKLSAgICAgICAgNDQxMDAgICAgICAgICAgMTc2NAotICAgICAgICA0ODAwMCAgICAgICAgICAxOTIwCi0KLSAgICBBbiBBUEkgaXMgcHJvdmlkZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaW50byBhbnkgbXVsdGlwbGUgb2YgdGhlIG1pbmltYWwKLSAgICBibG9jayBzaXplLgotCi0gICAgQWxsIHRoZSBzYW1wbGluZyByYXRlcyBhYm92ZSBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotKi8KLQotI2lmbmRlZiBfX1NTUkNfSF9fCi0jZGVmaW5lIF9fU1NSQ19IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNTUkNfSU5TVEFOQ0VfU0laRSAgICAgICAgICA1NDgKLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9BTElHTk1FTlQgICAgIDQKLSNkZWZpbmUgU1NSQ19TQ1JBVENIX0FMSUdOTUVOVCAgICAgIDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1NSQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBTU1JDX0lOVkFMSURfRlMgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAvKiBUaGUgaW5wdXQgb3IgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgICAgPSAyLCAgICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBlcXVhbCB0byBtb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdGVyZW8gKi8KLSAgICBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAvKiBPbmUgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIE5VTEwgKi8KLSAgICBTU1JDX1dST05HX05SX1NBTVBMRVMgICAgICAgPSA0LCAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgICAgID0gNSwgICAgICAgICAgICAgICAgLyogVGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGFsbGlnbmVkICovCi0gICAgU1NSQ19JTlZBTElEX01PREUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgLyogQSB3cm9uZyB2YWx1ZSBoYXMgYmVlbiB1c2VkIGZvciB0aGUgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgKi8KLSAgICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICAgICAgPSA3LCAgICAgICAgICAgICAgICAvKiBBbiBpbnZhbGlkIChvdXQgb2YgcmFuZ2UpIHZhbHVlIGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIG9uZSBvZiB0aGUgcGFyYW1ldGVycyAqLwotICAgIExWWFhYX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IFNTUkNfUmV0dXJuU3RhdHVzX2VuOwotCi0vKiBJbnN0YW5jZSBtZW1vcnkgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2UgWyBTU1JDX0lOU1RBTkNFX1NJWkUvNCBdOwotfSBTU1JDX0luc3RhbmNlX3Q7Ci0KLS8qIFNjcmF0Y2ggbWVtb3J5ICovCi10eXBlZGVmIExWTV9JTlQzMiBTU1JDX1NjcmF0Y2hfdDsKLQotLyogTnViZXIgb2Ygc2FtcGxlcyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX05SX1NBTVBMRVNfREVGQVVMVCAgICAgPSAwLAotICAgIFNTUkNfTlJfU0FNUExFU19NSU4gICAgICAgICA9IDEsCi0gICAgU1NSQ19OUl9TQU1QTEVTX0RVTU1ZICAgICAgID0gTFZNX01BWEVOVU0KLX0gU1NSQ19OUl9TQU1QTEVTX01PREVfZW47Ci0KLS8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX0luOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgU1NSQ19Gc19PdXQ7Ci0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICBTU1JDX05yT2ZDaGFubmVsczsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE5yU2FtcGxlc0luOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzT3V0OwotfSBTU1JDX1BhcmFtc190OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBQUk9UT1RZUEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfR2V0TnJTYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAob3Igc2FtcGxlIHBhaXJzIGZvciBzdGVyZW8pIHRvIGJlICAgICovCi0vKiAgdXNlZCBhcyBpbnB1dCBhbmQgYXMgb3V0cHV0IG9mIHRoZSBTU1JDIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kZSAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIHR3byBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfREVGQVVMVC4gIEluIHRoaXMgbW9kZSwgdGhlIGZ1bmN0aW9uICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgNDAgbXMgYmxvY2tzICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NSQ19OUl9TQU1QRUxTX01JTiB3aWxsIHJldHVybiB0aGUgbWluaW1hbCBudW1iZXIgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBzYW1wbGVzIHRoYXQgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNvbnZlcnNpb24gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvLiAgRWFjaCBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoaXMgcmF0aW8gd2lsbCAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYWNjZXB0ZWQgYnkgdGhlIFNTUkNfSW5pdCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX1BhcmFtcyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdoZW4gTW9kZSBpcyBub3QgYSB2YWxpZCBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0dldE5yU2FtcGxlcyggU1NSQ19OUl9TQU1QTEVTX01PREVfZW4gIE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19QYXJhbXNfdCogICAgICAgICAgIHBTU1JDX1BhcmFtcyApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXRTY3JhdGNoU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNjcmF0Y2ggc2l6ZSBmb3IgYSBnaXZlbiBjb252ZXJzaW9uIHJhdGlvIGFuZCAgICAgICAgICAgKi8KLS8qICBmb3IgZ2l2ZW4gYnVmZmVyIHNpemVzIGF0IHRoZSBpbnB1dCBhbmQgYXQgdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTY3JhdGNoU2l6ZSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggc2l6ZS4gIFRoZSBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlIChpbiBieXRlcykuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0U2NyYXRjaFNpemUoICAgU1NSQ19QYXJhbXNfdCogICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqICAgICAgICBwU2NyYXRjaFNpemUgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTU1JDIG1vZHVsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0luc3RhbmNlICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19TY3JhdGNoICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcElucHV0SW5TY3JhdGNoLCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBpbnB1dCBzYW1wbGVzIChlLmcuIHRvIHNhdmUgbWVtb3J5KSAgICAgICAqLwotLyogIHBPdXRwdXRJblNjcmF0Y2ggICAgICAgIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiB0aGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBjYW4gYmUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgb3V0cHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgIFdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIGFueSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogIFNTUkNfQUxMSU5HTUVOVF9FUlJPUiAgIFdoZW4gdGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkgaXMgbm90ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyBhbGxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGluaXQgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaW50ZXJuYWwgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfSW5pdCggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19TY3JhdGNoX3QqICBwU1NSQ19TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgIHBTU1JDX1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiogICAgICBwcElucHV0SW5TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwT3V0cHV0SW5TY3JhdGNoKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfU2V0R2FpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gc2V0cyBoZWFkcm9vbSBnYWluIGFuZCB0aGUgcG9zdCBnYWluIG9mIHRoZSBTU1JDICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJIZWFkcm9vbUdhaW5FbmFibGVkICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgaGVhZHJvb20gZ2FpbiBvZiB0aGUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OLiAgTFZNX01PREVfT0ZGICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBjYXNlIGl0IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIGlucHV0ICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGlzIGJlbG93IC02ZEIgaW4gYWxsIGNhc2VzICh0aGUgZGVmYXVsdCBoZWFkcm9vbSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgLTYgZEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJPdXRwdXRHYWluRW5hYmxlZCAgICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgb3V0cHV0IGdhaW4uICBUaGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyBMVk1fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE91dHB1dEdhaW4gICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGdhaW4uICBUaGUgb3V0cHV0IGdhaW4gaXMgYSBsaW5lYXIgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiB2YWx1ZS4gMHg3RkZGIGlzIGVxdWFsIHRvICs2IGRCIGFuZCAweDAwMDAgY29ycmVzcG9uZHMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtaW5mIGRCLiAgQnkgZGVmYXVsdCwgYSAzZEIgZ2FpbiBpcyBhcHBsaWVkLCByZXN1bHRpbmcgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIG92ZXJhbGwgZ2FpbiBvZiAtM2RCICgtNmRCIGhlYWRyb29tICsgM2RCIG91dHB1dCBnYWluKSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBwU1NSQ19JbnN0YW5jZSBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICBXcm9uZyB2YWx1ZSB1c2VkIGZvciB0aGUgYkhlYWRyb29tR2FpbkVuYWJsZWQgb3IgdGhlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX1ZBTFVFICAgICAgV2hlbiBPdXRwdXRHYWluIGlzIG91dCB0byB0aGUgcmFuZ2UgWzA7MzI3NjddICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIFNTUkNfU2V0R2FpbnMgZnVuY3Rpb24gaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkICAgICAgKi8KLS8qICAgICBpbiByYXJlIGNhc2VzLiAgUHJlZmVyYWJseSwgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19TZXRHYWlucyggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYkhlYWRyb29tR2FpbkVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTW9kZV9lbiAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgT3V0cHV0R2FpbiApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19BdWRpb0luICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvT3V0ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU1NSQ19PSyAgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgV2hlbiBvbmUgb2YgcFNTUkNfSW5zdGFuY2UsIHBTU1JDX0F1ZGlvSW4gb3IgcFNTUkNfQXVkaW9PdXQgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfUHJvY2VzcyggIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvT3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAvKiBfX1NTUkNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0OTdkMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVklERU9FRElUT1JSRVNBTVBMRVJfSAotI2RlZmluZSBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1NNE9TQV9Db250ZXh0IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpOwotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKTsKLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSA7Ci12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogVklERU9FRElUT1JSRVNBTVBMRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRFWElGQ19Db21tb25BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRFWElGQ19Db21tb25BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTIzYzAyYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00RVhJRkNfQ29tbW9uQVBJLmgKLSAqIEBicmllZiAgICBFWElGIGNvbW1vbiBkYXRhIGhlYWRlcgotICogQG5vdGUgICAgVGhlIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGUgYWxsb3cgcmVhZGluZwotICogICAgICAgICAgICBhbmQgd3JpdGluZyBFWElGIEpQRUcgaW1hZ2VzIGNvbXBsaWFudCBzcGVjIEVYSUYgMi4yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX19NNF9FWElGX0NPTU1PTl9BUElfSF9fCi0jZGVmaW5lIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXwotCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRDb21tb25fdHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHR5cGUgTTRFWElGQ19Db250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiAgICBNNEVYSUZDX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXJyb3JzICYgV2FybmluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTTRFWElGQ19OT19FUlIgICAgICAgICAgICAgIDB4MDAwMDAwMDAgICAgLyoqPCBpbnZhbGlkIHBhcmFtZXRlciAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9QQVJBTUVURVIgICAgICAgMHgwMDAwMDAwMSAgICAvKio8IGludmFsaWQgcGFyYW1ldGVyICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX0FMTE9DICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qKjwgYWxsb2NhdGlvbiBlcnJvciAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9CQURfQ09OVEVYVCAgICAgMHgwMDAwMDAwMyAgICAvKio8IGludmFsaWQgY29udGV4dCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9OT1RfQ09NUExJQU5UICAgMHgwMDAwMDAwNCAgICAvKio8IHRoZSBpbWFnZSBpbiBidWZmZXIgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFRyBjb21wbGlhbnQgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfTk9fQVBQX0ZPVU5EICAgIDB4MDAwMDAwMDUgICAgLyoqPCB0aGUgSlBFRyBpbWFnZSBkb2VzIG5vdCBjb250YWluIGFueSBBUFAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aWYgMi4yIGNvbXBsaWFudCAqLwotI2RlZmluZSBNNEVYSUZDX1dBUl9OT19USFVNQk5BSUwgICAgMHgwMDAwMDAwNiAgICAvKio8IHRoZSBFeGlmIHBhcnQgZG9lcyBub3QgY29udGFpbiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX0FQUF9UUlVOQ0FURUQgICAweDAwMDAwMDA3ICAgIC8qKjwgVGhlIEFQUDEgc2VjdGlvbiBpbiBpbnB1dCBidWZmZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbXBsZXRlICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRFWElGQ19CYXNpY1RhZ3MKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBiYXNpYyB0YWdzIHZhbHVlcy4KLSAqIEBub3RlICAgICAgICBUaGlzIEV4aWYgcmVhZGVyIGZvY3VzZXMgb24gYSBzZXQgb2YgIkVudHJ5IFRhZ3MiLgotICogICAgICAgICAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgIkVudHJ5IFZhbHVlcyIgb2YgdGhlc2UgdGFncy4KLSAqICAgICAgICAgICAgICAgIE00RVhJRkNfQ2hhciogZmllbGRzIG9mIHN0cnVjdHVyZSBhcmUgTnVsbCB0ZXJtaW5hdGVkIFN0cmluZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8qKjwgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAvKio8IGltYWdlIGhlaWdodCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqY3JlYXRpb25EYXRlVGltZTsgICAgIC8qKjwgZGF0ZSBhbmQgdGltZSBvcmlnaW5hbCBpbWFnZSB3YXMgZ2VuZXJhdGVkICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmxhc3RDaGFuZ2VEYXRlVGltZTsgICAvKio8IGZpbGUgY2hhbmdlIGRhdGUgYW5kIHRpbWUgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqZGVzY3JpcHRpb247ICAgICAgICAgIC8qKjwgaW1hZ2UgdGl0bGUgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbWFrZTsgICAgICAgICAgICAgICAgIC8qKjwgbWFudWZhY3R1cmVyIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICptb2RlbDsgICAgICAgICAgICAgICAgLyoqPCBtb2RlbCBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqc29mdHdhcmU7ICAgICAgICAgICAgIC8qKjwgc29mdHdhcmUgdXNlZCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICphcnRpc3Q7ICAgICAgICAgICAgICAgLyoqPCBwZXJzb24gd2hvIGNyZWF0ZWQgdGhlIGltYWdlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmNvcHlyaWdodDsgICAgICAgICAgICAvKio8IGNvcHlyaWdodCBob2xkZXIgKi8KLSAgICBNNENPTU1PTl9PcmllbnRhdGlvbiBvcmllbnRhdGlvbjsgICAgICAgIC8qKjwgb3JpZW50YXRpb24gb2YgaW1hZ2UgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgdGh1bWJuYWlsU2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgdGh1bWJuYWlsICovCi0gICAgTTRPU0FfVUludDggICAgICAgICp0aHVtYm5haWxJbWc7ICAgICAgICAvKio8IHBvaW50ZXIgdG8gdGhlIHRodW1ibmFpbCBpbiBtYWluIGltYWdlIGJ1ZmZlciovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmxhdGl0dWRlUmVmOyAgICAgICAgICAvKio8IGxhdGl0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIGxhdGl0dWRlOyAgICAgICAgICAgICAgLyoqPCBsYXRpdHVkZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsb25naXR1ZGVSZWY7ICAgICAgICAgLyoqPCBsb25naXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbG9uZ2l0dWRlOyAgICAgICAgICAgICAvKio8IGxvbmdpdHVkZSAqLwotCi19IE00RVhJRkNfQmFzaWNUYWdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00RVhJRkNfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotICogQGJyaWVmICAgIGdldCB0aGUgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBleGlmIGxpYnJhcnkuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgdmVyc2lvbiBudW1iZXJzIGluIGEgc3RydWN0dXJlLgotICogQHBhcmFtICAgIHBWZXJzaW9uOiAgICAoT1VUKSAgICAgICAgdGhlIHN0cnVjdHVyZSBjb250YWluaW5nIHZlcnNpb24gbnVtYmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVYSUZDX0VSUl9QQVJBTUVURVI6ICAgICAgICAoRGVidWcgb25seSkgdGhlIHBhcmFtZXRlciBpcyBNNEVYSUZDX05VTEwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00RVhJRkNfZ2V0VmVyc2lvbiAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzKi8KLSNlbmRpZiAvKiBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGFhMjBkMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0FQSS5oCi0gKiBAYnJpZWYgICAgVGhlIFBpY3R1cmVzIHRvIDNHUFAgQ29udmVydGVyLgotICogQG5vdGUgICAgTTRQVE8zR1BQIHByb2R1Y2VzIDNHUFAgY29tcGxpYW50IGF1ZGlvL3ZpZGVvICBmaWxlcwotICogICAgICAgICAgICBmcm9tIGFuIEFNUiBOQiBhdWRpbyBmaWxlIGFuZCByYXcgcGljdHVyZXMgaW50byBhIE1QRUctNC9oMjYzIDNHUFAgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRQVE8zR1BQX0FQSV9IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfQVBJX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiBNNF9WZXJzaW9uSW5mbyAqLwotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqIERlZmluaXRpb25zIG9mIE00VklGSV9JbWFnZVBsYW5lICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotLyoqCi0gKiBDb21tb24gZGVmaW5pdGlvbnMgb2YgdmlkZW8gZWRpdGluZyBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqICAgIFB1YmxpYyB0eXBlIG9mIHRoZSBNNFBUTzNHUFAgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFBUTzNHUFBfQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UFRPM0dQUF9SZXBsYWNlQXVkaW9Nb2RlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB3YXkgdGhlIGF1ZGlvIGlzIG1hbmFnZWQgaWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSB2aWRlbwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZSA9IDAsICAvKio8IEF1ZGlvIHRyYWNrIGlzIGtlcHQgc2hvcnRlciB0aGFuIHRoZSB2aWRlbyB0cmFjayovCi0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX1NpbGVuY2UsICAgLyoqPCBJZiBhdWRpbyBpcyBzaG9ydGVyLCBzaWxlbmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQqLwotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wICAgICAgIC8qKjwgSWYgYXVkaW8gaXMgc2hvcnRlciwgbG9vcCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHdob2xlIHRyYWNrIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotfSBNNFBUTzNHUFBfQXVkaW9QYWRkaW5nTW9kZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemUKLSAqIEBicmllZiAgICBEZWZpbmVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIDNHUFAgZmlsZSBwcm9kdWNlZCBieSB0aGUgUFRPM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfazUwX0tCLCAgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNTAgS2J5dGVzICAqLwotICAgIE00UFRPM0dQUF9rNzVfS0IsICAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA3NSBLYnl0ZXMgICovCi0gICAgTTRQVE8zR1BQX2sxMDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDEwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazE1MF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMTUwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMjAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAyMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2szMDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDMwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazQwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNDAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rNTAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA1MDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2tVTkxJTUlURUQ9LTEgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBub3QgbGltaXRlZCAgICAgICAgICAgKi8KLX0gTTRQVE8zR1BQX091dHB1dEZpbGVNYXhTaXplOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAoTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCkgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAqIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgVGhlIGludGVncmF0b3IgbXVzdCBpbXBsZW1lbnQgYSBmdW5jdGlvbiBmb2xsb3dpbmcgdGhpcyBwcm90b3R5cGUuCi0gKiAgICAgICAgICAgIEl0cyBnb2FsIGlzIHRvIGZlZWQgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiB0byB0aGUgUFRPM0dQUCBpbiB0aGUgTTRQVE8zR1BQX1BhcmFtcyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMKLSAqIEBwYXJhbSAgICBwUGljdHVyZUR1cmF0aW9uKE9VVCkgRHVyYXRpb24gb2YgdGhlIHJldHVybmVkIHBpY3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOiBUaGUgcmV0dXJuZWQgaW1hZ2UgaXMgdGhlIGxhc3Qgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwgKGJlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFBUTzNHUFBfUGljdHVyZUNhbGxiYWNrRmN0KSAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Eb3VibGUqIHBQaWN0dXJlRHVyYXRpb24pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UFRPM0dQUF9QYXJhbXMKLSAqIEBicmllZiAgICBNNFBUTzNHUFAgcGFyYW1ldGVycyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzIG9yIE1QRUc0ICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBmcmFtZSBzaXplIDogU1FDSUYgdG8gVkdBKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIC8qKjwgVGFyZ2V0ZWQgT3V0cHV0IGJpdC1yYXRlLCBzZWUgZW51bSovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICBPdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgLyoqPCBNYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUsIHNlZSBlbnVtICovCi0gICAgTTRQVE8zR1BQX091dHB1dEZpbGVNYXhTaXplICAgICBPdXRwdXRGaWxlTWF4U2l6ZTsKLSAgICAvKio8IENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSB0aGUgUFRPM0dQUCB0byBnZXQgdGhlIGlucHV0IHBpY3R1cmVzKi8KLSAgICBNNFBUTzNHUFBfUGljdHVyZUNhbGxiYWNrRmN0KiAgIHBQaWN0dXJlQ2FsbGJhY2tGY3Q7Ci0gICAgLyoqPCBDb250ZXh0IHRvIGJlIGdpdmVuIGFzIHRoaXJkIGFyZ3VtZW50IG9mIHRoZSBwaWN0dXJlIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGwqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmVDYWxsYmFja0N0eHQ7Ci0gICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGF1ZGlvIHRyYWNrIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEF1ZGlvVHJhY2tGaWxlOwotICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBmaWxlICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICBBdWRpb0ZpbGVGb3JtYXQ7Ci0gICAgLyoqPCBUeXBlIG9mIHByb2Nlc3NpbmcgdG8gYXBwbHkgd2hlbiBhdWRpbyBpcyBzaG9ydGVyIHRoYW4gdmlkZW8qLwotICAgIE00UFRPM0dQUF9BdWRpb1BhZGRpbmdNb2RlICAgICAgQXVkaW9QYWRkaW5nTW9kZTsKLSAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcE91dHB1dDNncHBGaWxlOwotICAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZTsKLSAgICAvKio8IE51bWJlciBvZiBpbnB1dCBZVVYgZnJhbWVzIHRvIGVuY29kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgTmJWaWRlb0ZyYW1lczsKLSAgICBNNE9TQV9JbnQzMiAgIHZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiAgIHZpZGVvTGV2ZWw7Ci19IE00UFRPM0dQUF9QYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotICogQGJyaWVmICAgIEdldCB0aGUgTTRQVE8zR1BQIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIE00UFRPM0dQUCAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNNFBUTzNHUFAgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlIGNvbnRleHQgc3RydWN0dXJlIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICAgU2V0IHRoZSBNNFBUTzNHUFAgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgIEl0IG9wZW5zIHRoZSBpbnB1dCBmaWxlLCBidXQgdGhlIG91dHB1dCBmaWxlIG1heSBub3QgYmUgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBhcmFtcyAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIHBvaW50ZWQgc3RydWN0dXJlIGNhbiBiZSBkZS1hbGxvY2F0ZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGJlY2F1c2UKLSAqICAgICAgICAgICAgaXQgaXMgaW50ZXJuYWxseSBjb3BpZWQgYnkgdGhlIFBUTzNHUFAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0LXJhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gcGFkZGluZyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORzogICAgRW5jb2RpbmcgY29tcGxldGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNNFBUTzNHUFAgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNNFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0Vycm9yQ29kZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdiZDU0Zi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9FcnJvckNvZGVzLmgKLSAqIEBicmllZiAgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSBlcnJvciBkZWZpbml0aW9ucy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000UFRPM0dQUF9FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9FcnJvckNvZGVzX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIGNvcmUgSUQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwMSApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDIgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFICAgICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwMyApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZyAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA0ICkKLS8qKgotICogICAgVGhlIGZpbGUgc2l6ZSBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfSU5WQUxJRF9GSUxFX1NJWkUgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNSApCi0vKioKLSAqIFRoZSBpbnB1dCBhdWRpbyBmaWxlIGNvbnRhaW5zIGEgdHJhY2sgZm9ybWF0IG5vdCBoYW5kbGVkIGJ5IFBUTzNHUFAgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5IQU5ETEVEX0FVRElPX1RSQUNLX0lOUFVUX0ZJTEUgICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNiApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNyApCi0KLS8qKgotICogICAgVGhlIEFNUiBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9BTVJfREVDT0RFUl9JTklUX0VSUk9SICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIwICkKLS8qKgotICogICAgVGhlIEFNUiBkZWNvZGVyIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9BTVJfREVDT0RFX0VSUk9SICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIxICkKLS8qKgotICogICAgVGhlIEFNUiBkZWNvZGVyIGNsZWFudXAgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVSX0RFU1RST1lfRVJST1IgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjIgKQotCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9WSURFT19FTkNPREVSX0lOSVRfRVJST1IgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIzICkKLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgZGVjb2RpbmcgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERV9FUlJPUiAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjQgKQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBjbGVhbnVwIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9WSURFT19FTkNPREVSX0RFU1RST1lfRVJST1IgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI1ICkKLQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IGZpbGUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjYgKQotCi0vKioKLSAqICAgIFRoZSBFbmNvZGluZyBpcyBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORyAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNyApCi0KLS8qKgotICogICAgVGhlIEVuY29kaW5nIGlzIGNvbXBsZXRlZCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRSAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI4ICkKLQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORyAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI5ICkKLQotLyoqCi0gKiBUaGUgdmlkZW8gZW5jb2RlciBlbmNvdW50ZXJlZCBhbiBBY2NlcyBVbml0IGVycm9yOiB2ZXJ5IHByb2JhYmx5IGEgZmlsZSB3cml0ZSBlcnJvciAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDJBICkKLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkyZTU2Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKLSAqIEBicmllZiAgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSBpbnRlcm5hbCBkZWZpbml0aW9ucwotICogQG5vdGUgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBlbnVtIGFuZCB0eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotCi0jaWZuZGVmIF9fTTRQVE8zR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0KLSNkZWZpbmUgTTRQVE8zR1BQX1ZFUlNJT05fTUFKT1IgICAgICAgIDMKLSNkZWZpbmUgTTRQVE8zR1BQX1ZFUlNJT05fTUlOT1IgICAgICAgIDAKLSNkZWZpbmUgTTRQVE8zR1BQX1ZFUlNJT05fUkVWSVNJT04gICAgNgotCi0vKioKLSAqICAgIE00UFRPM0dQUCBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0vKioKLSAqICAgIEludGVybmFsbHkgdXNlZCBtb2R1bGVzICovCi0KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIgICAgLyogV3JpdGUgM0dQUCBmaWxlICAgICovCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiICAgIC8qIFJlYWQgQU1SIGZpbGUgICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFBUTzNHUFBfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgTTRQVE8zR1BQLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfa1N0YXRlX0NSRUFURUQgICAgICAgICA9IDAsICAgIC8qKjwgTTRQVE8zR1BQX0luaXQgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgICAgICAgICAgPSAxLCAgICAvKio8IE00UFRPM0dQUF9PcGVuIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgICAgICAgICAgID0gMiwgICAgLyoqPCBTdGVwIGNhbiBiZSBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEICAgICAgICA9IDMsICAgIC8qKjwgVHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX0NMT1NFRCAgICAgICAgICA9IDQgICAgIC8qKjwgT3V0cHV0IGZpbGUgaGFzIGJlZW4gY3JlYXRlZCAqLwotfQotTTRQVE8zR1BQX1N0YXRlczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIFN0YXRlIG9mIGEgbWVkaWEgc3RyZWFtIGVuY29kaW5nIChhdWRpbyBvciB2aWRlbykuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfTk9TVFJFQU0gID0gMCwgICAgLyoqPCBObyBzdHJlYW0gcHJlc2VudCAqLwotICAgIE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCAgID0gMSwgICAgLyoqPCBUaGUgc3RyZWFtIGVuY29kaW5nIGlzIGluIHByb2dyZXNzICovCi0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCAgPSAyICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZW5jb2RpbmcgKi8KLX0KLU00UFRPM0dQUF9TdHJlYW1TdGF0ZTsKLQotLyoKLSAqIERlZmluaXRpb24gb2YgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyAgICAgMC44RiAgICAvKio8IE1heCBBVSBzaXplIHdpbGwgYmUgMC44IHRpbWVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDoyOjAgZnJhbWUgc2l6ZSAqLwotI2RlZmluZSBNNFBUTzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyAgICAxLjJGIC8qKjwgTWF4IGNodW5rIHNpemUgd2lsbCBiZSAxLjIgdGltZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFBUTzNHUFBfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgICAgIDEwMDAgICAgLyoqPCBBQUMgbWF4IEFVIHNpemUgc2VlbXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdXQgODUwIGJ5dGVzICovCi0jZGVmaW5lIE00UFRPM0dQUF9BVURJT19NQVhfQ0hVTktfU0laRSAgICAgICAgICAgNTAwMAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBhbm9ueW1vdXMgZW51bQotICogQGJyaWVmICAgICAgICBlbnVtIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGVuY29kZXIgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotZW51bQotewotICAgIE00UFRPM0dQUF9rTm9FbmNvZGVyLAotICAgIE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZCwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkLAotICAgIE00UFRPM0dQUF9rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgTTRQVE8zR1BQIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIE00UFRPM0dQUCBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqICAgIE00UFRPM0dQUCBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00UFRPM0dQUF9TdGF0ZXMgICAgICAgICAgICAgbV9TdGF0ZTsgICAgICAgICAgICAvKio8IE00UFRPM0dQUCBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00UFRPM0dQUF9QYXJhbXMgICAgICAgICAgICAgbV9QYXJhbXM7ICAgICAgICAgICAvKio8IE00UFRPM0dQUCBwYXJhbWV0ZXJzLCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNFBUTzNHUFBfU3RyZWFtU3RhdGUgICAgICAgIG1fVmlkZW9TdGF0ZTsgICAgICAgLyoqPCBTdGF0ZSBvZiB0aGUgdmlkZW8gZW5jb2RpbmcgKi8KLSAgICBNNFBUTzNHUFBfU3RyZWFtU3RhdGUgICAgICAgIG1fQXVkaW9TdGF0ZTsgICAgICAgLyoqPCBTdGF0ZSBvZiB0aGUgYXVkaW8gZW5jb2RpbmcgKi8KLQotICAgIC8qKgotICAgICAqICAgIE9TQUwgZmlsZSByZWFkL3dyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FsRmlsZVJlYWQ7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgIHBPc2FsRmlsZVdyaXRlOyAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICogICAgUmVhZGVyIHN0dWZmICovCi0gICAgTTRfQWNjZXNzVW5pdCogICAgICAgICAgICAgICAgbV9wUmVhZGVyQXVkaW9BVTsgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICAgICAgbV9wUmVhZGVyQXVkaW9TdHJlYW07LyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBhdWRpbyBzdHJlYW0gKi8KLQotICAgIC8qKgotICAgICAqICAgIFdyaXRlciBzdHVmZiAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtX1dyaXRlclZpZGVvQVU7ICAgICAgIC8qKjwgV3JpdHRlbiB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtX1dyaXRlckF1ZGlvQVU7ICAgICAgIC8qKjwgV3JpdHRlbiBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00RU5DT0RFUl9IZWFkZXIqICAgICAgICAgICBtX3BFbmNvZGVySGVhZGVyOyAgICAgIC8qKjwgU2VxdWVuY2UgaGVhZGVyIHJldHVybmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciBhdCBlbmNvZGVyIGNyZWF0ZSAoaWYgYW55KSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICBtX3BXcml0ZXJWaWRlb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgbV9wV3JpdGVyQXVkaW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyogIG1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbzsgICAgLyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKiAgICBtX3BXcml0ZXJBdWRpb1N0cmVhbUluZm87ICAgLyoqPCBBdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLQotICAgIC8qKgotICAgICAqICAgIENvbnRleHRzIG9mIHRoZSB1c2VkIG1vZHVsZXMgICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvUmVhZGVyQ29udGV4dDsgLyoqPCBDb250ZXh0IG9mIHRoZSBhdWRpbyByZWFkZXIgbW9kdWxlKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wM2dwV3JpdGVyQ29udGV4dDsgICAvKio8IENvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcE1wNEVuY29kZXJDb250ZXh0OyAgLyoqPCBNcDQgZW5jb2RlciBjb250ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgIG1fZUVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFJlYWRlciBJbnRlcmZhY2VzICovCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICBtX3BSZWFkZXJHbG9iSW50OyAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlLCBnbG9iYWwgcGFydCAqLwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICAgbV9wUmVhZGVyRGF0YUludDsgICAgIC8qKjwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UsIGRhdGEgcGFydCAqLwotCi0gICAgLyoqCi0gICAgICogV3JpdGVyIEludGVyZmFjZXMgKi8KLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgbV9wV3JpdGVyR2xvYkludDsgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UsIGdsb2JhbCBwYXJ0ICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIG1fcFdyaXRlckRhdGFJbnQ7ICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlLCBkYXRhIHBhcnQgKi8KLQotICAgIC8qKgotICAgICAqIEVuY29kZXIgSW50ZXJmYWNlcyAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBtX3BFbmNvZGVySW50OyAgICAgICAgICAgICAgICAvKio8IEVuY29kZXIgY29tbW9uIGludGVyZmFjZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICBtX3BFbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgIG1fcEVuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKgotICAgICAqICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICAgICAgcFNhdmVkUGxhbmU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgdWlTYXZlZER1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogICAgVmlkZW8gcmF0ZSBjb250cm9sIHN0dWZmICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fZExhc3RWaWRlb1JlZ3VsQ3RzOyAvKio8IExhc3QgdGltZSAoQ1RTKSB0aGUgdmlkZW8gYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGF0aW9uIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX210Q3RzOyAgICAgICAgIC8qKjwgQ3VycmVudCB2aWRlbyBjdHMgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdE5leHRDdHM7ICAgICAvKio8IE5leHQgdmlkZW8gQ1RTIHRvIHRyYW5zY29kZSAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX210QXVkaW9DdHM7ICAgIC8qKjwgQ3VycmVudCBhdWRpbyBjdHMgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9BdWRpb09mZlNldDsgICAvKio8IEF1ZGlvIE9mZnNldCB0byBhZGQgdG8gdGhlIGN0cyBpbiBsb29wIG1vZGUqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX1ByZXZBdWRpb0N0czsgIC8qKjwgUHJldmlvdXMgYXVkaW8gY3RzIGZvciBBQUMgbG9vcGluZyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX0RlbHRhQXVkaW9DdHM7IC8qKjwgRGVsdGEgYXVkaW8gY3RzIGZvciBBQUMgbG9vcGluZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX0N1cnJlbnRGaWxlU2l6ZTsgLyoqPCBDdXJyZW50IE91dHB1dCBmaWxlIHNpemUgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fTWF4RmlsZVNpemU7ICAgICAvKio8IE1heCBPdXRwdXQgZmlsZSBzaXplICAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtX0lzTGFzdFBpY3R1cmU7ICAgLyoqPCBBIGJvb2xlYW4gdGhhdCBzaWduYWxzIHRvIHRoZSBlbmNvZGVyIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIHRvIGJlIGVuY29kZWQqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtX2JMYXN0SW50ZXJuYWxDYWxsQmFjazsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9OYkN1cnJlbnRGcmFtZTsgIC8qKjwgSW5kZXggb2YgdGhlIGN1cnJlbnQgWVVWIGZyYW1lIGVuY29kZWQgKi8KLQotICAgIC8qKgotICAgICAqICAgIEF1ZGlvIHBhZGRpbmcgbW9kZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIG1fYkF1ZGlvUGFkZGluZ1NpbGVuY2U7ICAvKio8IEEgYm9vbGVhbiB0aGF0IHNpZ25hbHMgdGhhdCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVIHdpbGwgYmUgcGFkZGVkIGJ5IHNpbGVuY2UgKi8KLX0gTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIENhbGwgYW4gZXh0ZXJuYWwgY2FsbGJhY2sgdG8gZ2V0IHRoZSBwaWN0dXJlIHRvIGVuY29kZQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE00UFRPM0dQUAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UgcmVhZCB3aXRoIHRoZSBtX3BQaWN0dXJlQ2FsbGJhY2tGY3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGJiNzE0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9BUElfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0FQSV9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQVBJLmgKLSAqIEBicmllZiAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgcHVibGljIEFQSS4KLSAqIEBub3RlICAgIFZTUyBhbGxvd3MgZWRpdGluZyAzR1BQIGZpbGVzLgotICogICAgICAgICAgSXQgaXMgYSBzdHJhaWdodGZvcndhcmQgYW5kIGZ1bGx5IHN5bmNocm9ub3VzIEFQSS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogIE9TQUwgdHlwZXMgZm9yIGZpbGUgYWNjZXNzICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotLyoqCi0gKiAgRGVmaW5pdGlvbiBvZiBNNF9WZXJzaW9uSW5mbyAqLwotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqIEltYWdlIHBsYW5lcyBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotLyoqCi0gKiBDb21tb24gZGVmaW5pdGlvbnMgb2YgdmlkZW8gZWRpdGluZyBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0KLS8qKgotICogRXh0ZW5kZWQgQVBJICh4VlNTKSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0jZW5kaWYKLQotLy8jaW5jbHVkZSAiTTRWRF9IV19BUEkuaCIKLS8vI2luY2x1ZGUgIk00VkVfQVBJLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBFZGl0aW9uIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgUHVibGljIHR5cGUgb2YgdGhlIFZTUyBlZGl0IGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0VkaXRDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdHlwZXMgb2YgdGhlIFZTUzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAgICAgICAgICAgPSAwLCAgLyoqPCBObyB2aWRlbyBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrICA9IDgsICAvKio8IEludGVuZGVkIGZvciBiZWdpbiBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjayAgICA9IDE2LCAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgICAgICAgPSAyNTYgLyoqPCBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gaXMgdXNlZCAqLwotICAgIC8qIHJlc2VydmVkIDI1NiArIG4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IG51bWJlciBuICovCi0KLX0gTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9BdWRpb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgICAgPSAwLAotICAgIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbiAgPSA4LCAvKio8IEludGVuZGVkIGZvciBiZWdpbiBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlT3V0ID0gMTYgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotCi19IE00VlNTM0dQUF9BdWRpb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9UcmFuc2l0aW9uVHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdGhhdCBjYW4gYmUgYXBwbGllZCBkdXJpbmcgYSB0cmFuc2l0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSAgICAgID0gMCwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlID0gMSwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgID0gMjU2Ci0gICAgLyogcmVzZXJ2ZWQgMjU2ICsgbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlcm5hbCB0cmFuc2l0aW9uIG51bWJlciBuICovCi0KLX0gTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfQXVkaW9UcmFuc2l0aW9uVHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdGhhdCBjYW4gYmUgYXBwbGllZCBkdXJpbmcgYSB0cmFuc2l0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZSA9IDAsCi0gICAgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX0Nyb3NzRmFkZQotCi19IE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBFZmZlY3QKLSAqICAgICAgICAgIGFuZCBUcmFuc2l0aW9uIGZ1bmN0aW9ucwotICogQG5vdGUgICAgVGhlIHVpUHJvZ3Jlc3MgdmFsdWUgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBjYXNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgUHJvZ3Jlc3Mgb2YgdGhlIEVmZmVjdCBvciB0aGUgVHJhbnNpdGlvbiwgZnJvbSAwIHRvIDEwMDAgKG9uZSB0aG91c2FuZCkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlQcm9ncmVzczsKLSAgICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IGNsaXAgKGZpcnN0IGNsaXAgaW4gY2FzZSBvZiBhIFRyYW5zaXRpb24pLCBmcm9tIDAgdG8gTiAqLwotICAgIC8vTTRPU0FfVUludDggICAgIHVpQ3VycmVudENsaXA7Ci0gICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywgaW4gdGhlIGN1cnJlbnQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlDbGlwVGltZTsKLSAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBpbiB0aGUgb3V0cHV0IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpT3V0cHV0VGltZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICBiSXNMYXN0OwotCi19IE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX2NvZGVjVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBjb2RlYyB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBpbnRlcmZhY2VzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWU1MzR1BQIHNlcnZpY2VzIHRvIGlkZW50aWZ5Ci0gKiAgICAgICAgICAgICBhIGN1cnJlbnRseSBzdXBwb3J0ZWQgY29kZWMgaW50ZXJmYWNlLiBFYWNoIGNvZGVjIGlzCi0gKiAgICAgICAgICAgIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICAgIFdoZW4gYSBjb2RlYyBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvCi0gKiAgICAgICAgICAgIGlkZW50aWZ5IGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICogICAgICAgICAgICBUaGlzIGNhbiBiZSBleHRlbmRlZCBmb3Igb3RoZXIgY29kZWNzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKiBWaWRlbyBEZWNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0RlY01QRUc0ID0gMCwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRGVjSDI2NCwKLQotICAgIC8qIFZpZGVvIEVuY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jTVBFRzQsCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VuY0gyNjMsCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VuY0gyNjQsCi0KLSAgICAvKiBBdWRpbyBEZWNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0RlY0FNUk5CLAotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNBQUMsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0RlY01QMywKLQotICAgIC8qIEF1ZGlvIEVuY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvRW5jQU1STkIsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VuY0FBQywKLQotICAgIC8qIG51bWJlciBvZiBjb2RlY3MsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5LCBiZWZvcmUgaW52bGFpZCB0eXBlICovCi0gICAgTTRWU1MzR1BQX2tDb2RlY1R5cGVfTkIsCi0gICAgLyogaW52YWxpZCBjb2RlYyB0eXBlICovCi0gICAgTTRWU1MzR1BQX2tDb2RlY1R5cGVJbnZhbGlkID0gMjU1Ci0KLX0gTTRWU1MzR1BQX2NvZGVjVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvRWZmZWN0RmN0Ci0gKiBAYnJpZWYgICAgICAgQmVnaW4gYW5kIEVuZCB2aWRlbyBlZmZlY3QgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGNsaXAuCi0gKiAgICAgICAgICAgICAgSXQgbXVzdCBhcHBseSB0aGUgdmlkZW8gZWZmZWN0IHRvIGJ1aWxkIHRoZSBvdXRwdXQgaW1hZ2UuCi0gKiAgICAgICAgICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBlZmZlY3QgaXMgZ2l2ZW4sIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEwMDAuCi0gKiAgICAgICAgICAgICAgV2hlbiB0aGUgZWZmZWN0IGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsIHRoZSBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzCi0gKiAgICAgICAgICAgICAgYW5kIGJ1ZmZlcnMgYXJlIHZhbGlkIGFuZCBvd25lZCBieSB0aGUgVlNTIDNHUFAuCi0gKgotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dCAgICAoSU4pIFRoZSBmdW5jdGlvbiBjb250ZXh0LCBwcmV2aW91c2x5IHNldCBieSB0aGUgaW50ZWdyYXRvcgotICogQHBhcmFtICAgcElucHV0UGxhbmVzICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZXMgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIHRyYW5zaXRpb24gcHJvZ3Jlc3MuCi0gKiBAcGFyYW0gICB1aUV4dGVybmFsRWZmZWN0SWQgIChJTikgV2hpY2ggZWZmZWN0IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIChmb3IgZXh0ZXJuYWwgZWZmZWN0cykKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNFZTUzNHUFBfZWRpdFZpZGVvRWZmZWN0RmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUV4dGVybmFsRWZmZWN0SWQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QKLSAqIEBicmllZiAgICAgICBFeHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIGltYWdlIG9mIHRoZSBmaXJzdCBjbGlwIGFuZAotICogICAgICAgICAgICAgIHRoZSBpbWFnZSBvZiB0aGUgc2Vjb25kIGNsaXAuIEl0IG11c3QgYnVpbGQgdGhlIG91dHB1dCBpbWFnZQotICogICAgICAgICAgICAgIGZyb20gdGhlIHR3byBpbnB1dCBpbWFnZXMuCi0gKiAgICAgICAgICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSB0cmFuc2l0aW9uIGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGV4dGVybmFsIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsIHRoZSBpbWFnZSBwbGFuZQotICogICAgICAgICAgICAgIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgYXJlIHZhbGlkIGFuZCBvd25lZCBieSB0aGUgVlNTIDNHUFAuCi0gKgotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dCAgICAoSU4pIFRoZSBmdW5jdGlvbiBjb250ZXh0LCBwcmV2aW91c2x5IHNldCBieSB0aGUgaW50ZWdyYXRvcgotICogQHBhcmFtICAgcENsaXAxSW5wdXRQbGFuZXMgICAoSU4pIEZpcnN0IGlucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBDbGlwMklucHV0UGxhbmVzICAgKElOKSBTZWNvbmQgaW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lcyAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gZWZmZWN0IHByb2dyZXNzLgotICogQHBhcmFtICAgdWlFeHRlcm5hbFRyYW5zaXRpb25JZCAgICAoSU4pIFdoaWNoIHRyYW5zaXRpb24gZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBleHRlcm5hbCB0cmFuc2l0aW9ucykKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwQ2xpcDFJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcENsaXAySW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFeHRlcm5hbFRyYW5zaXRpb25JZAotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhdWRpby92aWRlbyBlZmZlY3QgZm9yIHRoZSBlZGl0aW9uLgotICogQG5vdGUgICAgRWZmZWN0IHN0YXJ0IHRpbWUgaXMgcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aVN0YXJ0VGltZTsgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgICAgVmlkZW9FZmZlY3RUeXBlOyAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCwgZXRjLiAqLwotICAgIE00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QgRXh0VmlkZW9FZmZlY3RGY3Q7ICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAqcEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsvKio8IENvbnRleHQgZ2l2ZW4gdG8gdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZSAgICBBdWRpb0VmZmVjdFR5cGU7ICAgICAgIC8qKjwgTm9uZSwgRmFkZUluLCBGYWRlT3V0ICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0VmZmVjdFNldHRpbmdzICAgICAgICAgeFZTUzsKLSNlbmRpZgotCi19IE00VlNTM0dQUF9FZmZlY3RTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyCi0gKiBAYnJpZWYgICAgVHJhbnNpdGlvbiBiZWhhdmlvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwID0gMCwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9MaW5lYXIsCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1Nsb3dNaWRkbGUsCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZQotfSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cjsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHRyYW5zaXRpb24gdG8gYmUgYXBwbGllZCB3aGVuIGFzc2VtYmxpbmcgdHdvIGNsaXBzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24sIGluIG1pbGxpc2Vjb25kcyAoc2V0IHRvIDAgdG8gZ2V0IG5vIHRyYW5zaXRpb24pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKio8IFR5cGUgb2YgdGhlIHZpZGVvIHRyYW5zaXRpb24gKi8KLSAgICBNNFZTUzNHUFBfVmlkZW9UcmFuc2l0aW9uVHlwZSAgICBWaWRlb1RyYW5zaXRpb25UeXBlOwotCi0gICAgLyoqPCBFeHRlcm5hbCB0cmFuc2l0aW9uIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0IEV4dFZpZGVvVHJhbnNpdGlvbkZjdDsKLQotICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgZXh0ZXJuYWwgdHJhbnNpdGlvbiB2aWRlbyBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICpwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9UcmFuc2l0aW9uVHlwZSAgICBBdWRpb1RyYW5zaXRpb25UeXBlOyAgIC8qKjwgVHlwZSBvZiB0aGUgYXVkaW8gdHJhbnNpdGlvbiAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyICAgICBUcmFuc2l0aW9uQmVoYXZpb3VyOyAgICAvKio8VHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19UcmFuc2l0aW9uU2V0dGluZ3MgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBpbnB1dCBjbGlwIGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEl0IGFsc28gY29udGFpbnMgdGhlIHNldHRpbmdzIGZvciB0aGUgY3V0IGFuZCBiZWdpbi9lbmQgZWZmZWN0cyBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAqcEZpbGU7ICAgICAgICAgICAgLyoqPCBDbGlwIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgRmlsZVR5cGU7ICAgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGhTaXplOyAgICAgIC8qKjwgQ2xpcCBwYXRoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZCBiZWNhdXNlIG9mIFVURjE2IGNvbnZlcnNpb24pKi8KLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgIENsaXBQcm9wZXJ0aWVzOyAgIC8qKjwgQ2xpcCBhbmFseXNpcyBwcmV2aW91c2x5IGNvbXB1dGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0VGltZTsgICAvKio8IEJlZ2luIGN1dCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0VGltZTsgICAgIC8qKjwgRW5kIGN1dCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgIGJUcmFuc2NvZGluZ1JlcXVpcmVkOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19DbGlwU2V0dGluZ3MgICAgICAgICAgICAgeFZTUzsKLSNlbmRpZgotCi19IE00VlNTM0dQUF9DbGlwU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlZmluZSBhIGNvbXBsZXRlCi0gKiAgICAgICAgICBlZGl0aW9uIG9wZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudCBvZiB0aGUgY2xpcCBsaXN0IHBDbGlwTGlzdCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcE51bWJlcjsKLSAgICAvKio8IFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgY2xpcCB3aWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGNvbXBhdGliaWxpdHkgY2hlY2tpbmcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICB1aU1hc3RlckNsaXA7Ci0gICAgLyoqPCBMaXN0IG9mIHRoZSBpbnB1dCBjbGlwcyBzZXR0aW5ncy4gUG9pbnRlciB0byBhbiBhcnJheSBvZiB1aUNsaXBOdW1iZXIKLSAgICAgY2xpcCBzZXR0aW5ncyBwb2ludGVycyAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgICAgICoqcENsaXBMaXN0OwotICAgIC8qKjwgTGlzdCBvZiB0aGUgdHJhbnNpdGlvbiBzZXR0aW5ncy4gUG9pbnRlciB0byBhbiBhcnJheSBvZiB1aUNsaXBOdW1iZXItMQotICAgICB0cmFuc2l0aW9uIHNldHRpbmdzIHBvaW50ZXJzICovCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAgICAgKipwVHJhbnNpdGlvbkxpc3Q7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICAgICAgICAgKkVmZmVjdHM7ICAgICAgICAgLyoqPCBMaXN0IG9mIGVmZmVjdHMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7ICAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgLyoqPCBGcmFtZSByYXRlIGF0IHdoaWNoIHRoZSBtb2RpZmllZCB2aWRlbyBzZWN0aW9ucyB3aWxsIGJlIGVuY29kZWQgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICB2aWRlb0ZyYW1lUmF0ZTsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAqcE91dHB1dEZpbGU7ICAgICAgLyoqPCBPdXRwdXQgM0dQUCBjbGlwIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgIHVpT3V0cHV0UGF0aFNpemU7ICAgIC8qKjwgT3V0cHV0IGZpbGUgcGF0aCBzaXplKi8KLSAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwVGVtcG9yYXJ5RmlsZTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfRWRpdFNldHRpbmdzICAgICAgICAgICAgICB4VlNTOwotI2VuZGlmCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgIFBUVm9sTGV2ZWw7Ci19IE00VlNTM0dQUF9FZGl0U2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICAgIGNsaXBzIGFyZSBjb21wYXRpYmxlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICBwQ2xpcFByb3BlcnRpZXMgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSAgIEZpbGVUeXBlICAgICAgICAgICAgKElOKSBUeXBlIG9mIHRoZSBpbnB1dCBmaWxlICguM2dwLCAuYW1yLCAubXAzKQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChNNE9TQV9Wb2lkICpwQ2xpcCwgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgKnBDbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIKLSAqICAgICAgICAgIGZvciBWU1MgM0dQUCBlZGl0aW5nIGFzc2VtYmx5IGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXAxUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1BMQVRGT1JNCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eShNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgKnBDbGlwMVByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXAyUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoCi0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0KiBwQ29udGV4dCwKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgU2l6ZSBvZiB0aGUgY2xpcCBwYXRoIChuZWVkZWQgZm9yIFVURjE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBuYkVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRHVwbGljYXRlcyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlLCBwZXJmb3JtaW5nIGFsbG9jYXRpb25zIGlmIHJlcXVpcmVkCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NEZXN0ICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc09yaWcgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIGJDb3B5RWZmZWN0cyAgICAgICAgKElOKSBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkdXBsaWNhdGUgZWZmZWN0cyAoZGVwcmVjYXRlZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NPcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMpLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdE9wZW4oKQotICogQGJyaWVmICAgU2V0IHRoZSBWU1MgM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLCBhbmQgc2V0IHRoZSBzZXR0aW5ncy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCkKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgZWRpdGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSBlZGl0aW5nIG9wZXJhdGlvbgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU6RWRpdGlvbiBpcyBkb25lLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcChNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgIEZpbmlzaCB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xvc2UoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCkKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBBdWRpbyBNaXhpbmcgRmVhdHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqCi0gKiAgUHVibGljIHR5cGUgb2YgdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPcmlnaW5hbENsaXBGaWxlOyAgICAgIC8qKjwgSW5wdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkZGVkQXVkaW9UcmFja0ZpbGU7ICAgLyoqPCBOZXcgYXVkaW8gdHJhY2sgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgQWRkZWRBdWRpb0ZpbGVUeXBlOyAgICAgLyoqPCBGaWxlIEZvcm1hdCBvZiB0aGUgbmV3IGF1ZGlvIGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlBZGRDdHM7ICAgICAgICAgICAgICAgLyoqPCBUaW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHdoaWNoIHRoZSBhZGRlZCBhdWRpbyB0cmFjayBpcyBpbnNlcnRlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUFkZFZvbHVtZTsgICAgICAgICAgICAvKio8IFZvbHVtZSwgaW4gcGVyY2VudGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aW1lIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcDsgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgb2YgdGhlIGxvb3AgKDAgbWVhbnMgbm8gbG9vcCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgIC8qKjwgSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50ICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRDbGlwRmlsZTsgICAgICAvKio8IE91dHB1dCAzR1BQIGNsaXAgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZTsgICAgICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1vb3YuYmluIikgKi8KLSAgICAvKio8IFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb3B0aW9ubmFsLiBUaGV5IGFyZSBqdXN0IHVzZWQgaW4gY2FzZSBvZiBNUDMgcmVwbGFjZW1lbnQuICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgIG91dHB1dEFTRjsgICAgICAgICAvKio8IE91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgb3V0cHV0QXVkaW9Gb3JtYXQ7IC8qKjwgT3V0cHV0IGF1ZGlvIGNvZGVjKEFBQy9BTVIpKi8KLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgICAgICAgICAgb3V0cHV0QXVkaW9CaXRyYXRlOyAvKio8IE91dHB1dCBhdWRpbyBiaXRyYXRlICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE5CQ2hhbm5lbHM7IC8qKjwgT3V0cHV0IGF1ZGlvIG5iIG9mIGNoYW5uZWxzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxvb3A7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTnVtQ2hhbm5lbHM7Ci19IE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQqIHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgVlNTIGF1ZGlvIG1peGluZyBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byB2YWxpZCBhdWRpbyBtaXhpbmcgc2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKCkKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8gbWl4aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzogQXVkaW8gbWl4aW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyBjYWxsIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBFeHRyYWN0IFBpY3R1cmUgRmVhdHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqCi0gKiAgUHVibGljIHR5cGUgb2YgdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgZXh0cmFjdCBwaWN0dXJlIGF1ZGlvIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dENsaXBGaWxlOyAgLyoqPCBJbnB1dCAzR1BQIGNsaXAgZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGlFeHRyYWN0aW9uVGltZTsgLyoqPCBmcmFtZSB0aW1lIChpbiBtcykgdG8gYmUgZXh0cmFjdGVkICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dFl1dlBpYzsgICAvKio8IE91dHB1dCBZVVYgcGljdHVyZSBuYW1lICovCi19IE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVNldHRpbmdzOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVJbml0KCkKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgVlNTIGV4dHJhY3QgcGljdHVyZSBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGV4dHJhY3QgcGljdHVyZSBzZXR0aW5ncwotICogQHBhcmFtICAgIHBXaWR0aCAgICAgICAgICAgICAgICAoT1VUKSB2aWRlbyBzdHJlYW0gd2lkdGgKLSAqIEBwYXJhbSAgICBwSGVpZ2h0ICAgICAgICAgICAgICAgIChPVVQpIHZpZGVvIHN0cmVhbSBoZWlnaHQKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUDE6ICAgIFRoZSBpbnB1dCBjbGlwIGlzIGVtcHR5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVJbml0KAotICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfVUludDMyICpwV2lkdGgsCi0gICAgICAgIE00T1NBX1VJbnQzMiAqcEhlaWdodCwKLSAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlU3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChJTikgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcGFyYW0gICBwRGVjUGxhbmVzICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFBsYW5lIGluIHdpY2ggdGhlIGV4dHJhY3RlZCBwaWN0dXJlIGlzIGNvcGllZAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcGljdHVyZSBleHRyYWN0aW9uCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBWU1NfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6IFBpY3R1cmUgZXh0cmFjdGlvbiAgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVTdGVwKE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY1BsYW5lcywgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcChNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICBDb21tb24gZmVhdHVyZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgR2V0IHRoZSBWU1MgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotCi0jaWZkZWYgV0lOMzIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoKQotICogQGJyaWVmICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgIGVyciAgICAgICAgICAgICAoSU4pIEVycm9yIGNvZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdGlvbiBmcm9tCi0gKiBAcGFyYW0gICBzTWVzc2FnZSAgICAgICAgKElOL09VVCkgQWxsb2NhdGVkIHN0cmluZyBpbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gd2lsbCBiZSBjb3BpZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICBJbnB1dCBlcnJvciBpcyBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZShNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyKiBzTWVzc2FnZSk7Ci0jZW5kaWYgLyoqPCBXSU4zMiAqLwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0Vycm9yQ29kZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2M1MDBkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FcnJvckNvZGVzLmgKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVycm9yIGRlZmluaXRpb25zLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBXYXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgICBFbmQgb2YgZWRpdGlvbiwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2VkaXRDbG9zZSgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMDEpCi0KLS8qKgotICogICAgRW5kIG9mIGF1ZGlvIG1peGluZywgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMTApCi0KLS8qKgotICogICAgRW5kIG9mIGV4dHJhY3QgcGljdHVyZSwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0VYVFJBQ1RfUElDVFVSRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMjApCi0vKiBSQzogdG8ga25vdyB3aGVuIGEgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAzMCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9yIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludmFsaWQgZmlsZSB0eXBlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDAxKQotLyoqCi0gKiBJbnZhbGlkIGVmZmVjdCBraW5kICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9FRkZFQ1RfS0lORCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDAyKQotLyoqCi0gKiBJbnZhbGlkIGVmZmVjdCB0eXBlIGZvciB2aWRlbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMykKLS8qKgotICogSW52YWxpZCBlZmZlY3QgdHlwZSBmb3IgYXVkaW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX0VGRkVDVF9UWVBFICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDQpCi0vKioKLSAqIEludmFsaWQgdHJhbnNpdGlvbiB0eXBlIGZvciB2aWRlbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNSkKLS8qKgotICogSW52YWxpZCB0cmFuc2l0aW9uIHR5cGUgZm9yIGF1ZGlvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA2KQotLyoqCi0gKiBJbnZhbGlkIHZpZGVvIGVuY29kaW5nIGZyYW1lIHJhdGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEUgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNykKLSAvKioKLSAqIEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiBpcyB1c2VkIHdpdGhvdXQgYmVpbmcgc2V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEwgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA4KQotLyoqCi0gKiBFeHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aG91dCBiZWluZyBzZXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9UUkFOU0lUSU9OX05VTEwgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDkpCi0KLS8qKgotICogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGNsaXAgZHVyYXRpb24gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04gIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTApCi0vKioKLSAqIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciBvciBlcXVhbCB0aGFuIGVuZCBjdXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVCAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTEpCi0vKioKLSAqIFR3byBjb25zZWN1dGl2ZSB0cmFuc2l0aW9ucyBhcmUgb3ZlcmxhcHBpbmcgb24gb25lIGNsaXAgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTIpCi0KLS8qKgotICogQW4gaW5wdXQgM0dQUCBmaWxlIGlzIGludmFsaWQvY29ycnVwdGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDE2KQotLyoqCi0gKiBBIGZpbGUgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDE3KQotLyoqCi0gKiBBIGZpbGUgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDE4KQotCi0vKioKLSAqIEEgZmlsZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgVlNTICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDE5KQotIC8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYW4gdW5leHBlY3RlZGx5IGxhcmdlIFZpZGVvIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFBKQotLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgQXVkaW8gQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0UgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUIpCi0vKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGEgY29ycnVwdGVkIEF1ZGlvIEFNUiBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFDKQotLyoqCi0gKiBUaGUgdmlkZW8gZW5jb2RlciBlbmNvdW50ZXJlZCBhbiBBY2NlcyBVbml0IGVycm9yOiB2ZXJ5IHByb2JhYmx5IGEgZmlsZSB3cml0ZSBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFEKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvcnMgcmV0dXJuZWQgYnkgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBVbnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIwKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBIMjYzIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRSBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIxKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBNUEVHLTQgcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIyKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBNUEVHLTQgUlZMQyB0b29sIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMykKLS8qKgotICogVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyNCkKLSAvKioKLSAqIEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMjUpCi0vKioKLSAqIEZpbGUgY29udGFpbnMgbm8gdmlkZW8gc3RyZWFtIG9yIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDI2KQotLyoqCi0gKiBVbnN1cHBvcnRlZCB2aWRlbyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19QUk9GSUxFIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjcpCi0KLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fTEVWRUwgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyOCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9ycyByZXR1cm5lZCBieSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKSAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEF0IGxlYXN0IG9uZSBvZiB0aGUgY2xpcCBhbmFseXNpcyBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBWU1MgM0dQUCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMCkKLS8qKgotICogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB2aWRlbyBmb3JtYXQgKEgyNjMgb3IgTVBFRzQpICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVCAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMxKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzIpCi0vKioKLSAqICAgIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgTVBFRy00IHRpbWUgc2NhbGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzMpCi0vKioKLSAqICAgIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgdXNlIG9mIE1QRUctNCBkYXRhIHBhcnRpdGlvbmluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORyAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzQpCi0vKioKLSAqICAgIE1QMyBjbGlwcyBjYW4ndCBiZSBhc3NlbWJsZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzUpCi0vKioKLSAqICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIGF1ZGlvIHN0cmVhbSB0eXBlIChleDogQU1SICE9IEFBQykgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEUgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzYpCi0vKioKLSAqICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIGF1ZGlvIG51bWJlciBvZiBjaGFubmVscyAoZXg6IHN0ZXJlbyAhPSBtb25vKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUyAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzNykKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgc2FtcGxpbmcgZnJlcXVlbmN5IChleDogNDQxMDBIeiAhPSAxNjAwMEh6KSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1kgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQXVkaW8gbWl4aW5nIGVycm9yIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBUaGUgaW5wdXQgM0dQUCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyB0cmFjayAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1MCkKLS8qKgotICogVGhlIFZvbHVtZSBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKEFkZFZvbHVtZSkgbXVzdCBiZSBzdHJpY3RseSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk8gICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTEpCi0vKioKLSAqIFRoZSB0aW1lIGF0IHdoaWNoIHRoZSBhdWRpbyB0cmFjayBpcyBhZGRlZCAoQWRkQ3RzKSBjYW4ndCBiZSBzdXBlcmlvciB0aGFuIHRoZQotICAgaW5wdXQgdmlkZW8gdHJhY2sgZHVyYXRpb24gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT04gICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTIpCi0vKioKLSAqIFRoZSBhdWRpbyB0cmFjayBmaWxlIGZvcm1hdCBzZXR0aW5nIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOREVGSU5FRF9BVURJT19UUkFDS19GSUxFX0ZPUk1BVCAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1MykKLS8qKgotICogVGhlIGFkZGVkIGF1ZGlvIHRyYWNrIHN0cmVhbSBoYXMgYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1NCkKLS8qKgotICogVGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlIGRvZXNuJ3Qgc3VwcG9ydCBFVlJDLCBNUDMgYXVkaW8gdHJhY2tzICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1NSkKLS8qKgotICogQW4gYWRkZWQgYXVkaW8gdHJhY2sgbGltaXQgdGhlIGF2YWlsYWJsZSBmZWF0dXJlczogdWlBZGRDdHMgbXVzdCBiZSAwCi0gICBhbmQgYlJlbW92ZU9yaWdpbmFsIG11c3QgYmUgTTRPU0FfVFJVRSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU2KQotLyoqCi0gKiBJbnB1dCBhdWRpbyB0cmFjayBpcyBub3QgQU1SLU5CIG5vciBBQUMgc28gaXQgY2FuJ3QgYmUgbWl4ZWQgd2l0aCBvdXRwdXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1NykKLS8qKgotICogSW5wdXQgY2xpcCBtdXN0IGJlIGEgM2dwcCBmaWxlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTgpCi0vKioKLSAqIEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lIG9yIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgZHVyYXRpb24gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1AgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1OSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQXVkaW8gbWl4aW5nIGFuZCBleHRyYWN0IHBpY3R1cmUgZXJyb3IgY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSDI2MyBQcm9maWxlIDMgbGV2ZWwgMTAgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA2MCkKLS8qKgotICogRmlsZSBjb250YWlucyBubyB2aWRlbyBzdHJlYW0gb3IgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDYxKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBJbnRlcm5hbCBlcnJvciBhbmQgd2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBJbnRlcm5hbCBzdGF0ZSBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTAwKQotLyoqCi0gKiBMdW1pbmFuY2UgZmlsdGVyIGVmZmVjdCBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTA0KQotLyoqCi0gKiBUcmFuc2l0aW9uIGZpbHRlciBlZmZlY3QgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwNikKLS8qKgotICogVGhlIGF1ZGlvIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFUl9JTklUX0ZBSUxFRCAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTApCi0vKioKLSAqIFRoZSBkZWNvZGVyIHByb2R1Y2VkIGFuIHVuYXR0ZW5kZWQgYW1vdW50IG9mIFBDTSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE1KQotLyoqCi0gKiBPdXRwdXQgZmlsZSBtdXN0IGJlIDNHUFAgb3IgTVAzICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTcpCi0vKioKLSAqIENhbiBub3QgZmluZCBhIHZhbGlkIHZpZGVvIGZyYW1lICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExOCkKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0Vycm9yQ29kZXNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NjhiNjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCi0gKiBAYnJpZWYgICAgQVBJIG9mIHhWU1MKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSNlcnJvciAiKioqIHRoZSBmbGFnIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMgc2hvdWxkIGJlIGFjdGl2YXRlZCBpbiBDb21waWxlclN3aXRjaGVzXAotICAgICAgICAgICAgIGZvciBWaWRlb1N0dWRpbyAqKioiCi0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX2dldFRleHRSZ2JCdWZmZXJGY3QKLSAqIEBicmllZiAgICAgICAgRXh0ZXJuYWwgdGV4dCB0byBSR0IgYnVmZmVyIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgcmVuZGVyaW5nRGF0YSwgdGhlIHRleHQgYnVmZmVyIGFuZAotICogICAgICAgICAgICAgICAgaXRzIHNpemUuIEl0IG11c3QgYnVpbGQgdGhlIG91dHB1dCBSR0IgaW1hZ2UgcGxhbmUgY29udGFpbmluZyB0aGUgdGV4dC4KLSAqCi0gKiBAcGFyYW0gICBwUmVuZGVyaW5nRGF0YSAgICAoSU4pIFRoZSBkYXRhIGdpdmVuIGJ5IHRoZSB1c2VyIGluIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQHBhcmFtICAgIHBUZXh0QnVmZmVyICAgICAgICAoSU4pIFRleHQgYnVmZmVyIGdpdmVuIGJ5IHRoZSB1c2VyIGluIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQHBhcmFtICAgIHRleHRCdWZmZXJTaXplICAgIChJTikgVGV4dCBidWZmZXIgc2l6ZSBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmUgICAgKElOL09VVCkgT3V0cHV0IFJHQjU2NSBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX2dldFRleHRSZ2JCdWZmZXJGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcFJlbmRlcmluZ0RhdGEsCi0gICAgTTRPU0FfVm9pZCAqcFRleHRCdWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHRleHRCdWZmZXJTaXplLAotICAgIE00VklGSV9JbWFnZVBsYW5lICoqcE91dHB1dFBsYW5lCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQkdNU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGFkZCBCYWNrZ3JvdW5kIG11c2ljIHRvIDNncCBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgKnBGaWxlOyAgICAgICAgIC8qKjwgSW5wdXQgZmlsZSBwYXRoICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgIEZpbGVUeXBlOyAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQWRkQ3RzOyAgICAgICAvKio8IFRpbWUsIGluIG1pbGxpc2Vjb25kcywgYXQgd2hpY2ggdGhlIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBpcyBpbnNlcnRlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUFkZFZvbHVtZTsgICAgIC8qKjwgVm9sdW1lLCBpbiBwZXJjZW50YWdlLCBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgc3RhcnQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbG9vcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBlbmQgdGltZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiX0R1Y2tpbmdOZWVkZWVkOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfdGhyZXNob2xkOyAgLyoqPCBUaHJlc2hvbGQgdmFsdWUgYXQgd2hpY2ggYmFja2dyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBsb3dWb2x1bWU7ICAgICAgIC8qKjwgbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8gdGhpcyBmYWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW5jcmVhc2UgdGhlIHByaW1hcnkgdHJhY2sgdG8gaW52ZXJzZSBvZiB0aGlzIGZhY3RvciAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlOdW1DaGFubmVsczsKLX0gTTR4VlNTX0JHTVNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdHlwZXMgb2YgdGhlIFZTUzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa1JHQjg4OCAgICAgICAgICAgPSAwLCAgLyoqPCBSR0I4ODggZGF0YSB0eXBlICovCi0gICAgTTRWU1MzR1BQX2tSR0I1NjUgICAgICAgICAgID0gMSAgLyoqPCBSR0I1NjUgZGF0YSB0eXBlICovCi0KLX0gTTRWU1MzR1BQX1JHQlR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvL3ZpZGVvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IEluIHBlcmNlbnQgb2YgdGhlIGN1dCBjbGlwIGR1cmF0aW9uICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlTdGFydFBlcmNlbnQ7Ci0gICAgLyoqPCBJbiBwZXJjZW50IG9mIHRoZSAoKGNsaXAgZHVyYXRpb24pIC0gKGVmZmVjdCBzdGFydHRpbWUpKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpRHVyYXRpb25QZXJjZW50OwotICAgIC8qKjwgRnJhbWluZyBmaWxlIHBhdGggKEdJRi9QTkcgZmlsZSksIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICpwRnJhbWluZ0ZpbGVQYXRoOwotICAgIC8qKjwgRnJhbWluZyBSR0I1NjUgYnVmZmVyLCAgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgKnBGcmFtaW5nQnVmZmVyOwotICAgIC8qKjxSR0IgQnVmZmVyIHR5cGUsdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRWU1MzR1BQX1JHQlR5cGUgICAgICAgICAgcmdiVHlwZTsKLSAgICAvKio8IFRoZSB0b3AtbGVmdCBYIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIHdoZXJlIHRoZSBhZGRlZCBmcmFtZSB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nIHx8IFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdG9wbGVmdF94OwotICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgd2hlcmUgdGhlIGFkZGVkIGZyYW1lIHdpbGwgYmUgZGlzcGxheWVkLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgfHwgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB0b3BsZWZ0X3k7Ci0gICAgLyoqPCBEb2VzIGZyYW1pbmcgaW1hZ2UgaXMgcmVzaXplZCB0byBvdXRwdXQgdmlkZW8gc2l6ZS4KLSAgICAgVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYlJlc2l6ZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBmcmFtaW5nU2NhbGVkU2l6ZTsKLS8qKjwgU2l6ZSB0byB3aGljaCB0aGUgdGhlIGZyYW1pbmcgZmlsZSBuZWVkcyB0byBiZSByZXNpemVkICovCi0gICAgLyoqPCBUZXh0IGJ1ZmZlci4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcFRleHRCdWZmZXI7Ci0gICAgLyoqPCBUZXh0IGJ1ZmZlciBzaXplLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB0ZXh0QnVmZmVyU2l6ZTsKLSAgICAvKio8IFBvaW50ZXIgY29udGFpbmluZyBzcGVjaWZpYyBkYXRhIHVzZWQgYnkgdGhlIGZvbnQgZW5naW5lIChzaXplLCBjb2xvci4uLikgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwUmVuZGVyaW5nRGF0YTsKLSAgICAvKio8IFRleHQgcGxhbmUgd2lkdGguIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpVGV4dEJ1ZmZlcldpZHRoOwotICAgIC8qKjwgVGV4dCBwbGFuZSBoZWlnaHQuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpVGV4dEJ1ZmZlckhlaWdodDsKLSAgICAvKio8IFByb2Nlc3NpbmcgcmF0ZSBvZiB0aGUgZWZmZWN0IGFkZGVkIHdoZW4gdXNpbmcgdGhlIEZpZnRpZXMgZWZmZWN0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgIC8qKjwgUkdCMTYgaW5wdXQgY29sb3Igb2YgdGhlIGVmZmVjdCBhZGRlZCB3aGVuIHVzaW5nIHRoZSByZ2IxNiBjb2xvciBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICB1aVJnYjE2SW5wdXRDb2xvcjsKLQotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ1N0YXJ0OyAgICAgICAvKlN0YXJ0IHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ01pZGRsZTsgICAgICAvKk1pZGRsZSBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdFbmQ7ICAgICAgICAgLypFbmQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZTsgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCBkdXJhdGlvbiwgb2YgdGhlIEZhZGVJbiBwaGFzZSovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7ICAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZiBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgb2YgdGhlIEZhZGVPdXQgcGhhc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB3aWR0aDsgICAvKndpZHRoIG9mIHRoZSBBUkdCODg4OCBjbGlwIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBoZWlnaHQ7IC8qaGVpZ2h0IG9mIHRoZSBBUkdCODg4OCBjbGlwIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotfSBNNHhWU1NfRWZmZWN0U2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhbHBoYSBtYWdpYyB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOyAgICAgICAgLyoqPCBBbHBoYSBmaWxlIHBhdGggKEpQRyBmaWxlKSAgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIGJsZW5kaW5nUGVyY2VudDsgICAgLyoqPCBCbGVuZGluZyBQZXJjZW50YWdlIGJldHdlZW4gMCBhbmQgMTAwICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICBpc3JldmVyc2U7ICAgICAgICAgICAgLyoqPCBkaXJlY3QgZWZmZWN0IG9yIHJldmVyc2UgKi8KLSAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB3aWR0aDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBoZWlnaHQ7Ci19IE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9EaXJlY3Rpb24KLSAqIEBicmllZiAgICBEZWZpbmVzIGRpcmVjdGlvbnMgZm9yIHRoZSBzbGlkZSB0cmFuc2l0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIGVudW0gewotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9MZWZ0T3V0UmlnaHRJbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1RvcE91dEJvdHRvbUluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fQm90dG9tT3V0VG9wSW4KLX0gTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9EaXJlY3Rpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzbGlkZSB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uIGRpcmVjdGlvbjsgLyogZGlyZWN0aW9uIG9mIHRoZSBzbGlkZSAqLwotfSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhZGRpdGlvbmFsIHRyYW5zaXRpb24gc2V0dGluZ3Mgc3BlY2lmaWMgdG8KLSAqICAgICAgICAgICAgeFZTUywgd2hpY2ggYXJlIGFwcGVuZGVkIHRvIHRoZSBWU1MzR1BQIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqICAgICAgICAgICAgc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQW55dGhpbmcgeFZTUy1zcGVjaWZpYywgYnV0IGNvbW1vbiB0byBhbGwgdHJhbnNpdGlvbnMsIHdvdWxkIGdvIGhlcmUsCi0gICAgYmVmb3JlIHRoZSB1bmlvbi4gKi8KLSAgICB1bmlvbiB7Ci0gICAgICAgIC8qKjwgQWxwaGFNYWdpYyBzZXR0aW5ncywgdXNlZCBvbmx5IGlmIFZpZGVvVHJhbnNpdGlvblR5cGUgPT0KLSAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICovCi0gICAgICAgIE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgICAgICAgICpwQWxwaGFNYWdpY1NldHRpbmdzOwotICAgICAgICAvKiBvbmx5IGluIGNhc2Ugb2Ygc2xpZGUgdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICAgICpwU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3M7Ci0gICAgfSB0cmFuc2l0aW9uU3BlY2lmaWM7Ci19IE00eFZTU19UcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyBkaWZmZXJlbnQgbWVkaWEgcmVuZGVyaW5nIHVzaW5nIGV4aWYgb3JpZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1Jlc2l6aW5nID0gMCwgICAgICAgIC8qVGhlIHBpY3R1cmUgaXMgcmVzaXplZCwgdGhlIGFzcGVjdCByYXRpbyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuIEFsbCBvZiB0aGUgcGljdHVyZSBpcyByZW5kZXJlZCovCi0gICAgTTR4VlNTX2tDcm9wcGluZywgICAgICAgICAgICAvKlRoZSBwaWN0dXJlIGlzIGNyb3BwZWQsIHRoZSBhc3BlY3QgcmF0aW8gaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvbmUuIFRoZSBwaWN0dXJlIGlzIG5vdCByZW5kZXJlZCBlbnRpcmVseSovCi0gICAgTTR4VlNTX2tCbGFja0JvcmRlcnMgICAgICAgIC8qQmxhY2sgYm9yZGVycyBhcmUgcmVuZGVyZWQgaW4gb3JkZXIgdG8ga2VlcCB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdCByYXRpby4gQWxsIHRoZSBwaWN0dXJlIGlzIHJlbmRlcmVkKi8KLQotfSBNNHhWU1NfTWVkaWFSZW5kZXJpbmc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfQ2xpcFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGlucHV0IGNsaXAgZm9yIHRoZSBlZGl0aW9uLgotICogQG5vdGUgICAgSXQgYWxzbyBjb250YWlucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSBjdXQgYW5kIGJlZ2luL2VuZCBlZmZlY3RzIGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50OyAgICAvKio8IEJlZ2luIGN1dCB0aW1lLCBpbiBwZXJjZW50IG9mIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAob25seSBmb3IgM0dQUCBjbGlwICEpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFBlcmNlbnQ7ICAgIC8qKjwgRW5kIGN1dCB0aW1lLCBpbiBwZXJjZW50IG9mIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAob25seSBmb3IgM0dQUCBjbGlwICEpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUR1cmF0aW9uOyAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIGNsaXAsIGlmIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMCwgaGFzIHByaW9yaXR5IG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRUaW1lIG9yIHVpRW5kQ3V0UGVyY2VudCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhblpvb207ICAgICAgICAgICAgLyoqPCBSQzogQm9vbGVhbiB1c2VkIHRvIGtub3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbiBhbmQgem9vbSBtb2RlIGlzIGVuYWJsZWQgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYTsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhhOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFlhOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGI7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYjsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYjsgICAgLyoqPCBSQyAqLwotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOyAgICAgICAgLyoqPCBGQiBvbmx5IHVzZWQgd2l0aCBKUEVHOiB0byBjcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemUsIG9yIHJlbmRlciBibGFjayBib3JkZXJzKi8KLQotfSBNNHhWU1NfQ2xpcFNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19FZGl0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVmaW5lIGEgY29tcGxldGUKLSAqICAgICAgICAgIGVkaXRpb24gb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBzaXplICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgICAgICAgICAgb3V0cHV0VmlkZW9TaXplOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGZvcm1hdCAoTVBFRzQgLyBIMjYzKSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIGZvcm1hdCAoQUFDLCBBTVJOQiAuLi4pICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgICAgb3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgYXVkaW8gc2FtcGxpbmcgZnJlcSAoODAwMEh6LC4uLikgKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgICBvdXRwdXRBdWRpb1NhbXBsRnJlcTsKLSAgICAvKio8IE1heGltdW0gb3V0cHV0IGZpbGUgc2l6ZSBpbiBCWVRFUyAoaWYgc2V0IHRvIDAsIG5vIGxpbWl0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZVNpemU7Ci0gICAgLyoqPCBJcyBvdXRwdXQgYXVkaW8gbXVzdCBiZSBNb25vID8gVmFsaWQgb25seSBmb3IgQUFDICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF1ZGlvTW9ubzsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBiaXRyYXRlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgLyoqPCBPdXRwdXQgYXVkaW8gYml0cmF0ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIC8qKjwgQmFja2dyb3VuZCBtdXNpYyB0cmFjayBzZXR0aW5ncyAqLwotICAgIE00eFZTU19CR01TZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICpwQkdNdHJhY2s7Ci0gICAgLyoqPCBGdW5jdGlvbiBwb2ludGVyIG9uIHRleHQgcmVuZGVyaW5nIGVuZ2luZSwgaWYgbm90IHVzZWQsIG11c3QgYmUgc2V0IHRvIE5VTEwgISEgKi8KLSAgICBNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdCAgICAgICAgICAgICAgICBwVGV4dFJlbmRlcmluZ0ZjdDsKLSAgICAvKiogb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsKi8KLSAgICBNNE9TQV9JbnQzMiAgIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiAgIG91dHB1dFZpZGVvTGV2ZWw7Ci0KLX0gTTR4VlNTX0VkaXRTZXR0aW5nczsKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2NjlmZWIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBtYWdpY2FsIGFuZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBWaWRlb0VkaXRpb24gY29uZmlnICovCi0vKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTiAgICAgICAgICAgIDEwMCAgICAvKio8IDEwMCBtaWxsaXNlY29uZHMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX05CX0FVX1BSRUZFVENIICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgLyoqPCBwcmVmZWN0IDQgQVVzICovCi0jZGVmaW5lIE00VlNTM0dQUF9OT19TVFNTX0pVTVBfUE9JTlQgICAgICAgICAgICAgICAgICAgIDQwMDAwIC8qKjwgSWYgM2dwIGZpbGUgZG9lcyBub3QgY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFNUU1MgdGFibGUgKG5vIHJhcCBmcmFtZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXAgYmFja3dhcmQgNDAgcyBtYXhpbXVtICovCi0KLS8qKioqKioqKioqKioqKioqKi8KLS8qIFdyaXRlciBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDIKLQotLyoqPCBNYXggQVUgc2l6ZSB3aWxsIGJlIDAuOCB0aW1lcyB0aGUgWVVWNDoyOjAgZnJhbWUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgICAgICAgICAgMC45RgotLyoqPCBNYXggY2h1bmsgc2l6ZSB3aWxsIGJlIDEuMiB0aW1lcyB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1ZJREVPX0FVX1NJWkVfVE9fQ0hVTkNLX1NJWkVfUkFUSU8gICAgMS4yRgotCi0vKiogUkVBRCBDQVJFRlVMTFkgSU4gQ0FTRSBPRiBSRVBPUlRFRCBSVU5OSU5HIFRST1VCTEVTCi1UaGUgbWF4IEFVIHNpemUgaXMgdXNlZCB0byBwcmUtc2V0IG1heCBzaXplIG9mIEFVIHRoYXQgY2FuIGJlIHdyaXR0ZW4gaW4gdGhlIDNHUCB3cml0ZXIKLUZvciBhdWRpbyBzdGFuZGFyZCB3aXRoIHZhcmlhYmxlIEFVIHNpemUsIHRoZXJlIGNvdWxkIGJlIHNvbWUgZW5jb2Rpbmcgc2V0dGluZ3MgbGVhZGluZyB0byBBVSBzaXplCi1leGNlZWRpbmcgdGhpcyBsaW1pdC4KLUZvciBBQUMgc3RyZWFtcyBmb3IgaW5zdGFuY2UgdGhlIGF2ZXJhZ2UgQVUgc2l6ZSBpcyBnaXZlbiBieToKLWF2IEFVIHNpemUgPSAoYXYgYml0cmF0ZSAqIDEwMjQpLyhzYW1wbGluZyBmcmVxKQotSWYgVlNTIHJldHVybnMgdGhlIG1lc3NhZ2U6Ci0+PiBFUlJPUjogYXVkaW8gQVUgc2l6ZSAoWFhYWCkgdG8gY29weSBsYXJnZXIgdGhhbiBhbGxvY2F0ZWQgb25lIChZWVlZKSA9PiBhYm9ydAotPj4gUExFQVNFIENPTlRBQ1QgU1VQUE9SVCBUTyBFWFRFTkQgTUFYIEFVIFNJWkUgSU4gVEhFIFBST0RVQ1QgTElCUkFSWQotRXJyb3IgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIHdoZW4gbWl4aW5nIHdpdGggYXVkaW8gZnVsbCByZXBsYWNlbWVudAotICovCi0vKio8IEFBQyBtYXggQVUgc2l6ZSAtIFJFQUQgRVhQTEFOQVRJT04gQUJPVkUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMjA0OAotLyoqPCBzZXQgdG8geDQgbWF4IEFVIHNpemUgcGVyIGNodW5rICovCi0jZGVmaW5lIE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkUgICAgICAgICAgICAgICAgICAgIDgxOTIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBIMjYzIC8gTVBFRzQgY29uZmlnICovCi0vKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgICAgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSAgICAgICAgICAgIDI1NQotCi0jaWZkZWYgQklHX0VORElBTgotLyoqPCAweGIzIDAxIDAwIDAwIExpdHRsZSBlbmRpYW4gLyBiMDAgMDAgMDAgMDEgYjMgYmlnIGVuZGlhbiovCi0jZGVmaW5lICAgIE00VlNTM0dQUF9FRElUX0dPVl9IRUFERVIgICAgICAgICAgICAweDAwMDAwMWIzCi0jZWxzZQotLyoqPCAweGIzIDAxIDAwIDAwIExpdHRsZSBlbmRpYW4gLyBiMDAgMDAgMDAgMDEgYjMgYmlnIGVuZGlhbiovCi0jZGVmaW5lICAgIE00VlNTM0dQUF9FRElUX0dPVl9IRUFERVIgICAgICAgICAgICAweGIzMDEwMDAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqLwotLyogQU1SIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9XUklUVEVOX0FNUl9UUkFDS19USU1FX1NDQUxFICAgICAgICAgICAgODAwMAotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0RFQ09ERURfUENNX1NBTVBMRV9OVU1CRVIgICAgICAgICAgICAxNjAgICAgICAgIC8qKjwgMjBtcyBhdCA4MDAwaHogLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMHg4PTE2MCBzYW1wbGVzICovCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgICAgICAgIDEyMjAwICAgLyoqPCAxMi4yIGticHMgKi8KLQotLyoqKioqKioqKioqKioqLwotLyogRVZSQyBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfRVZSQ19ERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgICAgICA5MjAwICAgLyoqPCA5LjIga2JwcyAqLwotCi0vKioqKioqKioqKioqKiovCi0vKiBNUDMgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLS8qKiBNYWNybyB0byBtYWtlIGEganVtcCBvbiB0aGUgTVAzIHRyYWNrIG9uIHNldmVyYWwgc3RlcHMKLSAgICBUbyBhdm9pZCB0byBibG9jayB0aGUgc3lzdGVtIHdpdGggYW4gbG9uZyBNUDMganVtcCwgdGhpcyBwcm9jZXNzCi0gICAgaXMgZGl2aWRlZCBvbiBzZXZlcmFsIHN0ZXBzLgotICovCi0jZGVmaW5lIE00VlNTM0dQUF9NUDNfSlVNUEVEX0FVX05VTUJFUl9NQVggMTAwCi0KLS8qKiBNYWNybyB0byBkZWZpbmUgdGhlIG51bWJlciBvZiByZWFkIEFVIHRvIGFuYWx5c2UgdGhlIGJpdHJhdGUKLSAgICBTbyB0aGUgcHJvY2VzcyB3aWxsIHJlYWQgdGhlIGZpcnN0IG4gQVUgb2YgdGhlIE1QMyBzdHJlYW0gdG8gZ2V0Ci0gICAgdGhlIGF2ZXJhZ2UgYml0cmF0ZS4gbiBpcyBkZWZpbmVkIGJ5IHRoaXMgZGVmaW5lLgotICovCi0jZGVmaW5lIE00VlNTM0dQUF9NUDNfQVVfTlVNQkVSX01BWCA1MDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFNUiBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSAgICAgMTMKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTiAxNjAKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdID0KLXsKLSAgICAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLAotICAgIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IFwKLSAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBQUMgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFICAgICAgNAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXSA9Ci17Ci0gICAgMHgwMCwgMHhDOCwgMHgyMCwgMHgwNwotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV07Ci0jZW5kaWYKLQotI2RlZmluZSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkUgICAgICAgIDYKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkVdID0KLXsKLSAgICAweDIxLCAweDEwLCAweDAzLCAweDIwLCAweDU0LCAweDFDCi19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV07Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTg1NTg4Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbiBwcm90b3R5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBWU1MgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0KLS8qKgotICogICAgVlNTIHByaXZhdGUgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgLyoqPCBmb3IgTTRfQWNjZXNzVW5pdCBkZWZpbml0aW9uICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQWxsIGVycm9ycyBhcmUgZmF0YWwgaW4gdGhlIFZTUyAqLwotI2RlZmluZSBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKSBpZihNNE5PX0VSUk9SIT1lcnIpIHJldHVybiBlcnI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgYXVkaW8gcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKQotICogQGJyaWVmICAgIE9wZW4gbmV4dCBjbGlwCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKipoQ2xpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCB2aWRlbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAbm90ZSAgICBJZiB0aGVyZSBpcyBhdWRpbyBvbiB0aGUgY3VycmVudCBjbGlwLCBwcm9jZXNzIGl0LCBlbHNlIHN3aXRjaCB0byB0aGUgbmV4dCBjbGlwCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgYXVkaW8gdHJhY2sgaXMgcmVhY2hlZAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDbGlwUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpCi0gKiBAYnJpZWYgICAgT3BlbiBhIGNsaXAuIENyZWF0ZXMgYSBjbGlwIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgaENsaXBDdHh0ICAgICAgICAgICAgKE9VVCkgUmV0dXJuIHRoZSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncyBvZiB0aGlzIGNsaXAuIFRoZSBtb2R1bGUgd2lsbCBrZWVwIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0byB0aGlzIHBvaW50ZXIKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIGJTa2lwQXVkaW9UcmFjayAgICAgICAgKElOKSBJZiB0cnVlLCBkbyBub3Qgb3BlbiB0aGUgYXVkaW8KLSAqIEBwYXJhbSAgICBiRmFzdE9wZW5Nb2RlICAgICAgICAoSU4pIElmIHRydWUsIHVzZSB0aGUgZmFzdCBtb2RlIG9mIHRoZSAzZ3BwIHJlYWRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHRoZSBmaXJzdCBBVSBpcyByZWFkKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBJbml0ICgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKipoQ2xpcEN0eHQsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QKLSk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4gKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgTTRPU0FfQm9vbCBiRmFzdE9wZW5Nb2RlLAotICAgIE00T1NBX0Jvb2wgYkF2b2lkT3BlbmluZ1ZpZGVvRGVjCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N1cnJlbnRUaW1lKCkKLSAqIEBicmllZiAgICBKdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgYW5kIGRlY29kZSB1cCB0byB0aGUgY3VycmVudCB2aWRlbyB0aW1lCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgIGlDdHMgICAgICAgIChJTikgVGFyZ2V0IENUUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCwgTTRPU0FfSW50MzIgaUN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkKLSAqIEBicmllZiAgICBKdW1wIGluIHRoZSBhdWRpbyB0cmFjayBvZiB0aGUgY2xpcC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcEp1bXBDdHMgICAgICAgICAgICAoSU4vT1VUKSBpbjp0YXJnZXQgQ1RTLCBvdXQ6IHJlYWNoZWQgQ1RTCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwgTTRPU0FfSW50MzIgKnBKdW1wQ3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSgpCi0gKiBAYnJpZWYgICAgQ2xvc2UgYSBjbGlwLiBEZXN0cm95IHRoZSBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZShNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGZpbGUgZm9ybWF0IHdyaXRlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgIHRoZSB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0LHBXdHJHbG9iYWxJbnRlcmZhY2Ugb3IgcFd0ckRhdGFJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgdmlkZW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAgIChJTikgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwgb3IgdGhlIGRlY29kZXIgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRXcml0ZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRXcml0ZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZGVjb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9TdWJzY3JpYmVNZWRpYUFuZENvZGVjKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcmVhZGVyLCBkZWNvZGVycywgd3JpdGVycyBhbmQgZW5jb2RlcnMKLSAqICAgICAgICAgIGluIHRoZSBWU1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgRVZSQyBmcmFtZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIGJ1ZmZlcgotICogQG5vdGUKLSAqICAgICAwIDEgMiAzCi0gKiAgICArLSstKy0rLSsKLSAqICAgIHxmciB0eXBlfCAgICAgICAgICAgICAgUkZDIDM1NTgKLSAqICAgICstKy0rLSstKwotICoKLSAqIEZyYW1lIFR5cGU6IDQgYml0cwotICogICAgVGhlIGZyYW1lIHR5cGUgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvZGVjIGRhdGEKLSAqICAgIGZyYW1lIGluIHRoZSBSVFAgcGFja2V0LgotICoKLSAqIEZvciBFVlJDIGFuZCBTTVYgY29kZWNzLCB0aGUgZnJhbWUgdHlwZSB2YWx1ZXMgYW5kIHNpemUgb2YgdGhlCi0gKiBhc3NvY2lhdGVkIGNvZGVjIGRhdGEgZnJhbWUgYXJlIGRlc2NyaWJlZCBpbiB0aGUgdGFibGUgYmVsb3c6Ci0gKgotICogVmFsdWUgICBSYXRlICAgICAgVG90YWwgY29kZWMgZGF0YSBmcmFtZSBzaXplIChpbiBvY3RldHMpCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgMCAgICAgQmxhbmsgICAgICAwICAgICgwIGJpdCkKLSAqICAgMSAgICAgMS84ICAgICAgICAyICAgICgxNiBiaXRzKQotICogICAyICAgICAxLzQgICAgICAgIDUgICAgKDQwIGJpdHM7IG5vdCB2YWxpZCBmb3IgRVZSQykKLSAqICAgMyAgICAgMS8yICAgICAgIDEwICAgICg4MCBiaXRzKQotICogICA0ICAgICAxICAgICAgICAgMjIgICAgKDE3MSBiaXRzOyA1IHBhZGRlZCBhdCBlbmQgd2l0aCB6ZXJvcykKLSAqICAgNSAgICAgRXJhc3VyZSAgICAwICAgIChTSE9VTEQgTk9UIGJlIHRyYW5zbWl0dGVkIGJ5IHNlbmRlcikKLSAqCi0gKiBAcGFyYW0gICBwQ3BBdWRpb0ZyYW1lICAgKElOKSBFVlJDIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpCi0gKiBAYnJpZWYgICAgR2V0IHZpZGVvIGFuZCBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsaXAgc3RyZWFtcwotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiBmYXRhbCBlcnJvcnMgb25seSAoZXJyb3JzIHRoYXQgc2hvdWxkIG5vdCBoYXBwZW4gaW4gdGhlCi0gKiAgICAgICAgICAgICBmaW5hbCBpbnRlZ3JhdGVkIHByb2R1Y3QpLgotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ2xpcFByb3BlcnRpZXMgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFJlc2V0IHRoZSBhdWRpbyBlbmNvZGVyIChDcmVhdGUgaXQgaWYgbmVlZGVkKQotICogQG5vdGUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgKnBDX2V3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUDMgZmlsZQotICogQG5vdGUgICAgQ3JlYXRlcyB0aGUgd3JpdGVyLCBDcmVhdGVzIHRoZSBvdXRwdXQgZmlsZSwgQWRkcyB0aGUgc3RyZWFtcywgUmVhZGllcyB0aGUKLSAqICAgICAgICAgICAgd3JpdGluZyBwcm9jZXNzCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgKnBDX2V3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBPc2FGaWxlV3JpdFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBtYXhPdXRwdXRGaWxlU2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgICAgICBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSBhdWRpbyBtaXhlcgotICogQHBhcmFtICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQWRkZWRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbnB1dENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBBZGRlZENsaXBQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjaygpCi0gKiBAYnJpZWYgICAgRGVsZXRlIHRoZSBhdWRpbyB0cmFjay4gQ2xpcCB3aWxsIGJlIGxpa2UgaWYgaXQgaGFkIG5vIGF1ZGlvIHRyYWNrCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRTdGFydEFVKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRQcm9jZXNzQVUoKQotICogQGJyaWVmICAgIFByb2Nlc3NBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSB3cml0dGVuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxGVU5DVElPTlNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTc5MDBmMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZW51bSBhbmQgdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000VlNTM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fTUFKT1IgICAgICAgIDMKLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9NSU5PUiAgICAgICAgMgotI2RlZmluZSBNNFZTU19WRVJTSU9OX1JFVklTSU9OICAgIDUKLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotLyoqCi0gKiAgICBWU1MgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgICAgICAgIC8qKjwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIgICAgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiICAgICAgICAvKio8IERlY29kZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIgICAgICAgIC8qKjwgRW5jb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgICAgICAgIC8qKjwgSW1hZ2UgcGxhbmVzIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIgICAgICAgIC8qKjwgUmVhZCAzR1BQIGZpbGUgICAgICovCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIgICAgICAgICAgICAvKio8IERlY29kZXIgYXVkaW8gICAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIiAgLyoqPCBFbmNvZGUgYXVkaW8gICAgKi8KLQotCi0jaW5jbHVkZSAiU1NSQy5oIiAgICAgICAgICAgICAgICAgICAgLyoqPCBTU1JDICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiRnJvbTJpVG9Nb25vXzE2LmgiICAgICAgICAvKio8IFN0ZXJlbyB0byBNb25vICAgICAqLwotI2luY2x1ZGUgIk1vbm9UbzJJXzE2LmgiICAgICAgICAgICAgLyoqPCBNb25vIHRvIFN0ZXJlbyAgICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdJTkRPV19TSVpFIDEwCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFN0YXRlCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DUkVBVEVEICAgID0gMCwgICAgLyoqPCBNNFZTUzNHUFBfZWRpdEluaXQgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU8gICAgICAgID0gMSwgICAgLyoqPCBQcm9jZXNzaW5nIHZpZGVvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU8gICAgICAgID0gMiwgICAgLyoqPCBQcm9jZXNzaW5nIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzICAgICAgICA9IDMsICAgIC8qKjwgUHJvY2Vzc2luZyBNUDMgYXVkaW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9NUDNfSlVNUCAgID0gNCwgICAgICAgIC8qKjwgUHJvY2Vzc2luZyBhIGp1bXAgaW4gYSBNUDMgYXVkaW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9GSU5JU0hFRCAgICA9IDUsICAgIC8qKjwgUHJvY2Vzc2luZyBkb25lLCBWU1MgM0dQUCBjYW4gYmUgY2xvc2VkICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEICAgICAgICA9IDYgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgaGFzIGJlZW4gY2xvc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWU1MgM0dQUCBjYW4gYmUgZGVzdHJveWVkICovCi19Ci1NNFZTUzNHUFBfRWRpdFN0YXRlOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKio8IERvaW5nIFJlYWQvV3JpdGUgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGhhdmUgbm8gcHJvY2Vzc2luZwotICAgICAqIG9uIGlucHV0IGZyYW1lcy4gT25seSB0aW1lIHN0YW1wIG1hbmlwdWxhdGlvbnMgaW4gb3V0cHV0IGZpbGUuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFICAgID0gMTAsCi0gICAgLyoqPCBEZWNvZGUgZW5jb2RlIHRvIGNyZWF0ZSBhbiBJIGZyYW1lLiBUaGlzIGlzIGRvbmUgZm9yIGEgc2luZ2xlIGZyYW1lCi0gICAgICogdG8gY3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBmcmFtZS4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCAgICAgPSAxMSwKLSAgICAvKio8IERvaW5nIFJlYWQtPkRlY29kZS0+RmlsdGVyLT5FbmNvZGUtPldyaXRlIG9wZXJhdGlvbiBvbiB0aGUgaW5wdXQgZmlsZQotICAgICAqIHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMTIsCi0gICAgLyoqPCBBcHBsaWVkIHdoZW4gVHJhbnNpdGlvbiBpcyBhY3RpdmUgYW5kIGJsZW5kaW5nIG9mIHR3byB2aWRlb3MgaXMKLSAgICAgKiByZXF1aXJlZC4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04gICAgPSAxMywKLSAgICAvKio8IFNwZWNpYWwgUmVhZC9Xcml0ZSBtb2RlIHVzZWQgYWZ0ZXIgQkVHSU5fQ1VUIHN0YXRlLiBUaGUgZnJhbWUKLSAgICAgKiBpcyBhbHJlYWR5IGNvZGVkIGFzIEkgZnJhbWUgaW4gQkVHSU5fQ1VUIHN0YXRlOyBzbyBza2lwIGl0LiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUICAgICA9IDE0Ci19Ci1NNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGU7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURSAgICA9IDIwLCAgICAvKio8IERvaW5nIFJlYWQvV3JpdGUgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBkZWNvZGluZy9lbmNvZGluZykgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX0RFQ09ERV9FTkNPREUgPSAyMSwgICAgLyoqPCBEb2luZyBSZWFkLURlY29kZS9GaWx0ZXIvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGUtV3JpdGUgb3BlcmF0aW9uICovCi0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OICAgID0gMjIgICAgLyoqPCBUcmFuc2l0aW9uOyBibGVuZGluZyBvZiB0d28gYXVkaW8gKi8KLX0KLU00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFN0YXR1cwotICogQGJyaWVmICAgICAgICBTdGF0dXMgb2YgdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IHJlYWR5IGZvciByZWFkaW5nICovCi0gICAgTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERSAgICAgICAgPSAxLCAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSByZWFkeSBmb3IgZGVjb2RpbmcgKi8KLSAgICBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICAgID0gMiAgICAgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgaW4gc3BsaXR0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVVwVG8oKSBwcm9jZXNzaW5nICovCi19Ci1NNFZTUzNHUFBfQ2xpcFN0YXR1czsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcEN1cnJlbnRFZmZlY3QKLSAqIEBicmllZiAgICAgICAgQ3VycmVudCBlZmZlY3QgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0NsaXBDdXJyZW50RWZmZWN0X05PTkUgICAgPSAwLCAgICAvKio8IE5vbmUgKi8KLSAgICBNNFZTUzNHUFBfa0NsaXBDdXJyZW50RWZmZWN0X0JFR0lOICAgID0gMSwgICAgLyoqPCBCZWdpbiBlZmZlY3QgY3VycmVudGx5IGFwcGxpZWQgKi8KLSAgICBNNFZTUzNHUFBfa0NsaXBDdXJyZW50RWZmZWN0X0VORCAgICA9IDIgICAgICAgIC8qKjwgRW5kIGVmZmVjdCBjdXJyZW50bHkgYXBwbGllZCAqLwotfQotTTRWU1MzR1BQX0NsaXBDdXJyZW50RWZmZWN0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgVlNTIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPID0gMCwgICAgICAgICAgICAvKio8IFZpZGVvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5ULCAgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQsIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQsICAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRCAgICAgICAgICAgICAgLyoqPCBQcm9jZXNzaW5nIGZpbmlzaGVkLCB1c2VyIG11c3Qgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAqLwotfQotTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU3RhdGUKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBWU1MgcGljdHVyZSBleHRyYWN0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rRXh0cmFjdFBpY3R1cmVTdGF0ZV9PUEVORUQgICA9IDAsICAvKio8IFZpZGVvIGNsaXAgaXMgb3BlbmVkIGFuZCByZWFkeSB0byBiZSByZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBSQVAgYmVmb3JlIHRoZSBwaWN0dXJlIHRvIGV4dHJhY3QgKi8KLSAgICBNNFZTUzNHUFBfa0V4dHJhY3RQaWN0dXJlU3RhdGVfUFJPQ0VTUyAgICA9IDEsICAvKio8IFZpZGVvIGlzIGRlY29kZWQgZnJvbSB0aGUgcHJldmlvdXMgUkFQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBwaWN0dXJlIHRvIGV4dHJhY3QgKi8KLSAgICBNNFZTUzNHUFBfa0V4dHJhY3RQaWN0dXJlU3RhdGVfRVhUUkFDVEVEPSAyICAgLyoqPCBWaWRlbyBBVSBoYXMgYmVlbiAgZGVjb2RlZCwgdXNlciBtdXN0IG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAgKi8KLX0KLU00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVN0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgICBDb2RlY3MgcmVnaXN0cmF0aW9uIHNhbWUgYXMgaW4gVlBTIGFuZCBWRVMsIHNvIGxlc3MgbWFwcGluZwotICogICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvd2FyZCBWU1MgYXBpIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBHbG9iYWxGY3RzOyAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICBwRGF0YUZjdHM7ICAgICAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLwotfSBNNFZTUzNHUFBfV3JpdGVySW50ZXJmYWNlOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgQUFDX0RFQ19TVFJFQU1fUFJPUFMKLSAqIEBicmllZiBBQUMgU3RyZWFtIHByb3BlcnRpZXMKLSAqIEBOb3RlIGFOb0NoYW4gYW5kIGFTYW1wRnJlcSBhcmUgdXNlZCBmb3IgcGFyc2luZyBldmVuIHRoZSB1c2VyIHBhcmFtZXRlcnMKLSAqICAgICAgICBhcmUgZGlmZmVyZW50LiAgVXNlciBwYXJhbWV0ZXJzIHdpbGwgYmUgaW5wdXQgZm9yIHRoZSBvdXRwdXQgYmVoYXZpb3VyCi0gKiAgICAgICAgb2YgdGhlIGRlY29kZXIgd2hlcmVhcyBmb3IgcGFyc2luZyBiaXRzdHJlYW0gcHJvcGVydGllcyBhcmUgdXNlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNE9TQV9JbnQzMiBhQXVkaW9PYmplY3RUeXBlOyAgICAgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSBvZiB0aGUgc3RyZWFtIC0gaW4gZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZSBmb3VuZCBpbiB0aGUgQWNjZXNzIFVuaXQgcGFyc2VkICovCi0gIE00T1NBX0ludDMyIGFOdW1DaGFuOyAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAoPTEobW9ubykgb3IgPTIoc3RlcmVvKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IGlucHV0IGJpdHN0cmVhbSovCi0gIE00T1NBX0ludDMyIGFTYW1wRnJlcTsgICAgICAgICAgICAvKio8IHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiAqLwotICBNNE9TQV9JbnQzMiBhRXh0ZW5zaW9uU2FtcEZyZXE7ICAgLyoqPCBleHRlbmRlZCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHosID0gMCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBleHRlbmRlZCBmcmVxdWVuY3kgKi8KLSAgTTRPU0FfSW50MzIgYVNCUlByZXNlbnQ7ICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgU0JSICovCi0gIE00T1NBX0ludDMyIGFQU1ByZXNlbnQ7ICAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFBTICovCi0gIE00T1NBX0ludDMyIGFNYXhQQ01TYW1wbGVzUGVyQ2g7ICAvKio8IG1heCBudW1iZXIgb2YgUENNIHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KLX0gQUFDX0RFQ19TVFJFQU1fUFJPUFM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0Ci0gKiBAYnJpZWYgICAgICAgIEZpbGVzeXN0ZW0gYW5kIGNvZGVjIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBwb2ludGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKioKLSAgICAgICogTWVkaWEgYW5kIENvZGVjIHJlZ2lzdHJhdGlvbiAqLwotICAgIC8qKjwgVGFibGUgb2YgTTRWRVNfV3JpdGVySW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBXcml0ZXJzIGxpc3QgKi8KLSAgICBNNFZTUzNHUFBfV3JpdGVySW50ZXJmYWNlICAgIFdyaXRlckludGVyZmFjZVtNNFdSSVRFUl9rVHlwZV9OQl07Ci0gICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyKi8KLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBXcml0ZXJHbG9iYWxGY3RzOwotICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICBwV3JpdGVyRGF0YUZjdHM7Ci0KLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwVmlkZW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogICAgcEF1ZGlvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IFRhYmxlIG9mIGludGVybmFsL2V4dGVybmFsIGZsYWdzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2RlckZsYWdbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBGdW5jdGlvbnMgb2YgdGhlIHVzZWQgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgbV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgbV9wUmVhZGVyRGF0YUl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFJlYWRlcjsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgbV9wUmVhZGVyRGF0YUl0OwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkUmVhZGVyczsKLQotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBtX3BWaWRlb0RlY29kZXI7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIG1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWM7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0jZW5kaWYKLQotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXI7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgLyoqPCBzdG9yZSBpbmRpY2VzIG9mIGV4dGVybmFsIGRlY29kZXJzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW000QURfa1R5cGVfTkJdOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAvKiBib29sZWFuIHRvIHRlbGwgd2hldGhlciByZWdpc3RlcmVkIGV4dGVybmFsIE9NWCBjb2RlY3Mgc2hvdWxkIGJlIGZyZWVkIGR1cmluZyBjbGVhbnVwCi0gICAgIG9yIG5ldyBjb2RlYyByZWdpc3RyYXRpb24qLwotICAgIE00T1NBX0Jvb2wgICAgYkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlOwotI2VuZGlmCi0KLQotfSBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9ucyByZWxhdGVkIHRvIG9uZSAzR1BQIGNsaXAgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSB0aGUgY29udGV4dCByZWxhdGVkIHRvIG9uZSBjbGlwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKiAgICAgICAgcFNldHRpbmdzOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgY2xpcCBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBwb3NzZXNzZWQpICovCi0KLSAgICBNNFZTUzNHUFBfQ2xpcFN0YXR1cyAgICAgICAgVnN0YXR1czsgICAgICAgICAgICAvKio8IFZpZGVvIHN0YXR1cyBvZiB0aGUgY2xpcCByZWFkaW5nICovCi0gICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMgICAgICAgIEFzdGF0dXM7ICAgICAgICAgICAgLyoqPCBBdWRpbyBzdGF0dXMgb2YgdGhlIGNsaXAgcmVhZGluZyAqLwotCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlWb2Zmc2V0OyAgICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gT2Zmc2V0IGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIGFuZCB0aGUgb3V0cHV0IHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJlZ2luIGN1dCB0YWtlbiBpbnRvIGFjY291bnQpICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlBb2Zmc2V0OyAgICAgICAgICAgLyoqPCBbVGltZXNjYWxlXSBPZmZzZXQgYmV0d2VlbiB0aGUgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBvdXRwdXQgYXVkaW8gc3RyZWFtIChiZWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0IHRha2VuIGludG8gYWNjb3VudCkgKi8KLQotICAgIC8qKgotICAgICAqIDNHUFAgcmVhZGVyIFN0dWZmICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcEZpbGVSZWFkUHRyRmN0OwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQ7ICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSAzR1BQIHJlYWRlciBtb2R1bGUgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICAgICAgICBwVmlkZW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIHZpZGVvIHN0cmVhbSAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgIHBBdWRpb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgYXVkaW8gc3RyZWFtICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgICAgICBWaWRlb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAod2UgZG8gbm90IHVzZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGFsbG9jYXRlIGxhdGVyLCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3N0IG9mIHRoZSB0aW1lIHdlIHdpbGwgbmVlZCBpdCkgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICAgICAgIEF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICh3ZSBkbyBub3QgdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYWxsb2NhdGUgbGF0ZXIsIGJlY2F1c2UgbW9zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRpbWUgd2Ugd2lsbCBuZWVkIGl0KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJWaWRlb0F1QXZhaWxhYmxlOyAgICAvKio8IFRlbGwgaWYgYSB2aWRlbyBBVSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91c2x5IHJlYWQpICovCi0gICAgLyoqPCBCb29sZWFuIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiRmlyc3RBdVdyaXR0ZW47Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwVmlEZWNDdHh0OyAgICAgICAgICAgIC8qKjwgVmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlWaWRlb0RlY0N0czsgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBGb3IgdmlkZW8gZGVjb2RlVXBUbygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3R1YWwgcmVhY2hlZCBjdHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaVZpZGVvUmVuZGVyQ3RzOyAgICAvKio8IFtNaWxsaXNlY29uZHNdIEZvciB2aWRlbyByZW5kZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHJlYWNoZWQgY3RzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaXNSZW5kZXJEdXA7ICAgICAgICAvKio8IFRvIGhhbmRsZSBkdXBsaWNhdGUgZnJhbWUgcmVuZGVyaW5nIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiBleHRlcm5hbCBkZWNvZGluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgICAgIGxhc3REZWNvZGVkUGxhbmU7ICAgIC8qKjwgTGFzdCBkZWNvZGVkIHBsYW5lICovCi0KLSAgICAvKioKLSAgICAgKiBNUEVHNCB0aW1lIGluZm8gc3R1ZmYgYXQgY2xpcCBsZXZlbCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgYk1wZWc0R292U3RhdGU7ICAgICAgICAgICAgLyoqPCBOYW1lbHksIHVwZGF0ZSBvciBpbml0aWFsaXphdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgdWlNcGVnNFByZXZHb3ZWYWx1ZUdldDsgICAgLyoqPCBQcmV2aW91cyBHb3YgdmFsdWUgcmVhZCAoaW4gc2Vjb25kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgdWlNcGVnNFByZXZHb3ZWYWx1ZVNldDsgICAgLyoqPCBQcmV2aW91cyBHb3YgdmFsdWUgd3JpdGUgKGluIHNlY29uZCkgKi8KLQotICAgIC8qKgotICAgICAqIFRpbWUtbGluZSBzdHVmZiAqLwotICAgICAvKio8IFtNaWxsaXNlY29uZHNdIENUUyBhdCB3aGljaCB0aGUgdmlkZW8gY2xpcCBhY3R1YWxseSBzdGFydHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDVFMgYXQgd2hpY2ggdGhlIGF1ZGlvIGNsaXAgYWN0dWFsbHkgc3RhcnRzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGltZSBhdCB3aGljaCB0aGUgY2xpcCBtdXN0IGVuZCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpRW5kVGltZTsKLQotICAgIC8qKgotICAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBBdWRpb0RlY0N0eHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIEFNUiBkZWNvZGVyICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVySW47ICAgIC8qKjwgSW5wdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dDsgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBkZWNvZGVkIFBDTSBkYXRhICovCi0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgICAgICAgIEFhY1Byb3BlcnRpZXM7ICAgICAgLyoqPCBTdHJ1Y3R1cmUgZm9yIG5ldyBhcGkgdG8gZ2V0IEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gQVUgdG8gRnJhbWUgc3BsaXQgc3R1ZmYgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJBdWRpb0ZyYW1lQXZhaWxhYmxlOyAgLyoqPCBUcnVlIGlmIGFuIGF1ZGlvIGZyYW1lIGlzIGF2YWlsYWJsZSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgcEF1ZGlvRnJhbWVQdHI7ICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIEF1ZGlvIGZyYW1lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvRnJhbWVTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBhdWRpbyBmcmFtZSBhdmFpbGFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzOyAgICAgICAvKio8IFtUaW1lc2NhbGVdIENUUyBvZiB0aGUgYXVkaW8gZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSAqLwotCi0gICAgLyoqCi0gICAgICogU2lsZW5jZSBmcmFtZSBzdHVmZiAqLwotICAgICAvKio8IFNpemUgdG8gcmVzZXJ2ZSB0byBzdG9yZSBhIHBjbSBmdWxsIG9mIHplcm9zIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VQY21TaXplOwotICAgIC8qKjwgUG9pbnRlciB0byBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgICAgIHBTaWxlbmNlRnJhbWVEYXRhOwotICAgIC8qKjwgU2l6ZSBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAvKio8IFtUaW1lc2NhbGVdIER1cmF0aW9uIG9mIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBzY2FsZV9hdWRpbzsgICAgICAgICAgICAvKio8IGZyZXF1ZW5jeSAvIDEwMDAuMCAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCi0gICAgIC8qKjwgRmlsZXN5c3RlbSBhbmQgc2hlbGwgcmVhZGVyLCBkZWNvZGVyIGZ1bmN0aW9ucyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCBTaGVsbEFQSTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgKnBQbGFuZVl1djsgIC8qIFlVVjQyMCBpbWFnZSBwbGFuZSwgY29udmVydGVkIGZyb20gQVJHQjg4OCAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgICBtX3BQcmVSZXNpemVGcmFtZTsgIC8qIFRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZSByZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgb25seSBpZiByZXNpemUgbmVlZGVkKSovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICpwUGxhbmVZdXZXaXRoRWZmZWN0OyAvKiBZVVY0MjAgaW1hZ2UgcGxhbmUsIHdpdGggY29sb3IgZWZmZWN0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJHZXRZdXZEYXRhRnJvbURlY29kZXI7ICAvKiBCb29sZWFuIHVzZWQgdG8gZ2V0IFlVViBkYXRhIGZyb20gZHVtbXkgdmlkZW8gZGVjb2RlciBvbmx5IGZvciBmaXJzdCB0aW1lICovCi19IE00VlNTM0dQUF9DbGlwQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBhbm9ueW1vdXMgZW51bQotICogQGJyaWVmICAgICAgICBlbnVtIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGVuY29kZXIgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1lbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tOb0VuY29kZXIsCi0gICAgTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0F1ZGlvVmlkZW9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGF1ZGlvIHZpZGVvIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIGF1ZGlvL3ZpZGVvLCBlbmNvZGluZy93cml0aW5nIG9wZXJhdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBUaW1pbmcgU3R1ZmYgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRHVyYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlLCB1c2VkIGZvciBwcm9ncmVzcyBjb21wdXRhdGlvbiAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBkSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDdXJyZW50IENUUyBvZiB0aGUgdmlkZW8gb3V0cHV0IHN0cmVhbSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBkT3V0cHV0VmlkQ3RzOwotLyoqPCBbTWlsbGlzZWNvbmRzXSBDdXJyZW50IENUUyBvZiB0aGUgYXVkaW8gb3V0cHV0IHN0cmVhbSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBkQVRvOwotICAgICAvKio8IFtNaWxsaXNlY29uZHNdIER1cmF0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZSwgdXNlZCBmb3IgcHJvZ3Jlc3MgY29tcHV0YXRpb24gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaU91dHB1dER1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogT3V0cHV0IFZpZGVvIFN0cmVhbSBTdHVmZiAqLwotICAgIE00U1lTX1N0cmVhbVR5cGUgICAgICAgICAgICBWaWRlb1N0cmVhbVR5cGU7ICAgICAgICAvKio8IE91dHB1dCB2aWRlbyBjb2RlYyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb1Byb2ZpbGU7ICAvKio8IE91dHB1dCB2aWRlbyBwcm9maWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvTGV2ZWw7ICAgLyoqPCBPdXRwdXQgdmlkZW8gbGV2ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAvKio8IEF2ZXJhZ2UgdmlkZW8gYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCBmcm9tIGlucHV0IGJpdHJhdGVzLCBkdXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMgYW5kIGN1dHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgT3V0cHV0IGltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9IZWlnaHQ7ICAgICAgICAgICAgLyoqPCBPdXRwdXQgaW1hZ2UgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9UaW1lU2NhbGU7ICAgICAgICAvKio8IFRpbWUgc2NhbGUgdG8gdXNlIGZvciB0aGUgZW5jb2RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0cmFuc2l0aW9uIChpZiBNUEVHLTQpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlZpZGVvRGF0YVBhcnRpdGlvbmluZzsgICAgLyoqPCBEYXRhIHBhcnRpdGlvbmluZyB0byB1c2UgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBvZiB0aGUgdHJhbnNpdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgTVBFRy00KSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICAgIHBWaWRlb091dHB1dERzaTsgICAgICAgIC8qKjwgRGVjb2RlciBTcGVjaWZpYyBJbmZvIG9mIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy00IHRyYWNrICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRwdXQgTVBFRy00IHRyYWNrICovCi0gICAgLyoqCi0gICAgICogT3V0cHV0IEF1ZGlvIFN0cmVhbSBTdHVmZiAqLwotICAgIE00U1lTX1N0cmVhbVR5cGUgICAgICAgICAgICBBdWRpb1N0cmVhbVR5cGU7ICAgICAgICAvKio8IFR5cGUgb2YgdGhlIG91dHB1dCBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzOyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICgxPW1vbm8sIDI9c3RlcmVvKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgICAgICAvKio8IEF1ZGlvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAgICAvKio8IFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeSAoODAwMCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXIsIDE2MDAwIG9yIG1vcmUgZm9yIGFhYykgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgICBwQXVkaW9PdXRwdXREc2k7ICAgICAgICAvKio8IERlY29kZXIgU3BlY2lmaWMgSW5mbyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgdWlBdWRpb091dHB1dERzaVNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgRGVjb2RlciBTcGVjaWZpYyBJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBhdWRpbyB0cmFjayAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gRW5jb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jQ3R4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgcEF1ZGlvRW5jRFNJOyAgICAgICAvKio8IERlY29kZXIgc3BlY2lmaWMgaW5mbyBidWlsdCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICAgICAgICAgICBBdWRpb0VuY1BhcmFtczsgICAgIC8qKjwgQ29uZmlnIG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0KLSAgICAvKioKLSAgICAgKiBTaWxlbmNlIGZyYW1lIHN0dWZmICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZVBjbVNpemU7ICAgICAgIC8qKjwgU2l6ZSB0byByZXNlcnZlIHRvIHN0b3JlIGEgcGNtIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB6ZXJvcyBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgICAgICBwU2lsZW5jZUZyYW1lRGF0YTsgICAgICAvKio8IFBvaW50ZXIgdG8gc2lsZW5jZSBmcmFtZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlRnJhbWVTaXplOyAgICAgLyoqPCBTaXplIG9mIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpU2lsZW5jZUZyYW1lRHVyYXRpb247ICAvKio8IFtUaW1lc2NhbGVdIER1cmF0aW9uIG9mIHNpbGVuY2UgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgc2NhbGVfYXVkaW87ICAgICAgICAgICAgLyoqPCBmcmVxdWVuY3kgLyAxMDAwLjAgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIEVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNEVOQ09ERVJfQ29udGV4dCAgICAgICAgICAgIHBFbmNDb250ZXh0OyAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgZW5jb2RlciAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgICAgICAgIE91cldyaXRlckRhdGFJbnRlcmZhY2U7ICAgIC8qKjwgT3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyIGludGVyZmFjZSwgdG8gZ2l2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5jb2RlciBzaGVsbCAqLwotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICAgICBwRHVtbXlBdUJ1ZmZlcjsgICAgICAgICAgICAvKio8IEJ1ZmZlciBnaXZlbiB0byB0aGUgZW5jb2RlciBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB0byB3cml0ZSBBVXMgd2UgZG9uJ3Qgd2FudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0cHV0ICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlNcGVnNEdvdk9mZnNldDsgICAgICAgIC8qKjwgQ2xpcCBHT1Ygb2Zmc2V0IGluIG1zIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gYW5kIHN5c3RlbSB0aW1lICovCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgICBWcHBFcnJvcjsgICAgICAgICAgICAgICAgLyoqPCBFcnJvciBmb3IgVlBQIGFyZSBtYXNrZWQgYnkgVmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZXIsIHNvIHdlIG11c3QgcmVtZW1iZXIgaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgZW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgTTRXUklURVJfQ29udGV4dCAgICAgICAgICAgIHAzZ3BXcml0ZXJDb250ZXh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSAzR1BQIHdyaXRlciBtb2R1bGUgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgICAgICAgV3JpdGVyVmlkZW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgICAgICBXcml0ZXJBdWRpb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyAgICBXcml0ZXJWaWRlb1N0cmVhbUluZm87ICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyAgICBXcml0ZXJBdWRpb1N0cmVhbUluZm87ICAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgV3JpdGVyVmlkZW9BVTsgICAgICAgICAgICAvKio8IFdyaXR0ZW4gdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgV3JpdGVyQXVkaW9BVTsgICAgICAgICAgICAvKio8IFdyaXR0ZW4gYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgICAgIC8qKjwgTWF4IEFVIHNpemUgc2V0IHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHZpZGVvICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7ICAgICAgICAvKio8IE1heCBBVSBzaXplIHNldCB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBhdWRpbyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGU7IC8qKjwgQXZlcmFnZSB2aWRlbyBiaXRyYXRlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZSwgY29tcHV0ZWQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBiaXRyYXRlcywgZHVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBhbmQgY3V0cyAqLwotCi19IE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZWRpdCBWU1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgVlNTIGVkaXQgb3BlcmF0aW9ucyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogVlNTIDNHUFAgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFN0YXRlICAgICAgICAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZTUyBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00VlNTM0dQUF9FZGl0VmlkZW9TdGF0ZSAgICBWc3RhdGU7Ci0gICAgTTRWU1MzR1BQX0VkaXRBdWRpb1N0YXRlICAgIEFzdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFVzZXIgU2V0dGluZ3MgKGNvcGllZCwgdGh1cyBvd25lZCBieSBWU1MzR1BQKSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwTnVtYmVyOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudCBvZiB0aGUgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IHBDbGlwTGlzdC4gKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICAgICAqcENsaXBMaXN0OyAgICAgICAgICAgIC8qKjwgTGlzdCBvZiB0aGUgaW5wdXQgY2xpcHMgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIHVpQ2xpcE51bWJlciBjbGlwIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAgICpwVHJhbnNpdGlvbkxpc3Q7ICAgIC8qKjwgTGlzdCBvZiB0aGUgdHJhbnNpdGlvbiBzZXR0aW5ncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiB1aUNsaXBOdW1iZXItMSB0cmFuc2l0aW9uIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICAgICAgICpwRWZmZWN0c0xpc3Q7ICAgICAgICAvKio8IExpc3Qgb2YgdGhlIGVmZmVjdHMgc2V0dGluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgbmJFZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0c0xpc3Q7ICAgIC8qKjwgTGlzdCBvZiB0aGUgYWN0aXZlIGVmZmVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy4gQXJyYXkgb2YgbmJFZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXJzIG9mIGVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIG5iQWN0aXZlRWZmZWN0czsgICAgLyoqPCBOdW1iZXJzIG9mIGFjdGl2ZSBlZmZlY3RzIFJDICovCi0KLSAgICAvKioKLSAgICAgKiBJbnB1dCBTdHVmZiAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcDsgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGN1cnJlbnQgY2xpcCAxIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGxpc3QgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICAgICAgcEMxOyAgICAgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGN1cnJlbnQgY2xpcCAxICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgICAgIHBDMjsgICAgICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBjdXJyZW50IGNsaXAgMiAqLwotCi0gICAgLyoqCi0gICAgICogRGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBkT3V0cHV0RnJhbWVEdXJhdGlvbjsgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBkaXJlY3RseSByZWxhdGVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmcmFtZSByYXRlICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXYxWzNdOyAgICAgICAgICAgIC8qKjwgRmlyc3QgdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2MlszXTsgICAgICAgICAgICAvKio8IFNlY29uZCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXYzWzNdOyAgICAgICAgICAgIC8qKjwgVGhpcmQgdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSBSQyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2NFszXTsgICAgICAgICAgICAvKio8IEZvdXJ0aCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lIFJDICovCi0KLSAgICAvKioKLSAgICAgKiBFZmZlY3Qgc3R1ZmYgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiQ2xpcDFBdEJlZ2luQ3V0OyAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaGUgY2xpcDEgaXMgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgYmVnaW4gY3V0ICovCi0gICAgTTRPU0FfSW50OCAgICAgICAgICAgICAgICAgICAgaUNsaXAxQWN0aXZlRWZmZWN0OyAgICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGFjdGl2ZSBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gQ2xpcDEgKDwwIG1lYW5zIG5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VkIGZvciB2aWRlbyBhbmQgYXVkaW8gYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2ltdWx0YW5lb3VzbHkpICovCi0gICAgTTRPU0FfSW50OCAgICAgICAgICAgICAgICAgICAgaUNsaXAyQWN0aXZlRWZmZWN0OyAgICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGFjdGl2ZSBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gQ2xpcDIgKDwwIG1lYW5zIG5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VkIGZvciB2aWRlbyBhbmQgYXVkaW8gYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzaW11bHRhbmVvdXNseSkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVHJhbnNpdGlvbkVmZmVjdDsgICAgICAgIC8qKjwgVHJ1ZSBpZiB0aGUgdHJhbnNpdGlvbiBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKi8KLQotICAgIC8qKgotICAgICAqIEVuY29kaW5nIGFuZCBXcml0aW5nIG9wZXJhdGlvbnMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgIGJTdXBwb3J0U2lsZW5jZTsgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgdGhlIG91dHB1dCBzdHJlYW0gY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzaWxlbmNlIChldmVuIGlmIG5vdCBlZGl0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgQUFDKywgYnV0IG5vdCBFVlJDKSAqLwotICAgIE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgICAgZXdjOyAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIGFuZCB2aWRlbyBlbmNvZGUvd3JpdGUgc3R1ZmYgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYklzTU1TOyAgICAgICAgICAgICAgICAvKio8IEJvb2xlYW4gdXNlZCB0byBrbm93IGlmIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgYSBmaWxlIHdpdGggYW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBjb25zdHJhaW50ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aU1NU1ZpZGVvQml0cmF0ZTsgICAgLyoqPCBJZiBpbiBNTVMgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIE1NU3ZpZGVvRnJhbWVyYXRlOyAgICAvKio8IElmIGluIE1NUyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZCB2aWRlbyBmcmFtZXJhdGUgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYUZpbGVSZWFkUHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICBwT3NhRmlsZVdyaXRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCi0gICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICAgICAgICAgU2hlbGxBUEk7ICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYklzc2Vjb25kQ2xpcDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3RzTGlzdDE7ICAvKio8IExpc3Qgb2YgdGhlIGFjdGl2ZSBlZmZlY3RzIHNldHRpbmdzLiBBcnJheSBvZiBuYkVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgbmJBY3RpdmVFZmZlY3RzMTsgIC8qKjwgTnVtYmVycyBvZiBhY3RpdmUgZWZmZWN0cyBSQyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBtX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkOyAgLyoqPCBGbGFnIHRvIGluZGljYXRlIHRoYXQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgZWZmZWN0IGlzIGFjdGl2ZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBpSW5PdXRUaW1lT2Zmc2V0OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBiRW5jb2RlVGlsbEVvRjsKLSAgICBNNHhWU1NfRWRpdFNldHRpbmdzICAgICAgeFZTUzsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9haXJfY29udGV4dDsKLQotICAgIE00T1NBX0Jvb2wgYkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdDsgLyoqPCBPdmVybGF5IGZsYWcgZm9yIGNsaXAxICovCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OyAvKio8IE92ZXJsYXkgZmxhZyBmb3IgY2xpcDIsIHVzZWQgaW4gdHJhbnNpdGlvbiAqLwotfSBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYXVkaW8gbWl4aW5nIFZTUyAzR1BQIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBvcGVyYXRpb25zIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgVlNTIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU3RhdGUgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgc3RhdGUgKi8KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGNvcHkgb2YgdGhlIGlucHV0IHNldHRpbmdzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaUFkZEN0czsgICAgICAgICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHdoaWNoIHRoZSBhZGRlZCBhdWRpbyB0cmFjayBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdGltZSBvZiB0aGUgbG9vcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpRW5kTG9vcDsgICAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgb2YgdGhlIGxvb3AgKDAgbWVhbnMgbm8gbG9vcCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICBiUmVtb3ZlT3JpZ2luYWw7ICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCB0aGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50ICovCi0KLSAgICAvKioKLSAgICAgKiBJbnB1dCBhdWRpby92aWRlbyBmaWxlICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgSW5wdXRDbGlwU2V0dGluZ3M7ICAgICAgICAvKio8IFN0cnVjdHVyZSBpbnRlcm5hbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlIHRoZSBpbnB1dCAzR1BQIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgcElucHV0Q2xpcEN0eHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGlucHV0IDNHUFAgY2xpcCAqLwotCi0gICAgLyoqCi0gICAgICogQWRkZWQgYXVkaW8gZmlsZSBzdHVmZiAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIEFkZGVkQ2xpcFNldHRpbmdzOyAgICAgICAgLyoqPCBTdHJ1Y3R1cmUgaW50ZXJuYWxseSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgYWRkZWQgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICBwQWRkZWRDbGlwQ3R4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgYWRkZWQgM0dQUCBjbGlwICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBzdHVmZiAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICBmT3JpZ0ZhY3RvcjsgICAgICAgICAgICAvKio8IEZhY3RvciB0byBhcHBseSB0byB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBmb3IgdGhlIG1peGluZyAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICBmQWRkZWRGYWN0b3I7ICAgICAgICAgICAgLyoqPCBGYWN0b3IgdG8gYXBwbHkgdG8gdGhlIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGZvciB0aGUgbWl4aW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJTdXBwb3J0U2lsZW5jZTsgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHRoZSBvdXRwdXQgc3RyZWFtIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2lsZW5jZSAoZXZlbiBpZiBub3QgZWRpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIEFBQyssIGJ1dCBub3QgRVZSQykgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkhhc0F1ZGlvOyAgICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJBdWRpb01peGluZ0lzTmVlZGVkOyAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkbyBtaXhpbmcgKi8KLQotICAgIC8qKgotICAgICAqIEVuY29kaW5nIGFuZCBXcml0aW5nIG9wZXJhdGlvbnMgKi8KLSAgICBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICAgIGV3YzsgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBhbmQgdmlkZW8gZW5jb2RlL3dyaXRlIHN0dWZmICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCi0gICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0IFNoZWxsQVBJOyAgICAgICAgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBhbmQgc2hlbGwgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIGZ1bmN0aW9ucyAqLwotCi0gICAgLyoqCi0gICAgICogU2FtcGxlIFJhdGUgQ29udmVydG9yIChTU1JDKSBzdHVmZiAobmVlZGVkIGluIGNhc2Ugb2YgbWl4aW5nIHdpdGggIT0gQVNGL25iIG9mIGNoYW5uZWxzKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiX1NTUkNuZWVkZWQ7ICAgICAgICAvKio8IElmIHRydWUsIFNTUkMgaXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIT0gQVNGIG9yIG5iIG9mIGNoYW5uZWxzKSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBDaGFubmVsQ29udmVyc2lvbjsgICAgLyoqPCAxPUNvbnZlcnNpb24gZnJvbSBNb25vIHRvIFN0ZXJlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI9U3RlcmVvIHRvIE1vbm8sIDA9bm8gY29udmVyc2lvbiAqLwotICAgIFNTUkNfSW5zdGFuY2VfdCAgICAgICAgICAgICBTc3JjSW5zdGFuY2U7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIFNzcmMgKi8KLSAgICBTU1JDX1NjcmF0Y2hfdCogICAgICAgICAgICAgU3NyY1NjcmF0Y2g7ICAgICAgICAvKio8IFdvcmtpbmcgbWVtb3J5IG9mIHRoZSBTc3JjICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbEluOyAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgbmVlZHMgYXMgaW5wdXQgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsT3V0OyAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgb3V0cHV0cyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwU3NyY0J1ZmZlckluOyAgICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwU3NyY0J1ZmZlck91dDsgICAgICAgIC8qKjwgT3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJJbjsgICAgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIGluIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5Tc3JjQnVmZmVyT3V0Oy8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBvdXQgYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBUZW1wQnVmZmVyOyAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBQb3NJblRlbXBCdWZmZXI7ICAgIC8qKjwgUG9zaXRpb24gaW4gdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtaW5pbXVtQnVmZmVySW47ICAgIC8qKjwgTWluaW11bSBhbW91bnQgb2YgZGVjb2RlZCBkYXRhIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgYnkgU1NSQyBhbmQgY2hhbm5lbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRvciAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiX0R1Y2tpbmdOZWVkZWVkOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfdGhyZXNob2xkOyAgLyoqPCBUaHJlc2hvbGQgdmFsdWUgYXQgd2hpY2ggYmFja2dyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpYyBzaGFsbCBkdWNrICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIEluRHVja2luZ19sb3dWb2x1bWU7ICAvKio8IGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IgYW5kIGluY3JlYXNlIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgdG8gaW52ZXJzZSBvZiB0aGlzIGZhY3RvciAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBsb3dWb2x1bWU7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGF1ZGlvVm9sdW1lQXJyYXlbV0lORE9XX1NJWkVdOyAvLyBzdG9yZSBwZWFrIGF1ZGlvIHZvbC4gbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkdXJhdGlvbiBmb3IgV0lORE9XX1NJWkUKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgYXVkVm9sQXJySW5kZXg7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGR1Y2tpbmdGYWN0b3IgOyAgICAgLyoqPCBtdWx0aXBseSBieSB0aGlzIGZhY3RvciB0byBicmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBREUgSU4vRkFERSBPVVQgZWZmZWN0ICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGZCVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBmUFRWb2xMZXZlbDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkRvRHVja2luZzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkxvb3A7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJOb0xvb3Bpbmc7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgcExWQXVkaW9SZXNhbXBsZXI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJqdW1wZmxhZzsKLQotfSBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0ludGVybmFsRXh0cmFjdFBpY3R1cmVDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGV4dHJhY3QgcGljdHVyZSBWU1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbnMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqICAgIFZTUyBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVN0YXRlIFN0YXRlOyAgICAgICAgICAgICAgICAvKio8IFZTUyBleHRyYWN0IHBpY3R1cmVpbnRlcm5hbCBzdGF0ZSAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZXMgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBDbGlwU2V0dGluZ3M7ICAgICAgICAgICAgLyoqPCBTdHJ1Y3R1cmUgaW50ZXJuYWxseSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlIHRoZSBpbnB1dCAzRlBQIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgcElucHV0Q2xpcEN0eHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGlucHV0IDNHUFAgY2xpcCAqLwotCi0gICAgLyoqCi0gICAgICogU2V0dGluZ3MgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUV4dHJhY3RDdHM7ICAgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDdHMgb2YgdGhlIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZXh0cmFjdGVkICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBzdHVmZiAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgZGVjUGxhbmVzWzNdOyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBZVVY0MjAgcGljdHVyZSBwbGFuZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAgICAgLyoqPCBEZWNvZGVkIGltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9IZWlnaHQ7ICAgICAgICAgICAgLyoqPCBEZWNvZGVkIGltYWdlIGhlaWdodCAqLwotCi0gICAgLyoKLSAgICAgKiBEZWNvZGVyIGluZm8gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpRGVjQ3RzOyAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRGVjb2RlZCBBVSBDdHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICBiSnVtcEZsYWc7ICAgICAvKio8IDEgaWYgYSBqdW1wIGhhcyBiZWVuIG1hZGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpRGVsdGFUaW1lOyAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGltZSBiZXR3ZWVuIHByZXZpb3VzIFJBUCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaUdhcDsgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYmV0d2VlbiBqdW1wIEFVIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rpb24gdGltZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpU3RlcDsgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBQcm9ncmVzcyBiYXIgdGltZSBpbmNyZW1lbnQgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLCB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYUZpbGVSZWFkUHRyOwotICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICBwT3NhRmlsZVdyaXRQdHI7Ci0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiQ2xpcE9wZW5lZDsKLX0gTTRWU1MzR1BQX0ludGVybmFsRXh0cmFjdFBpY3R1cmVDb250ZXh0OwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Y2UxMDJmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRYVlNTX0FQSV9IX18KLSNkZWZpbmUgX19NNFhWU1NfQVBJX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00eFZTU19BUEkuaAotICogQGJyaWVmICAgIEFQSSBvZiBWaWRlbyBTdHVkaW8gMi4xCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLS8qIEVycm9ycyBjb2RlcyAqLwotCi0vKioKLSAqIEVuZCBvZiBhbmFseXppbmcgPT4gdGhlIHVzZXIgY2FuIGNhbGwgTTR4VlNTX1ByZXZpZXdTdGFydCBvciBNNHhWU1NfU2F2ZVN0YXJ0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkUgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwMSkKLQotLyoqCi0gKiBFbmQgb2YgcHJldmlldyBnZW5lcmF0aW5nID0+IHRoZSB1c2VyIGNhbiBsYXVuY2ggdnBzIHRvIHNlZSBwcmV2aWV3LiBPbmNlIHByZXZpZXcgaXMgb3ZlciwKLSAgIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfUHJldmlld1N0b3AoKSB0byBiZSBhYmxlIHRvIHNhdmUgZWRpdGVkIGZpbGUsIG9yIHRvIGNhbGwgYW5vdGhlcgotICAgTTR4VlNTX1NlbmRDb21tYW5kKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDAyKQotCi0vKioKLSAqIEVuZCBvZiBzYXZlZCBmaWxlIGdlbmVyYXRpb24gPT4gdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TYXZlU3RvcCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwMykKLQotLyoqCi0gKiBUcmFuc2NvZGluZyBpcyBuZWNlc3NhcnkgdG8gZ28gZnVydGhlciAtPiBpZiB0aGUgdXNlciBkb2VzIG5vdCB3YW50IHRvIGNvbnRpbnVlLAotICBoZSBtdXN0IGNhbGwgTTR4VlNTX3NlbmRDb21tYW5kKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlkgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDA0KQotCi0vKioKLSAqIEluIGNhc2Ugb2YgTU1TLCB0aGUgb3V0cHV0IGZpbGUgc2l6ZSB3b24ndCBiZSByZWFjaGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNSkKLQotLyoqCi0gKiBKUEcgaW5wdXQgZmlsZSBkaW1lbnNpb25zIGFyZSB0b28gaGlnaCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0pQR19UT09fQklHICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTLCAweDAwMDEpCi0KLS8qKgotICogVVRGIENvbnZlcnNpb24sIHdhcm5pbmcgb24gdGhlIHNpemUgb2YgdGhlIHRlbXBvcmFyeSBjb252ZXJ0ZWQgYnVmZmVyKi8KLSNkZWZpbmUgTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDA2KQotCi0vKioKLSAqIFNXSUtBUiA6RXJyb3Igd2hhbiBOT19NT1JFX1NQQUNFKi8KLSNkZWZpbmUgTTR4VlNTRVJSX05PX01PUkVfU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWUywgMHgwMDA3KQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00eFZTU19WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSB4VlNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9IE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsKzEsIC8qIDI1NyAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNTggKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjU5ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MCAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjEgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYyICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCwgLyogVGV4dCBvdmVybGF5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MyAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjQgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjY1ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2NiAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjcgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY4Ki8KLX0gTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNHhWU1NfVmlkZW9UcmFuc2l0aW9uVHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdGhhdCBjYW4gYmUgYXBwbGllZCBkdXJpbmcgYSB0cmFuc2l0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCwgLyoyNTYqLwotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljLAotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9TbGlkZVRyYW5zaXRpb24sCi0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0ZhZGVCbGFjawotCi19IE00eFZTU19WaWRlb1RyYW5zaXRpb25UeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUHJldmlld1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgVlBTIGZvciBwcmV2aWV3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcDNncFByZXZpZXdGaWxlOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwUENNRmlsZTsKLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgIG91dFBDTV9BU0Y7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF1ZGlvTW9ubzsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgKkVmZmVjdHM7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsKLQotfSBNNHhWU1NfUHJldmlld1NldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfdG9VVEY4RmN0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgcHJvdG90eXBlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICB0byBjb252ZXJ0IGEgc3RyaW5nIGVuY29kZWQgaW4gYW55IGZvcm1hdCB0byBhbiBVVEY4IHN0cmluZy4KLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgc3RyaW5nIHRvIGNvbnZlcnQgdG8gVVRGOAotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVURjggY29udmVydGVkIHN0cmluZwotICogQHBhcmFtICAgIGJ1ZmZlck91dFNpemUgICAgSU4vT1VUICAgIElOOiAgICAgU2l6ZSBvZiB0aGUgZ2l2ZW4gb3V0cHV0IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNHhWU1NfdG9VVEY4RmN0KQotKAotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAqcEJ1ZmZlckluLAotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgKnBCdWZmZXJPdXQsCi0gICAgTTRPU0FfVUludDMyICAgICAgICAqYnVmZmVyT3V0U2l6ZQotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfZnJvbVVURjhGY3QKLSAqIEBicmllZiAgICAgICAgVGhpcyBwcm90b3R5cGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIHRvIGNvbnZlcnQgYW4gVVRGOCBzdHJpbmcgdG8gYSBzdHJpbmcgZW5jb2RlZCBpbiBhbnkgZm9ybWF0LgotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBVVEY4IHN0cmluZyB0byBjb252ZXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZGVzaXJlZCBmb3JtYXQuCi0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgY29udmVydGVkIHN0cmluZwotICogQHBhcmFtICAgIGJ1ZmZlck91dFNpemUgICAgSU4vT1VUICAgIElOOiAgICAgU2l6ZSBvZiB0aGUgZ2l2ZW4gb3V0cHV0IGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNHhWU1NfZnJvbVVURjhGY3QpCi0oCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAqcEJ1ZmZlckluLAotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAqcEJ1ZmZlck91dCwKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICpidWZmZXJPdXRTaXplCi0pOwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfSW5pdFBhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgcGFyYW1ldGVycyBmb3IgeFZTUy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgcEZpbGVXcml0ZVB0cjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUGF0aDsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX3RvVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udlRvVVRGOEZjdDsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX2Zyb21VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252RnJvbVVURjhGY3Q7Ci0KLQotCi19IE00eFZTU19Jbml0UGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfSW5pdAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfSW5pdChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTR4VlNTX0luaXRQYXJhbXMqIHBhcmFtcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1JlZHVjZVRyYW5zY29kZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU2VuZENvbW1hbmQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2VuZENvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1ByZXZpZXdTdGFydAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHByZXZpZXcKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIHByZXZpZXcgZmlsZSBhbmQgZmlsbCBwUHJldmlld1NldHRpbmdzIHdpdGgKLSAqICAgICAgICAgICAgICAgIHByZXZpZXcgcGFyYW1ldGVycy4KLSAqICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkUKLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByZXZpZXdTZXR0aW5ncyAgICAoSU4pIFByZXZpZXcgc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUHJldmlld1N0YXJ0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00eFZTU19QcmV2aWV3U2V0dGluZ3MqIHBQcmV2aWV3U2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUHJldmlld1N0b3AKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHByZXZpZXcgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlIHRvIGFsbG93IHNhdmluZyBvciByZXNlbmQgYW4gZWRpdGluZyBjb21tYW5kCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1ByZXZpZXdTdG9wKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU2F2ZVN0YXJ0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZSB0aGUgc2F2ZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGNyZWF0ZSAzR1AgZWRpdGVkIGZpbmFsIGZpbGUKLSAqICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkUKLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEZpbGVQYXRoICAgICAgICAgICAgKElOKSBJZiB0aGUgdXNlciB3YW50cyB0byBwcm92aWRlIGEgZGlmZmVyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGVuYW1lLCBlbHNlIGNhbiBiZSBOVUxMIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdGFydChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TYXZlU3RvcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1N0ZXAKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBkaWZmZXJlbnRzIHRhc2tzLCBkZXBlbmRpbmcgb2YgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbjoKLSAqICAgICAgICAgICAgICAgICAgICAtIGFuYWx5c2VzIGVkaXRpbmcgc3RydWN0dXJlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfU2VuZENvbW1hbmQKLSAqICAgICAgICAgICAgICAgICAgICAtIGdlbmVyYXRlcyBwcmV2aWV3IGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19QcmV2aWV3U3RhcnQKLSAqICAgICAgICAgICAgICAgICAgICAtIGdlbmVyYXRlcyBmaW5hbCBlZGl0ZWQgZmlsZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NhdmVTdGFydAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIGluZGljYXRpb24gZnJvbSAwIHRvIDEwMAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgYWdhaW4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX1BSRVZJRVdfUkVBRFk6ICAgIFByZXZpZXcgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTogICAgICAgIEZpbmFsIGVkaXRlZCBmaWxlIGlzIGdlbmVyYXRlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FOiAgICBBbmFseXNlIGlzIGRvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1N0ZXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19DbG9zZUNvbW1hbmQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGN1cnJlbnQgZWRpdGluZyBwcm9maWxlLCB1bmFsbG9jYXRlCi0gKiAgICAgICAgICAgICAgICByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUyBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBjYW4gY2FsbCBhIG5ldyBNNHhWU1NfU2VuZENvbW1hbmQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQ2xlYW5VcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGdldCB0aGUgdmVyc2lvbiBvZiB0aGUgVmlkZW8gU3R1ZGlvIDIuMQotICoKLSAqIEBwYXJhbSAgICBwVmVyc2lvbiAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgdmVyc2lvbiBpbmZvIHN0cnVjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUgICAgVGhlIHByb3RvdHlwZSBvZiB0aGlzIGVmZmVjdCBmdW5jdGlvbiBpcyBleHBvc2VkIGJlY2F1c2UgaXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgY2FsbGVkIGJ5IHRoZSBWUFMgZHVyaW5nIHRoZSBwcmV2aWV3Ci0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcgotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZSAgICBUaGUgcHJvdG90eXBlIG9mIHRoaXMgZWZmZWN0IGZ1bmN0aW9uIGlzIGV4cG9zZWQgYmVjYXVzZSBpdCBuZWVkcyB0bwotICogICAgICAgICAgICBjYWxsZWQgYnkgdGhlIFZQUyBkdXJpbmcgdGhlIHByZXZpZXcKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gbWFrZSBhIHZpZGVvIGxvb2sgYXMgaWYgaXQgd2FzIHRha2VuIGluIHRoZSBmaWZ0aWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBVc2VyRGF0YSAgICAgICAoSU4pIENvbnRleHQKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcEZpZnRpZXNEYXRhLCBwUGxhbmVPdXQgb3IgcFByb2dyZXNzIGFyZSBOVUxMIChERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMKLSgKLSAgICBNNE9TQV9Wb2lkICpwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb20oTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUgICAgVGhlIHByb3RvdHlwZSBvZiB0aGlzIGVmZmVjdCBmdW5jdGlvbiBpcyBleHBvc2VkIGJlY2F1c2UgaXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgY2FsbGVkIGJ5IHRoZSBWUFMgZHVyaW5nIHRoZSBwcmV2aWV3Ci0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggem9vbSB0byBhcHBseSAoSW4vT3V0KQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb20KLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgdGhlIFVURjE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsIE00T1NBX1ZvaWQqIHBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwgTTRPU0FfVUludDggbmJFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRHVwbGljYXRlcyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlLCBwZXJmb3JtaW5nIGFsbG9jYXRpb25zIGlmIHJlcXVpcmVkCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NEZXN0ICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc09yaWcgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIGJDb3B5RWZmZWN0cyAgICAgICAgKElOKSBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkdXBsaWNhdGUgZWZmZWN0cwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzKS4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIE1DUyBjb250ZXh0IHdpdGhpbiB0aGUgeFZTUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIFZTUyBzdGF0ZSBoYXMgbW92ZWQgdG8gYW5hbHl6aW5nIHN0YXRlCi0gKiAgICAgICAgICAgICAgICBvciBiZXlvbmQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgbWNzQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIG1jcyBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVlNTM0dQUCBjb250ZXh0IHdpdGhpbiB0aGUgeFZTUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIFZTUyBzdGF0ZSBoYXMgbW92ZWQgdG8gR2VuZXJhdGluZwotICogICAgICAgICAgICAgICAgcHJldmlldyBvciBiZXlvbmQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgdnNzM2dwcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gcG9pbnRlciBvZiB2c3MzZ3BwIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Db250ZXh0KiB2c3MzZ3BwQ29udGV4dCk7Ci0KLS8vIEdldCBzdXBwb3J0ZWQgdmlkZW8gZGVjb2RlcnMgYW5kIGNhcGFiaWxpdGllcy4KLU00T1NBX0VSUiBNNHhWU1NfZ2V0VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzKE00REVDT0RFUl9WaWRlb0RlY29kZXJzICoqZGVjb2RlcnMpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBfX000WFZTU19BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0ludGVybmFsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Mjk2NTcyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFhWU1NfSU5URVJOQUxfSF9fCi0jZGVmaW5lIF9fTTRYVlNTX0lOVEVSTkFMX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00eFZTU19JbnRlcm5hbC5oCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgb2YgVmlkZW8gQXV0aG9yaW5nLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTTRfeFZTU19NQUpPUiAgICAgICAgMQotI2RlZmluZSBNNF94VlNTX01JTk9SICAgICAgICA1Ci0jZGVmaW5lIE00X3hWU1NfUkVWSVNJT04gICAgNQotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgZGVzY3JpYmUgdGhlIG1heCBkaW1lbnNpb25zIG9mIGFuIGlucHV0IEpQRyAqLwotI2RlZmluZSBNNFhWU1NfTVhfSlBHX05CX09GX1BJWEVMUyAgICAzOTI2MDE2Ci0KLS8qU2l6ZSBvZiB0aGUgVVRGIHRlbXBvcmFyeSBjb252ZXJzaW9uIGJ1ZmZlciBrZWVwIGluIHRoZSBWQSBpbnRlcm5hbCBjb250ZXh0IGFuZAotYWxsb2NhdGUgYXQgdGhlIGluaXRpYWxpemF0aW9uKi8KLSNkZWZpbmUgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUgICAgICAgICAgICAyMDQ4Ci0KLS8qIE1heCBwYXRoIGxlbmd0aCBzaXplICovCi0jZGVmaW5lICBNNFhWU1NfTUFYX1BBVEhfTEVOIDI1NgotCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgICAgICAgICAgICAgICAoICggKGEpIDwgKDApICkgPyAoLShhKSkgOiAoYSkgKQotCi0vKiogWSxVLFYgdmFsdWVzIGluIGNhc2Ugb2YgYmxhY2sgYm9yZGVycyByZW5kZXJpbmcgKi8KLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0VmZmVjdHNBbHBoYUJsZW5kaW5nCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgZWZmZWN0cyBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgaW50ZXJuYWwgaW5mb3JtYXRpb25zIHRvIGNyZWF0ZSBhbiBhbHBoYQotICogICAgICAgICAgICBibGVuZGluZyBmb3IgdGhlIGVmZmVjdHMgdGV4dCBhbmQgZnJhbWluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fZmFkZUluVGltZTsgICAgICAgIC8qU3RhcnQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fZmFkZU91dFRpbWU7ICAgICAgICAvKk1pZGRsZSBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9lbmQ7ICAgICAgICAgICAgLypFbmQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fbWlkZGxlOyAgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgRmFkZUluIHBoYXNlKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9zdGFydDsgICAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgRmFkZU91dCBwaGFzZSovCi0KLX0gTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmc7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhJUyBTVFJVQ1RVUkUgTVVTVCBOT1QgQkUgTU9ESUZJRUQKLSAqIHN0cnVjdCAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdAotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBmcmFtaW5nIGVmZmVjdCwgYW5kIGJ5IFZQUyBmb3IgcHJldmlld2luZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKkZyYW1pbmdSZ2I7ICAgICAgICAgICAgICAgIC8qKjwgZGVjb2RlZCBCR1I1NjUgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqRnJhbWluZ1l1djsgICAgICAgICAgICAgICAgLyoqPCBjb252ZXJ0ZWQgWVVWNDIwIHBsYW5hciBwbGFuZSAqLwotICAgIE00T1NBX0ludDMyIGR1cmF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIGZyYW1lICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlvdXNDbGlwVGltZTsgICAgICAgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFNBVklORyAqLwotICAgIE00T1NBX0ludDMyIHByZXZpZXdPZmZzZXRDbGlwVGltZTsgICAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBmb3IgUFJFVklFVyAqLwotICAgIE00T1NBX0ludDMyIHByZXZpZXdDbGlwVGltZTsgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBmb3IgUFJFVklFVyAqLwotICAgIE00T1NBX1ZvaWQqIHBDdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBNNHhWU1NfRnJhbWluZ1N0cnVjdCB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nIGZpbHRlciAqLwotICAgIE00T1NBX1ZvaWQqIHBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5leHQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QsIGlmIG5vIG1vcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBvbiBjdXJyZW50IE00eFZTU19GcmFtaW5nU3RydWN0ICovCi0gICAgTTRPU0FfVUludDMyIHRvcGxlZnRfeDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBYIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBvZiB0aGUgZmlyc3QgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00T1NBX1VJbnQzMiB0b3BsZWZ0X3k7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWSBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgb2YgdGhlIGZpcnN0IGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogYWxwaGFCbGVuZGluZ1N0cnVjdDsgLyogQWxwaGEgYmxlbmRpbmcgU3RydWN0ICovCi0vKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gY2FzZSBvZiBmaWxlIEFSR0I4ODggdXNlZCBpbiBmcmFtaW5nCi0gYXMgdmlkZW8gZWZmZWN0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHdpZHRoOyAgIC8qd2lkdGggb2YgdGhlIEFSR0I4ODg4IGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBoZWlnaHQ7IC8qaGVpZ2h0IG9mIHRoZSBBUkdCODg4OCBjbGlwIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0KLX0gTTR4VlNTX0ZyYW1pbmdTdHJ1Y3Q7Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSElTIFNUUlVDVFVSRSBNVVNUIE5PVCBCRSBNT0RJRklFRAotICogc3RydWN0ICAgIE00eFZTU19GcmFtaW5nQ29udGV4dAotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBmcmFtaW5nIGVmZmVjdCwgd2hlbiB0aGUgZmxhZwotICAgICAgICAgICAgICAgIERFQ09ERV9HSUZfT05fU0FWSU5HIGlzIGFjdGl2YXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqICAgICAgICAgICAgYUZyYW1pbmdDdHg7ICAgICAgICAvKio8RnJhbWluZyBzdHJ1Y3QgZm9yIHRoZSBkZWNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGN1cnJlbnQgZnJhbWUgb2YgdGhlIGdpZiovCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqICAgICAgICAgICAgYUZyYW1pbmdDdHhfbGFzdDsgICAgLyoqPEZyYW1pbmcgc3RydWN0IGZvciB0aGUgZGVjb2Rpbmcgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJldmlvdXMgZnJhbWUgb2YgdGhlIGdpZiovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsgICAgLyoqPCBQb2ludGVyIG9uIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgcEZpbGVXcml0ZVB0cjsgICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwU1BTQ29udGV4dDsgICAgICAgIC8qKjxTUFMgY29udGV4dCBmb3IgdGhlIEdJRiBkZWNvZGluZyovCi0gICAgLy9NNFNQU19TdHJlYW0gICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtOyAgICAgICAgLyoqPEdJRiBpbnB1dCBzdHJlYW0gYnVmZmVyIHBvaW50ZXIqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcEVmZmVjdEZpbGVQYXRoOyAgICAvKio8ZmlsZSBwYXRoIG9mIHRoZSBnaWYqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgIG91dHB1dFZpZGVvU2l6ZTsgICAgLyoqPCBPdXRwdXQgdmlkZW8gc2l6ZSBSQyAqLwotICAgIC8vTTRTUFNfRGlzcG9zYWxNb2RlICAgICAgICAgICAgICAgIGRpc3Bvc2FsOyAgICAgICAgICAgIC8qKjxwcmV2aW91cyBmcmFtZSBHSUYgZGlzcG9zYWwqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgYl9hbmltYXRlZDsgICAgICAgICAgICAvKio8SXMgdGhlIEdJRiBhbmltYXRlZD8qLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBiRWZmZWN0UmVzaXplOyAgICAgICAgLyoqPElzIHRoZSBnaWYgcmVzaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRvcGxlZnRfeDsgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBYIGNvb3JkaW5hdGUgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwaWN0dXJlIG9mIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIHBpeGVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0b3BsZWZ0X3k7ICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWSBjb29yZGluYXRlIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGljdHVyZSBvZiB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8qKjxHSUYgd2lkdGgsIGZpbGwgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHdpdGggdGhlIFNQUyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qKjxHSUYgaGVpZ2h0LCBmaWxsIGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gd2l0aCB0aGUgU1BTKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGVmZmVjdER1cmF0aW9uOyAgICAgICAgLyoqPEVmZmVjdCBkdXJhdGlvbiovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RTdGFydFRpbWU7ICAgIC8qKjxFZmZlY3Qgc3RhcnQgdGltZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBjbGlwVGltZTsgICAgICAgICAgICAvKio8Y3VycmVudCBvdXRwdXQgY2xpcCB0aW1lIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGZyYW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfY2xpcFRpbWU7ICAgICAgICAvKio8cHJldmlvdXMgb3V0cHV0IGNsaXAgdGltZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdFN0ZXBEdXJhdGlvbjsgICAgLyoqPFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0aGUgcHJldmlvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBiX0lzRmlsZUdpZjsgICAgICAgIC8qKjxJcyB0aGUgZnJhbWluZyB1c2luZyBhIGdpZiBmaWxlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3Rfd2lkdGg7ICAgICAgICAgICAgLyoqPExhc3QgZnJhbWUgd2lkdGgqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF9oZWlnaHQ7ICAgICAgICAvKio8TGFzdCBmcmFtZSBoZWlnaHQqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF90b3BsZWZ0X3g7ICAgICAgICAvKio8TGFzdCBmcmFtZSB4IHRvcGxlZnQqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF90b3BsZWZ0X3k7ICAgICAgICAvKio8TGFzdCBmcmFtZSB5IHRvcGxlZnQqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9naWZfdGltZTsgICAgLyoqPCBDdXJyZW50IHRpbWUgb3MgdGhlIEdJRiBpbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB0aW1lICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUR1cmF0aW9uUmF0aW87ICAgIC8qKjwgRnJhbWUgZHVyYXRpb24gcmF0aW8gKi8KLSAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogICAgYWxwaGFCbGVuZGluZ1N0cnVjdDsvKkFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0jaWZkZWYgREVCVUdfR0lGCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICB1aURlYnVnX2ZpbGVDb3VudGVyOy8qKjxmb3IgZGVidWcgcHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgdGhlIGZyYW1lIG9mIHRoZSBnaWYqLwotI2VuZGlmIC8qREVCVUdfR0lGKi8KLX1NNHhWU1NfRnJhbWluZ0NvbnRleHQ7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcwotICogQGJyaWVmICAgIEludGVybmFsIHhWU1MgcGFyYW1ldGVyIGZvciBQdG8zR1BQIG1vZHVsZQotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGJ5IE00eFZTU19zZW5kQ29tbWFuZCBmdW5jdGlvbiwKLSAqIEBub3RlICAgIGFuZCBpcyB1c2VkIGR1cmluZyBNNHhWU1NfU3RlcCBmdW5jdGlvbiB0byBpbml0aWFsaXplIFB0bzNHUFAgbW9kdWxlCi0gKiBAbm90ZSAgICBBbGwgdGhlIEpQRyBmaWxlcyB0byB0cmFuc2Zvcm0gdG8gM0dQIGFyZSBjaGFpbmVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVJbjsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlT3V0OwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVUZW1wOyAgICAgICAgICAgIC8qKjwgdGVtcG9yYXJ5IGZpbGUgdXNlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgd3JpdGluZywgTlVMTCBpcyBjc3RtZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyIG5vdCB1c2VkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsKLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgIElucHV0RmlsZVR5cGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3JlYXRlZDsgICAgICAgICAgICAvKio8IFRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBmaWxlIGlzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBvciBub3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNQYW5ab29tOyAgICAgICAgICAgIC8qKjwgUkM6IEJvb2xlYW4gdXNlZCB0byBrbm93IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbiBhbmQgem9vbSBtb2RlIGlzIGVuYWJsZWQgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYTsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhhOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFlhOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGI7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYjsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYjsgICAgLyoqPCBSQyAqLwotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOyAgICAgICAgLyoqPCBGQjogdG8gcmVuZGVyIG9yIG5vdCBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0IHJhdGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgZnJhbWVyYXRlOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwTmV4dDsgICAgICAgICAgICAgICAgLyoqPCBBZGRyZXNzIG9mIG5leHQgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgKi8KLSAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODg6d2lkdGggYW5kIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHdpZHRoOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBoZWlnaHQ7Ci0KLX0gTTR4VlNTX1B0bzNHUFBfcGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfZmlmdGllc1N0cnVjdAotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBmaWZ0aWVzIGVmZmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyIGZpZnRpZXNFZmZlY3REdXJhdGlvbjsgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgc2FtZSBlZmZlY3QgaW4gYSB2aWRlbyAqLwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzQ2xpcFRpbWU7ICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcgZmlsdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgU0FWSU5HICovCi0gICAgTTRPU0FfVUludDMyIHNoaWZ0UmFuZG9tVmFsdWU7ICAgICAgICAgICAgICAgIC8qKjwgVmVydGljYWwgc2hpZnQgb2YgdGhlIGltYWdlICovCi0gICAgICBNNE9TQV9VSW50MzIgc3RyaXBlUmFuZG9tVmFsdWU7ICAgICAgICAgICAgICAgIC8qKjwgSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc3RyaXBlICovCi0KLX0gTTR4VlNTX0ZpZnRpZXNTdHJ1Y3Q7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19Db2xvclJHQjE2Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIFJHQjE2IGNvbG9yIGVmZmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZSBjb2xvckVmZmVjdFR5cGU7ICAgIC8qQ29sb3IgdHlwZSBvZiBlZmZlY3QqLwotICAgIE00T1NBX1VJbnQxNiAgICByZ2IxNkNvbG9yRGF0YTsgICAgICAgICAgICAvKlJHQjE2IGNvbG9yIG9ubHkgZm9yIHRoZSBSR0IxNiBjb2xvciBlZmZlY3QqLwotfSBNNHhWU1NfQ29sb3JTdHJ1Y3Q7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQKLSAqIEBicmllZiAgICBUaGUgQ2FsbGJhY2sgQ29udGV4dCBwYXJhbWV0ZXJzIGZvciBQdG8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBtX0ZpbGVJbjsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX05iSW1hZ2U7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9JbWFnZUNvdW50ZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbV90aW1lRHVyYXRpb247Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wRmlsZVJlYWRQdHI7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICBtX3BEZWNvZGVkUGxhbmU7IC8qIFVzZWQgZm9yIFBhbiBhbmQgWm9vbSBvbmx5ICovCi0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiAgICBtX3BQdG8zR1BQcGFyYW1zOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX2Fpcl9jb250ZXh0OwotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyAgICBtX21lZGlhUmVuZGVyaW5nOwotCi19IE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIFN0YXRlIG9mIHRoZSB4VlNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkID0gMCwKLSAgICBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nLAotICAgIE00eFZTU19rU3RhdGVPcGVuZWQsCi0gICAgLy9NNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXcsCi0gICAgLy9NNHhWU1Nfa1N0YXRlUHJldmlldywKLSAgICBNNHhWU1Nfa1N0YXRlU2F2aW5nLAotICAgIE00eFZTU19rU3RhdGVTYXZlZAotCi19IE00eFZTU19TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBNaWNybyBzdGF0ZSBvZiB0aGUgeFZTUyBmb3IgcHJldmlld2luZy9zYXZpbmcgc3RhdGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyA9IDAsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmcKLQotfSBNNHhWU1NfZWRpdE1pY3JvU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgTWljcm8gc3RhdGUgb2YgdGhlIHhWU1MgZm9yIGFuYWx5emluZyBzdGF0ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUCA9IDAsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUywKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MKLQotfSBNNHhWU1NfYW5hbHlzZU1pY3JvU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX01DU19wYXJhbXMKLSAqIEBicmllZiAgICBJbnRlcm5hbCB4VlNTIHBhcmFtZXRlciBmb3IgTUNTIG1vZHVsZQotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGJ5IE00eFZTU19zZW5kQ29tbWFuZCBmdW5jdGlvbiwKLSAqIEBub3RlICAgIGFuZCBpcyB1c2VkIGR1cmluZyBNNHhWU1NfU3RlcCBmdW5jdGlvbiB0byBpbml0aWFsaXplIE1DUyBtb2R1bGUKLSAqIEBub3RlICAgIEFsbCB0aGUgaW5wdXQgZmlsZXMgdG8gdHJhbnNjb2RlIGFyZSBjaGFpbmVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUluOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZU91dDsKLSAgICAvKio8IHRlbXBvcmFyeSBmaWxlIHVzZWQgZm9yIG1ldGFkYXRhIHdyaXRpbmcsIE5VTEwgaXMgY3N0bWVtIHdyaXRlciBub3QgdXNlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZVRlbXA7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgICAgIElucHV0RmlsZVR5cGU7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgICAgIE91dHB1dEZpbGVUeXBlOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvRm9ybWF0OwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICBPdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgIE91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF1ZGlvTW9ubzsKLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQkdNOwotICAgIC8qKjwgVGhpcyBib29sZWFuIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgb3V0cHV0IGZpbGUgaXMgYWxyZWFkeSBjcmVhdGVkIG9yIG5vdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3JlYXRlZDsKLSAgICAvKio8IEFkZHJlc3Mgb2YgbmV4dCBNNHhWU1NfTUNTX3BhcmFtcyogZWxlbWVudCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luQ3V0VGltZTsgICAgLyoqPCBCZWdpbm5pbmcgY3V0IHRpbWUgaW4gaW5wdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBFbmRDdXRUaW1lOyAgICAgIC8qKjwgRW5kIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9UaW1lc2NhbGU7ICAgIC8qT3V0cHV0IHRpbWVzY2FsZSovCi0KLSAgICBNNE1DU19NZWRpYVJlbmRlcmluZyAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgLyoqPCBGQjogdG8gY3JvcCwgcmVzaXplLCBvciByZW5kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjayBib3JkZXJzKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9jbGlwbnVtYmVyOwotICAgIE00T1NBX1VJbnQzMiAgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX1VJbnQzMiAgb3V0cHV0VmlkZW9MZXZlbDsKLX0gTTR4VlNTX01DU19wYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhbHBoYSBtYWdpYyB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICpwUGxhbmU7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICBibGVuZGluZ3RocmVzaG9sZDsgICAgLyoqPCBCbGVuZGluZyBSYW5nZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICBpc3JldmVyc2U7ICAgICAgICAgICAgLyoqPCBkaXJlY3QgZWZmZWN0IG9yIHJldmVyc2UgKi8KLQotfSBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgdHlwZSBoYXBwZW5zIHRvIG1hdGNoIHRoZSBleHRlcm5hbCB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAoaS5lLiB0aGUgb25lIHdoaWNoIGlzIGdpdmVuIGJ5IHRoZSBhcHBsaWNhdGlvbiksIGJ1dCBhcmUKLSAqICAgICAgICAgICAgY29uY2VwdHVhbGx5IGRpZmZlcmVudCB0eXBlcywgc28gdGhhdCBpZiAob3IgcmF0aGVyIHdoZW4pIHNvbWUgZGF5Ci0gKiAgICAgICAgICAgIHRyYW5zbGF0aW9uIG5lZWRzIHRvIG9jY3VyIHdoZW4gbG9hZGluZyB0aGUgc2V0dGluZ3MgZnJvbSB0aGUgYXBwLAotICogICAgICAgICAgICB0aGlzIHNlcGFyYXRlIHR5cGUgd2lsbCBhbHJlYWR5IGJlIHJlYWR5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgICAgTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxKcGVnQ2h1bmtNb2RlCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgY2h1bmsgY2FsbGJhY2sgdG8gZGVjb2RlCi0gKiAgICAgICAgICAgIGEgSlBFRyBieSBjaHVuayBtb2RlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1VURkNvbnZlcnNpb25Db250ZXh0Ci0gKiBAYnJpZWYgICAgSW50ZXJuYWwgVVRGIGNvbnZlcnNpb24gY29udGV4dAotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIFVURiBjb252ZXJzaW9uIGluZm9ybWF0aW9ucwotICogICAgICAgICAgICBuZWVkZWQgYnkgdGhlIHhWU1MgdG8gbWFuYWdlIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyAoVVRGOC8xNi9BU0NJSSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfdG9VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252VG9VVEY4RmN0OwotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfZnJvbVVURjhGY3QgICAgICAgICAgICAgICAgcENvbnZGcm9tVVRGOEZjdDsKLSAgICAvKlRlbXBvcmFyeSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIGVhY2ggY29udmVyc2lvbiovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgLypTaXplIG9mIHRoZSBwcmV2aW91cyBidWZmZXIsIHRoZSBzaXplIGlzIHByZWRlcm1pbmF0ZWQqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci19IE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19Db250ZXh0Ci0gKiBAYnJpZWYgICAgSW50ZXJuYWwgY29udGV4dCBvZiB0aGUgeFZTUwotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGludGVybmFsIGluZm9ybWF0aW9ucyBuZWVkZWQgYnkgdGhlIHhWU1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqPCBQb2ludGVyIG9uIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7Ci0gICAgLyoqPCBQb2ludGVyIG9uIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7Ci0gICAgLyoqPCBMb2NhbCBjb3B5IG9mIHZpZGVvIGVkaXRvciBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqICAgICAgICAgICAgcFNldHRpbmdzOwotICAgIC8qKjwgQ3VycmVudCBTZXR0aW5ncyBvZiB2aWRlbyBlZGl0b3IgdG8gdXNlIGluIHN0ZXAgZnVuY3Rpb25zIGZvciBwcmV2aWV3L3NhdmUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiAgICAgICAgICAgIHBDdXJyZW50RWRpdFNldHRpbmdzOwotICAgIC8qKjwgQ3VycmVudCBjb250ZXh0IG9mIHZpZGVvIGVkaXRvciB0byB1c2UgaW4gc3RlcCBmdW5jdGlvbnMgZm9yIHByZXZpZXcvc2F2ZSAqLwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCAgICAgICAgICAgIHBDdXJyZW50RWRpdENvbnRleHQ7Ci0gICAgLyoqPCBUaGlzIGlzIHRvIGtub3cgaWYgYSBwcmV2aW91cyBNNHhWU1Nfc2VuZENvbW1hbmQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ2xpcE51bWJlcjsKLSAgICAvKio8IEF1ZGlvIG1peGluZyBzZXR0aW5ncywgbmVlZGVkIHRvIGZyZWUgaXQgaW4gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiovCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqICAgIHBBdWRpb01peFNldHRpbmdzOwotICAgIC8qKjwgQXVkaW8gbWl4aW5nIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0ICAgIHBBdWRpb01peENvbnRleHQ7Ci0gICAgLyoqPCBGaWxlIHBhdGggZm9yIFBDTSBvdXRwdXQgZmlsZTogdXNlZCBmb3IgcHJldmlldywgZ2l2ZW4gdG8gdXNlciAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcGNtUHJldmlld0ZpbGU7Ci0gICAgLyoqPCBEdXBsaWNhdGlvbiBvZiBvdXRwdXQgZmlsZSBwb2ludGVyLCB0byBiZSBhYmxlIHRvIHVzZSBhdWRpbyBtaXhpbmcgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRGaWxlOwotICAgIC8qKjwgRHVwbGljYXRpb24gb2YgdGVtcG9yYXJ5IGZpbGUgcG9pbnRlciwgdG8gYmUgYWJsZSB0byB1c2UgYXVkaW8gbWl4aW5nICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZTsKLSAgICAvKio8IE1pY3JvIHN0YXRlIGZvciBTYXZpbmcvUHJldmlld2luZyBzdGF0ZSAqLwotICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZSAgICAgICAgICAgIGVkaXRpbmdTdGVwOwotICAgIC8qKjwgTWljcm8gc3RhdGUgZm9yIEFuYWx5emluZyBzdGF0ZSAqLwotICAgIE00eFZTU19hbmFseXNlTWljcm9TdGF0ZSAgICAgICAgYW5hbHlzZVN0ZXA7Ci0gICAgLyoqPCBOYiBvZiBzdGVwIGZvciBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcuIFVzZWQgdG8gY29tcHV0ZSBwcm9ncmVzc2lvbgotICAgICAgICAgb2YgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBuYlN0ZXBUb3RhbDsKLSAgICAvKio8IEN1cnJlbnQgc3RlcCBudW1iZXIgZm9yIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZXA7Ci0gICAgLyoqPCBUbyBiZSBhYmxlIHRvIGZyZWUgcEVmZmVjdHMgZHVyaW5nIHByZXZpZXcgY2xvc2UgKi8KLSAgICBNNHhWU1NfUHJldmlld1NldHRpbmdzKiAgICAgICAgICAgIHBQcmV2aWV3U2V0dGluZ3M7Ci0gICAgLyoqPCBUZW1wb3JhcnkgZmlsZSBwYXRoOiBhbGwgdGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkIGhlcmUgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUGF0aDsKLSAgICAvKio8IEN1cnJlbnQgc3RhdGUgb2YgeFZTUyAqLwotICAgIE00eFZTU19TdGF0ZSAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZTsKLSAgICAvKio8IExpc3Qgb2Ygc3RpbGwgcGljdHVyZXMgaW5wdXQgdG8gY29udmVydCB0byAzR1Agd2l0aCBwYXJhbWV0ZXJzICovCi0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiAgICAgICAgICAgIHBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAvKio8IEN1cnJlbnQgZWxlbWVudCBvZiB0aGUgYWJvdmUgY2hhaW5lZCBsaXN0IGJlZWluZyBwcm9jZXNzZCBieSB0aGUgUHRvM0dQUCAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgICAgICAgICBwUFRvM0dQUGN1cnJlbnRQYXJhbXM7Ci0gICAgLyoqPCBDdXJyZW50IFB0bzNHUFAgY29udGV4dCwgbmVlZGVkIHRvIGNhbGwgUHRvM0dQUF9zdGVwIGZ1bmN0aW9uIGluIE00eFZTU19zdGVwIGZ1bmN0aW9uICovCi0gICAgTTRQVE8zR1BQX0NvbnRleHQgICAgICAgICAgICAgICAgcE00UFRPM0dQUF9DdHh0OwotICAgIC8qKjwgUG9pbnRlciBvbiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIFB0bzNHUFAgbW9kdWxlICovCi0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgICAgICBwQ2FsbEJhY2tDdHh0OwotICAgIC8qKjwgTGlzdCBvZiBmaWxlcyB0byB0cmFuc2NvZGUgd2l0aCBwYXJhbWV0ZXJzICovCi0gICAgTTR4VlNTX01DU19wYXJhbXMqICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OwotICAgIC8qKjwgQ3VycmVudCBlbGVtZW50IG9mIHRoZSBhYm92ZSBjaGFpbmVkIGxpc3QgYmVlaW5nIHByb2Nlc3NkIGJ5IHRoZSBNQ1MgKi8KLSAgICBNNHhWU1NfTUNTX3BhcmFtcyogICAgICAgICAgICAgICAgcE1DU2N1cnJlbnRQYXJhbXM7Ci0gICAgLyoqPCBDdXJyZW50IE1DUyBjb250ZXh0LCBuZWVkZWQgdG8gY2FsbCBNQ1Nfc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiovCi0gICAgTTRNQ1NfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgcE1DU19DdHh0OwotICAgIC8qKjwgSW5kZXggdG8gaGF2ZSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGVuYW1lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZUluZGV4OwotICAgIC8qKjwgSW4gY2FzZSBvZiBNTVMgdXNlIGNhc2UsIHRhcmdldGVkIGJpdHJhdGUgdG8gcmVhY2ggb3V0cHV0IGZpbGUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlOwotICAgIC8qKjwgSWYgdGhlIHNlbmRDb21tYW5kIGZjdCBpcyBjYWxsZWQgdHdpY2Ugb3IgbW9yZSwgdGhlIGZpcnN0IGNvbXB1dGVkIHRpbWVzY2FsZQotICAgICAgICByZWNvcmRlZCBoZXJlIG11c3QgYmUgcmV1c2VkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgIC8qVVRGIENvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgTTR4VlNTX1VURkNvbnZlcnNpb25Db250ZXh0ICAgIFVURkNvbnZlcnNpb25Db250ZXh0OyAgICAvKlVURiBjb252ZXJzaW9uIGNvbnRleHQgc3RydWN0dXJlKi8KLQotfSBNNHhWU1NfQ29udGV4dDsKLQotLyoqCi0gKiBJbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnJvdGF0aW9uRGVncmVlKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUpQRyhNNE9TQV9Wb2lkKiBwRmlsZUluLCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlQW5kUmVzaXplSlBHKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzKTsKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUZfSW5pdGlhbGl6YXRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUZfQ2xlYW5pbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLSNlbHNlCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvUmVzb2x1dGlvbik7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfZnJlZUNvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqIHBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKTsKLQotTTRPU0FfRVJSIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbiggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbihNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpOwotCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0jZW5kaWYgLyogX19NNFhWU1NfSU5URVJOQUxfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4OTg3ZTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgIE1lZGlhIENvbnZlcnNpb24gU2VydmljZSBwdWJsaWMgQVBJLgotICogQG5vdGUgICAgTUNTIGFsbG93cyB0cmFuc2NvZGluZyBhIDNncC9tcDQgZmlsZSBpbnRvIGEgbmV3IDNncC9tcDQgZmlsZSBjaGFuZ2luZyB0aGUKLSAqICAgICAgICAgIHZpZGVvIGFuZCBhdWRpbyBlbmNvZGluZyBzZXR0aW5ncy4KLSAqICAgICAgICAgIEl0IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGFuZCBmdWxseSBzeW5jaHJvbm91cyBBUEkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000TUNTX0FQSV9IX18KLSNkZWZpbmUgX19NNE1DU19BUElfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgdHlwZXMgZm9yIGZpbGUgYWNjZXNzICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotCi0vKioKLSAqIFRvIGVuYWJsZSBleHRlcm5hbCBhdWRpbyBjb2RlY3MgcmVnaXN0ZXJpbmcqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiAgICBQdWJsaWMgdHlwZSBvZiB0aGUgTUNTIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRNQ1NfQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00TUNTX01lZGlhUmVuZGVyaW5nCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgZGlmZmVyZW50IG1lZGlhIHJlbmRlcmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rUmVzaXppbmcgPSAwLCAgICAvKio8IFRoZSBtZWRpYSBpcyByZXNpemVkLCB0aGUgYXNwZWN0IHJhdGlvIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBvZiB0aGUgbWVkaWEgaXMgcmVuZGVyZWQgKi8KLSAgICBNNE1DU19rQ3JvcHBpbmcsICAgICAgICAvKio8IFRoZSBtZWRpYSBpcyBjcm9wcGVkLCB0aGUgYXNwZWN0IHJhdGlvIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBhcyB0aGUgb3JpZ2luYWwgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lZGlhIGlzIG5vdCByZW5kZXJlZCBlbnRpcmVseSAqLwotICAgIE00TUNTX2tCbGFja0JvcmRlcnMgICAgIC8qKjwgQmxhY2sgYm9yZGVycyBhcmUgcmVuZGVyZWQgaW4gb3JkZXIgdG8ga2VlcCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIGFzcGVjdCByYXRpby4gQWxsIHRoZSBtZWRpYSBpcyByZW5kZXJlZCAqLwotfSBNNE1DU19NZWRpYVJlbmRlcmluZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00TUNTX0V4dGVybmFsUHJvZ3Jlc3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBFZmZlY3QgZnVuY3Rpb25zCi0gKiBAbm90ZSAgICBUaGUgdWlQcm9ncmVzcyB2YWx1ZSBzaG91bGQgYmUgZW5vdWdoIGZvciBtb3N0IGNhc2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIHVpUHJvZ3Jlc3M7ICAgICAvKio8IFByb2dyZXNzIG9mIHRoZSBFZmZlY3QgZnJvbSAwIHRvIDEwMDAgKG9uZSB0aG91c2FuZCkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlDbGlwVGltZTsgICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY3VycmVudCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aU91dHB1dFRpbWU7ICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRwdXQgY2xpcCB0aW1lLWxpbmUgKi8KLQotfSBNNE1DU19FeHRlcm5hbFByb2dyZXNzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRNQ1NfQXVkaW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0eXBlcyBvZiB0aGUgTUNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfTm9uZSAgICA9IDAsCi0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW4gID0gOCwgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlT3V0ID0gMTYsIC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0V4dGVybmFsID0gMjU2Ci0KLX0gTTRNQ1NfQXVkaW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdAotICogQGJyaWVmICAgICAgIEF1ZGlvIGVmZmVjdCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBvcmlnaW5hbCBQQ00gZGF0YSBidWZmZXIgYW5kIGl0cyBzaXplLgotICogICAgICAgICAgICAgIEF1ZGlvIGVmZmVjdCBoYXZlIHRvIGJlIGFwcGxpZWQgb24gaXQuCi0gKiAgICAgICAgICAgICAgVGhlIHByb2dyZXNzIG9mIHRoZSBlZmZlY3QgaXMgZ2l2ZW4sIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEwMDAuCi0gKiAgICAgICAgICAgICAgV2hlbiB0aGUgZWZmZWN0IGZ1bmN0aW9uIGlzIGNhbGxlZCwgYWxsIHRoZSBidWZmZXJzIGFyZSB2YWxpZCBhbmQKLSAqICAgICAgICAgICAgICBvd25lZCBieSB0aGUgTUNTLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBQQ01kYXRhICAgICAgICAgICAgKElOL09VVCkgdmFsaWQgUENNIGRhdGEgYnVmZmVyCi0gKiBAcGFyYW0gICB1aVBDTXNpemUgICAgICAgICAgIChJTi9PVVQpIFBDTSBkYXRhIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHNpemUKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1ZGlvIGVmZmVjdCBwcm9ncmVzcy4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNE1DU19FZmZlY3RTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhdWRpbyBlZmZlY3QgZm9yIHRoZSBlZGl0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlTdGFydFRpbWU7ICAgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aUR1cmF0aW9uOyAgICAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3QgICAgIEV4dEF1ZGlvRWZmZWN0RmN0OyAgICAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICpwRXh0QXVkaW9FZmZlY3RGY3RDdHh0OyAgLyoqPCBDb250ZXh0IGdpdmVuIHRvIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00TUNTX0F1ZGlvRWZmZWN0VHlwZSAgICAgICAgQXVkaW9FZmZlY3RUeXBlOyAgICAgICAgIC8qKjwgTm9uZSwgRmFkZUluLCBGYWRlT3V0ICovCi0KLX0gTTRNQ1NfRWZmZWN0U2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRNQ1NfT3V0cHV0UGFyYW1zCi0gKiBAYnJpZWYgICAgTUNTIE91dHB1dCBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICAgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIHN0aWxsIHBpY3R1cmUgaW5wdXRzIDoKLSAqICAgICAgICAgICAgIC0gT3V0cHV0RmlsZVR5cGUgKG11c3QgYmUgc2V0IHRvIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcpCi0gKiAgICAgICAgICAgICAtIGJEaXNjYXJkRXhpZiBtdXN0IGJlIHNldCB0byBNNE9TQV9UUlVFIG9yIE00T1NBX0ZBTFNFCi0gKiAgICAgICAgICAgICAtIGJBZGp1c3RPcmllbnRhdGlvbiBtdXN0IGJlIHNldCB0byBNNE9TQV9UUlVFIG9yIE00T1NBX0ZBTFNFCi0gKiAgICAgICAgICAgICAtIChNZWRpYVJlbmRlcmluZyBpcyBub3QgaGFuZGxlZCA6IG91dHB1dCBpbWFnZSByZXNvbHV0aW9uIGlzIGFsd2F5cwotICAgICAgICAgICAgICAgICBzZXQgYWNjb3JkaW5nIHRvIEJlc3RGaXQgY3JpdGVyaWEpCi0gKiAgICAgICAgICAgIGJEaXNjYXJkRXhpZiBhbmQgYkFkanVzdE9yaWVudGF0aW9uIGFyZSBzdGlsbCBwaWN0dXJlIG9ubHkgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlVHlwZTsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIHNlZSBlbnVtICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgIE91dHB1dFZpZGVvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGZyYW1lIHNpemUgOiBRUVZHQSwgUUNJRiBvciBTUUNJRiAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICAvKio8IFRhcmdldGVkIE91dHB1dCBmcmFtZXJhdGUsIHNlZSBlbnVtICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVSYXRlOwotICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0OwotICAgIC8qKjwgU2FtcGxpbmcgZnJlcXVlbmN5IG9mIHRoZSBhdWRpbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgIE91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgLyoqPCBTZXQgdG8gTTRPU0FfVFJVRSBpZiB0aGUgb3V0cHV0IGF1ZGlvIGlzIG1vbm8gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF1ZGlvTW9ubzsKLSAgICAvKio8IE91dHB1dCBQQ00gZmlsZSBpZiBub3QgTlVMTCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcE91dHB1dFBDTWZpbGU7Ci0gICAgLyoqPCBUbyBjcm9wLCByZXNpemUsIG9yIHJlbmRlciBibGFjayBib3JkZXJzKi8KLSAgICBNNE1DU19NZWRpYVJlbmRlcmluZyAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgLyoqPCBMaXN0IG9mIGVmZmVjdHMgKi8KLSAgICBNNE1DU19FZmZlY3RTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgKnBFZmZlY3RzOwotICAgIC8qKjwgTnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhlIGFib3ZlIGxpc3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOwotCi0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotICAgIC8qKjwgVFJVRTogRXZlbiBpZiB0aGUgaW5wdXQgZmlsZSBjb250YWlucyBhbiBFWElGIHNlY3Rpb24sCi0gICAgdGhlIG91dHB1dCBmaWxlIHdvbid0IGNvbnRhaW4gYW55IEVYSUYgc2VjdGlvbi4qLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlzY2FyZEV4aWYgOwotCi0gICAgLyoqPCA9VFJVRSA6IHBpY3R1cmUgbXVzdCBiZSByb3RhdGVkIGlmIEV4aWYgdGFncyBob2xkIGEgcm90YXRpb24gaW5mbwotICAgIChhbmQgcm90YXRpb24gaW5mbyBpcyBzZXQgdG8gMCkqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRqdXN0T3JpZW50YXRpb24gOwotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLSAgICBNNE9TQV9JbnQzMiBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgb3V0cHV0VmlkZW9MZXZlbDsKLX0gTTRNQ1NfT3V0cHV0UGFyYW1zOwotCi0vKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUE91dHB1dFJlc29sdXRpb24KLSAqIEBicmllZiAgICBTdGlsbCBwaWN0dXJlIHNwZWNpZmljIDogTUNTIG91dHB1dCB0YXJnZXRlZCBmaWxlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1Jlc1NhbWVBc0lucHV0ICAgICAgID0gMHgwMCwgLyp3aWR0aCB4IGhlaWdodCovCi0gICAgTTRNQ1Nfa1Jlc1FWR0EgICAgICAgICAgICAgID0gMHgwMSwgLyozMjB4MjQwKi8KLSAgICBNNE1DU19rUmVzVkdBICAgICAgICAgICAgICAgPSAweDAyLCAvKjY0MHg0ODAqLwotICAgIE00TUNTX2tSZXNXUVZHQSAgICAgICAgICAgICA9IDB4MDMsIC8qNDAweDI0MCovCi0gICAgTTRNQ1Nfa1Jlc1dWR0EgICAgICAgICAgICAgID0gMHgwNCwgLyo4MDB4NDgwKi8KLSAgICBNNE1DU19rUmVzWEdBICAgICAgICAgICAgICAgPSAweDA1LCAvKjEwMjR4NzY4Ki8KLSAgICBNNE1DU19rUmVzQ3VzdG9tICAgICAgICAgICAgPSAweEZGICAvKlNpemUgaXMgc2V0IHZpYSBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQqLwotfSBNNE1DU19TUE91dHB1dFJlc29sdXRpb24gOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgIE00TUNTX1NQU3RyYXRlZ3kKLSAqIEBicmllZiAgICBTdGlsbCBwaWN0dXJlIHNwZWNpZmljIDogTUNTIHN0cmF0ZWd5IHRvIGNvbmZpZ3VyZSB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rRmlsZVNpemVPbmx5Rml4ZWQgICAgICAgICAgICA9IDB4MDAsIC8qU3RpbGxQaWN0dXJlUmVzb2x1dGlvbiBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFsaXR5RmFjdG9yIGFyZSBpZ25vcmVkKi8KLSAgICBNNE1DU19rRmlsZVNpemVBbmRSZXNGaXhlZCAgICAgICAgICA9IDB4MDEsIC8qUXVhbGl0eUZhY3RvciBpcyBpZ25vcmVkKi8KLSAgICBNNE1DU19rUXVhbGl0eUFuZFJlc0ZpeGVkICAgICAgICAgICA9IDB4MDIgIC8qT3V0cHV0RmlsZVNpemUgaXMgaWdub3JlZCovCi19IE00TUNTX1NQU3RyYXRlZ3kgOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgIE00TUNTX1NQQ3JvcAotICogQGJyaWVmICAgIFN0aWxsIHBpY3R1cmUgc3BlY2lmaWMgOiBpbmRpY2F0ZSB3aGV0aGVyIGNyb3BwaW5nIHNob3VsZCBiZSBkb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNoYW5naW5nIHRoZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tOb0Nyb3AgICAgICAgICAgICAgICAgPSAweDAwLCAvKk5vIENyb3BwaW5nIGlzIHBlcmZvcm1lZCovCi0gICAgTTRNQ1Nfa0Nyb3BCZWZvcmVSZXNpemUgICAgICA9IDB4MDEgIC8qSW5wdXQgaW1hZ2UgaXMgY3JvcHBlZCAoYmVmb3JlIGNoYW5naW5nIHJlc29sdXRpb24pKi8KLX0gTTRNQ1NfU1BDcm9wIDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNE1DU19FbmNvZGluZ1BhcmFtcwotICogQGJyaWVmICAgIE1DUyBmaWxlIHNpemUsIGJpdHJhdGUgYW5kIGN1dCBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICAgRm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHVzZWQgZm9yIHN0aWxsIHBpY3R1cmUgaW5wdXRzIDoKLSAqICAgICAgICAgICAgIC0gT3V0cHV0RmlsZVNpemUKLSAqICAgICAgICAgICAgIC0gU3RpbGxQaWN0dXJlUmVzb2x1dGlvbgotICogICAgICAgICAgICAgLSBRdWFsaXR5RmFjdG9yCi0gKiAgICAgICAgICAgICAtIFN0aWxsUGljdHVyZVN0cmF0ZWd5Ci0gKiAgICAgICAgICAgICAtIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodCAoaWYgU3RpbGxQaWN0dXJlUmVzb2x1dGlvbj09TTRNQ1Nfa1Jlc0N1c3RvbSkKLSAqICAgICAgICAgICAgU3RpbGwgcGljdHVyZSBvbmx5IHBhcmFtZXRlcnMgOiBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uLCBRdWFsaXR5RmFjdG9yLAotICogICAgICAgICAgICBTdGlsbFBpY3R1cmVTdHJhdGVneSBhbmQgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICBPdXRwdXRWaWRlb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIHZpZGVvIGJpdHJhdGUgKi8KLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgIE91dHB1dEF1ZGlvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgYXVkaW8gYml0cmF0ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgQmVnaW5DdXRUaW1lOyAgICAgICAgICAgLyoqPCBCZWdpbm5pbmcgY3V0IHRpbWUgaW4gaW5wdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgRW5kQ3V0VGltZTsgICAgICAgICAgICAgLyoqPCBFbmQgY3V0IHRpbWUgaW4gaW5wdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgT3V0cHV0RmlsZVNpemU7ICAgICAgICAgLyoqPCBFeHBlY3RlZCByZXN1bHRpbmcgZmlsZSBzaXplICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBPdXRwdXRWaWRlb1RpbWVzY2FsZTsgICAvKio8IE9wdGlvbmFsIHBhcmFtZXRlciB1c2VkIHRvIGZpeCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZSBkdXJpbmcgdHJhbnNjb2RpbmcgKi8KLQotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgIFF1YWxpdHlGYWN0b3IgOyAgICAgICAgIC8qKjwgPS0xICh1bmRlZmluZWQpIG9yIDAobG93ZXN0KS4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MChiZXN0KSA6IFRoaXMgcGFyYW1ldGVyIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSBpbmRpY2F0aW9uIGZvciB0aGUgSlBFRyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgKGlmID0tMSB0aGUgTUNTIHdpbGwgc2V0IHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkpKi8KLSAgICBNNE1DU19TUFN0cmF0ZWd5ICAgICAgICAgICAgU3RpbGxQaWN0dXJlU3RyYXRlZ3kgOyAvKio8IERlZmluZXMgd2hpY2ggaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgYnkgTUNTKi8KLSAgICBNNE1DU19TUE91dHB1dFJlc29sdXRpb24gICAgU3RpbGxQaWN0dXJlUmVzb2x1dGlvbjsvKio8IERlc2lyZWQgb3V0cHV0IHJlc29sdXRpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHN0aWxsIHBpY3R1cmUgZmlsZSAqLwotICAgIC8qKjwgKG9ubHkgaWYgUmVzb2x1dGlvbj09TTRNQ1Nfa1Jlc0N1c3RvbSkgOiBDdXN0b20gb3V0cHV0IGltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoOwotICAgIC8qKjwgKG9ubHkgaWYgUmVzb2x1dGlvbj09TTRNQ1Nfa1Jlc0N1c3RvbSkgOiBDdXN0b20gb3V0cHV0IGltYWdlIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDdXN0b21IZWlnaHQ7Ci0gICAgLyoqPCBJbmRpY2F0ZSB3aGV0aGVyIENyb3Agc2hvdWxkIGJlIHBlcmZvcm1lZCAqLwotICAgIE00TUNTX1NQQ3JvcCAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIFggY29vcmRpbmF0ZSBvZiB0b3BsZWZ0IGNvcm5lciBvZiB0aGUgY3JvcCB3aW5kb3cgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9YOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIFkgY29vcmRpbmF0ZSBvZiB0b3BsZWZ0IGNvcm5lciBvZiB0aGUgY3JvcCB3aW5kb3cgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9ZOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIFdpZHRoIG9mIHRoZSBjcm9wIHdpbmRvdyAoaW4gcGl4ZWxzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX1c7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgSGVpZ2h0IG9mIHRoZSBjcm9wIHdpbmRvdyAoaW4gcGl4ZWxzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX0g7Ci0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotfSBNNE1DU19FbmNvZGluZ1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE1DUyB2ZXJzaW9uLgotICogQG5vdGUgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbml0KE00TUNTX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTUNTIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE1DUyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW5pdChNNE1DU19Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sIE00T1NBX1ZvaWQqIHBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlNYXhNZXRhZGF0YVNpemUpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgIEl0IG9wZW5zIHRoZSBpbnB1dCBmaWxlLCBidXQgdGhlIG91dHB1dCBmaWxlIGlzIG5vdCBjcmVhdGVkIHlldC4KLSAqICAgICAgICAgIEluIGNhc2Ugb2Ygc3RpbGwgcGljdHVyZSwgZm91ciBJbnB1dEZpbGVUeXBlIGFyZSBwb3NzaWJsZQotICogICAgICAgICAgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcvQk1QL0dJRi9QTkcKLSAqICAgICAgICAgIElmIG9uZSBvZiB0aGVtIGlzIHNldCwgdGhlIE91dHB1dEZpbGVUeXBlIFNIQUxMIGJlIHNldCB0byBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtciwgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0byBzdG9yZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSAoIm1vb3YuYmluIikuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogICBUaGUgaW5wdXQgZmlsZSBoYXMgbm90IGJlZW4gZm91bmQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU6ICAgVGhlIGlucHV0IGZpbGUgaXMgbm90IGEgdmFsaWQgZmlsZSwgb3IgaXMgY29ycnVwdGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOiAgVGhlIGlucHV0IGZpbGUgY29udGFpbnMgbm8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIHRyYW5zY29kaW5nCi0gKiBAbm90ZSAgICBwUHJvZ3Jlc3MgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU6IFRyYW5zY29kaW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIsIE1QMykgZmFpbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBhbiBBQUMgYXVkaW8gdHJhY2sKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3VsZCBuZXZlciBoYXBwZW4pCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfUElDVFVSRV9BVVRPX1JFU0laRTogUGljdHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzaXplZCB0byBmaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byByZXF1aXJlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGF1c2UgdGhlIHRyYW5zY29kaW5nIGkuZS4gcmVsZWFzZSB0aGUgKGV4dGVybmFsIGhhcmR3YXJlKSB2aWRlbyBkZWNvZGVyLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcGF1c2luZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSB0ZW1wb3JhcmlseSBzdXNwZW5kaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbiBjYWxscy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFJlc3VtZSB0aGUgdHJhbnNjb2RpbmcgYWZ0ZXIgYSBwYXVzZSAoc2VlIE00TUNTX3BhdXNlKS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHJlc3VtaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IGNhbGxpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZXN1bWUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nLgotICogQG5vdGUgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xvc2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE1DUy4KLSAqIEBub3RlIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19hYm9ydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZyBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE1DUwotICogICAgICAgICAgd2hhdGV2ZXIgdGhlIHN0YXRlIGlzLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19hYm9ydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyogcEZpbGVQcm9wZXJ0aWVzKTsKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb3BlcnRpZXMgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIGFuIGFsbG9jYXRlZCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgd2hpY2ggaXMgZmlsbGVkIHdpdGggdGhlIGlucHV0IHN0cmVhbSBwcm9wZXJ0aWVzLgotICogQG5vdGUgICAgVGhlIHN0cnVjdHVyZSBwUHJvcGVydGllcyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgZnVydGhlciBkZS1hbGxvY2F0ZWQKLSAgICAgICAgICAgIGJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcGVuZWQgc3RhdGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIHZpZGVvIG91dHB1dCBwYXJhbWV0ZXJzLgotICogQG5vdGUgICAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfb3Blbi4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIE00TUNTX3N0ZXAuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQYXJhbXMgICAgICAgICAgICAgKElOL09VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIDogT3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzIDogT3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMIDogU3BlY2lmaWVkIG91dHB1dCBwYXJhbWV0ZXJzIGRlZmluZSBhIG51bGwgZHVyYXRpb24gc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gYXVkaW8gYW5kIHZpZGVvKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpCi0gKiBAYnJpZWYgICBTZXQgdGhlIHZhbHVlcyBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoKS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKElOKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6IEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6IEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGNsaXAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6IEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6IE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBhdCBnaXZlbiBiaXRyYXRlcwotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c6IFZpZGVvIGJpdHJhdGUgdG9vIGxvdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIEdldCB0aGUgZXh0ZW5kZWQgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBDb3VsZCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChPVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogRW5jb2Rpbmcgc2V0dGluZ3Mgd291bGQgcHJvZHVjZSBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIGR1cmF0aW9uIGNsaXAgPSBlbmNvZGluZyBpcyBpbXBvc3NpYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KE00TUNTX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGNsaXAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6IEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6IE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBhdCBnaXZlbiBiaXRyYXRlcwotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c6ICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000TUNTX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDQyZGJiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuaAotICogQGJyaWVmICBNQ1MgZXJyb3IgY29kZXMgZGVmaW5pdGlvbnMgKE1lZGlhIENvbXByZXNzb3IgU2VydmljZSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0jaWZuZGVmIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNE1DU19FcnJvckNvZGVzX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIGNvcmUgSUQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogV2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEVuZCBvZiBwcm9jZXNzaW5nLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNE1DU19jbG9zZSgpICovCi0jZGVmaW5lIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNE1DUywgMHgxKQotLyogTWVkaWF0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE1DUyAqLwotI2RlZmluZSBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNE1DUywgMHgyKQotLyogSW5kaWNhdGUgdGhhdCBwaWN0dXJlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXNpemVkIHRvIGZpdCBpbnRvIHRoZSByZXF1aXJlZAotICAgcGFyYW1ldGVycyAoZmlsZSBzaXplKSAqLwotI2RlZmluZSBNNE1DU19XQVJfUElDVFVSRV9BVVRPX1JFU0laRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNE1DUywgMHgzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogLS0tLS0gT1BFTiBFUlJPUlMgLS0tLS0gKi8KLQotLyogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSAobWF5IGJlIGEgY29ycnVwdGVkIGZpbGUpICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDAxKQotLyogVGhlIGlucHV0IGZpbGUgaXMgaW52YWxpZC9jb3JydXB0ZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDIpCi0vKiBUaGUgaW5wdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDAzKQotLyogVGhlIGlucHV0IHZpZGVvIGZyYW1lIHNpemUgaXMgbm9uIG11bHRpcGxlIG9mIDE2ICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlBVVF9WSURFT19TSVpFX05PTl9YMTYgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDA0KQotCi0KLS8qIC0tLS0tIFNFVCBPVVRQVVQgUEFSQU1TIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEwKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTEpCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMikKLS8qIFRoZSBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTMpCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTQpCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAgIChJdCBjYW4ndCBoYXBwZW4gaW4gY3VycmVudCB2ZXJzaW9uIG9mIE1DUyEpICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE1KQotLyogQSBudWxsIGNsaXAgZHVyYXRpb24gYXMgYmVlbiBjb21wdXRlZCwgd2hpY2ggaXMgdW52YWxpZCAoc2hvdWxkIG5ldmVyIGhhcHBlbiEpICovCi0jZGVmaW5lIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE2KQotLyogVGhlIC5tcDQgY29udGFpbmVyIGNhbm5vdCBoYW5kbGUgaDI2MyBjb2RlYyAqLwotI2RlZmluZSBNNE1DU19FUlJfSDI2M19GT1JCSURERU5fSU5fTVA0X0ZJTEUgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNykKLQotCi0vKiAtLS0tLSBQUkVQQVJFIERFQ09ERVJTIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBIMjYzIFByb2ZpbGUgKG90aGVyIHRoYW4gMCkgaXMgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgyMCkKLS8qIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjayB3aXRoIGFuIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5Ci0gICAoc2hvdWxkIG5ldmVyIGhhcHBlbikgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MjEpCi0vKiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiwgb3IgTVAzKSBmYWlsZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MjIpCi0KLQotLyogLS0tLS0gU0VUIEVOQ09ESU5HIFBBUkFNUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGNsaXAgZHVyYXRpb24gKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzApCi0vKiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscyAqLwotI2RlZmluZSBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMSkKLS8qIEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzIpCi0vKiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dCBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzICovCi0jZGVmaW5lIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEwgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMzKQotLyogVmlkZW8gYml0cmF0ZSBpcyB0b28gbG93IChhdm9pZCB1Z2x5IHZpZGVvKSAqLwotI2RlZmluZSBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1cgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNCkKLS8qIEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM1KQotLyogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpICovCi0jZGVmaW5lIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM2KQotLyogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSCAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzcpCi0KLS8qIC0tLS0tIE9USEVSUyBFUlJPUlMgLS0tLS0gKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4NTApCi0jZGVmaW5lIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRNQ1MsIDB4NTEpCi0jZGVmaW5lIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRNQ1MsIDB4NTIpCi0jZW5kaWYgLyogX19NNE1DU19FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbENvbmZpZy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWZhZjFlNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbENvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGludGVybmFsIGNvbnN0YW50IHZhbHVlcyBzZXR0aW5ncwotICogQG5vdGUgICBUaGlzIGhlYWRlciBmaWxlIGlzIG5vdCBwdWJsaWMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLSNpZm5kZWYgX19NNE1DU19JTlRFUk5BTENPTkZJR19IX18KLSNkZWZpbmUgX19NNE1DU19JTlRFUk5BTENPTkZJR19IX18KLQotCi0vKioKLSAqIERlZmluaXRpb24gb2YgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfQVVESU9fTUFYX0NIVU5LX1NJWkUgICAgICAgIDcxNjggLyoqPCBhZGQgbXAzIGVuY29kZXIgYW5kIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggYml0cmF0ZSBpcyBub3cgMzIwa2JwcyBpbnN0ZWFkIG9mIDEyOGticHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGlzIHZhbHVlIGhhcyB0byBiZSBpbmNyZWFzZWQgYWNjb3JkaW5nbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICgoc2l6ZW9mKE00T1NBX1VJbnQ4KSptYXhfY2hhbm5lbF9udW1iZXIpKzMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0YWtlIGEgbWFyZ2luKGFmdGVyIHRlc3RzLCAyIHdhcyBub3QgZW5vdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkqTUFYX1BDTV9HUkFOVUxBUklUWV9TQU1QTEVTKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlZm9yZTogNDAwMCovLyoqPCBNYWdpY2FsICovCi0KLS8qKgotICogVmlkZW8gbWF4IEFVIGFuZCBmcmFnbWVudCBzaXplICovCi0jZGVmaW5lIE00TUNTX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyAgIDAuOCAvKio8IE1hZ2ljYWwuIFVzZWQgdG8gZGVmaW5lIHRoZSBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19WSURFT19DSFVOS19BVV9TSVpFX1JBVElPICAgICAxLjIgLyoqPCBNYWdpY2FsLiBVc2VkIHRvIGRlZmluZSB0aGUgbWF4IGNodW5rIHNpemUgKi8KLQotLyoqCi0gKiBWYXJpb3VzIE1hZ2ljYWxzICovCi0jZGVmaW5lIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQgICAgICAgIDEKLSNkZWZpbmUgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgMgotCi0vKioKLSAqIEdyYW51bGFyaXR5IGZvciBhdWRpbyBlbmNvZGVyICovCi0gLyoqPCBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIHBhc3MgaW4gQU1SIGVuY29kaW5nIGNhc2UgKi8KLSNkZWZpbmUgTTRNQ1NfUENNX0FNUl9HUkFOVUxBUklUWV9TQU1QTEVTIDE2MAotLyoqPCBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIHBhc3MgaW4gQUFDIGVuY29kaW5nIGNhc2UgKi8KLSNkZWZpbmUgTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTIDEwMjQKLS8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIE1QMyBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUyA1NzYKLQotI2RlZmluZSBNNE1DU19BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgMTAyNCAgLyoqPCBhZGQgbXAzIGVuY29kZXIgYW5kIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBhbnltb3JlLCBub3cgdGhlIG1heCBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBpcyBjb21wdXRlZCBkeW5hbWljYWxseSBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgY2hhbm5lbHMsdGhlIG1heCBQQ00gZ3JhbnVsYXJpdHkgc2FtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYSBtYXJnaW4uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmVmb3JlOiAxMDI0Ki8vKio8IE1hZ2ljYWwgKi8KLS8qKgotICogV3JpdGVyIGZpbGUgYW5kIG1vb3Ygc2l6ZSBlc3RpbWF0aW9uICovCi0jZGVmaW5lIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTyAgICAxLjA0ICAvKio8IG1hZ2ljYWwgbW9vdiBzaXplIGlzIGxlc3MgdGhhbiA0JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBmaWxlIHNpemUgaW4gYXZlcmFnZSAqLwotCi0vKioKLSAqIElmIDNncCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW4gU1RTUyB0YWJsZSAobm8gcmFwIGZyYW1lcyksCi0gICBqdW1wIGJhY2t3YXJkIHRvIGEgc3BlY2lmaWVkIGxpbWl0ICovCi0jZGVmaW5lIE00TUNTX05PX1NUU1NfSlVNUF9QT0lOVCAgICAgICAgICA0MDAwMCAvKio8IDQwIHMgKi8KLQotI2VuZGlmIC8qIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsRnVuY3Rpb25zLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMWM2NzllLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCi0gKiBAYnJpZWYgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgaW50ZXJuYWwKLSAqICAgICAgICAgIHRvIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNE1DU19JTlRFUk5BTEZVTkNUSU9OU19IX18KLSNkZWZpbmUgX19NNE1DU19JTlRFUk5BTEZVTkNUSU9OU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludEFwcGx5VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBEbyB0aGUgdmlkZW8gcmVuZGVyaW5nIGFuZCB0aGUgcmVzaXplIChpZiBuZWVkZWQpCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTikgICAgIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTUNTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICBwUGxhbmVJbiAgICAoSU4pICAgICBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgIHBQbGFuZU91dCAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHRoZSBvdXRwdXQgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIEVSUl9NQ1NfVklERU9fREVDT0RFX0VSUk9SOiB0aGUgdmlkZW8gZGVjb2RpbmcgZmFpbGVkCi0gKiBAcmV0dXJuICBFUlJfTUNTX1JFU0laRV9FUlJPUjogICAgICAgdGhlIHJlc2l6aW5nIGZhaWxlZAotICogQHJldHVybiAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcmVhZGVyLCBkZWNvZGVycywgd3JpdGVycyBhbmQgZW5jb2RlcnMKLSAqICAgICAgICAgICBpbiB0aGUgTUNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBNZWRpYVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UgKnBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICpwV3RyRGF0YUludGVyZmFjZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGZpbGUgZm9ybWF0IHdyaXRlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yIHBXdHJEYXRhSW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckVuY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCBtZWRpYVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgbWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAgICAgICAgICAgIChJTikgICBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgIG1lZGlhVHlwZTogICAgICAgICAgICAgIChJTikgICBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpICBUaGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyUmVhZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZWdpc3RlciBhdWRpbyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBNQ1MgdG8gcmVnaXN0ZXIgQ29yZSBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pICAgICBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAoSU4pICAgICBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHdyaXRlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciB0aGUgZW5jb2RlcnMKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxEZWNvZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZGVjb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIGFuIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkKLSAqIEBub3RlICAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0ZXBFbmNvZGluZyBmdW5jdGlvbgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgICBNQ1MgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgIChJTi9PVVQpIElucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSAgICAgU2l6ZSBvZiBwUENNZGF0YQotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAoSU4pICAgICBFZmZlY3QgcHJvZ3Jlc3MKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgIChJTi9PVVQpIElucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSAgICAgU2l6ZSBvZiBwUENNZGF0YQotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAoSU4pICAgICBFZmZlY3QgcHJvZ3Jlc3MKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlT3V0KCBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMRlVOQ1RJT05TX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlNGYyMzYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuaAotICogQGJyaWVmICBNQ1MgaW50ZXJuYWwgdHlwZXMgYW5kIHN0cnVjdHVyZXMgZGVmaW5pdGlvbnMKLSAqIEBub3RlICAgVGhpcyBoZWFkZXIgZmlsZSBpcyBub3QgcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNE1DU19JTlRFUk5BTFRZUEVTX0hfXwotCi0vKioKLSAqICAgIE1DUyBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNE1DU19BQlMoYSkgICAgICAgICAgICAgICAoICggKGEpIDwgKDApICkgPyAoLShhKSkgOiAoYSkgKQotCi0KLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotCi0vKioKLSAqICAgIEludGVybmFsbHkgdXNlZCBtb2R1bGVzICovCi0jaW5jbHVkZSAiTTRSRUFERVJfM2dwQ29tLmgiICAgICAgICAvKio8IFJlYWQgM0dQUCBmaWxlICAgICAqLwotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIgICAgICAgLyoqPCBEZWNvZGUgdmlkZW8gICAgICAgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIiAgICAgIC8qKjwgVmlkZW8gcmVzaXplICAgICAgICovCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIgICAgICAgICAgICAvKio8IERlY29kZXIgYXVkaW8gICAgICAqLwotI2luY2x1ZGUgIlNTUkMuaCIgICAgICAgICAgICAgICAgICAgLyoqPCBTU1JDICAgICAgICAgICAgICAgKi8KLSNpbmNsdWRlICJGcm9tMmlUb01vbm9fMTYuaCIgICAgICAgIC8qKjwgU3RlcmVvIHRvIE1vbm8gICAgICovCi0jaW5jbHVkZSAiTW9ub1RvMklfMTYuaCIgICAgICAgICAgICAvKio8IE1vbm8gdG8gU3RlcmVvICAgICAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIiAgLyoqPCBFbmNvZGUgYXVkaW8gICAgICAgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIgICAgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qKgotICogIEluc3RlYWQgb2YgaW5jbHVkaW5nIEFBQyBjb3JlIHByb3BlcnRpZXMsIGl0IGlzIGJldHRlciB0byByZWRlZmluZSB0aGUgbmVlZGVkIHR5cGUKLSAqICBBQUNfREVDX1NUUkVBTV9QUk9QUwotICogIEluIGNhc2Ugb2YgZXh0ZXJuYWwgQUFDIGRlY29kZXIsIGl0IHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHB1dCB0aGlzIHR5cGUgYXMgcHVibGljCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgQUFDX0RFQ19TVFJFQU1fUFJPUFMKLSAqIEBicmllZiBBQUMgU3RyZWFtIHByb3BlcnRpZXMKLSAqIEBOb3RlIGFOb0NoYW4gYW5kIGFTYW1wRnJlcSBhcmUgdXNlZCBmb3IgcGFyc2luZyBldmVuIHRoZSB1c2VyIHBhcmFtZXRlcnMKLSAqICAgICAgICBhcmUgZGlmZmVyZW50LiAgVXNlciBwYXJhbWV0ZXJzIHdpbGwgYmUgaW5wdXQgZm9yIHRoZSBvdXRwdXQgYmVoYXZpb3VyCi0gKiAgICAgICAgb2YgdGhlIGRlY29kZXIgd2hlcmVhcyBmb3IgcGFyc2luZyBiaXRzdHJlYW0gcHJvcGVydGllcyBhcmUgdXNlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNE9TQV9JbnQzMiBhQXVkaW9PYmplY3RUeXBlOyAgICAgLyoqPCBBdWRpbyBvYmplY3QgdHlwZSBvZiB0aGUgc3RyZWFtIC0gaW4gZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZSBmb3VuZCBpbiB0aGUgQWNjZXNzIFVuaXQgcGFyc2VkICovCi0gIE00T1NBX0ludDMyIGFOdW1DaGFuOyAgICAgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAoPTEobW9ubykgb3IgPTIoc3RlcmVvKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IGlucHV0IGJpdHN0cmVhbSovCi0gIE00T1NBX0ludDMyIGFTYW1wRnJlcTsgICAgICAgICAgICAvKio8IHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiAqLwotICBNNE9TQV9JbnQzMiBhRXh0ZW5zaW9uU2FtcEZyZXE7ICAgLyoqPCBleHRlbmRlZCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHosID0gMCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBleHRlbmRlZCBmcmVxdWVuY3kgKi8KLSAgTTRPU0FfSW50MzIgYVNCUlByZXNlbnQ7ICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgU0JSICovCi0gIE00T1NBX0ludDMyIGFQU1ByZXNlbnQ7ICAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFBTICovCi0gIE00T1NBX0ludDMyIGFNYXhQQ01TYW1wbGVzUGVyQ2g7ICAvKio8IG1heCBudW1iZXIgb2YgUENNIHNhbXBsZXMgcGVyIGNoYW5uZWwgKi8KLX0gQUFDX0RFQ19TVFJFQU1fUFJPUFM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgICBDb2RlY3MgcmVnaXN0cmF0aW9uIHNhbWUgYXMgaW4gVlBTIGFuZCBWRVMsIHNvIGxlc3MgbWFwcGluZwotICogICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvd2FyZCBNQ1MgYXBpIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiBwR2xvYmFsRmN0czsgICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICBwRGF0YUZjdHM7ICAgICAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyAqLwotfSBNNE1DU19Xcml0ZXJJbnRlcmZhY2U7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00TUNTX1N0YXRlcwotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIE1DUy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1N0YXRlX0NSRUFURUQsICAgICAgICAgICAvKio8IE00TUNTX2luaXQgaGFzIGJlZW4gY2FsbGVkICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX09QRU5FRCwgICAgICAgICAgICAvKio8IE00TUNTX29wZW4gaGFzIGJlZW4gY2FsbGVkICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX1NFVCwgICAgICAgICAgICAgICAvKio8IEFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0ICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX1JFQURZLCAgICAgICAgICAgICAvKio8IEFsbCBvcHRpb25uYWwgcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0ICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9KVU1QLCAgICAvKio8IE11c3QganVtcCB0byB0aGUgSWZyYW1lIGJlZm9yZSB0aGUgYmVnaW4gY3V0ICovCi0gICAgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREUsICAvKio8IE11c3QgZGVjb2RlIHVwIHRvIHRoZSBiZWdpbiBjdXQgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkcsICAgICAgICAvKio8IFN0ZXAgY2FuIGJlIGNhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX1BBVVNFRCwgICAgICAgICAgICAvKio8IFBhdXNlZCwgUmVzdW1lIGNhbiBiZSBjYWxsZWQgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9GSU5JU0hFRCwgICAgICAgICAgLyoqPCBUcmFuc2NvZGluZyBpcyBmaW5pc2hlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9DTE9TRUQgICAgICAgICAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkICAgICAgICAgICAgKi8KLX0gTTRNQ1NfU3RhdGVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNE1DU19TdHJlYW1TdGF0ZQotICogQGJyaWVmICAgICAgICBTdGF0ZSBvZiBhIG1lZGlhIHN0cmVhbSBlbmNvZGluZyAoYXVkaW8gb3IgdmlkZW8pLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU0gID0gMCwgICAgLyoqPCBObyBzdHJlYW0gcHJlc2VudCAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCAgID0gMSwgICAgLyoqPCBUaGUgc3RyZWFtIGVuY29kaW5nIGlzIGluIHByb2dyZXNzICovCi0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEICA9IDIgICAgLyoqPCBUaGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBlbmNvZGluZyAgICAqLwotfSBNNE1DU19TdHJlYW1TdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBhbm9ueW1vdXMgZW51bQotICogQGJyaWVmICAgICAgICBlbnVtIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGVuY29kZXIgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotZW51bQotewotICAgIE00TUNTX2tOb0VuY29kZXIsCi0gICAgTTRNQ1Nfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRNQ1Nfa0VuY29kZXJTdG9wcGVkLAotICAgIE00TUNTX2tFbmNvZGVyUnVubmluZwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE1DUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNQ1MgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgYml0UG9zOwotICAgICAgICAgICAgICAgICAvKiBiaXQgY291bnQgb2YgbnVtYmVyIG9mIGJpdHMgdXNlZCBzbyBmYXIgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgKnN0cmVhbUJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAvKiBCaXRzdHJlYW0gQnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgYnl0ZUNudDsKLSAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQnl0ZXMgd3JpdHRlbiBpbiBCaXRzdHJlYW0gYnVmZmVyKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBjdXJyQnVmZjsKLSAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGJ1ZmZlciBob2xkcywgNGJ5dGVzIG9mIGJpdHN0cmVhbSovCi0KLSAgICBNNE9TQV9VSW50OCAgIHByZXZCeXRlOwotICAgICAgICAgICAgICAgIC8qIFByZXZpb3VzIGJ5dGUgd3JpdHRlbiBpbiB0aGUgYnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50OCAgIHByZXZQcmV2Qnl0ZTsKLSAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyB0byBwcmV2aW91cyBieXRlIHdyaXR0ZW4gaW4gdGhlIGJ1ZmZlciAqLwotCi19TlNXQVZDX2JpdFN0cmVhbV90X01DUzsKLQotI2RlZmluZSBfTUFYbnVtX3NsaWNlX2dyb3VwcyAgOAotI2RlZmluZSBfTUFYbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAgMjU2Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE00T1NBX1VJbnQzMiAgbGV2ZWxfaWRjX2luZGV4OwotICBNNE9TQV9VSW50MzIgIE1heEZyYW1lTnVtOwotICBNNE9TQV9VSW50MzIgIGV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlOwotICBNNE9TQV9JbnQzMiAgIE1heFBpY09yZGVyQ250THNiOwotICBNNE9TQV9JbnQzMiAgIG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOwotCi0gIC8qIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMSkgKi8KLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbX01BWG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGVdOwotCi0gIE00T1NBX1VJbnQxNiBQaWNXaWR0aEluTWJzOwotICBNNE9TQV9VSW50MTYgRnJhbWVIZWlnaHRJbk1iczsKLSAgTTRPU0FfVUludDE2ICBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMTsKLSAgTTRPU0FfVUludDE2ICBwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czE7Ci0KLSNpZmRlZiBfQ0FQX0ZNT18KLSAgTTRPU0FfVUludDE2IE51bVNsaWNlR3JvdXBNYXBVbml0czsKLSAgTTRPU0FfVUludDE2IE1heFBpY1NpemVJbk1iczsKLSNlbmRpZiAvKl9DQVBfRk1PXyovCi0KLSAgTTRPU0FfVUludDggICBwcm9maWxlX2lkYzsKLSAgTTRPU0FfVUludDggICByZXNlcnZlZF96ZXJvXzRiaXRzOwotICBNNE9TQV9VSW50OCAgIGxldmVsX2lkYzsKLSAgTTRPU0FfVUludDggICBzZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICBsb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICBNNE9TQV9VSW50OCAgIHBpY19vcmRlcl9jbnRfdHlwZTsKLSAgLyogaWYocGljX29yZGVyX2NudF90eXBlID09IDApICovCi0gIE00T1NBX1VJbnQ4ICAgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OwotCi0gIE00T1NBX1VJbnQ4ICAgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKLSAgLyogZm9yKCBpID0gMDsgaSA8IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKyApICovCi0gIE00T1NBX1VJbnQ4ICAgbnVtX3JlZl9mcmFtZXM7Ci0KLSAgTTRPU0FfQm9vbCAgICBjb25zdHJhaW50X3NldDBfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBjb25zdHJhaW50X3NldDFfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBjb25zdHJhaW50X3NldDJfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBjb25zdHJhaW50X3NldDNfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZnJhbWVfbWJzX29ubHlfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZnJhbWVfY3JvcHBpbmdfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICB2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgQWN0aXZlOwotCi0gIC8qIHZ1aV9zZXFfcGFyYW1ldGVyc190IHZ1aV9zZXFfcGFyYW1ldGVyczsgKi8KLX0gQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1M7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE00T1NBX0ludDE2ICAgICAgIHBpY19pbml0X3FwX21pbnVzMjY7Ci0gIE00T1NBX0ludDE2ICAgICAgIHBpY19pbml0X3FzX21pbnVzMjY7Ci0gIE00T1NBX0ludDE2ICAgICAgIGNocm9tYV9xcF9pbmRleF9vZmZzZXQ7Ci0KLS8vI2lmZGVmIF9DQVBfRk1PXwotICAvKiBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDAgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICBydW5fbGVuZ3RoX21pbnVzMVtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAyICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgdG9wX2xlZnRbX01BWG51bV9zbGljZV9ncm91cHNdOwotICBNNE9TQV9VSW50MTYgICAgICBib3R0b21fcmlnaHRbX01BWG51bV9zbGljZV9ncm91cHNdOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gNiApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHBpY19zaXplX2luX21hcF91bml0c19taW51czE7Ci0gIE00T1NBX1VJbnQxNiAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMTsKLQotICBNNE9TQV9VSW50MTYgRmlyc3RNYkluU2xpY2VHcm91cFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIE00T1NBX1VJbnQxNiBMYXN0TWJJblNsaWNlR3JvdXBbX01BWG51bV9zbGljZV9ncm91cHNdOwotCi0KLSAgTTRPU0FfVUludDggICpzbGljZV9ncm91cF9pZDsKLSAgTTRPU0FfVUludDggICpNYXBVbml0VG9TbGljZUdyb3VwTWFwOwotICBNNE9TQV9VSW50OCAgKk1iVG9TbGljZUdyb3VwTWFwOwotICBNNE9TQV9VSW50MTYgIE51bVNsaWNlR3JvdXBNYXBVbml0czsKLQotICBNNE9TQV9VSW50OCAgICAgICBzbGljZV9ncm91cF9tYXBfdHlwZTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDMgfHwgNCB8fCA1ICovCi0gIE00T1NBX0Jvb2wgICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZzsKLSAgTTRPU0FfQm9vbCAgIG1hcF9pbml0aWFsaXplZDsKLS8vICNlbmRpZiAvKl9DQVBfRk1PXyovCi0KLSAgTTRPU0FfVUludDggICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgICAgIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7Ci0gIE00T1NBX1VJbnQ4ICAgICAgbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsKLSAgTTRPU0FfVUludDggICAgICAgd2VpZ2h0ZWRfYmlwcmVkX2lkYzsKLSAgTTRPU0FfVUludDggICAgICAgbnVtX3NsaWNlX2dyb3Vwc19taW51czE7Ci0KLSAgTTRPU0FfQm9vbCAgICAgICAgZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnOwotICAvKiBpZiggcGljX29yZGVyX2NudF90eXBlIDwgMiApICBpbiB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCAqLwotICBNNE9TQV9Cb29sICAgICAgICBwaWNfb3JkZXJfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICB3ZWlnaHRlZF9wcmVkX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIHJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBBY3RpdmU7Ci0KLSAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfYWN0aXZlX3NwczsKLX0gQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgIE00T1NBX1VJbnQzMiBiaXRQb3M7ICAgICAgICAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotICAgICAgTTRPU0FfVUludDMyIHRvdGFsQml0czsgICAgICAgICAgICAgLyohPCBiaXQgcG9zaXRpb24gaW4gZmlsZSAodG90YWwgYml0cyByZWFkIHNvIGZhcikgKi8KLQotICAgICAgTTRPU0FfVUludDMyIGxhc3RUb3RhbEJpdHM7ICAgICAgICAgLyohPCBiaXQgcG9zaXRpb24gaW4gZmlsZSBvZiB0aGUgbGFzdCBWT1AgKi8KLSAgICAgIE00T1NBX1VJbnQzMiBudW1CaXRzSW5CdWZmZXI7ICAgICAgIC8qITwgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCi0gICAgICBNNE9TQV9VSW50MzIgcmVhZGFibGVCeXRlc0luQnVmZmVyOyAvKiE8IG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGluIGRlY29kZXIgYnVmZmVyKi8KLSAgICAgIE00T1NBX1VJbnQzMiBtYXhCdWZmZXJTaXplOyAgICAgICAgIC8qITwgbWF4IGJ1ZmZlciBzaXplIGluIGJpdCB1bml0cyAqLwotICAgICAgTTRPU0FfVUludDggICpCdWZmZXI7ICAgICAgICAgICAgICAgLyohPCBjaGFyIGJ1ZmZlciBhdCByZWFkaW5nIGZyb20gZmlsZSAqLwotICAgICAgTTRPU0FfSW50MzIgICAgIGk4Qml0Q250OwotICAgICAgTTRPU0FfVUludDMyICAgICB1aTMyVGVtcEJ1ZmY7Ci0gICAgICBNNE9TQV9JbnQ4KnB1aThCZnJQdHI7Ci0gICAgICBNNE9TQV9VSW50MzIgICAgdWkzMkxhc3RUd29CeXRlczsgIC8qITwgc3RvcmVzIHRoZSBsYXN0IHJlYWQgdHdvIGJ5dGVzICovCi19IENvbUJpdFN0cmVhbU1DU190OwotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0KLSAgICBNNE9TQV9JbnQzMiBwcmV2X2ZyYW1lX251bTsKLSAgICBNNE9TQV9JbnQzMiBjdXJfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHByZXZfbmV3X2ZyYW1lX251bTsKLSAgICBNNE9TQV9JbnQzMiBsb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX0ludDMyIGlzX2RvbmU7Ci0gICAgTTRPU0FfSW50MzIgaXNfZmlyc3Q7Ci0gICAgTTRPU0FfSW50MzIgZnJhbWVfY291bnQ7Ci0gICAgTTRPU0FfSW50MzIgZnJhbWVfbW9kX2NvdW50OwotICAgIE00T1NBX0ludDMyIFBPQ19sc2I7Ci0gICAgTTRPU0FfSW50MzIgUE9DX2xzYl9tb2Q7Ci0KLQotICAgIE00T1NBX1VJbnQzMiAgICBtX051bV9CeXRlc19OQUxVbml0TGVuZ3RoOwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm87ICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgYSBkZWNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7LyoqPCBTaXplIG9mIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBwb2ludGVyIGFib3ZlKi8KLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFbmNvZGVyU1BTOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJTUFNTaXplOwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEVuY29kZXJQUFM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2RlclBQU1NpemU7Ci0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRmluYWxEU0k7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fcEZpbmFsRFNJU2l6ZTsKLQotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJfU1BTX0NudDsKLSAgICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAqcF9jbGlwX3NwczsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyX1BQU19DbnQ7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgKnBfY2xpcF9wcHM7Ci0KLSAgICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAqcF9lbmNvZGVyX3NwczsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAqcF9lbmNvZGVyX3BwczsKLQotCi0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgIGVuY29kZXJfc3BzOwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICBlbmNvZGVyX3BwczsKLSAgICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAgY2xpcF9zcHM7Ci0KLSAgICAvKiBFbmNvZGVyIFNQUyBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyIGVuY19zZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgICBNNE9TQV9VSW50MzIgZW5jX2xvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gICAgTTRPU0FfVUludDMyIGVuY19waWNfb3JkZXJfY250X3R5cGU7Ci0gICAgTTRPU0FfVUludDMyIGVuY19sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7IC8qIGFwcGxpY2FibGUgd2hlbiBQT0MgdHlwZSA9IDAgKi8KLSAgICBNNE9TQV9VSW50MzIgZW5jX2RlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICAgIE00T1NBX0ludDMyIGVuY19vZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICAgIE00T1NBX0ludDMyIGVuY19vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gICAgTTRPU0FfVUludDMyIGVuY19udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyAvKiByYW5nZSAwIHRvIDI1NSAqLwotICAgIC8qIGFycmF5IG9mIHNpemUgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAqLwotICAgIE00T1NBX0ludDMyICAgZW5jX29mZnNldF9mb3JfcmVmX2ZyYW1lWzI1Nl07Ci0gICAgTTRPU0FfVUludDMyIGVuY19udW1fcmVmX2ZyYW1lczsKLSAgICBNNE9TQV9VSW50MzIgZW5jX2dhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKLQotCi0gICAgLyogSW5wdXQgY2xpcCBTUFMgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiBjbGlwX3NlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX2xvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfcGljX29yZGVyX2NudF90eXBlOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX2xvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsgLyogYXBwbGljYWJsZSB3aGVuIFBPQyB0eXBlID0gMCAqLwotICAgIE00T1NBX1VJbnQzMiBjbGlwX2RlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3Jfbm9uX3JlZl9waWM7Ci0gICAgTTRPU0FfSW50MzIgIGNsaXBfb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX251bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IC8qIHJhbmdlIDAgdG8gMjU1ICovCi0gICAgLyogYXJyYXkgb2Ygc2l6ZSBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICovCi0gICAgTTRPU0FfSW50MzIgIGNsaXBfb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbMjU2XTsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9udW1fcmVmX2ZyYW1lczsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7Ci0KLSAgICBNNE9TQV9VSW50MzIgZmluYWxfUFBTX0lEOwotICAgIE00T1NBX1VJbnQzMiBmaW5hbF9TUFNfSUQ7Ci0gICAgTlNXQVZDX2JpdFN0cmVhbV90X01DUyAgZW5jYnM7Ci0KLX0gTlNXQVZDX01DU190OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgTUNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIE1DUyBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIE1DUyBTdGF0ZSBhbmQgc2V0dGluZ3Mgc3R1ZmYgKi8KLSAgICBNNE1DU19TdGF0ZXMgICAgICAgICAgICBTdGF0ZTsgICAgIC8qKjwgTUNTIGludGVybmFsIHN0YXRlICovCi0gICAgTTRNQ1NfU3RyZWFtU3RhdGUgICAgICAgVmlkZW9TdGF0ZTsvKio8IFN0YXRlIG9mIHRoZSB2aWRlbyBlbmNvZGluZyAqLwotICAgIE00TUNTX1N0cmVhbVN0YXRlICAgICAgIEF1ZGlvU3RhdGU7LyoqPCBTdGF0ZSBvZiB0aGUgYXVkaW8gZW5jb2RpbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBub2F1ZGlvOy8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVhbCB3aXRoIGF1ZGlvIHRyYW5zY29kaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbm92aWRlbzsvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB2aWRlbyB0cmFuc2NvZGluZyAqLwotCi0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgIElucHV0RmlsZVByb3BlcnRpZXM7LyoqPCBJbnB1dCBhdWRpby92aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIHBJbnB1dEZpbGU7ICAgICAgICAgICAgIC8qKjwgUmVtZW1iZXIgaW5wdXQgZmlsZSBwb2ludGVyIGJldHdlZW4gZmFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBhbmQgbm9ybWFsIG9wZW4gKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlOyAgICAgICAgICAvKio8IFJlbWVtYmVyIGlucHV0IGZpbGUgdHlwZSBiZXR3ZWVuIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gYW5kIG5vcm1hbCBvcGVuICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkZpbGVPcGVuZWRJbkZhc3RNb2RlOyAgLyoqPCBGbGFnIHRvIGtub3cgaWYgYSBwYXJ0aWN1bGFyIHJlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgZmFzdCBvcGVuICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlNYXhNZXRhZGF0YVNpemU7ICAgICAgLyoqPCBMaW1pdGF0aW9uIG9uIHRoZSBtYXggYWNjZXB0YWJsZSBtb292Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIG9mIGEgM2dwcCBmaWxlICovCi0KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBFbmNvZGluZ1ZpZGVvRm9ybWF0OyAgICAvKio8IE91dHB1dCB2aWRlbyBmb3JtYXQsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIEVuY29kaW5nV2lkdGg7ICAgICAgICAgIC8qKjwgT3V0cHV0IHZpZGVvIHdpZHRoLCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICBFbmNvZGluZ0hlaWdodDsgICAgICAgICAvKio8IE91dHB1dCB2aWRlbyBoZWlnaHQsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00RU5DT0RFUl9GcmFtZVJhdGUgICAgIEVuY29kaW5nVmlkZW9GcmFtZXJhdGU7IC8qKjwgT3V0cHV0IHZpZGVvIGZyYW1lcmF0ZSwgc2V0IGJ5IHRoZSB1c2VyKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpQmVnaW5DdXRUaW1lOyAgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlFbmRDdXRUaW1lOyAgICAgICAvKio8IEJlZ2luIGN1dCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aU1heEZpbGVTaXplOyAgICAgIC8qKjwgTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplLCBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCBhdWRpbyBiaXRyYXRlIGluIGJwcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpVmlkZW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCB2aWRlbyBiaXRyYXRlIGluIGJwcyAqLwotCi0gICAgTTRPU0FfVUludDggICAgIHVpUHJvZ3Jlc3M7ICAvKio8IFByb2dyZXNzIGluZm9ybWF0aW9uIHNhdmVkIGF0IGVhY2ggc3RlcCB0byBiZSBhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCBpbiBjYXNlIG9mIHBhdXNlICovCi0KLSAgICAvKioKLSAgICAgKiBSZWFkZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBwUmVhZGVyQ29udGV4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgcmVhZGVyIG1vZHVsZSAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogIHBSZWFkZXJWaWRlb1N0cmVhbTsgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwUmVhZGVyQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYlVuc3VwcG9ydGVkVmlkZW9Gb3VuZDsgICAvKio8IFRydWUgaWYgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGhhcyBiZWVuIGZvdW5kICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYlVuc3VwcG9ydGVkQXVkaW9Gb3VuZDsgICAvKio8IFRydWUgaWYgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGhhcyBiZWVuIGZvdW5kICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVMTsgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVUyOyAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVMTsgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVUyOyAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgbV9wRGF0YUFkZHJlc3MxOyAgICAgICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgZm9yIEFjY2VzcyBVbml0ICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgbV9wRGF0YUFkZHJlc3MyOyAgICAgICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgZm9yIEFjY2VzcyBVbml0ICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgbV9wRGF0YVZpZGVvQWRkcmVzczE7ICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgZm9yIEFjY2VzcyBVbml0ICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgbV9wRGF0YVZpZGVvQWRkcmVzczI7ICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgZm9yIEFjY2VzcyBVbml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9hdWRpb0FVRHVyYXRpb247ICAgICAgICAvKio8IEF1ZGlvIEFVIGR1cmF0aW9uICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgaUF1ZGlvQ3RzT2Zmc2V0OyAgICAgICAgICAvKio8IEF1ZGlvIEFVIENUUyBvZmZzZXQgZHVlIHRvIGJlZ2luIGN1dCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwVmlEZWNDdHh0OyAgICAgICAgIC8qKjwgVmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgIGRWaURlY1N0YXJ0aW5nQ3RzOyAgLyoqPCBWaWRlbyBDVFMgYXQgd2hpY2ggdGhlIGRlY29kZS9lbmNvZGUgd2lsbCBzdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZWQgZm9yIGJlZ2luIGN1dCBhbmQgcGF1c2UvcmVzdW1lKSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkVmlEZWNDdXJyZW50Q3RzOyAgIC8qKjwgVmlkZW8gQ1RTIHRvIGRlY29kZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICBpVmlkZW9CZWdpbkRlY0luY3I7IC8qKjwgQ1RTIHN0ZXAgZm9yIHRoZSBiZWdpbiBjdXQgZGVjb2RlIChkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24pICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgIGRDdHNJbmNyZW1lbnQ7ICAgICAgLyoqPCBDdHMgaW5jcmVtZW50IGZyb20gb25lIHZpZGVvIGZyYW1lIHRvIGFub3RoZXIqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICBpc1JlbmRlckR1cDsgICAgICAgIC8qKjwgVG8gaGFuZGxlIGR1cGxpY2F0ZSBmcmFtZSByZW5kZXJpbmcgaW4gY2FzZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGRlY29kaW5nICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgIGxhc3REZWNvZGVkUGxhbmU7ICAgLyoqPCBMYXN0IGRlY29kZWQgcGxhbmUgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcFZpRW5jQ3R4dDsgICAgICAgICAvKio8IFZpZGVvIGVuY29kZXIgY29udGV4dCAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICBwUHJlUmVzaXplRnJhbWU7ICAgIC8qKjwgVGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlIHJlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGlmIHJlc2l6ZSBuZWVkZWQgb25seSkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICB1aUVuY1ZpZGVvQml0cmF0ZTsgIC8qKjwgQWN0dWFsIHZpZGVvIGJpdHJhdGUgZm9yIHRoZSB2aWRlbyBlbmNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgIG91dHB1dFZpZGVvVGltZXNjYWxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICBlbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBBdWRpb0RlY0N0eHQ7ICAgICAgICAvKio8IEF1ZGlvIChBQUMpIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICBBdWRpb0RlY0J1ZmZlckluOyAgICAgLyoqPCBJbnB1dCBzdHJ1Y3R1cmUgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0OyAgICAvKio8IE91dHB1dCBzdHJ1Y3R1cmUgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgIHBQb3NJbkRlY0J1ZmZlck91dDsgICAvKio8IFBvc2l0aW9uIGludG8gdGhlIGRlY29kZXIgYnVmZmVyICovCi0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgIEFhY1Byb3BlcnRpZXM7ICAgLyoqPCBTdHJ1Y3R1cmUgZm9yIG5ldyBhcGkgdG8gZ2V0IEFBQyBwcm9wZXJ0aWVzICovCi0KLSAgICAvKioKLSAgICAgKiBTYW1wbGUgUmF0ZSBDb252ZXJ0b3IgKFNTUkMpIHN0dWZmICovCi0gICAgU1NSQ19JbnN0YW5jZV90ICAgICAgICBTc3JjSW5zdGFuY2U7ICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgU3NyYyAqLwotICAgIFNTUkNfU2NyYXRjaF90KiAgICAgICAgU3NyY1NjcmF0Y2g7ICAgICAgICAvKio8IFdvcmtpbmcgbWVtb3J5IG9mIHRoZSBTc3JjICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxJbjsgICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBuZWVkcyBhcyBpbnB1dCAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsT3V0OyAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgb3V0cHV0cyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFNzcmNCdWZmZXJJbjsgICAgICAvKio8IElucHV0IG9mIHRoZSBTU1JDICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwU3NyY0J1ZmZlck91dDsgICAgIC8qKjwgT3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwUG9zSW5Tc3JjQnVmZmVySW47IC8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBpbiBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJPdXQ7LyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIG91dCBidWZmZXIgKi8KLQotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgcExWQXVkaW9SZXNhbXBsZXI7Ci0KLQotICAgIC8qKgotICAgICAqIGF1ZGlvIGVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY0N0eHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgcEF1ZGlvRW5jRFNJOyAvKio8IERlY29kZXIgc3BlY2lmaWMgaW5mbyBidWlsdCBieSB0aGUgZW5jb2RlciovCi0gICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICAgICAgICAgICBBdWRpb0VuY1BhcmFtczsvKio8IENvbmZpZyBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgcEF1ZGlvRW5jb2RlckJ1ZmZlcjsgICAgICAvKio8IElucHV0IG9mIHRoZSBlbmNvZGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICBwUG9zSW5BdWRpb0VuY29kZXJCdWZmZXI7IC8qKjwgUG9zaXRpb24gaW50byB0aGUgZW5jb2RlciBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIGF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OyAgLyoqPCBNaW5pbXVtIG51bWJlciBvZiBwY20gc2FtcGxlcyBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBmZWVkIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIC8qKgotICAgICAqIFdyaXRlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgcFdyaXRlckNvbnRleHQ7ICAgICAvKio8IENvbnRleHQgb2YgdGhlIHdyaXRlciBtb2R1bGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgIHBPdXRwdXRGaWxlOyAgICAgICAgLyoqPCBPdXRwdXQgZmlsZSB0byBiZSBjcmVhdGVkICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZTsgICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gYmUgY3JlYXRlZCB0byBzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgIFdyaXRlclZpZGVvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbiB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgIFdyaXRlckF1ZGlvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbiBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zIFdyaXRlclZpZGVvU3RyZWFtSW5mbzsvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4gdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgIFdyaXRlclZpZGVvQVU7ICAgICAgICAvKio8IFdyaXR0ZW4gdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgIFdyaXRlckF1ZGlvQVU7ICAgICAgICAvKio8IFdyaXR0ZW4gYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpVmlkZW9BVUNvdW50OyAgICAgICAvKio8IE51bWJlciBvZiB2aWRlbyBBVSB3cml0dGVuIGluIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgICAvKio8IE1heCBhY2Nlc3MgdW5pdCBzaXplIGZvciB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvTWF4Q2h1bmNrU2l6ZTsgLyoqPCBNYXggY2h1bmNrIHNpemUgZm9yIHRoZSBvdXRwdXQgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpQXVkaW9BVUNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGF1ZGlvIEFVIHdyaXR0ZW4gaW4gb3V0cHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7IC8qKjwgTWF4IGFjY2VzcyB1bml0IHNpemUgZm9yIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpQXVkaW9DdHM7ICAgICAgIC8qKjwgQXVkaW8gQVUgY3RzICh3aGVuIGF1ZGlvIGlzIHRyYW5zY29kZWQpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiX2lzUmF3V3JpdGVyOyAgICAvKio8IEJvb2xlYW4gdG8ga25vdyBpZiB0aGUgcmF3IHdyaXRlciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBvciBub3QgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgIHBPdXRwdXRQQ01maWxlOyAgIC8qKjwgT3V0cHV0IFBDTSBmaWxlIGlmIG5vdCBOVUxMICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgcE9zYUZpbGVSZWFkUHRyOyAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICBwT3NhRmlsZVdyaXRQdHI7IC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgICogTWVkaWEgYW5kIENvZGVjIHJlZ2lzdHJhdGlvbiAqLwotICAgIC8qKjwgVGFibGUgb2YgTTRWRVNfV3JpdGVySW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBXcml0ZXJzIGxpc3QgKi8KLSAgICBNNE1DU19Xcml0ZXJJbnRlcmZhY2UgICAgICAgICAgICAgICBXcml0ZXJJbnRlcmZhY2VbTTRXUklURVJfa1R5cGVfTkJdOwotICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHM7Ci0gICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzOwotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgIHBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgLyoqPCBGdW5jdGlvbnMgb2YgdGhlIHVzZWQgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlckV4dGVybmFsQVBJVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgICBwQXVkaW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgVGFibGUgb2YgaW50ZXJuYWwvZXh0ZXJuYWwgZmxhZ3MgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2RlckZsYWdbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBGdW5jdGlvbnMgb2YgdGhlIHVzZWQgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBtX3BSZWFkZXJHbG9iYWxJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIG1fcFJlYWRlcjsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQ7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFJlYWRlcnM7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgICAgICAgICBtX3BWaWRlb0RlY29kZXI7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVySXRUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYzsKLQotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgIG1fcEF1ZGlvRGVjb2RlcjsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICBtX3BBdWRpb0RlY29kZXJJdFRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtNNEFEX2tUeXBlX05CXTsgLyoqPCBzdG9yZSBpbmRpY2VzIG9mIGV4dGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcnMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIG1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YTsKLQotICAgIE00TUNTX01lZGlhUmVuZGVyaW5nICAgIE1lZGlhUmVuZGVyaW5nOyAgICAgLyoqPCBGQjogdG8gY3JvcCwgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgbV9haXJfY29udGV4dDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiRXh0T01YQXVkRGVjb2RlcjsgIC8qIEV4dGVybmFsIE9NWCBBdWRpbyBkZWNvZGVyICovCi0KLSAgICAvKio8IEZsQiAyMDA5LjAzLjA0OiBBdWRpbyBlZmZlY3RzKi8KLSAgICBNNE1DU19FZmZlY3RTZXR0aW5ncyAgICAqcEVmZmVjdHM7ICAgICAgICAgICAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhlIGFib3ZlIGxpc3QgKi8KLSAgICBNNE9TQV9JbnQ4ICAgICAgICAgICAgICBwQWN0aXZlRWZmZWN0TnVtYmVyOyAgICAvKio8IEVmZmVjdCBJRCB0byBiZSBhcHBsaWVkLCBpZiAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ki8KLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYklzU3RpbGxQaWN0dXJlOyAgICAgICAvKio8ID1UUlVFIGlmIGlucHV0IGZpbGUgaXMgYSBzdGlsbCBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKUEVHLCBQTkcsIEJNUCwgR0lGKSovCi0gICAgTTRNQ1NfQ29udGV4dCAgICAgICAgICAgbV9wU3RpbGxQaWN0dXJlQ29udGV4dDsgLyoqPCBDb250ZXh0IG9mIHRoZSBzdGlsbCBwaWN0dXJlIHBhcnQgb2YgTUNTKi8KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0gICAgTlNXQVZDX01DU190ICAgICAgICAgICAgKm1fcEluc3RhbmNlOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICpIMjY0TUNTVGVtcEJ1ZmZlcjsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBIMjY0TUNTVGVtcEJ1ZmZlclNpemU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgSDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiSDI2NFRyaW07Ci0gICAgLyogRmxhZyB3aGVuIHRvIGdldCAgbGFzdGRlY29kZWRmcmFtZUNUUyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJMYXN0RGVjb2RlZEZyYW1lQ1RTOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIGVuY29kaW5nVmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIGVuY29kaW5nVmlkZW9MZXZlbDsKLQotfSBNNE1DU19JbnRlcm5hbENvbnRleHQ7Ci0KLQotI2VuZGlmIC8qIF9fTTRNQ1NfSU5URVJOQUxUWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzMGFhNjEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZWRpdG9yX21jcwotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfbWNzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICAgIE00TUNTX0FQSS5jIFwKLSAgICAgIE00TUNTX0F1ZGlvRWZmZWN0cy5jIFwKLSAgICAgIE00TUNTX0NvZGVjcy5jIFwKLSAgICAgIE00TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBcCi0gICAgICBNNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDU2ZWYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBQQ00gc2FtcGxlcyAqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0vKioKLSAqIERlY29kZXIgaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0vKiBFbmNvZGVyIGludGVyZmFjZSovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKiBFbmFibGUgZm9yIERFQlVHIGxvZ2dpbmcgKi8KLS8vI2RlZmluZSBNQ1NfRFVNUF9QQ01fVE9fRklMRQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLUZJTEUgKmZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLUZJTEUgKmZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0jZW5kaWYKLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbENvbmZpZy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSNpbmNsdWRlICJNNE1DU19TdGlsbFBpY3R1cmUuaCIKLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLS8qIENvbW1vbiBoZWFkZXJzIChmb3IgYWFjKSAqLwotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotCi0vKiBWZXJzaW9uICovCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUFKT1IgMwotI2RlZmluZSBNNE1DU19WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTiAgMwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBFbmNvZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFRyYW5zY29kZWRUaW1lICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICAgKnBDb250ZXh0ICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApOwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggbW9kZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmV3U2l6ZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLXN0YXRpYyBNNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjRFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXh0ZXJuYWwgZnVuY3Rpb24gdXNlZCBvbmx5IGJ5IFZpZGVvRWRpdG9yIGFuZCB0aGF0IGRvZXMgbm90IGFwcGVhcgotICogaW4gdGhlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApOwotCi0vKiBBbGwgZXJyb3JzIGFyZSBmYXRhbCBpbiB0aGUgTUNTICovCi0jZGVmaW5lIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpIGlmKE00Tk9fRVJST1IhPWVycikgcmV0dXJuIGVycjsKLQotLyogQSBkZWZpbmUgdXNlZCB3aXRoIFNTUkMgMS4wNCBhbmQgYWJvdmUgdG8gYXZvaWQgdGFraW5nIGJsb2NrcyBzbWFsbGVyCi0gKiB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUKLSAqLwotI2RlZmluZSBNNE1DU19TU1JDX01JTkJMT0NLU0laRSAgICAgICAgMTAwCi0KLXN0YXRpYyBNNE9TQV9VQ2hhciBUYWJfTUNTWzhdID0KLXsKLSAgICAxNywgNSwgMywgMywgMSwgMSwgMSwgMQotfTsKLQotTTRPU0FfRVJSIEgyNjRNQ1NfR2V0aW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqKiBpbnN0YW5jZSApCi17Ci0gICAgTlNXQVZDX01DU190ICpwX2JzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBwX2JzID0gKE5TV0FWQ19NQ1NfdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTlNXQVZDX01DU190KSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk5TV0FWQ19NQ1NfdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcF9icyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19HZXRpbnN0YW5jZTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcF9icy0+cHJldl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmN1cl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSAwOwotICAgIHBfYnMtPnByZXZfbmV3X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+aXNfZG9uZSA9IDA7Ci0gICAgcF9icy0+aXNfZmlyc3QgPSAxOwotCi0gICAgcF9icy0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BFbmNvZGVyU1BTID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJTUFNTaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJQUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclBQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fcEZpbmFsRFNJU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfU1BTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfcHBzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfUFBTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLQotICAgIHBfYnMtPmVuY29kZXJfcHBzLnNsaWNlX2dyb3VwX2lkID0gTTRPU0FfTlVMTDsKLQotICAgICppbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilwX2JzOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX2dldEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDMyIHVpMzJSZXRCaXRzOwotICAgIE00T1NBX1VJbnQ4ICpwYnM7Ci0gICAgTTRPU0FfSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIC8qIE1lYXN1cmUgdGhlIHF1YW50aXR5IG9mIGJpdHMgdG8gYmUgcmVhZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICB1aTMyUmV0Qml0cyA9IHBfYnMtPnVpMzJUZW1wQnVmZiA+PiAoMzIgLSBudW1CaXRzKTsKLQotICAgIC8qIFJlYWQgbnVtQml0cyBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPDw9IG51bUJpdHM7Ci0gICAgcF9icy0+Yml0UG9zICs9IG51bUJpdHM7Ci0KLSAgICBpZiggYmNudCA+IDI0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAoaW50KShwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAvKiBub3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoKCBwYnNbLTFdKQotICAgICAgICAgICAgICAgICAgICB8IChwYnNbLTJdKSkpKSAvLyhwX2JzLT51aTMyTGFzdFR3b0J5dGVzICYgMHgwMDAwRkZGRikgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEVQQiBieXRlIGZvdW5kOiBza2lwIGl0IGFuZCB1cGRhdGUgYml0UG9zIGFjY29yZGluZ2x5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmNudCArPSA4OwotICAgICAgICAgICAgfSB3aGlsZSAoIGJjbnQgPD0gMjQgKTsKLQotICAgICAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcGJzOwotICAgICAgICAgICAgcF9icy0+aThCaXRDbnQgPSBiY250OwotICAgICAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcF9icy0+Yml0UG9zIDw9IHBfYnMtPm51bUJpdHNJbkJ1ZmZlciApCi0gICAgewotICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci19Ci0KLU00T1NBX1ZvaWQgSDI2NE1DU19mbHVzaEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9VSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAocF9icy0+bnVtQml0c0luQnVmZmVyIC0gcF9icy0+Yml0UG9zKSApCi0gICAgICAgIHsgICAvKiBOb3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogIE9uIHRoZSBmbHkgZGV0ZWN0aW9uIG9mIEVQQiBieXRlICovCi0gICAgICAgICAgICAgICAgaWYoICggKihwYnMpID09IDB4MDMpICYmICghKCggcGJzWy0xXSkgfCAocGJzWy0yXSkpKSApCi0gICAgICAgICAgICAgICAgeyAvKiBKQzogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgcF9icy0+Yml0UG9zICs9IDg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiB8PSAqKHBicykrKyA8PCAoMjQgLSBiY250KTsKLSAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGwwID0gMCwgbDE7Ci0gICAgLyogUmVhZGluZyAzMiBCaXRzIGZyb20gbG9jYWwgY2FjaGUgYnVmZmVyIG9mIEJpdHN0cmVhbSBzdHJ1Y3R1cmUqLwotICAgIGNvZGUgPSBwX2JzLT51aTMyVGVtcEJ1ZmY7Ci0KLSAgICAvKiBDaGVja2luZyBpbiBmaXJzdCAzIGJpdHMqLwotICAgIGlmKCBjb2RlID4+IDI5ICkKLSAgICB7Ci0gICAgICAgIGwwID0gVGFiX01DU1soY29kZSA+PiAyOSldOwotICAgICAgICBjb2RlID0gY29kZSA+PiAoMzIgLSBsMCk7Ci0gICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIGwwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29kZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29kZSA8PD0gMzsKLQotICAgICAgICAgICAgICAgIGZvciAoIGwwID0gMzsgY29kZSA8IDB4ODAwMDAwMDA7IGNvZGUgPDw9IDEsIGwwKysgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBsMCA8IDE2ICkgLyphbGwgdXNlZnVsIGJpdHMgYXJlIGluc2lkZSB0aGUgMzIgYml0cyByZWFkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSA+PiAoMzEgLSBsMCk7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDIgKiBsMCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7IC8qIFJlYWQgdGhlIHVzZWZ1bCBiaXRzIGluIDIgcGFydHMgKi8KLSAgICAgICAgICAgICAgICAgICAgbDEgPSAoIGwwIDw8IDEpIC0gMzE7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPj49IGwwOwotICAgICAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoIGNvZGUgPDwgbDEpIHwgSDI2NE1DU19nZXRCaXRzKHBfYnMsIGwxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMzIpOwotCi0gICAgICAgICAgICAgICAgaWYoIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBpZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgMzIsIHRoZSBvbmx5IGNvZGUgYWxsb3dlZCBpcyAxIGZvbGxvd2VkCi0gICAgICAgICAgICAgICAgICAgIGJ5IDMyIDAncyAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qcmVhZGluZyAzMiBtb3JlIGJpdHMgZnJvbSBiaXRzdHJlYW0gYnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvZGUgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29kZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qaWYgbnVtYmVyIG9mIGxlYWRpbmcgMCdzIGlzID4zMiwgdGhlbiBzeW1ib2wgaXMgPjMyIGJpdHMsCi0gICAgICAgICAgICAgICAgd2hpY2ggaXMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAvL3BfYnMtPnN0YXRlID0gX0JTX0VSUjsKLSAgICAgICAgICAgICAgICAvL3BfYnMtPmZsYWdzIHw9IF9CRl9TWU1fRVJSOwotICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMSApIC8vKHBfYnMtPnN0YXRlID09IF9CU19PSykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgfQotCi1NNE9TQV9JbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfSW50MzIgY29kZU5vLCByZXQ7Ci0KLSAgICAvKiByZWFkIHRoZSB1bnNpZ25lZCBjb2RlIG51bWJlciAqLwotICAgIGNvZGVObyA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBtYXAgdG8gdGhlIHNpZ25lZCB2YWx1ZSwgaWYgdmFsdWUgaXMgb2RkIHRoZW4gaXQncyBwb3NpdGl2ZSwKLSAgICBpZiBldmVuIHRoZW4gaXQncyBuZWdhdGl2ZSwgZm9ybXVsYSBpcyAoLTEpXihrKzEpKkNFSUwoay8yKSAqLwotCi0gICAgcmV0ID0gKGNvZGVObyAmIDB4MDEpID8gKCggY29kZU5vICsgMSkgPj4gMSkgOiAoKCAtY29kZU5vKSA+PiAxKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLU00T1NBX1ZvaWQgRGVjQml0U3RyZWFtUmVzZXRfTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBieXRlc19yZWFkICkKLXsKLSAgICBwX2JzLT5iaXRQb3MgPSAwOwotCi0gICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gYnl0ZXNfcmVhZCA8PCAzOwotICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGJ5dGVzX3JlYWQ7Ci0gICAgLy9wX2JzLT5zdGF0ZSA9IE00Tk9fRVJST1I7Ly9fQlNfT0s7Ci0gICAgLy9wX2JzLT5mbGFncyA9IDA7Ci0KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0gICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBiUy0+Yml0UG9zID0gMDsKLSAgICBiUy0+Ynl0ZUNudCA9IDA7Ci0gICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICBiUy0+cHJldkJ5dGUgPSAweGZmOwotICAgIGJTLT5wcmV2UHJldkJ5dGUgPSAweGZmOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0cyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBsZW5ndGggKQotewotICAgIE00T1NBX1VJbnQzMiBtYXNrZWRWYWx1ZSA9IDAsIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVPbmU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVuMSA9IChsZW5ndGggPT0gMzIpID8gMzEgOiBsZW5ndGg7Ci0KLSAgICBpZiggIShsZW5ndGgpICkKLSAgICB7Ci0gICAgICAgIC8qIExlbmd0aCA9IDAsIHJldHVybiBPSyovCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIG1hc2tlZFZhbHVlID0gKE00T1NBX1VJbnQzMikodmFsdWUgJigoIDEgPDwgbGVuMSkgLSAxKSk7Ci0KLSAgICBpZiggMzIgPiAobGVuZ3RoICsgYlMtPmJpdFBvcykgKQotICAgIHsKLSAgICAgICAgYlMtPmJpdFBvcyArPSBsZW5ndGg7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9ICgoIGJTLT5iaXRQb3MgKyBsZW5ndGgpIC0gMzIpOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAobWFza2VkVmFsdWUgPj4gKHRlbXApKTsKLQotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAoIG1hc2tlZFZhbHVlICYoKCAxIDw8IHRlbXApIC0gMSkpIDw8ICgzMiAtIHRlbXApOwotCi0gICAgICAgIGJTLT5iaXRQb3MgPSB0ZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3B1dEJpdCggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIG1hc2tlZFZhbHVlID0gKHZhbHVlID8gMSA6IDApOwotCi0gICAgaWYoIDMyID4gKDEgKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IDE7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSk7Ci0KLSAgICAgICAgLyogd3JpdGluZyBpdCB0byBtZW1vcnkqLwotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKGJTLT5jdXJyQnVmZikgJjB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0gICAgICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUyApCi17Ci0gICAgTTRPU0FfVUludDggdHJhaWxCaXRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlQ250ID0gMDsKLQotICAgIHRyYWlsQml0cyA9IChNNE9TQV9VSW50OCkoYlMtPmJpdFBvcyAlIDgpOwotCi0gICAgLyogQWxyZWFkeSBpbiB0aGUgYnl0ZSBhbGlnbmVkIHBvc2l0aW9uLAotICAgIFJCU1AgdHJhaWxpbmcgYml0cyB3aWxsIGJlIDEwMDAgMDAwMCAqLwotICAgIGlmKCAwID09IHRyYWlsQml0cyApCi0gICAgewotICAgICAgICB0cmFpbEJpdHMgPSAoMSA8PCA3KTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIHRyYWlsQml0cywgOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICg4IC0gdHJhaWxCaXRzKTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdChiUywgMSk7Ci0gICAgICAgIHRyYWlsQml0cy0tOwotCi0gICAgICAgIGlmKCB0cmFpbEJpdHMgKQotICAgICAgICB7IC8qIHB1dCB0cmFpbEJpdHMgdGltZXMgemVyb3MgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCAwLCB0cmFpbEJpdHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRm9yIHdyaXR0aW5nIHRoZSBjdXJyQnVmZiBpbiBzdHJlYW1CdWZmIDRieXRlIGFsaWdubWVudCBpcyByZXF1aXJlZCovCi0gICAgYnl0ZUNudCA9IChNNE9TQV9VSW50OCkoKCBiUy0+Yml0UG9zICsgNCkgLyA4KTsKLQotICAgIHN3aXRjaCggYnl0ZUNudCApCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIEl0IHdpbGwgbm90IGNvbWUgaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gICAgYlMtPmJpdFBvcyA9MDsKLSAgICAvLyAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfdUV4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMDsKLQotICAgIC8qIFRoZSBjb2RlTnVtIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybyBmb3IgdGhpcyB1ZSh2KSAqLwotICAgIGlmKCBjb2RlTnVtIDwgMCApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBJbXBsZW1lbnRhdGlvbiBmb3IgRW5jb2Rpbmcgb2YgdGhlIFRhYmxlIDktMSBpbiB0aGUgU3RhbmRhcmQgKi8KLSAgICB0ZW1wID0gY29kZU51bSArIDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgdGVtcCAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcCAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoKCBsb29wICogMikgLSAxKTsKLQotICAgIGRhdGEgPSBjb2RlTnVtICsgMTsKLQotICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCBkYXRhLCBjb2RlTGVuKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3NFeHBWTEMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTLCBNNE9TQV9JbnQzMiBjb2RlTnVtICkKLXsKLQotICAgIE00T1NBX0ludDMyIGxvb3AsIHRlbXAxLCB0ZW1wMjsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMCwgaXNQb3NpdGl2ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFic2NvZGVOdW07Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgaXNQb3NpdGl2ZSA9IDE7Ci0gICAgfQotCi0gICAgaWYoIGNvZGVOdW0gPiAwICkKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSBjb2RlTnVtOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhYnNjb2RlTnVtID0gLWNvZGVOdW07Ci0gICAgfQotCi0gICAgdGVtcDEgPSAoICggKCBhYnNjb2RlTnVtKSA8PCAxKSAtIGlzUG9zaXRpdmUpICsgMTsKLSAgICB0ZW1wMiA9IHRlbXAxOwotCi0gICAgZm9yICggbG9vcCA9IDA7IGxvb3AgPCAxNiAmJiB0ZW1wMiAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcDIgLz0gMjsKLSAgICB9Ci0KLSAgICBjb2RlTGVuID0gKCBsb29wICogMikgLSAxOwotCi0gICAgZGF0YSA9IHRlbXAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSggICBNNE9TQV9Wb2lkICphaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgTTRPU0FfSW50OCAqcFRtcEJ1ZmYxID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjIgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBpbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilhaW5zdGFuY2U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgIkluICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSB3aXRoIEZyYW1lU2l6ZSA9ICVkICBpbkJ1Zl9TaXplPSVkIiwKLSAgICAgICAgZnJhbWVfc2l6ZSwgaW5idWZfc2l6ZSk7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBjb2RlY3MgbWF5IGFkZCBhIHN0YXJ0IGNvZGUsIG1ha2Ugc3VyZSBpdCBpcyBub3QgcHJlc2VudAotCi0gICAgaWYoICFtZW1jbXAoKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgICJceDAwXHgwMFx4MDBceDAxIiwgNCkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzTkFMVSBFUlJPUiA6IE5BTFUgc3RhcnQgY29kZSBoYXMgbm90IGJlZW4gcmVtb3ZlZCAlZCAiCi0gICAgICAgICAgICAiMHglWCAweCVYIiwgaW5idWZfc2l6ZSwgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzBdLAotICAgICAgICAgICAgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzFdKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotICAgIHBUbXBCdWZmMSA9IChNNE9TQV9JbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGluYnVmX3NpemUgKyA0LCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikidG1wTkFMVSIpOwotICAgIG1lbWNweSgodm9pZCAqKShwVG1wQnVmZjEgKyA0KSwgKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgIGluYnVmX3NpemUpOwotICAgIHBUbXBCdWZmMVszXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplKSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzJdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gOCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMVsxXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplID4+IDE2KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzBdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMjQpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjIgPSAoTTRPU0FfSW50OCAqKWluYnVmZjsKLSAgICBpbmJ1ZmYgPSAoTTRPU0FfVUludDggKilwVG1wQnVmZjE7Ci0gICAgaW5idWZfc2l6ZSArPSA0OwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBhdmFpbGFibGUgc2l6ZSB3YXMgc2V0Ci0gICAgaWYoIGluYnVmX3NpemUgPj0gKm91dGJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiEhISBIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogc3BlY2lmaWVkIGF2YWlsYWJsZSBzaXplIGlzIGluY29ycmVjdCAlZCAiLAotICAgICAgICAgICAgKm91dGJ1Zl9zaXplKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgLy8gVXNlIHVuc2lnbmVkIHZhbHVlIHRvIGZpeCBlcnJvcnMgZHVlIHRvIGJpdCBzaWduIGV4dGVuc2lvbiwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVswXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsxXTsKLSAgICAgICAgbmFsX3NpemVfbG93MTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsyXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVszXTsKLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLSAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotCi0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDE7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICAgICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIG5hbF91bml0X3R5cGUgPT0gMSkgfHwgKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgLyogRmlyc3QgTUIgaW4gc2xpY2UgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGZpcnN0X21iX2luX3NsaWNlKTsKLQotICAgICAgICAgICAgLyogU2xpY2UgVHlwZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIC8qIFBpY3R1cmUgUGFyYW1ldGVyIHNldCBJZCAqLwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0gICAgICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA1ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgICAgICAgICAgICAgICAgICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zICYgMHg3OwotCi0gICAgICAgICAgICBpZiggY250ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSA4IC0gY250OwotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgY250KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBjbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGNudCA8IChuYWxfc2l6ZSAtIDIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIDgpOwotICAgICAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotCi0gICAgICAgICAgICBpZiggdGVtcCAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLQotICAgICAgICAgICAgICAgIGlmKCA4IC0gY250ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsICg4IC0gY250KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUgOiAxMyB0ZW1wID0gMCB0cmFpbGluZyBiaXRzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICg4IC0gaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+ZW5jYnMuYnl0ZUNudDsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm91dGJ1Zl9zaXplID0gb3V0YnVmZnBvczsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gaW5zdGFuY2UtPlBPQ19sc2IgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5QT0NfbHNiID09IGluc3RhbmNlLT5QT0NfbHNiX21vZCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgfQotICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IGluc3RhbmNlLT5mcmFtZV9jb3VudCArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmZyYW1lX2NvdW50ID09IGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLQotICAgIGZyZWUocFRtcEJ1ZmYxKTsKLSAgICBwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNTUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpzcHMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00T1NBX0ludDMyIHRlbXBfbWF4X2RwYl9zaXplOwotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQ4IHByb2ZpbGVfaWRjLCBsZXZlbF9pZGMsIHJlc2VydmVkX3plcm9fNGJpdHMsCi0gICAgICAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IGNvbnN0cmFpbnRfc2V0MF9mbGFnLCBjb25zdHJhaW50X3NldDFfZmxhZywKLSAgICAgICAgY29uc3RyYWludF9zZXQyX2ZsYWcsIGNvbnN0cmFpbnRfc2V0M19mbGFnOwotCi0gICAgc3BzLT5wcm9maWxlX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDBfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQyX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDNfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICByZXNlcnZlZF96ZXJvXzRiaXRzID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA0KTsKLSAgICBzcHMtPmxldmVsX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+TWF4RnJhbWVOdW0gPSAxIDw8IChzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLSAgICBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgaWYgKHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDApCi0gICAgewotICAgICAgICBzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5NYXhQaWNPcmRlckNudExzYiA9Ci0gICAgICAgICAgICAxIDw8IChzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgIH0KLSAgICBlbHNlIGlmKCBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxICkKLSAgICB7Ci0gICAgICAgIHNwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPQotICAgICAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgICAgIC8vIFRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljIHRvIHJlbW92ZSBjb2RlYyBkZXBlbmRlbmN5Ci0KLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLQotICAgICAgICAvKm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMjU1Ki8KLQotICAgICAgICBzcHMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBkZWx0YVBPQyAqLwotICAgICAgICBzcHMtPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLSAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV0gPQotICAgICAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0KLSAgICAgICAgICAgICAgICBzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbnVtX3JlZl9mcmFtZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwxNiAqLwotICAgIHNwcy0+bnVtX3JlZl9mcmFtZXMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHNwcy0+cGljX3dpZHRoX2luX21ic19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoIXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT5QaWNXaWR0aEluTWJzID0gc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDE7Ci0gICAgc3BzLT5GcmFtZUhlaWdodEluTWJzID0gKCAyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSAqIFwKLSAgICAgICAgKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0jaWZkZWYgX0NBUF9GTU9fCi0KLSAgICBzcHMtPk51bVNsaWNlR3JvdXBNYXBVbml0cyA9Ci0gICAgICAgIHNwcy0+UGljV2lkdGhJbk1icyAqIChzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpOwotICAgIHNwcy0+TWF4UGljU2l6ZUluTWJzID0gc3BzLT5QaWNXaWR0aEluTWJzICogc3BzLT5GcmFtZUhlaWdodEluTWJzOwotCi0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9PSAwICkKLSAgICAgICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gMTsKLQotICAgIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmKCBzcHMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgKQotICAgIHsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgLyogbm8gZXJyb3IgbWVzc2FnZSBhcyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgd2l0aG91dCBWVUkgbWVzc2FnZXMgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgRGVjUFBTTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICpwcHMgKQotewotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQzMiBwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIE00T1NBX1VJbnQzMiBpLCBsZW5ndGgsIHY7Ci0jZW5kaWYKLQotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotCi0gICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHBwcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAoTTRPU0FfVUludDgpcGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0KLSAgICBwcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgbXVzdCBiZSAwIG9yIDEgKi8KLSAgICBwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSNpZmRlZiBfQ0FQX0ZNT18KLSAgICAvKiBGTU8gc3R1ZmYgYmVnaW5zIGhlcmUgKi8KLQotICAgIHBwcy0+bWFwX2luaXRpYWxpemVkID0gRkFMU0U7Ci0KLSAgICBpZiggcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgKQotICAgIHsKLSAgICAgICAgcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBzd2l0Y2goIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+cnVuX2xlbmd0aF9taW51czFbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+dG9wX2xlZnRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgICAgICBwcHMtPmJvdHRvbV9yaWdodFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2lkID0gKEgyNjRVSW50OAotICAgICAgICAgICAgICAgICAgICAqKU00SDI2NERlY19tYWxsb2MoKHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMQotICAgICAgICAgICAgICAgICAgICArIDEpLCBNNEgyNjRfQ09SRUlELCAoTTRPU0FfQ2hhciAqKSJQUFMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBwcy0+c2xpY2VfZ3JvdXBfaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRGVjUFBTTUNTOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBsZW5ndGggPSAwLCB2ID0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDE7IHYgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgdiA+Pj0gMSwgbGVuZ3RoKysgKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClnZXRCaXRzKHBfdmxjX2VuZ2luZS0+cF9icywgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0gMDsKLSAgICB9Ci0gICAgLyogRW5kIG9mIEZNTyBzdHVmZiAqLwotCi0jZWxzZQotCi0jZW5kaWYgLyogX0NBUF9GTU9fICovCi0KLSAgICAvKiBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAvKiBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0gICAgcHBzLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAvKiB3ZWlnaHRlZF9iaXByZWRfaWRjIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsMiAqLwotICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAyKTsKLQotICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xcF9taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBwaWNfaW5pdF9xc19taW51czI2IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0yNiwyNSAqLwotICAgIHBwcy0+cGljX2luaXRfcXNfbWludXMyNiA9Ci0gICAgICAgIChNNE9TQV9JbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgLyogY2hyb21hX3FwX2luZGV4X29mZnNldCBtdXN0IGJlIGluIHRoZSByYW5nZSAtMTIsKzEyICovCi0gICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyggTlNXQVZDX01DU190ICppbnN0YW5jZSwgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUgKQotewotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBiczsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9iczEsIGJzMTsKLQotICAgIE00T1NBX1VJbnQ4IG5hbHVfaW5mbyA9IDA7Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gMCwKLSAgICAgICAgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGNudCwgY250MTsKLSAgICBNNE9TQV9VSW50MzIgb3V0YnVmZnBvcyA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0k7Ci0gICAgTTRPU0FfVUludDggKmxDbGlwRFNJX1BQU19zdGFydDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBEU0lfUFBTX29mZnNldCA9IDA7Ci0KLSAgICBNNE9TQV9VSW50OCAqbFBQU19CdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsUFBTX0J1ZmZlcl9TaXplID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsU2l6ZSwgbFNpemUxOwotICAgIE00T1NBX1VJbnQzMiBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBQUFNSZW1CaXRzID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsRW5jb2Rlcl9TUFNJRCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1BQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJQUFNSZW1CaXRzID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEZvdW5kID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4IENsaXBfU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9QUFNJRFsyNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRF9pbl9QUFNbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX1VJbnQ4IENsaXBfVXNlZFBQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgcF9iczEgPSAmYnMxOwotCi0gICAgLyogRmluZCB0aGUgYWN0aXZlIFNQUyBJRCAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFM6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoID0KLSAgICAgICAgICAgIChpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s0XSAmIDB4MDMpICsgMTsKLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudCA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzVdICYgMHgxRjsKLQotICAgIGxDbGlwRFNJID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gKyA2OwotCi0gICAgbENsaXBEU0lfUFBTX29mZnNldCA9IDY7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1NQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyA0KTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gNCk7Ci0KLSAgICAgICAgQ2xpcF9TUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkU1BTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgICAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gbENsaXBEU0lfUFBTX29mZnNldCArIDIgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQgPSBsQ2xpcERTSVswXTsKLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMTsKLQotICAgIGxDbGlwRFNJX1BQU19zdGFydCA9IGxDbGlwRFNJOwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9QUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgIENsaXBfUFBTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfUFBTSURbY250XV0gPSAxOwotICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIGNsaXAgU1BTIElEIHVzZWQgYXQgdGhlIGN1dCBzdGFydCBmcmFtZSAqLwotICAgIHdoaWxlKCAoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplKSA8IGluYnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgbWFza19iaXRzID0gMHhGRkZGRkZGRjsKLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluYnVmZiArIGZyYW1lX3NpemUpOwotCi0gICAgICAgIHN3aXRjaCggaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMF07Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDI7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemVfaGlnaDE2OwotICAgICAgICAgICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclsyXTsKLSAgICAgICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyAzOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoIHBfYnMtPkJ1ZmZlclswXSA8PCA4KSArIHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggcF9icy0+QnVmZmVyWzJdIDw8IDgpICsgcF9icy0+QnVmZmVyWzNdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gKCBuYWxfc2l6ZV9oaWdoMTYgPDwgMTYpICsgbmFsX3NpemVfbG93MTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzRdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYWxfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiMCBzaXplIG5hbCB1bml0IGF0IGxpbmUgJWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBmcmFtZV9zaXplICs9IGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0KLSAgICAgICAgICAgICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDEpCi0gICAgICAgICAgICA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPQotICAgICAgICAgICAgaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDE7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0KLSAgICAgICAgZm9yYmlkZGVuX2JpdCA9ICggbmFsdV9pbmZvID4+IDcpICYgMTsKLSAgICAgICAgbmFsX3JlZl9pZGMgPSAoIG5hbHVfaW5mbyA+PiA1KSAmIDM7Ci0gICAgICAgIG5hbF91bml0X3R5cGUgPSAobmFsdV9pbmZvKSAmMHgxZjsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsQWN0aXZlU1BTSURfQ2xpcCA9IENsaXBfU1BTSURfaW5fUFBTW3BpY19wYXJhbWV0ZXJfc2V0X2lkXTsKLQotICAgIGluc3RhbmNlLT5maW5hbF9TUFNfSUQgPSBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICAvKiBEbyB3ZSBuZWVkIHRvIGFkZCBlbmNvZGVyIFBQUyB0byBjbGlwIFBQUyAqLwotCi0gICAgbENsaXBEU0kgPSBsQ2xpcERTSV9QUFNfc3RhcnQ7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBpZiggbEFjdGl2ZVNQU0lEX0NsaXAgPT0gQ2xpcF9TUFNJRF9pbl9QUFNbQ2xpcF9QUFNJRFtjbnRdXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxQUFNfQnVmZmVyID0gbENsaXBEU0kgKyAxOwotICAgICAgICAgICAgbFBQU19CdWZmZXJfU2l6ZSA9IGxTaXplIC0gMTsKLQotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgQ2xpcF9TUFNJRF9pbl9QUFNbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgPSAoIGxTaXplIC0gMSkgPDwgMzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBwX2JzLT5iaXRQb3M7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBsQ2xpcERTSVtsU2l6ZSAtIDFdOwotCi0gICAgICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMxLCBsU2l6ZTEpOwotCi0gICAgICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gKCBsU2l6ZTEpIDw8IDM7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzID09IGxDbGlwUFBTUmVtQml0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIGxFbmNvZGVyUFBTUmVtQml0cyA+IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAyID0gSDI2NE1DU19nZXRCaXRzKHBfYnMxLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gbEVuY29kZXJQUFNSZW1CaXRzIC0gODsKLQotICAgICAgICAgICAgICAgICAgICBpZiggdGVtcDEgIT0gdGVtcDIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPCA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSA9PSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxGb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRm9ybSB0aGUgZmluYWwgU1BTIGFuZCBQUFMgZGF0YSAqLwotCi0gICAgaWYoIGxGb3VuZCA9PSAxICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIG5lZWQgdG8gYWRkIFBQUyAqLwotICAgICAgICBpbnN0YW5jZS0+ZmluYWxfUFBTX0lEID0gQ2xpcF9QUFNJRFtjbnRdOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBREQgUFBTICovCi0gICAgICAgIC8qIGZpbmQgdGhlIGZyZWUgUFBTIElEICovCi0KLSAgICAgICAgY250ID0gMDsKLQotICAgICAgICB3aGlsZSggQ2xpcF9Vc2VkUFBTSURbY250XSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudCsrOwotICAgICAgICB9Ci0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBjbnQ7Ci0KLSAgICAgICAgc2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUKLSAgICAgICAgICAgICsgMTA7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopaW5zdGFuY2UtPm1fcEZpbmFsRFNJLAotICAgICAgICAgICAgKHZvaWQgKilpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtsQ2xpcERTSV9QUFNfb2Zmc2V0XSA9IHRlbXA7Ci0KLSAgICAgICAgLy90ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbMF07Ci0gICAgICAgIGxTaXplMSA9IGluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplIC0gMTsKLSAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgbEVuY29kZXJfUFBTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLSAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IHBfYnMxLT5iaXRQb3M7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgY250MSsrOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyXSA9Ci0gICAgICAgICAgICBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9Ci0gICAgICAgICAgICAmKGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDNdKTsKLSAgICAgICAgbFBQU19CdWZmZXIgPSBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyOwotCi0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9QUFNfSUQpOwotICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEKTsKLQotICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICB9Ci0gICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gdGVtcDsKLSAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZV0gPQotICAgICAgICAgICAgKCB0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMV0gPQotICAgICAgICAgICAgKHRlbXApICYweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMiArIHRlbXA7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIHRoZSBjbGlwIFNQUyAqLwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBDbGlwX1NQU0lEW2NudF0gPT0gaW5zdGFuY2UtPmZpbmFsX1NQU19JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmNsaXBfc3BzKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgLy9DbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIERlY29kZSBlbmNvZGVyIFNQUyAqLwotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclNQUyArIDEpOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBpbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSAtIDEpOwotICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmVuY29kZXJfc3BzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubnVtX3JlZl9mcmFtZXMKLSAgICA+IGluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcyApCi0gICAgewotICAgICAgICByZXR1cm4gMTAwOyAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLSAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKilsUFBTX0J1ZmZlcjsKLSAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFBQU19CdWZmZXJfU2l6ZSk7Ci0gICAgRGVjUFBTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMpOwotCi0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ID0KLSAgICAgICAgMSA8PCAoaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc05BTFUoIE5TV0FWQ19NQ1NfdCAqYWluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICAvLyNpZm5kZWYgREdSX0ZJWCAvLyArIG5ldwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIC8vI2VuZGlmIC8vICsgZW5kIG5ldwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggKmJ1ZmY7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaW5zdGFuY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmlzX2RvbmUgKQotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgaW5idWZmWzBdID0gMHgwMDsKLSAgICBpbmJ1ZmZbMV0gPSAweDAwOwotICAgIGluYnVmZlsyXSA9IDB4MDA7Ci0gICAgaW5idWZmWzNdID0gMHgwMTsKLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gcF9icy0+QnVmZmVyWzJdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IHBfYnMtPkJ1ZmZlclszXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgNF0gPSBwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDUpIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0KLQotICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNDsKLSAgICAgICAgYnVmZiA9IGluYnVmZiArIGZyYW1lX3NpemUgKyA0OwotCi0gICAgICAgIHdoaWxlKCBuYWxfc2l6ZSA+IDQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBidWZmWzBdID09IDB4MDApICYmIChidWZmWzFdID09IDB4MDApICYmIChidWZmWzJdID09IDB4MDApCi0gICAgICAgICAgICAgICAgJiYgKGJ1ZmZbM10gPT0gMHgwMSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3NpemUgPD0gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBuYWxfc2l6ZSA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIC8vICAgICAgTTRPU0FfVFJBQ0UxXzMoIkgyNjRNQ1NfUHJvY2Vzc05BTFUgZnJhbWUgIGlucHV0IGJ1ZmYgc2l6ZSA9ICVkICBjdXJyZW50IHBvc2l0aW9uCi0gICAgICAgIC8vPSAlZCAgIG5hbCBzaXplID0gJWQiLAotICAgICAgICAvLyAgaW5idWZfc2l6ZSwgZnJhbWVfc2l6ZSwgIG5hbF9zaXplICsgNCk7Ci0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0KLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKklEUi9QUFMgUGFja2V0IC0gRG8gbm90aGluZyovCi0gICAgICAgICAgICBpbnN0YW5jZS0+aXNfZG9uZSA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDU7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDEpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHNsaWNlX3R5cGUpOwotCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5jbGlwX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMjQpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDE2KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKCh0ZW1wKSAmMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXAgKyA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyIC0gNTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmb3V0YnVmZltvdXRidWZmcG9zXSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnMtPkJ1ZmZlciwgbmFsX3NpemUgKyA0KTsKLQotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDI0KSYgMHhGRik7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTs7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gOCkmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSkmIDB4RkYpOzsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyBuYWxfc2l6ZSArIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSggIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGluYnVmX3NpemUgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZXNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9MDsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotCi0gICAgd2hpbGUoZnJhbWVzaXplIDwgaW5idWZfc2l6ZSkKLSAgICB7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0OwotICAgICAgICAgICAgYnVmZiA9ICBpbmJ1ZmYgKyBmcmFtZXNpemUgKyA0OwotCi0gICAgICAgICAgICB3aGlsZShuYWxfc2l6ZSA+IDQpewotICAgICAgICAgICAgICAgIGlmKChidWZmWzBdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsyXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzNdID09IDB4MDEpKXsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmYgPSBidWZmICsgMTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihuYWxfc2l6ZSA8PSA0KXsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IChpbmJ1Zl9zaXplIC0gZnJhbWVzaXplIC0gNCkgLSBuYWxfc2l6ZTsKLQotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMF0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDFdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDE2KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAyXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAzXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSApJiAweEZGKTsKLSAgICAgICAgZnJhbWVzaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSBmcmFtZXNpemUgPSAleCBuYWxzaXplID0gJXgiLAotICAgICAgICAgICAgZnJhbWVzaXplLCBuYWxfc2l6ZSkKLSAgICB9Ci0KLSAgICByZXR1cm4gIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgSDI2NE1DU19GcmVlaW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2UgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfRnJlZWluc3RhbmNlOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5wX2VuY29kZXJfc3BzICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMpOwotICAgICAgICBpbnN0YW5jZS0+cF9lbmNvZGVyX3NwcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Bwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+bV9wRmluYWxEU0kgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+bV9wRmluYWxEU0kpOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UpOwotICAgICAgICBpbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb25JbmZvPTB4JXgiLAotICAgICAgICBwVmVyc2lvbkluZm8pOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBWZXJzaW9uSW5mbyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBNNE1DU19WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciA9IE00TUNTX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZ2V0VmVyc2lvbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTUNTIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE1DUyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19pbml0KCBNNE1DU19Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00TUNTX2luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEZpbGVSZWFkUHRyRmN0PTB4JXgsIHBGaWxlV3JpdGVQdHJGY3Q9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBNQ1MgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1DU19JbnRlcm5hbENvbnRleHQpLAotICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiTTRNQ1NfSW50ZXJuYWxDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNE1DU19JbnRlcm5hbENvbnRleHQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IHRoZSBjb250ZXh0LiBBbGwgcG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBNNE9TQV9OVUxMCi0gICAgKiBiZWNhdXNlIENsZWFuVXAoKSBjYW4gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgSW5pdCgpLiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bm92aWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKgotICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgcEMtPnBJbnB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOwotICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gMDsKLSAgICAvKiBGaXJzdCB0ZW1wb3JhcnkgdmlkZW8gQVUgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPSAwOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gMC4wOwotICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAwOwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gMC4wOwotICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMC4wOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgcEMtPnBWaUVuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tOb0VuY29kZXI7Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5pU3NyY05iU2FtcGxJbiA9IDA7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbE91dCA9IDA7Ci0gICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogQXVkaW8gZW5jb2RlciAqLwotICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gMDsKLQotICAgIC8qKgotICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50ID0gMDsKLSAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplID0gMDsKLSAgICBwQy0+dWlBdWRpb0FVQ291bnQgPSAwOwotICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gMDsKLQotICAgIHBDLT51aUF1ZGlvQ3RzID0gMDsKLSAgICBwQy0+Yl9pc1Jhd1dyaXRlciA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBFbmNvZGluZyBjb25maWcgKi8KLSAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsgLyoqPCBObyBmb3JtYXQgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gMDsgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gMDsgICAgICAgICAgICAvKio8IE5vIGZyYW1lcmF0ZSBzZXQgeWV0ICovCi0KLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBiZWdpbiBjdXQgKi8KLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBlbmQgY3V0ICovCi0gICAgcEMtPnVpTWF4RmlsZVNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gbGltaXQgKi8KLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa1ZpZGVvVW5rbm93bjsKLSAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0KLSAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSAwOwotCi0gICAgLypGQiAyMDA4LzEwLzIwOiBhZGQgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBhbmQgQUlSIGNvbnRleHQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IE00TUNTX2tSZXNpemluZzsKLSAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqLwotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIEVmZmVjdHMqLwotICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLSAgICAvKiovCi0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotICAgIGVyciA9IE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhwQyk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAvKioKLSAgICAqIEluaXRpYWxpemUgdGhlIFN0aWxsIHBpY3R1cmUgcGFydCBvZiBNQ1MqLwotCi0gICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNJbml0KHBDLCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgPSAwOwotICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEZsYWcgdG8gZ2V0IHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgY3RzICovCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZiggcEMtPm1fcEluc3RhbmNlID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZXJyID0gSDI2NE1DU19HZXRpbnN0YW5jZSgmcEMtPm1fcEluc3RhbmNlKTsKLSAgICB9Ci0gICAgcEMtPmJFeHRPTVhBdWREZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsbXAzIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oIE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQgKnBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLCBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFJFQURFUl9NZWRpYUZhbWlseSBtZWRpYUZhbWlseTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcjsKLQotICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAiTTRNQ1Nfb3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsIHBGaWxlT3V0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggKCBJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9CTVApICkKLSAgICB7Ci0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgd2UgbXVzdCB1c2UgdGhlIHN0aWxsIHBpY3R1cmUgZnVuY3Rpb25zKi8KLQotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY09wZW4ocEMsIHBGaWxlSW4sIElucHV0RmlsZVR5cGUsIHBGaWxlT3V0KTsKLQotI2Vsc2UKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuOiBTdGlsbCBwaWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgTUNTIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBJbnB1dEZpbGVUeXBlOwotICAgIHBDLT5wT3V0cHV0RmlsZSA9IHBGaWxlT3V0OwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IHBUZW1wRmlsZTsKLSAgICBwQy0+dWlQcm9ncmVzcyA9IDA7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYUZpbGVSZWFkUHRyKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfQm9vbCB0cnVlVmFsdWUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIEZvciBmaXJzdCBjYWxsIHVzZSBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZ0cnVlVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggKCAoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkgPT0gZXJyKQotICAgICAgICAgICAgICAgIHx8ICgoIChNNE9TQV9VSW50MzIpTTRFUlJfUEFSQU1FVEVSKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBOb3QgZmF0YWwsIHNvbWUgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmFzdCBvcGVuIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIGZhbHNlVmFsdWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKiBGb3Igc2Vjb25kIGNhbGwgdXNlIG5vcm1hbCBvcGVuIG1vZGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCAmZmFsc2VWYWx1ZSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0T3BlbihwQy0+cFJlYWRlckNvbnRleHQsIHBDLT5wSW5wdXRGaWxlKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICBNNE9TQV9FUlJfU1BMSVQoZXJyLCB1aUR1bW15LCB1aUNvcmVJZCwgdWlEdW1teSk7Ci0KLSAgICAgICAgaWYoIE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICB3aGlsZSggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oIHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoICggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkKLSAgICAgICAgICAgIHx8IChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0Ci0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYSBIMjYzIG9yIE1QRUctNCB2aWRlbyBzdHJlYW0gaW4gaW5wdXQgM2dwcCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogK0NSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc3RvcmVhZCBhcyBwZXIgdGhlIDNncCBmaWxlIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiAtQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIEFNUi1OQiwgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgQU1SLU5CLCBBQUMsIE1QMyBub3IgRVZSQyAoQU1SLVdCLCBXQVYuLi4pICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbSAoMHgleCkgaW4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAzZ3BwIGNsaXAiLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IGVuZCBvZiB3aGlsZSAoTTROT19FUlJPUiA9PSBlcnIpICovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgc3RyZWFtICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIGlmKCBwQy0+VmlkZW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgLypGQiAyMDA5LTAyLTA5OiB0aGUgZXJyb3IgaXMgY2hlY2sgYW5kIHJldHVybmVkIG9ubHkgaWYgdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCwKLSAgICAgICAgZWxzZSBvbmx5IGF1ZGlvIGlzIHVzZWQsIHRoYXQgaXMgd2h5IHRoZSBlZGl0aW5nIHByb2Nlc3MgY2FuIGNvbnRpbnVlKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0KLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICB9Ci0KLSAgICBpZiggcEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgKQotICAgIHsKLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICE9IHBTdHJlYW1IYW5kbGVyLT4KLSAgICAgICAgICAgIG1fc3RyZWFtVHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGVyciA9IE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBiZWdpbiBjdXQgZGVjb2RpbmcgaW5jcmVtZW50IGFjY29yZGluZyB0byB0aGUgaW5wdXQgZnJhbWUgcmF0ZSAqLwotICAgIGlmKCAwLiAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSApIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLgotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgIGZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0KLSAgICAgICAgICAgIDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIHRyYW5zY29kaW5nCi0gKiBAbm90ZSAgICBwUHJvZ3Jlc3MgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU6IFRyYW5zY29kaW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIgb3IgTVAzKSBmYWlsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k6IFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjawotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5IChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3RlcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX3N0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcFByb2dyZXNzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbnMqLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNTdGVwKHBDLCBwUHJvZ3Jlc3MpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9SRUFEWToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX2ludFN0ZXBTZXQocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRTdGVwRW5jb2RpbmcocEMsIHBQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgLyogU2F2ZSBwcm9ncmVzcyBpbmZvIGluIGNhc2Ugb2YgcGF1c2UgKi8KLSAgICAgICAgICAgICAgICBwQy0+dWlQcm9ncmVzcyA9ICpwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19zdGVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGF1c2UgdGhlIHRyYW5zY29kaW5nIGkuZS4gcmVsZWFzZSB0aGUgKGV4dGVybmFsIGhhcmR3YXJlKSB2aWRlbyBkZWNvZGVyLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcGF1c2luZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSB0ZW1wb3JhcmlseSBzdXNwZW5kaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbiBjYWxscy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcGF1c2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3BhdXNlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19wYXVzZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNQYXVzZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9KVU1QOiAvKio8IHRoZSB2aWRlbyBkZWNvZGVyIGhhcyBiZWVuIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzogLyoqPCB0aGUgdmlkZW8gaXMgYmVpbmcgdXNlZCwgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgT0ssIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3BhdXNlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgQ1RTIGF0IHdoaWNoIHdlIHdpbGwgcmVzdW1lIHRoZSBkZWNvZGluZyAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUywgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgdGhlIGN1cnJlbnQgQ1RTICovCi0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgaGF2ZW4ndCBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUyB5ZXQsIHNvIHRoZSByZXN1bWUgdGFyZ2V0IGlzIHN0aWxsIHRoZSBzdGFydGluZyBDVFMKLSAgICAgICAgKiAtLT4gbm90aGluZyB0byBkbyBpbiB0aGUgZWxzZSBibG9jayAqLwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2U6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUEFVU0VEOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3BhdXNlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFJlc3VtZSB0aGUgdHJhbnNjb2RpbmcgYWZ0ZXIgYSBwYXVzZSAoc2VlIE00TUNTX3BhdXNlKS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHJlc3VtaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IGNhbGxpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZXN1bWUoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3Jlc3VtZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfcmVzdW1lOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1Jlc3VtZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1BBVVNFRDogLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVzdW1lKCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwLjAgPT0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBzdGlsbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZWNvZGVkIHN0cmVhbSwgbm8gbmVlZCB0byBqdW1wLCB3ZSBjYW4gcHJvY2VlZCAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3Jlc3VtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiwgZXJyMjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19jbG9zZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbmRpY2F0ZSB0aGF0IGN1cnJlbnQgZmlsZSBpcyBubyBsb25nZXIgYSBzdGlsbCBwaWN0dXJlKi8KLSAgICAgICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0Nsb3NlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9GSU5JU0hFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGVuY29kZXIgYmVmb3JlIHRoZSB3cml0ZXIgdG8gYmUgY2VydGFpbiBhbGwgdGhlIEFVcyBoYXZlIGJlZW4gd3JpdHRlbiBhbmQgd2UgY2FuCi0gICAgZ2V0IHRoZSBEU0kuICovCi0KLSAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBzdGFydGVkPyBEb24ndCBzdG9wIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgaWYoIE00TUNTX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZW5jb2RlclN0YXRlICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJTdG9wcGVkOwotICAgIH0KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJTdG9wcGVkID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIENsb3NlIHRoZSB3cml0ZXIgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBXcml0ZXJDb250ZXh0ICkgLyogaGFwcGVucyBpbiBzdGF0ZSBfU0VUICovCi0gICAgewotICAgICAgICAvKiBIVyBlbmNvZGVyOiBmZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgYmVmb3JlCi0gICAgICAgIGNsb3NpbmcgaXQuICovCi0KLSAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICE9IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBNNEVOQ09ERVJfa01QRUc0ID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAgICAgICAgIHx8IChNNEVOQ09ERVJfa0gyNjQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuCi0gICAgICAgICAgICAgICAgICAgICBpZiBpdCBmYWlscy4gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRoaXMgaGVhZGVyIGluIHRoZSB3cml0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5hZGRyID0gKE00T1NBX01lbUFkZHIzMillbmNIZWFkZXItPnBCdWY7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltKQotICAgICAgICAgICAgICAgICYmIChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJEZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBwb2ludGVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1fcEluc3RhbmNlLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zaXplID0gcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0k7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBXcml0ZSBhbmQgY2xvc2UgdGhlIDNHUCBvdXRwdXQgZmlsZSAqLwotICAgICAgICBlcnIyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZShwQy0+cFdyaXRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycjIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENsb3NlIG91dHB1dCBQQ00gZmlsZSBpZiBuZWVkZWQgKi8KLSAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+cE91dHB1dFBDTWZpbGUpOwotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFkZCBhdWRpbyBlZmZlY3RzLAotICAgIGZyZWUgZWZmZWN0cyBsaXN0Ki8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEVmZmVjdHMgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEVmZmVjdHMpOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NMT1NFRDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2Nsb3NlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTLgotICogQG5vdGUgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19jbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgaWYoIGZpbGVfYXVfcmVhZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX2F1X3JlYWRlcik7Ci0gICAgICAgIGZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggZmlsZV9wY21fZGVjb2RlciApCi0gICAgewotICAgICAgICBmY2xvc2UoZmlsZV9wY21fZGVjb2Rlcik7Ci0gICAgICAgIGZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9lbmNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9lbmNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ29udGV4dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcCgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BJbnN0YW5jZSApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0ZyZWVpbnN0YW5jZShwQy0+bV9wSW5zdGFuY2UpOwotICAgICAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZW5jb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlFbmNDdHh0KQotICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAocEMtPnBWaUVuY0N0eHQpOwotICAgICAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluIHRoZSBIMjYzIGNhc2UsIHdlIGFsbG9jYXRlZCBvdXIgb3duIERTSSBidWZmZXIgKi8KLSAgICBpZiggKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1Zik7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIHNzcmMgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5Tc3JjU2NyYXRjaCk7Ci0gICAgICAgIHBDLT5Tc3JjU2NyYXRjaCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJJbik7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJPdXQpOwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGVuY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgYWxsIG90aGVyIHN0dWZmIC0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHJlYWRlcnMgYW5kIHRoZSBkZWNvZGVycyAqLwotICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3RpbGwgcGljdHVyZSByZXNvdXJjZXMgKi8KLQotICAgIE00TUNTX3N0aWxsUGljQ2xlYW5VcChwQyk7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0KLSAgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19hYm9ydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZyBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE1DUwotICogICAgICAgICAgd2hhdGV2ZXIgdGhlIHN0YXRlIGlzLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19hYm9ydCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgfHwgKHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ0xPU0VEKSApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgICAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENhbmNlbCB0aGUgb25nb2luZyBwcm9jZXNzZXMgaWYgYW55Ki8KLSAgICAgICAgICAgIGVyciA9IE00TUNTX3N0aWxsUGljQ2FuY2VsKHBDKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Fib3J0IDogTTRNQ1Nfc3RpbGxQaWNDYW5jZWwgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0aWxsIHBpY3R1cmUgcHJvY2VzcyBpcyBub3cgc3RvcHBlZDsgQ2Fycnkgb24gd2l0aCBjbG9zZSBhbmQgY2xlYW51cCovCi0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xvc2UocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2Nsb3NlIGZhaWxzIGVyciA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZXJyMSA9IGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gKGVycjEgPT0gTTROT19FUlJPUikgPyBlcnIgOiBlcnIxOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyogcEZpbGVQcm9wZXJ0aWVzKTsKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb3BlcnRpZXMgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIGFuIGFsbG9jYXRlZCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi1ieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgICAgICAgICAgICAgcEZpbGVQcm9wZXJ0aWVzPTB4JXgiLCBwQ29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVQcm9wZXJ0aWVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcFByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKHBDLCBwRmlsZVByb3BlcnRpZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX09QRU5FRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBwcmV2aW91c2x5IGNvbXB1dGVkIHByb3BlcnRpZXMgaW50byBnaXZlbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwRmlsZVByb3BlcnRpZXMsCi0gICAgICAgICh2b2lkICopICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcywKLSAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMIDogU3BlY2lmaWVkIG91dHB1dCBwYXJhbWV0ZXJzIGRlZmluZSBhIG51bGwgZHVyYXRpb24gc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfT3V0cHV0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVXaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZUhlaWdodDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFBhcmFtcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBQYXJhbXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBQYXJhbSBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldE91dHB1dFBhcmFtcyhwQywgcFBhcmFtcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBJZ25vcmUgYXVkaW8gb3IgdmlkZW8gc3RyZWFtIGlmIHRoZSBvdXRwdXQgZG8gbm90IG5lZWQgaXQsICovCi0gICAgLyogb3IgaWYgdGhlIGlucHV0IGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkgYXVkaW8gb3IgdmlkZW8gc3RyZWFtICovCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbykKLSAgICAgICAgfHwgKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIpCi0gICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzKSApCi0gICAgewotICAgICAgICBwQy0+bm92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykKLSAgICAgICAgfHwgKHBDLT5BdWRpb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkgKQotICAgIHsKLSAgICAgICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGlmKCBwQy0+bm9hdWRpbyAmJiBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICIhISEgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIDogY2xpcCBpcyBOVUxMLCB0aGVyZSBpcyBubyBhdWRpbywgbm8gdmlkZW8iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMOwotICAgIH0KLQotICAgIC8qIFNldCB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50V3JpdGVyKHBDb250ZXh0LCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiBTZXQgdmlkZW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLQotICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19GT1JCSURERU5fSU5fTVA0X0ZJTEU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvOgotICAgICAgICAgICAgICAgIGlmKCAoIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotCi0gICAgICAgICAgICAgICAgLyogRW5jb2RlciBuZWVkZWQgZm9yIGJlZ2luIGN1dCB0byBnZW5lcmF0ZSBhbiBJLWZyYW1lICovCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa05VTEw7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIGZyYW1lIHNpemUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgLyoqIFNldCB0aGUgdGFyZ2V0IHZpZGVvIGxldmVsLCBiZWNhdXNlIGlucHV0IDNncCBmaWxlIG1heQotICAgICAgICAgICAgICogIGhhdmUgd3JvbmcgdmlkZW8gbGV2ZWwgdmFsdWUgKHNvbWUgZW5jb2RlcnMgZG8gbm90IHJlc3BlY3QKLSAgICAgICAgICAgICAqICBsZXZlbCByZXN0cmljdGlvbnMgbGlrZSB2aWRlbyByZXNvbHV0aW9uIHdoZW4gY29udGVudCBpcyBjcmVhdGVkKS4KLSAgICAgICAgICAgICAqKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICAvLyBDbGlwJ3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBtYXkgbm90IGJlCi0gICAgICAgICAgICAvLyBtdWx0aXBsZSBvZiAxNi4KLSAgICAgICAgICAgIC8vIEVuc3VyZSBlbmNvZGluZyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBtdWx0aXBsZSBvZiAxNgotCi0gICAgICAgICAgICB1aW50MzJfdCByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdXaWR0aCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggLSByZW1haW5kZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdIZWlnaHQgJSAxNjsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPj0gOCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSb2xsIGZvcndhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RUVZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9XVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1dWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfTlRTQ19IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtUFIgTFY1ODA3Ki8KLSAgICAgICAgICAgICAgICAgICAgLyogK0NSIEdvb2dsZSAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzY0MF8zNjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMjgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xOTIwXzEwODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdmlkZW8gbWF4IGF1IHNpemUgYW5kIG1heCBjaHVuY2sgc2l6ZS4KLSAgICAgICAgKiBXZSBkbyBpdCBoZXJlIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZnJhbWUgc2l6ZSBvbmx5LCBhbmQKLSAgICAgICAgKiBiZWNhdXNlIHdlIG5lZWQgaXQgZm9yIHRoZSBmaWxlIHNpemUvdmlkZW8gYml0cmF0ZSBlc3RpbWF0aW9ucyAqLwotICAgICAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgxLjVGICooTTRPU0FfRmxvYXQpKHVpRnJhbWVXaWR0aCAqIHVpRnJhbWVIZWlnaHQpIFwKLSAgICAgICAgICAgICpNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgICAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAoTTRPU0FfVUludDMyKShwQy0+dWlWaWRlb01heEF1U2l6ZSAgICAgICBcCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICBNNE1DU19WSURFT19DSFVOS19BVV9TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvIG1heCBDaHVuY2sgc2l6ZSAqLwotCi0gICAgICAgIGlmKCAwID09IHBDLT51aVZpZGVvTWF4QXVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2l6ZSBtYXkgYmUgemVybyBpbiBjYXNlIG9mIG51bGwgZW5jb2Rpbmcgd2l0aCB1bnJlY29nbml6ZWQgc3RyZWFtICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiB2aWRlbyBmcmFtZSBzaXplIGlzIDAgcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNpemUgY2hlY2sgZm9yIEgyNjMgKG9ubHkgdmFsaWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBhbmQgU1FDSUYpICovCi0KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGcmFtZSByYXRlIGNvcnJlY3RuZXNzICovCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rN181X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMl81X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxNV9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjBfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazI1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRnJhbWUgcmF0ZSBjaGVjayBmb3IgSDI2MyAob25seSBkaXZpZGVycyBvZiAzMCBmcHMgKDI5Ljk3IGFjdHVhbGx5KSkgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgICAgICAvKiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IGF1ZGlvIHBhcmFtZXRlcnMgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgQXVkaW8gRm9ybWF0IGNvcnJlY3RuZXNzICovCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9IE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+YkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFKSA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYk1TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gY2hhbmdlIGludG8gaGlnaHNwZWVkIGFzYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQsIGFkZCBtcDMgZW5jb2RlciovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazExMDI1X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMTAyNUh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzID09IE00T1NBX05VTEwgfHwgcFBhcmFtcy0+bmJFZmZlY3RzID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlbmNvZGVyIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQXVkaW9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBTVIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gTTRFTkNPREVSX2tNb25vOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSA4MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciBNNFZJREVPRURJVElOR19rTnVsbCwgQUFDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSGlnaFNwZWVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBNUDMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBPdXRwdXQgYXVkaW8gZm9ybWF0ICglZCkgaXNcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGF1ZGlvIGVmZmVjdHMsIHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogRVZSQwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsIHBQYXJhbXMtPlwKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOyAqLwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtczogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZTsKLQotICAgICAgICAvKiBPcGVuIG91dHB1dCBQQ00gZmlsZSAqLwotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5vcGVuV3JpdGUoJihwQy0+cE91dHB1dFBDTWZpbGUpLAotICAgICAgICAgICAgcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUsIE00T1NBX2tGaWxlV3JpdGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qU3RvcmUgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBpbnRvIHRoZSBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBwQy0+TWVkaWFSZW5kZXJpbmcgPSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZzsKLQotICAgIC8qIEFkZCBhdWRpbyBlZmZlY3RzKi8KLSAgICAvKkNvcHkgTUNTIGVmZmVjdHMgc3RydWN0dXJlIGludG8gaW50ZXJuYWwgY29udGV4dCovCi0gICAgaWYoIHBQYXJhbXMtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGogPSAwOwotICAgICAgICBwQy0+bmJFZmZlY3RzID0gcFBhcmFtcy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSAoTTRNQ1NfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm5iRWZmZWN0cyBcCi0gICAgICAgICAgICAqc2l6ZW9mKE00TUNTX0VmZmVjdFNldHRpbmdzKSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvY2F0aW9uIG9mIGVmZmVjdHMgbGlzdCIpOwotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb3B5IGVmZmVjdCB0byAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmKHBQYXJhbXMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEVmZmVjdHNbal0uQXVkaW9FZmZlY3RUeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfTm9uZToKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIE5vbmUiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSAlaSBpcyBGYWRlSW4iLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVPdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlT3V0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEV4dGVybmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRWZmZWN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBubyBleHRlcm5hbCBlZmZlY3QgZnVuY3Rpb25cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB0byBleHRlcm5hbCBlZmZlY3QgbnVtYmVyICVpIiwgaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgbm90IHJlY29nbml6ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfU0VUOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIFNldCB0aGUgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCgpLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoSU4pIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLCAxMi4yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6IEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6IE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0IGZpbGUgYXQgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIGogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUmF0ZXM9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwUmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFJhdGVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBSYXRlcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX1NFVCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZ2l2ZW4gdmFsdWVzICovCi0gICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPnVpQXVkaW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPnVpQmVnaW5DdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBSYXRlcy0+RW5kQ3V0VGltZTsKLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IHBSYXRlcy0+T3V0cHV0RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGJlZ2luIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGxhcmdlciB0aGFuIGR1cmF0aW9uICglZD4lZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24pOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIGVuZCBjdXQgdGltZSBpcyB0b28gbGFyZ2UsIHdlIHNldCBpdCB0byB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZW5kIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiAwICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEJlZ2luIGN1dCBncmVhdGVyIHRoYW4gZW5kIGN1dCAoJWQsJWQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dWlCZWdpbkN1dFRpbWUsIHBDLT51aUVuZEN1dFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gYW5kIEVuZCBjdXRzIGFyZSBlcXVhbCAoJWQsJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRmxCIDIwMDkuMDMuMDQ6IGNoZWNrIGF1ZGlvIGVmZmVjdHMgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24gdmFsaWRpdHkqLwotICAgIGZvciAoIGogPSAwOyBqIDwgcEMtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBvdXRwdXRFbmRDdXQgPSBwQy0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRFbmRDdXQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbal0udWlTdGFydFRpbWUgPiAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBFZmZlY3RzIHN0YXJ0IHRpbWUgaXMgbGFyZ2VyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAoJWQsJWQpLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSArIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID4gXAotICAgICAgICAgICAgKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZS1hZGp1c3QgdGhlIGVmZmVjdCBkdXJhdGlvbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgY2xpcCovCi0gICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpIC0gXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIGF1ZGlvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9FVlJDCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGVsc2UgaWYocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0VWUkMpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tNUDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID49IE00RU5DT0RFUl9rMzIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMSovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAzMjAwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2sxNjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDE2MDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCA4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAocEMtPnVpQXVkaW9CaXRyYXRlIDwgMTYwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNEVOQ09ERVJfa1N0ZXJlbykgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9PSBNNEVOQ09ERVJfazgwMDBIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTEwMjVIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMi41Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDY0MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IE1QMyBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kgZXJyb3JcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCkiLCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2sxOTJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazE2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2szMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgYXVkaW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB2aWRlbyBiaXRyYXRlIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBOVUxMIHZpZGVvIDogY29weSBpbnB1dCBmaWxlIGJpdHJhdGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGUgPD0gMzAwMDAKLSAgICAgICAgJiYgcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlID0gcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmaWxlIHNpemUgKi8KLSAgICByZXR1cm4gTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShwQyk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIEdldCB0aGUgZXh0ZW5kZWQgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBDb3VsZCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChPVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogRW5jb2Rpbmcgc2V0dGluZ3Mgd291bGQgcHJvZHVjZSBhIG51bGwgZHVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IGVuY29kaW5nIGlzIGltcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9JbnQzMiBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWludmlkZW9iaXRyYXRlOwotICAgIE00T1NBX0ludDMyIG1heGNvbWJpbmVkYml0cmF0ZTsKLQotICAgIE00T1NBX0ludDMyIGNhbGNiaXRyYXRlOwotCi0gICAgTTRPU0FfVUludDMyIG1heGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBjYWxjZHVyYXRpb247Ci0KLSAgICBNNE9TQV9Cb29sIGZpeGVkX2F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBmaXhlZF92aWRlbyA9IE00T1NBX0ZBTFNFOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpVmlkZW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKHBDLT51aUF1ZGlvQml0cmF0ZSwgMCk7Ci0gICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gcEMtPnVpTWF4RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIC8vICAgICAgICBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIC8vICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7IC8qRGVmYXVsdCBtaW4gYXVkaW8gYml0cmF0ZSBmb3IgTVBFRyBsYXllciAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGJvdGggbW9ubyBhbmQgc3RlcmVvIGNoYW5uZWxzKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBmaXhlZF92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1pbnZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoICggcEMtPnVpVmlkZW9CaXRyYXRlID4gMCkKLSAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLSAgICAgICAgfQotICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBjdXQgdGltZXMgYXJlIGluIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbikKLSAgICAgICAgfHwgKCggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPj0gcFJhdGVzLT5FbmRDdXRUaW1lKQotICAgICAgICAmJiAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkpICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+QmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gMDsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgICAgICBjYWxjZHVyYXRpb24gPQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgIGVsc2UKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAvKiBwcmlvcml0eSAxIDogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyogd2UgY2FuIHB1dCBtYXhpbXVtIHZhbHVlcyBmb3IgYWxsIHVuZGVmaW5lZCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgJiYgKGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICAgICAgLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAobWludmlkZW9iaXRyYXRlICsgbWluYXVkaW9iaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgaWYoIG1heGR1cmF0aW9uCi0gICAgICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHByaW9yaXR5IDIgOiBjdXQgdGltZXMgKi8KLSAgICAgICAgaWYoICggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiAwKSB8fCAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgIC8qIGF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlcyAqLwotICAgICAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSAvIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID49IG1pbmF1ZGlvYml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW52aWRlb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+IGNhbGNiaXRyYXRlKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPj0gbWludmlkZW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWluYXVkaW9iaXRyYXRlID4gbWF4Y29tYmluZWRiaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOF9NQlBTKSApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCBtYXggcG9zc2libGUgYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDwgTTRWSURFT0VESVRJTkdfazk2X0tCUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgKzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDw9IG1heGNvbWJpbmVkYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAzLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA+IE00VklERU9FRElUSU5HX2s5Nl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWNvbXB1dGUgbWF4IGR1cmF0aW9uIHdpdGggZmluYWwgYml0cmF0ZXMgKi8KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkKLSAgICAgICAgICAgICogODAwMC4wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNhbGNkdXJhdGlvbiA9IHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIDogY29uc3RyYWludHMgYXJlIHRvbyBzdHJvbmcgKi8KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IHBSYXRlcy0+QmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgIH0KLQotICAgIC8qIGVzdGltYXRlZCByZXN1bHRpbmcgZmlsZSBzaXplICovCi0gICAgcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA9IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAqICgoIHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lKSAvIDgwMDAuMCkpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgIENoZWNrIHBhcmFtZXRlcnMgdG8gc3RhcnQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgVmVyaWZ5UmF0ZXM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2hlY2tQYXJhbXNBbmRTdGFydChwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gYml0cmF0ZSBzaG91bGQgbm90IHN0YXkgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpCi0gICAgICAgICYmIChwQy0+dWlBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIGF1ZGlvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBWaWRlbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgIT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCA6IHVuZGVmaW5lZCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgfQotCi0gICAgLyogU2V0IGVuZCBjdXQgdGltZSBpZiBuZWNlc3NhcnkgKG5vdCBhbiBlcnJvcikgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT51aUVuZEN1dFRpbWUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBGb3JjZSBhIHJlLXNldCB0byBjaGVjayB2YWxpZGl0eSBvZiBwYXJhbWV0ZXJzICovCi0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICBWZXJpZnlSYXRlcy5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuRW5kQ3V0VGltZSA9IHBDLT51aUVuZEN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZTsKLQotICAgIGVyciA9IE00TUNTX3NldEVuY29kaW5nUGFyYW1zKHBDb250ZXh0LCAmVmVyaWZ5UmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBwYXJhbWV0ZXJzIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogaW52YWxpZCBwYXJhbWV0ZXIgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBpcyBPSyA6IHVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotICAgIC8qKgotICAgICogUmVtYWtlIHRoZSBvcGVuIGlmIGl0IHdhcyBkb25lIGluIGZhc3QgbW9kZSAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICAvKiBDbG9zZSB0aGUgZmlsZSBvcGVuZWQgaW4gZmFzdCBtb2RlICovCi0gICAgICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ1JFQVRFRDsKLQotICAgICAgICAvKiBSZW9wZW4gaXQgaW4gbm9ybWFsIG1vZGUgKi8KLSAgICAgICAgZXJyID0gTTRNQ1Nfb3BlbihwQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUsIHBDLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgcEMtPnBPdXRwdXRGaWxlLCBwQy0+cFRlbXBvcmFyeUZpbGUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogTTRNQ1NfT3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIE00TUNTX1dJVEhfRkFTVF9PUEVOICovCi0KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUkVBRFk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotICAgICAgICBwQy0+YkgyNjRUcmltID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+dWlCZWdpbkN1dFRpbWUgIT0gMCkKLSAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+bV9wSW5zdGFuY2UpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX1NldEgyNjRQcm9jZXNzTkFMVWZjdHNQdHIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKTsKLQotICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50U3RldFNldCA6cEZjdFNldE9wdGlvbiBmYWlsZWQgIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuIGlmIGl0IGZhaWxzLiovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYW5kbGUgRFNJIGZpcnN0IGJpdHMKLSNkZWZpbmUgU1BTX1NUQVJUX1BPUyA2Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPU10gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMV07Ci0gICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEVuY29kZXJTUFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKShlbmNIZWFkZXItPnBCdWYpICsgU1BTX1NUQVJUX1BPUyArIDI7Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPUyArIDMKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZV0gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgNAotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclBQUyA9IChNNE9TQV9VSW50OCAqKWVuY0hlYWRlci0+cEJ1ZiArIFNQU19TVEFSVF9QT1MgKyA1Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemU7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBEU0kgaW50ZWdyaXR5ICovCi0gICAgICAgICAgICBpZiggZW5jSGVhZGVyLT5TaXplICE9IChwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSArIDUgKyBTUFNfU1RBUlRfUE9TKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50U3RlcFNldCBFUlJPUiA6IGludmFsaWQgU1BTIC8gUFBTICVkICVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplLCBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBhdWRpbyBwcm9jZXNzaW5nICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlV3JpdGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVXcml0ZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0aGUgYXVkaW8gc3RyZWFtIHRvIHRoZSBiZWdpbiBjdXQgdGltZSAoYWxsIEFVcyBhcmUgUkFQKQotICAgICogTXVzdCBiZSBkb25lIGFmdGVyIHRoZSAzZ3BwIHdyaXRlciBpbml0LCBiZWNhdXNlIGl0IG1heSB3cml0ZSB0aGUgZmlyc3QKLSAgICAqIGF1ZGlvIEFVIGluIHNvbWUgY2FzZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCAwID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgewotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgICAgIC8qKgotICAgICAgICAqIE5vIGJlZ2luIGN1dCwgZG8gdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGF0IHdlIG11c3Qgc3RhcnQgdGhlIGRlY29kZS9lbmNvZGUgcHJvY2VzcyBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gKE00T1NBX0RvdWJsZSlwQy0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwU2V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZGVjb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIE00TUNTX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1ZvaWQgKmRlY29kZXJVc2VyRGF0YTsKLSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyIEZpbHRlck9wdGlvbjsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIGRlY29kZXIsIGlmIGl0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCAodG8gZ2V0IHZpZGVvIHByb3BlcnRpZXMgZm9yIGV4YW1wbGUpICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotCi0jZWxzZQotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgPyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAmcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMsIHBDLT5tX3BSZWFkZXIsCi0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LCAmcEMtPlJlYWRlclZpZGVvQVUsIGRlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIChNNE9TQV9VSW50MzIpKE00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPdXIgZGVjb2RlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEgyNjMgcHJvZmlsZSBvdGhlciB0aGFuIDAuCi0gICAgICAgICAgICAqIFNvIGl0IHJldHVybnMgdGhpcyBpbnRlcm5hbCBlcnJvciBjb2RlLgotICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyT3B0aW9uLm1fcEZpbHRlckZ1bmN0aW9uID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSAmTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjA7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBFbmNQYXJhbXM7IC8qKjwgRW5jb2RlciBhZHZhbmNlZCBwYXJhbWV0ZXJzICovCi0gICAgTTRFTkNPREVSX1BhcmFtcyBFbmNQYXJhbXMxOwotICAgIE00T1NBX0RvdWJsZSBkRnJhbWVSYXRlOyAgICAgICAgICAgIC8qKjwgdG1wIHZhcmlhYmxlICovCi0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgLyogQXBwcm94aW1hdGl2ZSBjdHMgaW5jcmVtZW50ICovCi0gICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMC4wIC8gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIEktZnJhbWUgZGVmYXVsdHMuIik7Ci0KLSAgICAgICAgICAgIC8qIFNldCB1c2VmdWwgcGFyYW1ldGVycyB0byBlbmNvZGUgdGhlIGZpcnN0IEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZm9ybWF0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0gcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBkbyBub3QgY29uc3RyYWluIHRoZSBJLWZyYW1lICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGU7Ci0KLSAgICAgICAgICAgIC8qIE90aGVyIGVuY29kaW5nIHNldHRpbmdzIChxdWl0ZSBhbGwgZHVtbXkuLi4pICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7IC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgICAgIDA7IC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA1OyAgIC8qIGluaXRpYWwgUVAgPSA1ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0gICAgICAgICAgICAvKiBSYXRlIGZhY3RvciAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTm9ybWFsIGVuY29kaW5nLCBzZXQgZnVsbCBjb25maWcuIik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IGVuY29kZXIgc2hlbGwgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gTUNTIHNldHRpbmdzICovCi0gICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdDsKLSAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY29tcHV0ZWQgKi8KLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHVzZSB0aGUgInRydWUiIGNvcmUgaW50ZXJuYWwgYml0cmF0ZSByZWd1bGF0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzICovCi0KLSAgICAgICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlID0gMDsgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kID0gMDsgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgIC8qIHVzZSBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgIC8qIGluaXRpYWwgUVAgPSAxMCAqLwotICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBlbmNvZGVyIGZyYW1lIHJhdGUgYW5kIHJhdGUgZmFjdG9yICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMTAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMi41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAvKio8IE1QRUctNCBvbmx5ICovCi0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDIwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMzAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgKDB4JXgpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0d28gZnJhbWVzICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMS4wIC8gZEZyYW1lUmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qKjwgTVBFRzQgb3IgSC4yNjQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGltaXQgdGhlIHZpZGVvIGJpdHJhdGUgYWNjb3JkaW5nIHRvIGVuY29kZXIgcHJvZmlsZQotICAgICAqIGFuZCBsZXZlbCAqLwotICAgIGVyciA9IE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKCZFbmNQYXJhbXMpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBsaW1pdCBiaXRyYXRlIHJldHVybmVkIGVyciBcCi0gICAgICAgICAgICAgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wVmlFbmNDdHh0LAotICAgICAgICBwQy0+cFdyaXRlckRhdGFGY3RzLCBcCi0gICAgICAgIE00TUNTX2ludEFwcGx5VlBQLCBwQywgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksIFwKLSAgICAgICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgLyoqPCBXZSBwdXQgdGhlIE1DUyBjb250ZXh0IGluIHBsYWNlIG9mIHRoZSBWUFAgY29udGV4dCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBFbmNvZGVySW50LT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgLy9pZigoTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAvLyAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKSkKLSAgICB7Ci0gICAgICAgIEVuY1BhcmFtczEuSW5wdXRGb3JtYXQgPSBFbmNQYXJhbXMuSW5wdXRGb3JtYXQ7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lV2lkdGggPSBFbmNQYXJhbXMuSW5wdXRGcmFtZVdpZHRoOwotICAgICAgICAvL0VuY1BhcmFtczEuSW5wdXRGcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lV2lkdGggPSBFbmNQYXJhbXMuRnJhbWVXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zMS5GcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb1Byb2ZpbGU9IEVuY1BhcmFtcy52aWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtczEudmlkZW9MZXZlbD0gRW5jUGFyYW1zLnZpZGVvTGV2ZWw7Ci0gICAgICAgIEVuY1BhcmFtczEuQml0cmF0ZSA9IEVuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lUmF0ZSA9IEVuY1BhcmFtcy5GcmFtZVJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OyAvL0VuY1BhcmFtcy5Gb3JtYXQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zMS52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtczEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigibWNzIGVuY29kZXIgb3BlbiBBZHYgcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtcyk7Ci0gICAgfQotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKgotICAgICogQ29tcGFyZSB2aWRlbyBpbnB1dCBzaXplIGFuZCB2aWRlbyBvdXRwdXQgc2l6ZSB0byBjaGVjayBpZiByZXNpemUgaXMgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilFbmNQYXJhbXMuRnJhbWVXaWR0aAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGgpCi0gICAgICAgIHx8ICgoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZUhlaWdodAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0KSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZQotICAgICAgICAgcmVzaXppbmcgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9Ci0gICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWUsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgWSBwbGFuZSAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb1dpZHRoOyAvKio8IGlucHV0IHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fdmlkZW9IZWlnaHQ7IC8qKjwgaW5wdXQgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoCi0gICAgICAgICAgICA+PiAxOyAvKio8IFUgd2lkdGggaXMgaGFsZiB0aGUgWSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodAotICAgICAgICAgICAgPj4gMTsgLyoqPCBVIGhlaWdodCBpcyBoYWxmIHRoZSBZIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgViB3aWR0aCBlcXVhbHMgVSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0OyAvKio8IFYgaGVpZ2h0IGVxdWFscyBVIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIFByZXBhcmUgdGhlIEFBQyBkZWNvZGVyLCB0aGUgU1JDIGFuZCB0aGUgQU1SLU5CIGVuY29kZXIgYW5kIHRoZSBNUDMgZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgU1NSQ19SZXR1cm5TdGF0dXNfZW4KLSAgICAgICAgUmV0dXJuU3RhdHVzOyAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAwOyAvKiBNaW5pbWFsIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciBvbiB0aGUgb3V0cHV0ICovCi0gICAgTFZNX0lOVDMyIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcElucHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIGlucHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICBTU1JDX1BhcmFtc190IHNzcmNQYXJhbXM7ICAgICAgICAgIC8qIE1lbW9yeSBmb3IgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLQotICAgIGZpbGVfYXVfcmVhZGVyID0gZm9wZW4oIm1jc19SZWFkZXJPdXRwdXQucmF3IiwgIndiIik7Ci0gICAgZmlsZV9wY21fZGVjb2RlciA9IGZvcGVuKCJtY3NfRGVjb2Rlck91dHB1dC5wY20iLCAid2IiKTsKLSAgICBmaWxlX3BjbV9lbmNvZGVyID0gZm9wZW4oIm1jc19FbmNvZGVySW5wdXQucGNtIiwgIndiIik7Ci0KLSNlbmRpZgotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgQ3JlYXRlIGFuZCAic3RhcnQiIHRoZSBkZWNvZGVyIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0VWUkMgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBFVlJDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa01QMyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIE1QMyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLSAgICAgICAgTTRfQWFjRGVjb2RlckNvbmZpZyBBYWNEZWNQYXJhbTsKLQotICAgICAgICBBYWNEZWNQYXJhbS5tX0FBQ0RlY29kZXJQcm9maWxlID0gQUFDX2tBQUM7Ci0gICAgICAgIEFhY0RlY1BhcmFtLm1fRG93blNhbXBsaW5nTW9kZSA9IEFBQ19rRFNfT0ZGOwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGb3IgdGhpcyB2ZXJzaW9uLCB3ZSBlbmNvZGUgb25seSBpbiBBQUMgKi8KLSAgICAgICAgICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfVXNlclBhcmFtLCAoTTRPU0FfRGF0YU9wdGlvbikgJkFhY0RlY1BhcmFtKTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplOwotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNldCB0aGUgU1NSQyBwYXJhbWV0ZXJzIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgewotICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTEwMjU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgIH0KLQotICAgIGlmKCAxID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyApCi0gICAgewotICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX01PTk87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgIH0KLQotICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBQUMKLSAgICAgICAgfHwgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rODAwMEh6OgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazExMDI1SHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE2MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazIyMDUwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI0MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ0MTAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IGludmFsaWQgb3V0cHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgXAotICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICB9Ci0KLQotCi0gICAgUmV0dXJuU3RhdHVzID0gMDsKLQotICAgIHN3aXRjaCggc3NyY1BhcmFtcy5TU1JDX0ZzX0luICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE3NjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDMyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzIyMDUwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLQotICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nOlwKLSAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXMpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIChMVk1fSU5UMTYpKChzc3JjUGFyYW1zLk5yU2FtcGxlc0luID4gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpCi0gICAgICAgID8gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgOiBzc3JjUGFyYW1zLk5yU2FtcGxlc0luKTsKLQotICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNE1DU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgeyAvKiBEb24ndCB0YWtlIGJsb2NrcyBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZSAqLwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA8PCAxKTsKLSAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgTnJTYW1wbGVzTWluID0gKExWTV9JTlQxNikoTnJTYW1wbGVzTWluIDw8IDEpOwotICAgIH0KLQotCi0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gKExWTV9JTlQxNikoCi0gICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgIE5yU2FtcGxlc0luKTsgLyogbXVsdGlwbGljYXRpb24gYnkgTnJPZkNoYW5uZWxzIGlzIGRvbmUgYmVsb3cgKi8KLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpIFwKLSAgICAgICAgKnBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscywgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlck91dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLQotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoCi0gICAgICAgIDE2LCAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICAgICAgKE00T1NBX0ludDE2KXBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscy8qc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyovLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpLypzc3JjUGFyYW1zLlNTUkNfRnNfT3V0Ki8sIDEpOwotCi0gICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wTFZBdWRpb1Jlc2FtcGxlcikKLSAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICB9Ci0KLSAgICBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsCi0gICAgICAgIC8qZ0lucHV0UGFyYW1zLmx2SW5TYW1wbGVSYXRlKi8KLSAgICAgICAgLypwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kvKnNzcmNQYXJhbXMuU1NSQ19Gc19JbiovKTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLCAoTTRPU0FfSW50MTYpKDB4MTAwMCAvKiAweDdmZmYgKi8pLAotICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMC8qMHg3ZmZmKi8pKTsKLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBDLT5BdWRpb0VuY1BhcmFtcywgJnBDLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgaW5wdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQU1SX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUDM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKj0gc2l6ZW9mKHNob3J0KTsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpICogMjsKLQotICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHksIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciIpOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgd3JpdGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsgLyoqPCBUbyB3cml0ZSBjb21wb25lbnQgdmVyc2lvbiBpbiAzZ3Agd3JpdGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggcERTSSA9IE00T1NBX05VTEw7IC8qKjwgVG8gY3JlYXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIG9wdGlvblZhbHVlOyAvKio8IEZvciB0aGUgc2V0b3B0aW9uIGNhbGxzICovCi0gICAgTTRPU0FfVUludDMyIFRhcmdldGVkRmlsZVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiTVVMUFBTU1BTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4oJnBDLT5wV3JpdGVyQ29udGV4dCwgcEMtPnBPdXRwdXRGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwQy0+cFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdG8gdGhlIHdyaXRlciBjb250ZXh0IGluIHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBwQy0+cFdyaXRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywgKE00T1NBX0RhdGFPcHRpb24pIk5YUC1TVyA6IE1DUyAgICAiKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICogMTAwICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAqIDEwCi0gICAgICAgICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IFwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYSB2aWRlbyBpbnB1dCwgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IDA7IC8qKjwgV2lsbCBiZSB1cGRhdGVkIGxhdGVyICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBjYXNlIGlucHV0PU00RU5DT0RFUl9rTlVMTCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gYml0cmF0ZSB2YWx1ZSB3aWxsIGJlIHRoZSByZWFsIHZhbHVlICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ubWF4Qml0cmF0ZSA9IChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogbW9zdCBvdGhlciBwYXJhbWV0ZXJzIGFyZSAiZHVtbXkiICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJihwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgRW5jb2RlciBIZWFkZXIgcHJvcGVydGllcyBmb3IgVmlkZW8gc3RyZWFtIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggTTRFTkNPREVSX2tIMjYzID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEgyNjMgRFNJICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0KLSAgICAgICAgICAgICAgICA3OyAvKio8IEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICAgICAgcERTSSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNywgTTRNQ1MsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgKikicEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiAoRFNJIEgyNjMpIik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBEU0kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlV3JpdGVyKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwRFNJIChIMjYzKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVmVuZG9yIGlzIE5YUCBTb2Z0d2FyZTogTiwgWCwgUCwgUy4gKi8KLSAgICAgICAgICAgIHBEU0lbMF0gPSAnTic7Ci0gICAgICAgICAgICBwRFNJWzFdID0gJ1gnOwotICAgICAgICAgICAgcERTSVsyXSA9ICdQJzsKLSAgICAgICAgICAgIHBEU0lbM10gPSAnUyc7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICAgICAgcERTSVs0XSA9IDA7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMZXZlbCBpcyB0aGUgc2l4dGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdXaWR0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rNjRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMjA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2szODRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00RU5DT0RFUl9rODAwX0tCUFMvKjIwNDgqLykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9DSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFByb2ZpbGUgaXMgdGhlIHNldmVudGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgcERTSVs2XSA9IDA7Ci0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBwRFNJOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0KLSAgICAgICAgfQotICAgICAgICAvKiBvdGhlcndpc2UgKE1QRUc0KSwgdGhlIERTSSB3aWxsIGJlIHJlY292ZXJlZCBmcm9tIHRoZSBlbmNvZGVyIGxhdGVyIG9uLiAqLwotCi0gICAgICAgIC8qK0NSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGlmKCBwQy0+YkgyNjRUcmltID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiTVVMUFBTU1BTID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTVVMX1BQU19TUFMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZiTVVMUFBTU1BTKTsKLQotICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTVVMX1BQU19TUFMpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKi1DUkxWNjc3NSAtIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyVmlkZW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBtYXggdmlkZW8gQVUgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6XAotICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIGFuIGF1ZGlvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYXVkaW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iU2FtcGxlc1BlclNlYyA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQ2hhbm5lbHMgPSAxOyAgICAgIC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBdWRpb05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tQQ006Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyoqPCBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhbHJlYWR5IHRlc3RlZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgICAgICB1bmtub3duIGZvcm1hdCAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHByb2R1Y2VzIG9ubHkgQU1SLU5CIG91dHB1dCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeTsKLQotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVzZSB0aGUgRFNJIGdpdmVuIGJ5IHRoZSBlbmNvZGVyIG9wZW4oKSAqLwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0gcEMtPnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXcml0ZXIgd2lsbCBwdXQgYSBkZWZhdWx0IFBoaWxpcHMgRFNJICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICAgICAgICAgaW4gdGhlIERTSSBwb2ludGVyLi4uICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICZzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIHdyaXRlciAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGluayB0aGUgQVUgYW5kIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOyAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuZnJhZyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgYXVkaW8gbWF4IEFVIHNpemUgKi8KLSAgICAgICAgLyogQXMgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzLCBtYXggQVUKLSAgICAgICAgICogc2l6ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFkYXB0IHRoZSBtYXggQVUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUKLSAgICAgICAgICogY2hhbm5lbHMgbnVtYmVycyovCi0gICAgICAgIC8qIEFmdGVyIHRlc3RzLCBhIG1hcmdpbiBvZiAzIGlzIHRha2VuICgyIHdhcyBub3QgZW5vdWdoIGFuZCByYWlzZXMgdG8gbWVtb3J5IG92ZXJ3cml0ZSkKLSAgICAgICAgICovCi0gICAgICAgIC8vcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgc3dpdGNoKCBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLypjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0VWUkNfR1JBTlVMQVJJVFlfU0FNUExFUyoKLSAgICAgICAgICAgICAgICAoKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyAqIHNpemVvZihzaG9ydCkpKzMpOwotICAgICAgICAgICAgICAgIGJyZWFrOyovCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IHBDLT51aUF1ZGlvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBNNE1DU19BVURJT19NQVhfQ0hVTktfU0laRTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogU2V0IHRoZSBsaW1pdGF0aW9uIHNpemUgb2YgdGhlIHdyaXRlciAqLwotICAgIFRhcmdldGVkRmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICAvKiBhZGQgMSBrQiBtYXJnaW4gKi8KLSAgICBpZiggVGFyZ2V0ZWRGaWxlU2l6ZSA+IDgxOTIgKQotICAgICAgICBUYXJnZXRlZEZpbGVTaXplIC09IDEwMjQ7Ci0KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlU2l6ZSwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZUYXJnZXRlZEZpbGVTaXplKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb25cCi0gICAgICAgICAgICAoTTRXUklURVJfa01heEZpbGVTaXplKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgc3RyZWFtIHJlZ2lzdGVyaW5nIGluIG9yZGVyIHRvIGJlIHJlYWR5IHRvIHdyaXRlIGRhdGEgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcocEMtPnBXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRE8gdGhlIGF1ZGlvIGJlZ2luIGN1dC4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lU2l6ZTsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhbiBhdWRpbyBiZWdpbiBjdXQgaXMgbmVlZGVkICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSB8fCAoMCA9PSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgYXQgdGhlIGJlZ2luIGN1dCB0aW1lICovCi0gICAgaUN0cyA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmaUN0cyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQ6IG1fcEZjdEp1bXAoQXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJlbWVtYmVyIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLQotICAgIC8qKgotICAgICogQU1SLU5CICYgRVZSQzogdGhlcmUgbWF5IGJlIG1hbnkgZnJhbWVzIHBlciBBVS4KLSAgICAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHNsaWNlIHRoZSBmaXJzdCBBVSB0byBrZWVwIHRoZSAyMCBtcyBjdXQgcHJlY2lzaW9uICovCi0gICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBuZXh0IGZyYW1lIENUUyBpcyBsb3dlciB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwKLSAgICAgICAgKiB3ZSBtdXN0IHJlYWQgdGhlIEFVIGFuZCBwYXJzZSBpdHMgZnJhbWVzIHRvIHJlYWNoIHRoZQotICAgICAgICAqIG5lYXJlc3QgdG8gdGhlIGJlZ2luIGN1dCAqLwotICAgICAgICBpZiggKCBpQ3RzICsgMjApIDwgKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBhdWRpbyBBVSBhZnRlciB0aGUganVtcCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBubyBmYXRhbCBlcnJvciBoZXJlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBwdXJzdWUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFdoaWxlIHRoZSBuZXh0IEFVIGhhcyBhIGxvd2VyIENUUyB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwgd2UgYWR2YW5jZSB0bwotICAgICAgICAgICAgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgIHdoaWxlKCAoIGlDdHMgKyAyMCkgPD0gKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjOgotICAgICAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVNpemUgPSBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggMCA9PSB1aUZyYW1lU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3JydXB0ZWQgZnJhbWUhIFdlIGdldCBvdXQgb2YgdGhpcyBtZXNzIQotICAgICAgICAgICAgICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZS4uLiAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXRGcmFtZVNpemVfeHh4IHJldHVybnMgMCEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR28gdG8gdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzICs9IHVpRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAtPSB1aUZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBDVFMgb2YgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBpQ3RzICs9IDIwOyAvKio8IEFNUiwgRVZSQyBmcmFtZSBkdXJhdGlvbiBpcyBhbHdheXMgMjAgbXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA9IGlDdHM7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9EVFMgPSBpQ3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVXBkYXRlIHRoZSBhdWRpbyBiZWdpbiBjdXQgb2Zmc2V0ICovCi0gICAgICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMsIE00T1NBX1VJbnQ4KiBwUHJvZ3Jlc3MpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlBdWRpb1N0ZXBDb3VudCA9IDA7Ci0KLSAgICAvKiAtLS0tLS0tLS0tIFZJREVPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPlZpZGVvU3RhdGUpICkgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgZ29pbmcgb24gKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgLyogYmFkIGZpbGUgcHJvZHVjZWQgb24gdmVyeSBzaG9ydCAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgaGFzIGJlZW4gZW5jb2RlZCAtPiBiYWQgcHJvZHVjZWQgZmlsZSAtPiBlcnJvciByZXR1cm5lZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHZpZGVvIHRyYW5zY29kaW5nIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IFRoZSBpbnB1dCBwbGFuZSBpcyBudWxsIGJlY2F1c2UgdGhlIGlucHV0IGltYWdlIHdpbGwgYmUgb2J0YWluZWQgYnkgdGhlCi0gICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tIEFVRElPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPkF1ZGlvU3RhdGUpICkgLyoqPCBJZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIHdoaWxlKAotICAgICAgICAgICAgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgcnVubmluZywgZW5jb2RlIGF1ZGlvIHVudGlsIHdlIHJlYWNoIHZpZGVvIHRpbWUgKi8KLSAgICAgICAgICAgICggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+VmlkZW9TdGF0ZSkKLSAgICAgICAgICAgICYmIChwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgKyBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUykpIHx8Ci0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBub3QgcnVubmluZywgcGVyZm9ybSAxIHN0ZXAgb2YgYXVkaW8gZW5jb2RpbmcgKi8KLSAgICAgICAgICAgICgoIE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5BdWRpb1N0YXRlKQotICAgICAgICAgICAgJiYgKHVpQXVkaW9TdGVwQ291bnQgPCAxKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUF1ZGlvU3RlcENvdW50Kys7Ci0KLSAgICAgICAgICAgIC8qKjwgY2hlY2sgaWYgYW4gYWRpbyBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzIHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcocEMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IEF1ZGlvIHRyYW5zY29kaW5nICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBObyBtb3JlIHNwYWNlLCBxdWl0IHByb3Blcmx5ICovCi0gICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfTk9NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBmb3IgZW5kIGN1dCAqLwotICAgICAgICAgICAgLyogV2UgYWJzb2x1dGVseSB3YW50IHRvIGhhdmUgbGVzcyBvciBzYW1lIGF1ZGlvIGR1cmF0aW9uIGFzIHZpZGVvIC0+Ci0gICAgICAgICAgICAoMipwQy0+bV9hdWRpb0FVRHVyYXRpb24pICovCi0gICAgICAgICAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICsgKDIgKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gUFJPR1JFU1MgTUFOQUdFTUVOVCAtLS0tLS0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcHJvZ3Jlc3MgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA8IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgLyAocEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vcHJpbnRmKCI6ICU2LjBmXGJcYlxiXGJcYlxiXGJcYiIsIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCAqcFByb2dyZXNzID4gOTkgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IENUUyBmb3IgbmV4dCBzdGVwICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9ICAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gcEMtPmRDdHNJbmNyZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRoZSB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCB3aGVuIG5vIHN0cmVhbSBpcyBiZWluZyBlbmNvZGVkIGFueW1vcmUgKi8KLSAgICBpZiggKCAoIHBDLT5ub3ZpZGVvKSB8fCAoTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEID09IHBDLT5WaWRlb1N0YXRlKSkKLSAgICAgICAgJiYgKCggcEMtPm5vYXVkaW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPkF1ZGlvU3RhdGUpKSApCi0gICAgewotICAgICAgICAvKiB0aGUgQUlSIHBhcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICAgICAgLyoqLwotCi0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpbiB0aGUgY2xpcCAoZmlyc3QgZ2V0IHRoZSB0aW1lLCB0aGVuIGp1bXApICovCi0gICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0UHJldlJhcFRpbWUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQgPT0gZXJyICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgIGlDdHMgPSAoTTRPU0FfSW50MzIpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gTTRNQ1NfTk9fU1RTU19KVU1QX1BPSU5UOwotCi0gICAgICAgIGlmKCBpQ3RzIDwgMCApCi0gICAgICAgICAgICBpQ3RzID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RHZXRQcmV2UmFwVGltZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgIHsKLQotICAgICAgICAvLyBTYXZlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIE00T1NBX0ludDMyIGlDdHNPcmkgPSBpQ3RzOwotCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyhwQy0+bV9wSW5zdGFuY2UsCi0gICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gUmVzdG9yZSBqdW1wIHRpbWUgZm9yIHNhZmV0eSwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBpQ3RzID0gaUN0c09yaTsKLQotCi0gICAgfQotICAgIC8qIC0gQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0KLSAgICAvKioKLSAgICAqIERlY29kZSBvbmUgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSkoaUN0cyArIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IpOwotCi0gICAgLyoqCi0gICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlIGF0IGxlYXN0IG9uY2Ugd2l0aCB0aGUgYkp1bXAgZmxhZyB0byB0cnVlICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZwQy0+ZFZpRGVjQ3VycmVudEN0cywKLSAgICAgICAgTTRPU0FfVFJVRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDEiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IHBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRfTWVkaWFUaW1lIGREZWNUYXJnZXQ7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlICovCi0gICAgZERlY1RhcmdldCA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRTdGVwQmVnaW5EZWNvZGU6IERlY29kaW5nIHVwVG8gQ1RTICUuM2YiLAotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyk7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlKHBDLT5wVmlEZWNDdHh0LCAmZERlY1RhcmdldCwKLSAgICAgICAgTTRPU0FfRkFMU0UsIDApOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikKLSAgICAgICAgJiYgKGVyciAhPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGU6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDIiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24sIGlmIG5lZWRlZCAqLwotICAgIGlmKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMpCi0gICAgICAgIHx8IChNNFdBUl9OT19NT1JFX0FVID09IGVycikgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IChNNE9TQV9Eb3VibGUpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgMTMKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTiAxNjAKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4WwotICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMAotICAgIH07Ci0jZWxzZQotCi1leHRlcm4KLWNvbnN0Ci1NNE9TQV9VSW50OAotTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFBQyBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkUgICAgICA0Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLQotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwMCwgMHhDOCwgMHgyMCwgMHgwNwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkUgICAgICAgIDYKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPWwotICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV07Ci0KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBpZiBhbGwgYXVkaW8gZnJhbWUgaGFzIGJlZW4gd3JpdHRlbiAoaGFwcGVucyBhdCBiZWdpbiBjdXQpICovCi0gICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3IEFVIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qRkIgMjAwOS4wNC4wMjogUFIgc3VybnhwIzYxNjogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgIGNvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZQotICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UKLSAgICAgICAgICAgICAgICAgbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSwKLSAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiVGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTID4gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiAgIHBDLT5tX3BEYXRhQWRkcmVzczEKLSAgICAgICAgICAgICAgICAgKiBhbmQgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKgotICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICAqIG1heGltdW0gdmFsdWUuIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJBdWRpb0FVPy5tX21heHNpemUgPgotICAgICAgICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotICAgICAgICAgICAgLyogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgICogY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0KLSAgICAgICAgICAgICAgICAgKiB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAqIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZQotICAgICAgICAgICAgICAgICAqIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogWyBFTkQgXSAyMDA5MTAwOCAgSkZWIFBSIGZpeCBzdXJueHBzdyMxMDcxOiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczIsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTIubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTOwotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhQWRkcmVzczE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBwQy0+dWlBdWRpb0FVQ291bnQKLSAgICAgICAgPT0gMCApIC8qIElmIGl0IGlzIHRoZSBmaXJzdCBBVSwgd2Ugc2V0IGl0IHRvIHNpbGVuY2UKLSAgICAgICAgKGVsc2UsIGVycm9ycyAweDM4NDEsIDB4Mzg0NyBpbiBvdXIgQUFDIGRlY29kZXIpICovCi0gICAgewotICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tBQUMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBNdXN0IG5ldmVyIGhhcHBlbiAuLi4qLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2Rpbmc6IEJhZCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LAotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgLyogU29tZSByZW1haW5pbmcgQU1SIEFVIG5lZWRzIHRvIGJlIGNvcGllZCAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgV3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSArPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICsgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypNUDMgY2FzZTogY29weSB0aGUgQVUqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBDb3B5aW5nIGF1ZGlvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPmlBdWRpb0N0c09mZnNldCkKLSAgICAgICAgKiAocEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSAvIDEwMDAuMCkpKTsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAmJiBwQy0+dWlBdWRpb0FVQ291bnQgPT0gMCApCi0gICAgewotICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0IC09Ci0gICAgICAgICAgICAyMDsgLyogRHVyYXRpb24gb2YgYSBzaWxlbmNlIEFNUiBBVSwgdG8gaGFuZGxlIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICBzaWxlbmNlIGZyYW1lICovCi0gICAgfQotICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGF1ZGlvIEFVOiBDVFM9JWQgbXMiLAotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbCB0aGUgYXVkaW8gaGFzIGJlZW4gd3JpdHRlbiAqLwotICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXQgQXVkaW8gVHJhbnNjb2RpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdlbmVyYWwgZXJyb3IgKi8KLQotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzRGVjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGVjb2RlciBPVVQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0KLSAgICBpbnQgc3NyY0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3Igd2hpbGUgc3NyYyBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyIHVpU3NyY0luU2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgaW50cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmNJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBzc3JjIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBTc3JjSW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIHNzcmMgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjT3V0U2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgb3V0cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzU3NyYzsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDgKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uOyAvKio8IEZsYWcgdG8gaW5kaWNhdGUgaWYgYSBzdGVyZW8gPC0+IG1vbm8gY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmY7IC8qKjwgTXVsdGlwbGljYXRpdmUgY29lZmZpY2llbnQgaWYgc3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIGFwcGxpZWQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0KLSAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3IgY2hhbm5lbCBjb252ZXJ0b3IgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgMDsgLyoqPCBOYiBvZiBwY20gc2FtcGxlcyB0byBjb252ZXJ0IGluIGNoYW5uZWwgY29udmVydG9yICovCi0gICAgTTRPU0FfTWVtQWRkcjggcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBvdXRwdXQgKi8KLQotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGE7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUVuY29kZXJJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBlbmNvZGVyIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOyAvKio8IE5iIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzc3JjIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOAotICAgICAgICBwRW5jb2RlcklucHV0OyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBlbmNvZGVyIGlucHV0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLQotICAgIE00T1NBX0ludDE2ICp0ZW1wQnVmZk91dCA9IE00T1NBX05VTEw7Ci0gICAgLypGbEIgMjAwOS4wMy4wNDogYXBwbHkgYXVkaW8gZWZmZWN0cyBpZiBhbiBlZmZlY3QgaXMgYWN0aXZlKi8KLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICB1aW50MzJfdCBlcnJDb2RlID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBSRUFEIEFORCBERUNPREUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOwotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJnBDLT5BdWRpb0RlY0J1ZmZlck91dCwgTTRPU0FfRkFMU0UpOwotCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLCAxLCBmaWxlX3BjbV9kZWNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGUsIChNNE9TQV9EYXRhT3B0aW9uKSAmZXJyQ29kZSk7Ci0KLSAgICBpZiAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyQ29kZSApIHsKLSAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgcmV0dXJuIGVyckNvZGU7Ci0gICB9Ci0KLSAgICAvKiBTZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLQotICAgIC8qIF9fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEZFRUQgUkVTQU1QTEVSIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19mZWVkX3Jlc2FtcGxlcjoKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIHNzcmMgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19wcmVwYXJlX2lucHV0X2J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGRlY29kZXIgYnVmZmVyICovCi0gICAgdWlTc3JjSW5TaXplID0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzRGVjID0gKCBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcwotICAgICAgICArIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpIC0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGNhbiBmZWVkIGRpcmVjdGx5IHRoZSBTc3JjIHdpdGggdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPT0gcEMtPnBTc3JjQnVmZmVySW4pCi0gICAgICAgICYmICh1aUJ5dGVzRGVjID49IHVpU3NyY0luU2l6ZSkgKQotICAgIHsKLSAgICAgICAgcFNzcmNJbnB1dCA9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQ7Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBkZWNvZGVyIGJ1ZmZlciBhZnRlciByZXNhbXBsaW5nICovCi0gICAgICAgIGlmKCB1aUJ5dGVzRGVjID09IHVpU3NyY0luU2l6ZSApCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aVNzcmNJblNpemU7Ci0KLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2RvX3Jlc2FtcGxpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBTc3JjIGJ1ZmZlciBpbiAqLwotICAgIHVpU3NyY0luUm9vbSA9ICggcEMtPnBTc3JjQnVmZmVySW4gKyB1aVNzcmNJblNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXMgPQotICAgICAgICAodWlTc3JjSW5Sb29tIDwgdWlCeXRlc0RlYykgPyB1aVNzcmNJblJvb20gOiB1aUJ5dGVzRGVjOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGZyb20gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBpbnRvIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sICh2b2lkICopcEMtPnBQb3NJbkRlY0J1ZmZlck91dCwKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgU3NyYyBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluICs9IHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHRoZSBkZWNvZGVyIGJ1ZmZlciBvdXQgaXMgZW1wdHkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luRGVjQnVmZmVyT3V0IC0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpCi0gICAgICAgID09IChNNE9TQV9JbnQzMilwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBTc3JjIGluIGJ1ZmZlciBpcyByZWFkeSAoPSBmdWxsKSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgPCAoTTRPU0FfSW50MzIpdWlTc3JjSW5TaXplICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ7Ci0gICAgfQotCi0gICAgcFNzcmNJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBzc3JjIGJ1ZmZlciBpbiBhZnRlciByZXNhbXBsaW5nIChlbXB0eSkgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBETyBUSEUgUkVTQU1QTElORyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzoKLQotICAgIC8qKgotICAgICogTm8gbmVlZCBmb3IgbWVtY29weSwgd2UgY2FuIGZlZWQgU3NyYyBkaXJlY3RseSB3aXRoIHRoZSBkYXRhIGluIHRoZSBhdWRpbwotICAgIGRlY29kZXIgb3V0IGJ1ZmZlciovCi0KLSAgICBzc3JjRXJyID0gMDsKLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICB0ZW1wQnVmZk91dCA9Ci0gICAgICAgICAgICAoc2hvcnQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAidGVtcEJ1ZmZPdXQiKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopdGVtcEJ1ZmZPdXQsIDAsKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBTc3JjSW5wdXQsCi0gICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsIDAsIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgKHNob3J0ICopcFNzcmNJbnB1dCwgcEMtPmlTc3JjTmJTYW1wbE91dCwgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEgKQotICAgIHsKLSAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXRlbXBCdWZmT3V0LCAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQpcEMtPmlTc3JjTmJTYW1wbE91dCk7Ci0gICAgICAgIGZyZWUodGVtcEJ1ZmZPdXQpOwotICAgIH0KLQotCi0gICAgaWYoIDAgIT0gc3NyY0VyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nOiBTU1JDX1Byb2Nlc3MgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEIiwKLSAgICAgICAgICAgIHNzcmNFcnIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgUFJFUEFSRSBJTlBVVCBCVUZGRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOgotCi0gICAgLyogU2V0IHRoZSBmbGFnIGZvciBjaGFubmVsIGNvbnZlcnNpb24gcmVxdWlyZW1lbnQgKi8KLSAgICBpZiggKCBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMikgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rU3RlcmVvKQotICAgICAgICAmJiAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpICkKLSAgICB7Ci0gICAgICAgIG5lZWRDaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgU3NyYyBidWZmZXIgKi8KLSAgICB1aVNzcmNPdXRTaXplID0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgdWlCeXRlc1NzcmMgPQotICAgICAgICAoIHBDLT5wU3NyY0J1ZmZlck91dCArIHVpU3NyY091dFNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgaXMgZnVsbCAqLwotICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyA9Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDI7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIGVuY29kZXIgd2l0aCB0aGUgc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgIGlmKCAoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICYmICh1aUJ5dGVzU3NyYyA+PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICAgICAgICAgIGlmKCB1aUJ5dGVzU3NyYyA9PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICkKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgICAgICAgICAgLyogbWFyayB0aGUgZW5jb2RlciBidWZmZXIgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICAgICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICsgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotCi0gICAgICAgICAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2hhbm5lbCBjb252ZXJ0b3Igd3JpdGVzIGRpcmVjdGx5IGludG8gZW5jb2RlciBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAgICAgICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgICAgICAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgICAgICAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0KLSAgICAgICAgICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfY2hhbm5lbF9jb252ZXJ0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZW5jb2RlIGRpcmVjdGx5IGZyb20gc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY29kZXJJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBlbmNvZGVyIGJ1ZmZlciBpbiAqLwotICAgIGlmKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIH0KLQotICAgIHVpRW5jb2RlckluUm9vbSA9ICggcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkpCi0gICAgICAgIC0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAvKioKLSAgICAqIE5iIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbWluaW11bSBiZXR3ZWVuIG5iIG9mIGJ5dGVzIHJlbWFpbmluZyBpbgotICAgICogZGVjb2RlciBvdXQgYnVmZmVyIGFuZCBzcGFjZSByZW1haW5pbmcgaW4gc3NyYyBpbiBidWZmZXIgKi8KLSAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgKCggdWlFbmNvZGVySW5Sb29tICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKSA8IHVpQnl0ZXNTc3JjKQotICAgICAgICA/ICh1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDogdWlCeXRlc1NzcmM7Ci0KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0gdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGNvcHkgZnJvbSB0aGUgc3NyYyBvdXQgYnVmZmVyIGludG8gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIsICh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcG9zaXRpb24gaW4gc3NyYyBvdXQgYnVmZmVyIGFmdGVyIGVuY29kaW5nICovCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgIC8qIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciArPQotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICogMiAvIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmOwotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHNzcmMgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0KQotICAgICAgICA9PSAoTTRPU0FfSW50MzIpdWlTc3JjT3V0U2l6ZSApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogZ28gdG8gbmV4dCBzdGF0ZW1lbnQgKi8KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICBlbHNlCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBTVEVSRU8gPC0+IE1PTk8gfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjoKLQotICAgIC8qIGNvbnZlcnQgdGhlIGlucHV0IHBjbSBzdHJlYW0gdG8gbW9ubyBvciB0byBzdGVyZW8gKi8KLSAgICBzd2l0Y2goIG5lZWRDaGFubmVsQ29udmVyc2lvbiApCi0gICAgewotICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAvIDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9ySW5wdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRU5DT0RFIEFORCBXUklURSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOgotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGVuY29kZXIgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciAtIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKQotICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwRW5jb2RlcklucHV0OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgKCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikKLSAgICAgICAgLyBzaXplb2Yoc2hvcnQpIC8gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIGlmKCAqcEFjdGl2ZUVmZmVjdE51bWJlciA+PSAwICYmICpwQWN0aXZlRWZmZWN0TnVtYmVyIDwgcEMtPm5iRWZmZWN0cyApCi0gICAgewotICAgICAgICBpZiggcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyBwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFByb2dyZXNzID0gMDsKLSAgICAgICAgICAgIHBQcm9ncmVzcy51aUNsaXBUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUzsKLQotICAgICAgICAgICAgcFByb2dyZXNzLnVpT3V0cHV0VGltZSA9ICggcEMtPldyaXRlckF1ZGlvQVUuQ1RTICogMTAwMCkKLSAgICAgICAgICAgICAgICAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0gICAgICAgICAgICB0ZW1wUHJvZ3Jlc3MgPSAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAtIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlTdGFydFRpbWUKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRlbXBQcm9ncmVzcyAvIChNNE9TQV9VSW50MzIpcEMtPnBFZmZlY3RzWwotICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlEdXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSwgJnBQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogRXh0QXVkaW9FZmZlY3RGY3QoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAxLAotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJfaXNSYXdXcml0ZXIgKQotICAgIHsKLSAgICAgICAgLyogVGhpcyBhbGxvdyB0byB3cml0ZSBQQ00gZGF0YSB0byBmaWxlIGFuZCB0byBlbmNvZGUgQU1SIGRhdGEsCi0gICAgICAgICB3aGVuIG91dHB1dCBmaWxlIGlzIG5vdCBSQVcgKi8KLSAgICAgICAgaWYoIHBDLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5wT3V0cHV0UENNZmlsZSwKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdLCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyLgotICAgICAgICAgICAgcFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgZHVyYXRpb24gb2YgdGhlIGVuY29kZWQgQVUgKi8KLSAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICggZnJhbWVUaW1lRGVsdGEgKiAxMDAwKSAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSBkYXRhIGNvbnN1bWVkIGludG8gZW5jb2RlciBidWZmZXIgaW4gYWZ0ZXIgZW5jb2RpbmcgKGVtcHR5KSAqLwotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKQotICAgICAgICAgICAgcEVuY29kZXJJbnB1dDsgLyogd2lsbCBiZSBjb252ZXJ0ZWQgYmFjayB0byB1OCogaW4gZmlsZSB3cml0ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgICAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLQotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IE9ORSBQQVNTIERPTkUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOgotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVShNNE9TQV9NZW1BZGRyOCogYWRkciwgTTRPU0FfVUludDMyIG5ld1NpemUpCi0gKiBVc2VkIG9ubHkgaW4gY2FzZSBvZiAzR1AgY29uc3RhbnQgbWVtb3J5IHJlYWRlciwgdG8gYmUgYWJsZSB0byByZWFsbG9jIHRlbXBvcmFyeSBBVQotICogYmVjYXVzZSBtYXggQVUgc2l6ZSBjYW4gYmUgcmVldmFsdWF0ZWQgZHVyaW5nIHJlYWRpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKCBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICkKLXsKLSAgICBpZiggKmFkZHIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKCphZGRyKTsKLSAgICAgICAgKmFkZHIgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld1NpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUmVhbGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggKmFkZHIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qIER1cmF0aW9uIG9mIHRoZSBBVSAoZmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbgotICAgICAqIHRvIG9idGFpbiBhIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KQotICAgICAqLwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0FVRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfTWVtQWRkcjggV3JpdGVidWZmZXJBZGQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGxhc3RkZWNvZGVkQ1RTID0gMDsKLSAgICBNNF9BY2Nlc3NVbml0IGxSZWFkZXJWaWRlb0FVOyAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICBpZiggKCAoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHBDLT51aVZpZGVvQVVDb3VudCA8IHBDLT5tX3BJbnN0YW5jZS0+Y2xpcF9zcHMubnVtX3JlZl9mcmFtZXMpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICAgICAgfHwgKCggcEMtPnVpVmlkZW9BVUNvdW50ID09IDApICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBpZigocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKSAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpCi0gICAgewotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgcHJlZmV0Y2gsIHRoZSBvbmUgZnJhbWUgd2UgcmVxdWVzdGVkIHdpbGwgbm90IGJlIHdyaXR0ZW4gdW50aWwKLSAgICAgICAgLy8gdGhlIGVuY29kZXIgaXMgY2xvc2VkLCBzbyBkbyBpdCBub3cgcmF0aGVyIHRoYW4gaW4gTUNTX2Nsb3NlCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgfHwgKE00TUNTX2tFbmNvZGVyUnVubmluZyAhPSBwQy0+ZW5jb2RlclN0YXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nICIKLSAgICAgICAgICAgICAgICAicmV0dXJucyAweCVYIHcvIGVuY1N0YXRlPSVkIiwgZXJyLCBwQy0+ZW5jb2RlclN0YXRlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFN0b3AgYW5kIGNsb3NlIHRoZSBlbmNvZGVyIG5vdyB0byBmbHVzaCB0aGUgZnJhbWUgKHByZWZldGNoKSAqLwotICAgICAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIHN0b3AgcmV0dXJucyAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiISEhIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nIEVSUk9SIDogZW5jb2RlciBjbG9zZSByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLQotICAgIGlmICgocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpIHsKLQotICAgICAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9UUlVFOwotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFMsICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIG5vdCBuZWVkIHZpZGVvIGRlY29kZXIgYW55IG1vcmUsIG5lZWQgdG8gZGVzdHJveSBpdC4gT3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHdpbGwgY2FsbCByZWFkZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCBjYXVzZSBmcmFtZSBsb3N0IGR1cmluZyB0cmltaW5nLAotICAgICAgICAgKiBzaW5jZSB0aGUgM2dwIHJlYWRlciBpcyBzaGFyZWQgYmV0d2VlbiBNQ1MgYW5kIGRlY29kZXIuKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQpIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBkZWNvZGVyIHBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbGFzdGRlY29kZWRDVFMpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsUmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pXAotICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICIjIyMgW1RTX0NIRUNLXSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyAgdmlkZW8gQVUgQ1RTOiAlZCAiLAotICAgICAgICAgICAgbFJlYWRlclZpZGVvQVUubV9DVFMpOwotCi0KLSAgICB9Ci0KLQotICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0KLQotICAgIC8qIEZpbmQgdGhlIG5leHQgQVUgZHVyYXRpb24gdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQqLwotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0KLSAgICBpZiAocEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmIChwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKVwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEKLSAgICAgICAgICAgIGFuZCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgdmlkZW8gQVUgaW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTID4gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTICkKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVLAotICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTIpOwotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fc2l6ZSk7Ci0gICAgICAgIHZpZGVvQVVEdXJhdGlvbiA9IHBDLT5SZWFkZXJWaWRlb0FVMi5tX0NUUyAtIHBDLT5SZWFkZXJWaWRlb0FVMS5tX0NUUzsKLSAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMTsKLSAgICB9Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAvKiBUaGUgdmlkZW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHZpZGVvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyB2aWRlbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICA8IChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopInBDLT5IMjY0TUNTVGVtcEJ1ZmZlciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NOQUxVKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplLCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMiAqKSZwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0KTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9UaW1lKSgoKCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgICAgICAgICAqIChwQy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fYXR0cmlidXRlOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogdmlkZW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuQ1RTKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKShXcml0ZWJ1ZmZlckFkZCAtIDQpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciksIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgfQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuICovCi0gICAgLyogQnVnIGZpeCAxMS8xMi8yMDA4OiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgdmlkZW8gZHVyYXRpb24gLT4KLSAgICAoMip2aWRlb0FVRHVyYXRpb24pIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgZW5kIGN1dCovCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTICsgKDIgKnZpZGVvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfTWVkaWFUaW1lIG10VHJhbnNjb2RlZFRpbWUgPSAwLjA7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfSW50MzIgZGVyaXZlID0gMDsKLQotICAgIC8qKgotICAgICogR2V0IHZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBtdFRyYW5zY29kZWRUaW1lID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgRnJhbWVNb2RlID0gTTRFTkNPREVSX2tOb3JtYWxGcmFtZTsKLQotICAgIC8qKgotICAgICogRGVjb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUoJS4yZikiLAotICAgICAgICBtdFRyYW5zY29kZWRUaW1lKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZtdFRyYW5zY29kZWRUaW1lLAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLSAgICBlbHNlIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMyIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGZvciBlbmQgY3V0LgotICAgICogV2UgbXVzdCBjaGVjayBoZXJlIGlmIHRoZSBlbmQgY3V0IGlzIHJlYWNoZWQsIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHdlIG11c3QKLSAgICAqIGNhbGwgdGhlIGxhc3QgZW5jb2RlIHN0ZXAgKC0+IGJMYXN0RnJhbWUgc2V0IHRvIHRydWUpICovCi0gICAgaWYoICggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCApID49IChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpICkKLSAgICB7Ci0gICAgICAgIEZyYW1lTW9kZSA9Ci0gICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZTsgLyoqPCBXZSB3aWxsIGdpdmUgdGhpcyB2YWx1ZSB0byB0aGUgZW5jb2RlciB0bwotICAgICAgICAgICAgYXNrIGZvciB0aGUgZW5kIG9mIHRoZSBlbmNvZGluZyAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgZGVyaXZlID0gKE00T1NBX0ludDMyKSgoIHBDLT5kVmlEZWNDdXJyZW50Q3RzICsgcEMtPmRDdHNJbmNyZW1lbnQgKyAwLjUpCi0gICAgICAgICAgICAtIChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICArIE00TUNTX0FCUyhwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKSk7Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHN0YXJ0aW5nIENUUyB0byBoYXZlIGEgbW9yZSBwcmVjaXNlIHZhbHVlICgKLSAgICB0aGUgYmVnaW4gY3V0IGlzIG5vdCBhIHJlYWwgQ1RTKSovCi0gICAgaWYoIHBDLT51aVZpZGVvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IG10VHJhbnNjb2RlZFRpbWU7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5jb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgd2l0aCB2aWRlb0N0c1wKLSAgICAgICAgID0gJS4yZiIscEMtPlJlYWRlclZpZGVvQVUubV9DVFMpOwotICAgIHBDLT51aVZpZGVvQVVDb3VudCsrOwotICAgIC8qIHVwZGF0ZSB0aGUgZ2l2ZW4gZHVyYXRpb24gKHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPnBWaUVuY0N0eHQsIE00T1NBX05VTEwsCi0gICAgICAgIChwQy0+ZFZpRGVjQ3VycmVudEN0cyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIChkZXJpdmUgPj4gMSkpLAotICAgICAgICBGcmFtZU1vZGUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGF1dGhvciAgIERvdW55YSBNYW5haSAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEBicmllZiAgICBSZXRyaWV2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25mSW5mbzsKLSAgICBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgSDI2M3Byb3A7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9CaXRyYXRlOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgdmlkZW9TaXplOwotICAgIE00X0FBQ1R5cGUgaUFhY1R5cGUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEMsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IHBDIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgY29tbW9uIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzBdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzFdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9IDA7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXAsCi0gICAgICAgIDAsIHNpemVvZihNNFZJREVPRURJVElOR19GdHlwQm94KSk7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHZpZGVvIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyogUmVzZXQgY29tcGF0aWJpbGl0eSBjaGFydCAobm90IHVzZWQgaW4gTUNTKSAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVVua25vd246Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZFZpZGVvOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgYml0cmF0ZSBub3QgYXZhaWxhYmxlIHJldHJpZXZlIGFuIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwgJnZpZGVvQml0cmF0ZSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIGF1ZGlvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IHZpZGVvQml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJldHJpZXZlIHRoZSBQcm9maWxlICYgTGV2ZWwgKi8KLSAgICAgICAgaWYoICggTTRWSURFT0VESVRJTkdfa0gyNjMgIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKE00VklERU9FRElUSU5HX2tIMjY0Ci0gICAgICAgICAgICAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBmcm9tIHRoZSBleHRlcm5hbCB2aWRlbyBzaGVsbCBkZWNvZGVyLgotICAgICAgICAgICAgU2VlIHRoZSBjb21tZW50cyBpbiBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMsIGl0J3MgcHJldHR5IG11Y2ggdGhlCi0gICAgICAgICAgICBzYW1lIGlzc3VlLiAqLwotCi0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJkRlY0NvbmZJbmZvLCAmdmlkZW9TaXplKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSSByZXR1cm5zIDB4JTA4WCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb1dpZHRoID0gdmlkZW9TaXplLm1fdWlXaWR0aDsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPSB2aWRlb1NpemUubV91aUhlaWdodDsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSBEZWNDb25mSW5mby51aVRpbWVTY2FsZTsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLmJEYXRhUGFydGl0aW9uOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IERlY0NvbmZJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICBEZWNDb25mSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLQotICAgICAgICAgICAgZXJyID0gZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoRGVjQ29uZkluZm8udWlQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgZXJyID0gZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEZvciBoMjYzIHNldCBkZWZhdWx0IHRpbWVzY2FsZSA6IDMwMDAwOjEwMDEgKi8KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSAzMDAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICAgICAgZXJyID0gZ2V0QVZDUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIZXJlIGJlY2F1c2Ugd2lkdGggeCBoZWlnaHQgaXMgY29ycmVjdCBvbmx5IGFmdGVyIGRzaSBwYXJzaW5nCi0gICAgICAgIChkb25lIGluIGNyZWF0ZSBkZWNvZGVyKSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQ7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPnZpZGVvUm90YXRpb25EZWdyZWVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXIpCi0gICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogY2FsbGluZyBDcmVhdGVBdWRpb0RlY29kZXIsIHVzZXJEYXRhPSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRXh0T01YQXVkRGVjb2RlciApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQUFDIHByb3BlcnRpZXMqLwotICAgICAgICAgICAgICAgICAgICAvL2dldCBmcm9tIFJlYWRlcjsgdGVtcG9yYXJ5LCB0aWxsIEF1ZGlvIGRlY29kZXIgc2hlbGwgQVBJIGF2YWlsYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgQUFDIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZpQWFjVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tVbmtub3duOgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogQUFDIE5CQ2hhbnM9JWQsIFNhbXBsRnJlcT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRlY29kZXIgbm90IGltcGxlbWVudGVkIHlldCwgcHJvdmlkZSBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgbnVsbCBlbmNvZGluZyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSA4MDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQnVnZml4IFA0TUUwMDAwMTEyODogV2l0aCBzb21lIElNVEMgZmlsZXMsIHRoZSBBTVIgYml0IHJhdGUgaXMgMCBrYnBzIGFjY29yZGluZwotICAgICAgICAgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDEyLjIga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQwotICAgICAgICAgICAgICAgID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCZXR0ZXIgcmV0dXJuaW5nIGEgZ3Vlc3NlZCA4LjUga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZUJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYW4gaGFwcGVuIGFsc28gZm9yIGFhYywgaW4gdGhpcyBjYXNlIHdlIGNhbGN1bGF0ZSBhbiBhcHByb3hpbWF0aXZlICovCi0gICAgICAgICAgICAgICAgLyogdmFsdWUgZnJvbSBnbG9iYWwgYml0cmF0ZSBhbmQgdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkZpbGVCaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBGaWxlQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAtIHBDLT4KLSAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGUgLyogbm9ybWFsbHkgc2V0dGVkIHRvIDAsIGlmIG5vIHZpZGVvICovOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIEJ1Zzogd2l0aCBhYWMsIHZhbHVlIGlzIDAgdW50aWwgZGVjb2RlciBzdGFydCgpIGlzIGNhbGxlZCAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9IHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxOwotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzOwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tlQUFDcGx1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogR2V0ICdmdHlwJyBhdG9tICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3gsICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mdHlwKTsKLQotICAgIC8qIEFuYWx5c2lzIGlzIHN1Y2Nlc3NmdWwgKi8KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbgotICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gKQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5GaWxlVHlwZSA9IHBDLT5JbnB1dEZpbGVUeXBlOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKCBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApCi17Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lVHlwZSA9ICggKCAqcEF1ZGlvRnJhbWUpICYoMHhGIDw8IDMpKSA+PiAzOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gOTU7Ci0gICAgICAgICAgICBicmVhazsgLyogIDQ3NTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTAzOwotICAgICAgICAgICAgYnJlYWs7IC8qICA1MTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDExODsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNTkwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMzQ7Ci0gICAgICAgICAgICBicmVhazsgLyogIDY3MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTQ4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3NDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE1OTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNzk1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyMDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTAyMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMjQ0OwotICAgICAgICAgICAgYnJlYWs7IC8qIDEyMDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDM5OwotICAgICAgICAgICAgYnJlYWs7IC8qIFNJRCAoU2lsZW5jZSkgKi8KLQotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBObyBkYXRhICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAqcEF1ZGlvRnJhbWUpICYweDBGOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgYmxhbmsgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS84ICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gNDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvNCAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDgwOwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzIgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNzE7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEgKi8KLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBlcmFzdXJlICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIG1heCBmaWxlIHNpemUgaXMgZ3JlYXRlciBlbm91Z2ggdG8gZW5jb2RlIGEgZmlsZSB3aXRoIHRoZQotICogICAgICAgICAgIGN1cnJlbnQgc2VsZWN0ZWQgYml0cmF0ZXMgYW5kIGR1cmF0aW9uLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IKLSAqIEByZXR1cm4gICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVUludDMyIGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBhdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvYml0cmF0ZTsKLQotICAgIC8qIGZyZWUgZmlsZSBzaXplIDogT0sgKi8KLSAgICBpZiggcEMtPnVpTWF4RmlsZVNpemUgPT0gMCApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogZHVyYXRpb24gKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBhdWRpbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tFVlJDOgotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogQUFDIGFuZCBNUDMqLwotICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfazE2X0tCUFMgOiBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTZfS0JQUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIG1heCBmaWxlIHNpemUgKi8KLSAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+dWlNYXhGaWxlU2l6ZQotICAgICAgICA8IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChhdWRpb2JpdHJhdGUgKyB2aWRlb2JpdHJhdGUpICogKGR1cmF0aW9uIC8gODAwMC4wKSkgKQotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoTTRPU0FfVUludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUpCi0gKiBAYnJpZWYgICAgUmV0dXJucyB0aGUgY2xvc2VzdCBiaXRyYXRlIHZhbHVlIGZyb20gdGhlIGVudW0gbGlzdCBvZiB0eXBlIE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqIEBwYXJhbSAgICBmcmVlYml0cmF0ZTogdW5zaWduZWQgaW50IHZhbHVlCi0gKiBAcGFyYW0gICAgbW9kZTogLTE6cHJldmlvdXMsMDpjdXJyZW50LDE6bmV4dAotICogQHJldHVybiAgIGJpdHJhdGUgdmFsdWUgaW4gZW51bSBsaXN0IE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUKLU00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKCBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwgTTRPU0FfSW50OCBtb2RlICkKLXsKLSAgICBNNE9TQV9JbnQzMiBiaXRhcnJheSBbXSA9Ci0gICAgewotICAgICAgICAwLCBNNFZJREVPRURJVElOR19rMTZfS0JQUywgTTRWSURFT0VESVRJTkdfazI0X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTLCBNNFZJREVPRURJVElOR19rNDhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFMsIE00VklERU9FRElUSU5HX2s5Nl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMsIE00VklERU9FRElUSU5HX2sxOTJfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTLCBNNFZJREVPRURJVElOR19rMjg4X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUywgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMsIE00VklERU9FRElUSU5HX2syX01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s1X01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFMsIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLSAgICB9OwotCi0gICAgY29uc3QgTTRPU0FfVUludDMyIG5iYml0cmF0ZXMgPSAxNDsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIGZvciAoIGkgPSAwOyBmcmVlYml0cmF0ZSA+PSBiaXRhcnJheVtpXTsgaSsrICk7Ci0KLSAgICBzd2l0Y2goIG1vZGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAtMTogLyogcHJldmlvdXMgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDIgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMl07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDA6IC8qIGN1cnJlbnQgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDEgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMV07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIG5leHQgKi8KLSAgICAgICAgICAgIGlmKCBpID49IG5iYml0cmF0ZXMgKQotICAgICAgICAgICAgICAgIHJldHVybiBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgTTRNQ1Nfb3BlbigpCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqLwotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZGVjb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BWaWRlb0RlY29kZXItPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLSBGcmVlIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0gICAgLy8gV2UgY2Fubm90IGZyZWUgdGhlIHJlYWRlciBiZWZvcmUgZGVjb2RlcnMgYmVjYXVzZSB0aGUgZGVjb2RlcnMgbWF5IHJlYWQKLSAgICAvLyBmcm9tIHRoZSByZWFkZXIgKGluIGFub3RoZXIgdGhyZWFkKSBiZWZvcmUgYmVpbmcgc3RvcHBlZC4KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT4KLSAgICAgICAgcFJlYWRlckNvbnRleHQgKSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00TUNTX29wZW4gd2FzIG5vdCBjYWxsZWQgKi8KLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENsb3NlKHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveShwQy0+cFJlYWRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YUFkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLypCdWcgZml4IDExLzEyLzIwMDggKHRvIG9idGFpbiBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCkqLwotICAgIGlmKCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSk7Ci0gICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX29wZW5fbm9ybWFsTW9kZShNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4gSXQgaXMgdGhlIHNhbWUgYXMgTTRNQ1Nfb3BlbiB3aXRob3V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV0lUSF9GQVNUX09QRU4gZmxhZwotSXQgaXMgdXNlZCBpbiBWaWRlb0FydGlzdAotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0byBzdG9yZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSAoIm1vb3YuYmluIikuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogICBUaGUgaW5wdXQgZmlsZSBoYXMgbm90IGJlZW4gZm91bmQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU6ICAgVGhlIGlucHV0IGZpbGUgaXMgbm90IGEgdmFsaWQgZmlsZSwgb3IgaXMgY29ycnVwdGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOiAgVGhlIGlucHV0IGZpbGUgY29udGFpbnMgbm8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00TUNTX29wZW5fbm9ybWFsTW9kZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsXAotICAgICBwRmlsZU91dD0weCV4IiwgcENvbnRleHQsIHBGaWxlSW4sIHBGaWxlT3V0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSAsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiAoKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUE5HKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBTdGlsbCBwaWN0dXJlIGlzIG5vdFwKLSAgICAgICAgICAgICBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKE00TUNTX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSAgICAgPSBwRmlsZUluOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlICA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlICAgID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50UmVhZGVyKHBDb250ZXh0LCBwQy0+SW5wdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHJlYWRlciByZWxhdGVkIHZhcmlhYmxlcyAqLwotICAgIHBDLT5WaWRlb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5BdWRpb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3JlYWRlckNvbnRleHQgPSBwQy0+cFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICBpZiAoZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUpKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0ZJTEVfRFJNX1BST1RFQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWWFMgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLSAgICAgICAgICAgIGlmIChNNE1QNF9SRUFERVIgPT0gdWlDb3JlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0ocEMtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksCi0gICAgICAgICAgICAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluIGNhc2Ugd2UgZm91bmQgYSBCSUZTIHN0cmVhbSBvciBzb21ldGhpbmcgZWxzZS4uLiovCi0gICAgICAgIGlmKChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KSBcCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0PT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0gICAgICAgICAgICAgICAgICAgIHx8KE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpKQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgfHwoKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICYmKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlQVZDXSAhPSBNNE9TQV9OVUxMKSkpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpbiBpbnB1dCAzZ3BwIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKChNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZD09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgXAotICAgICAgICAgICAgICAgICAgICAgICAgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIFwKLSAgICAgICAgICAgIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIGlmKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICE9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAvKiBkZWNvZGVyIG5vdCBzdXBwb3J0ZWQgeWV0LCBidXQgYWxsb3cgdG8gZG8gbnVsbCBlbmNvZGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYgKDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKSAvKio8IHNhbml0eSBjaGVjayAqLwotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IChNNE9TQV9JbnQzMikoMzAwMC4gXAotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSk7IC8qKjwgYWJvdXQgMyBmcmFtZXMgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QURfQnVmZmVyIG91dHB1dEJ1ZmZlcjsKLSAgICB1aW50MzJfdCBvcHRpb25WYWx1ZSA9MDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyA6c3RhcnQiKTsKLQotICAgIC8vIERlY29kZSBmaXJzdCBhdWRpbyBmcmFtZSBmcm9tIGNsaXAgdG8gZ2V0IHByb3BlcnRpZXMgZnJvbSBjb2RlYwotCi0gICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpIHsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmKHBDLT5BYWNQcm9wZXJ0aWVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0gICAgfQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RDcmVhdGVBdWRpb0RlYyBcCi0gICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllczogbV9wRmN0U3RhcnRBdWRpb0RlYyBcCi0gICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA+IDAgKSB7Ci0KLSAgICAgICAgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIFwKLSAgICAgICAgICAgICpzaXplb2Yoc2hvcnQpLCBNNE1DUywgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb05iQ2hhbm5lbHMsIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSwgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzXAotICAgICAgICAgICAgRXJyb3IgaW4gcmVzZXRpbmcgcmVhZGVyOiAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotCi19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRMaW1pdEJpdHJhdGVQZXJDb2RlY1Byb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyogRW5jUGFyYW1zKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHN3aXRjaCAoRW5jUGFyYW1zLT5Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvTGV2ZWwsIEVuY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsOiBcCi0gICAgICAgICAgICAgICAgV3JvbmcgZW5jIGZvcm1hdCAlZCIsIEVuY1BhcmFtcy0+Rm9ybWF0KTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW46Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMWI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE5MjAwMCkgPyAxOTIwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDc2ODAwMCkgPyA3NjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMCkgPyAyMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0MDAwMDAwKSA/IDQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMDAwMDAwMCkgPyAxMDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTQwMDAwMDApID8gMTQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMDApID8gNTAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTM1MDAwMDAwKSA/IDEzNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwMDAwKSA/IDI0MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6Ci0gICAgICAgICAgICBzd2l0Y2ggKGxldmVsKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA4MDAwMCkgPyA4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTYwMDAwKSA/IDE2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwKSA/IDI0MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDgwMDAwKSA/IDQ4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gOTYwMDAwKSA/IDk2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwKSA/IDI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDApID8gNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyNTAwMDAwKSA/IDEyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNzUwMDAwMCkgPyAxNzUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2MjUwMDAwMCkgPyA2MjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjg3NTAwMDApID8gMTY4NzUwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzMDAwMDAwMDApID8gMzAwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgQVZDIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDBiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIE1QRUc0IHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDEwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMjA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDMwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgSDI2MyBwcm9maWxlIGZvciBub3cuCi0gICAgICAgICAgICAvLyBSZXR1cm4gaW5wdXQgYml0cmF0ZQotICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlkQml0cmF0ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0F1ZGlvRWZmZWN0cy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OGRlNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbiAoVmlkZW8gQ29tcHJlc3NvciBTZXJ2aWNlKQotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQVBJIGFuZCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgTUNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotLyogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0ZXBFbmNvZGluZyBmdW5jdGlvbgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi17Ci0gICAgTTRPU0FfSW50OCAqcEFjdGl2ZUVmZmVjdE51bWJlciA9ICYocEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIpOwotCi0gICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLQotICAgIGlmKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID4gcEMtPnVpQmVnaW5DdXRUaW1lCi0gICAgJiYgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlFbmRDdXRUaW1lKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dFJlbGF0ZWRUaW1lID0gMDsKLSAgICAgICAgTTRPU0FfVUludDggdWlFZmZlY3RJbmRleCA9IDA7Ci0gICAgICAgIG91dHB1dFJlbGF0ZWRUaW1lID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgIC0gcEMtPnVpQmVnaW5DdXRUaW1lICsgMC41KTsKLQotICAgICAgICBmb3IodWlFZmZlY3RJbmRleD0wOyB1aUVmZmVjdEluZGV4PHBDLT5uYkVmZmVjdHM7IHVpRWZmZWN0SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChvdXRwdXRSZWxhdGVkVGltZSA+PQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSkpICYmCi0gICAgICAgICAgICAgICAgKG91dHB1dFJlbGF0ZWRUaW1lIDwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlTdGFydFRpbWUgK1wKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlEdXJhdGlvbikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gdWlFZmZlY3RJbmRleDsKLSAgICAgICAgICAgICAgICB1aUVmZmVjdEluZGV4ID0gcEMtPm5iRWZmZWN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbiggIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgLyoqCi0gICAgICogTG9vcCBvbiBzYW1wbGVzICovCi0gICAgd2hpbGUgKHVpUENNc2l6ZS0tPjApIC8qKjwgZGVjcmVtZW50aW5nIHRvIG9wdGltaXplICovCi0gICAgewotICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgIGkzMnNhbXBsZSAqPSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgIGkzMnNhbXBsZSAvPSAxMDAwOwotICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW46IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgIChJTi9PVVQpIElucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSAgICAgU2l6ZSBvZiBwUENNZGF0YQotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAoSU4pICAgICBFZmZlY3QgcHJvZ3Jlc3MKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0gICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NDQ5MmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQ29kZWNzLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYXVkaW8vdmlkZW8KLSAqICAgICAgICAgY29kZWMgbWFuaXB1bGF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyogSW5jbHVkZSBmb3IgT1NBTCBkZWJ1ZyBzZXJ2aWNlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIgICAgLyogSW50ZXJuYWwgdHlwZXMgb2YgdGhlIE1DUyAqLwotCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1ZJREVDXzNHUAotI2luY2x1ZGUgIk00X01QRUc0VklfVmlkZW9IYW5kbGVyLmgiICAvKm5lZWRlZCBmb3IgcmVuZGVyZXIgZXJyb3IgY29kZXMqLwotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcygpCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzICA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICAgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKCJNQ1M6IE00TUNTX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICBwV3RyR2xvYmFsSW50ZXJmYWNlPTB4JXgsIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLCBwQyxwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLSAgICBpZigoTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgLyogYSB3cml0ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHdyaXRlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyA9IHBXdHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBEYXRhRmN0cyA9IHBXdHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyICgKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk1DUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwRW5jR2xvYmFsSW50ZXJmYWNlID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNQ1M6IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICAgICAgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4IiwgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0gICAgaWYgKE1lZGlhVHlwZSA+PSBNNEVOQ09ERVJfa1ZpZGVvX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGVuY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGVuY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBlbmNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBlbmNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIGFuZCBleHRlcm5hbCBBUEkgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGVuY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0gICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBlbmNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2F2ZSBlbmNvZGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IHBFbmNHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW01lZGlhVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZW5jb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJHbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBnbG9iYWwgaW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJEYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00TUNTX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGF0YSBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChtZWRpYVR5cGUgPT0gTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gfHwgbWVkaWFUeXBlID49IE00UkVBREVSX2tNZWRpYVR5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVttZWRpYVR5cGVdICAgPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLCBvciB0aGUgZGVjb2RlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGRlY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotI2lmbmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgLyogYSBkZWNvZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkRlY29kZXIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAvKiBvaCwgYW5kIGRvbid0IGZvcmdldCB0aGUgdXNlciBkYXRhLCB0b28uICovCi0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotI2VuZGlmIC8qIGFyZSBleHRlcm5hbCBkZWNvZGVycyBwb3NzaWJsZT8gKi8KLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBNQ1MgdG8KLSAqICAgICAgICAgICAgICByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChkZWNvZGVyVHlwZSA+PSBNNEFEX2tUeXBlX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgYXVkaW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZGVjb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTToKLSAgICAgICAgICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBHbG9iYWxGY3RzOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBEYXRhRmN0czsKLQotICAgIGlmIChwQy0+cFdyaXRlckdsb2JhbEZjdHMgPT0gTTRPU0FfTlVMTCB8fCBwQy0+cFdyaXRlckRhdGFGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLS8vRVZSQwotLy8gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0vLyAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tFVlJDOwotLy8gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgcmVhZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wUmVhZGVyICAgICAgID0gcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbcmVhZGVyVHlwZV07Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtyZWFkZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wUmVhZGVyID09IE00T1NBX05VTEwgfHwgcEMtPm1fcFJlYWRlckRhdGFJdCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUzoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUY6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZU1QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0vLyAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUVWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMWNhODcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICBNZWRpYSByZWFkZXJzIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgTUNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE1DUyBzcGVjaWZpYyB0eXBlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2Vycm9yICJubyByZWFkZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaW5jbHVkZSAiTTRSRUFERVJfQW1yLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1wM1JlYWRlci5oIgotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogV3JpdGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSB3cml0ZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLSNlcnJvciAibm8gd3JpdGVyIHJlZ2lzdGVyZWQiCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfUENNICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUiAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHdyaXRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfQU1SX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfUENNX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSX01QM19nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB2aWRlbyBlbmNvZGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotLy8jaW5jbHVkZSAiTTRNUDRFX2ludGVyZmFjZS5oIgotI2VuZGlmCi0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIFwKLSAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgTUNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00UkVBREVSX01lZGlhVHlwZSAgICAgICAgICByZWFkZXJNZWRpYVR5cGU7Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgICAgIHdyaXRlck1lZGlhVHlwZTsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFdyaXRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNEFEX1R5cGUgICAgICAgICAgICAgICAgICAgYXVkaW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgYXVkaW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiBwQXVkaW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgICAgICAgICB2aWRlb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgICAgICB2aWRlb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgcFZpZGVvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KTsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gM0dQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIDNHUCByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggICAmcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1SIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9NUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoICZ2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCAgIHBDb250ZXh0LCB2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9BVkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBVkMgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERU9fQVZDICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUk5CIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBBTVJOQiBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFBQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgKi8KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgTVAzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gUENNIC0tLSAqLwotCi0KLSAgICAvKiAtLS0gM0dQUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSAgICAvKiByZXRyaWV2ZXMgdGhlIDNHUFAgd3JpdGVyIG1lZGlhIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggICAmd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlcldyaXRlciggcENvbnRleHQsIHdyaXRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQUCB3cml0ZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoICAgcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIE1QRUc0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotICAgIC8qIC0tLSBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBIMjYzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZ2aWRlb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmlkZW9Db2RlY0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfSDI2MyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIEFNUiBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBQUMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgKi8KLQotCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIE1QMyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVAzRSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBNUDMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0OWY2OGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZW5jb2RlciBjYWxsYmFjayBvZiB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotLyoqCi0gKiBWaWRlbyBwcmVwcm9jZXNzaW5nIGludGVyZmFjZSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogVmlkZW8gZmlsdGVycyAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiIC8qKjwgZm9yIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKCkgKi8KLQotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0vKiovCi0KLQotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBEbyB0aGUgdmlkZW8gcmVuZGVyaW5nIGFuZCB0aGUgcmVzaXplIChpZiBuZWVkZWQpCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTUNTIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNE1DU19FUlJfVklERU9fREVDT0RFX0VSUk9SOiB0aGUgdmlkZW8gZGVjb2RpbmcgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9SRVNJWkVfRVJST1I6IHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotLyogVGhpcyBwYXJ0IGlzIHVzZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0gICAgLyoqCi0gICAgICogVGhlIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBNQ1MgY29udGV4dCEgKi8KLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00X01lZGlhVGltZSBtdEN0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotCi0gICAgLyoqCi0gICAgICogV2hlbiBDbG9zaW5nIGFmdGVyIGFuIGVycm9yIG9jY3VyZWQsIGl0IG1heSBoYXBwZW4gdGhhdCBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBoYXMKLSAgICAgKiBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBXaGVuIGNsb3NpbmcgaW4gcGF1c2UgbW9kZSwgdGhlIGRlY29kZXIgY2FuIGJlIG51bGwuCi0gICAgICogV2UgZG9uJ3Qgd2FudCBhbiBlcnJvciB0byBiZSByZXR1cm5lZCBiZWNhdXNlIGl0IHdvdWxkIGludGVycnVwdCB0aGUgY2xvc2UgcHJvY2VzcyBhbmQKLSAgICAgKiB0aHVzIHNvbWUgcmVzb3VyY2VzIHdvdWxkIGJlIGxvY2tlZC4gU28gd2UgcmV0dXJuIE00Tk9fRVJST1IuCi0gICAgICovCi0gICAgLyogSW5pdGlhbGl6ZSB0byBibGFjayBwbGFuZSB0aGUgb3V0cHV0IHBsYW5lIGlmIHRoZSBtZWRpYSByZW5kZXJpbmcKLSAgICAgaXMgYmxhY2sgYm9yZGVycyAqLwotICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCpwUGxhbmVPdXRbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCpwUGxhbmVPdXRbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKE00T1NBX05VTEwgPT0gcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcykgfHwKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCkpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogV2UgbXVzdCBmaWxsIHRoZSBpbnB1dCBvZiB0aGUgZW5jb2RlciB3aXRoIGEgZHVtbXkgaW1hZ2UsIGJlY2F1c2UKLSAgICAgICAgICogZW5jb2Rpbmcgbm9pc2UgbGVhZHMgdG8gYSBodWdlIHZpZGVvIEFVLCBhbmQgdGh1cyBhIHdyaXRlciBidWZmZXIgb3ZlcmZsb3cuICovCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3N0cmlkZSAqIHBQbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3N0cmlkZSAqIHBQbGFuZU91dFsyXS51X2hlaWdodCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludEFwcGx5VlBQOiBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYocEMtPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIG1fcFByZVJlc2l6ZUZyYW1lIGRpZmZlcmVudCB0aGFuIE00T1NBX05VTEwgbWVhbnMgdGhhdCByZXNpemluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqIEZCIDIwMDgvMTAvMjA6Ci0gICAgICAgICAgICBVc2VkIGZvciBjcm9wcGluZyBhbmQgYmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IE5lZWQgdG8gcmVzaXplIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsICZtdEN0cywKLSAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa1Jlc2l6aW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyCi0gICAgICAgICAgICAgICAgICogaW1hZ2UgcGxhbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBwUGxhbmVPdXQpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogTTRWaUZpbFJlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lViA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgIC8qRkIgMjAwOC8xMC8yMDogdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAgICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICAgICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzJdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzBdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclkiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclUiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSxWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcFBsYW5lT3V0LT51X2hlaWdodClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGgtXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCovCi0gICAgICAgICAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcEltYWdlUGxhbmVzVGVtcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0Nyb3BwaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qd2lkdGggd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwQy0+cFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gZ2V0dGluZyBBSVIgcGxhbmU6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsyXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiBEb24ndCBuZWVkIHJlc2l6aW5nIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10Q3RzLCBwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBtX3BGY3RSZW5kZXIgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAqIHBQbGFuZU91dFswXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMV0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMV0udV93aWR0aCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzJdLnVfd2lkdGgpKTsKLSAgICAgICAgcEMtPmxhc3REZWNvZGVkUGxhbmUgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYTNkNjRlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZzcwotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX2NvcmUKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRQVE8zR1BQX0FQSS5jIFwKLSAgICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBcCi0gICAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00eFZTU19BUEkuYyBcCi0gICAgICBNNHhWU1NfaW50ZXJuYWwuYyBcCi0gICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBcCi0gICAgICBNNFZTUzNHUFBfQ2xpcC5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBcCi0gICAgICBNNFZTUzNHUFBfQ29kZWNzLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXQuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXRWaWRlby5jIFwKLSAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRDaGFubmVsQ29udmVydGVyLmMgXAotICAgICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBcCi0gICAgICBNNEFJUl9BUEkuYyBcCi0gICAgICBNNFJFQURFUl9QY20uYyBcCi0gICAgICBNNFBDTVJfQ29yZVJlYWRlci5jIFwKLSAgICAgIE00QURfTnVsbC5jIFwKLSAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRSRUFERVJfQW1yLmMgXAotICAgICAgTTRWRF9Ub29scy5jIFwKLSAgICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcCBcCi0gICAgICBNNERFQ09ERVJfTnVsbC5jCi0KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICAgIFwKLSAgICBsaWJhdWRpb3V0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycyBcCi0gICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIgICAgICAgIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCi0gICAgbGlidmlkZW9lZGl0b3JfbWNzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9zdGFnZWZyaWdodHNoZWxscyBcCi0gICAgbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1ETTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRW5vIFwKLSAgICAtRERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZDFlYzczLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00QURfTnVsbC5jCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTVAzIGRlY29kZXIgcHVibGljIGludGVyZmFjZQotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAibnVsbCIgYXVkaW8gZGVjb2RlciwgdGhhdCBpcyBhIGRlY29kZXIKLSAqICAgICAgICAgIHRoYXQgZG8gbm90aGluZyBleGNlcHQgZ2V0dGluZyBBVSBmcm9tIHRoZSByZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLQotI2RlZmluZSBNNEFEX0ZPUkNFXzE2QklUUwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5VTEwgQXVkaW8gRGVjb2RlciB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNEFEX05VTExfTUFKT1IgICAgMQotI2RlZmluZSBNNEFEX05VTExfTUlOT1IgICAgMQotI2RlZmluZSBNNEFEX05VTExfUkVWSVNJT04gNAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX051bGxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIG51bGwgZGVjb2RlciBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IFBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHByb3ZpZGVkIGJ5IHRoZSB1c2VyICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICBtX3BBdWRpb1N0cmVhbWhhbmRsZXI7Ci19IE00QURfTnVsbENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOWFAgTVAzIGRlY29kZXIgZnVuY3Rpb25zIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbnVsbCBkZWNvZGVyCi0gKiBAbm90ZSAgICBBbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gVXNlciBkYXRhCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICAgTTRBRF9OVUxMX2NyZWF0ZSggIE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQzsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBRF9OVUxMX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QURfTlVMTF9jcmVhdGU6IGludmFsaWQgcG9pbnRlciBwU3RyZWFtSGFuZGxlciIpOwotCi0gICAgcEMgPSAoTTRBRF9OdWxsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFEX051bGxDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgTTRERUNPREVSX0FVRElPLCAoTTRPU0FfQ2hhciAqKSJNNEFEX051bGxDb250ZXh0Iik7Ci0gICAgaWYgKHBDID09IChNNEFEX051bGxDb250ZXh0KikwKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkNhbiBub3QgYWxsb2NhdGUgbnVsbCBkZWNvZGVyIGNvbnRleHQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IHBDOwotCi0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtaGFuZGxlciA9IHBTdHJlYW1IYW5kbGVyOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgbnVsbCBkZWNvZGVyCi0gKiBAbm90ZSAgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICAgTTRBRF9OVUxMX2Rlc3Ryb3koTTRBRF9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEMgPSAoTTRBRF9OdWxsQ29udGV4dCopY29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoY29udGV4dCA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRBRF9OVUxMX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCIpOwotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTaW1wbHkgb3V0cHV0IHRoZSBnaXZlbiBhdWRpbyBkYXRhCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgcElucHV0QnVmZmVyOiAgICAgKElOL09VVClJbnB1dCBEYXRhIGJ1ZmZlci4gSXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGF1ZGlvIGZyYW1lLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgdXBkYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIGFjdHVhbGx5IGRlY29kZWQgZGF0YS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdGhlIGZpcnN0IGZyYW1lIGluIHBJbnB1dEJ1ZmZlcikKLSAqIEBwYXJhbSAgIHBEZWNvZGVkUENNQnVmZmVyOiAoT1VUKSAgT3V0cHV0IFBDTSBidWZmZXIgKGRlY29kZWQgZGF0YSkuCi0gKiBAcGFyYW0gICBqdW1waW5nOiAgICAgICAgICAgKElOKSAgIE00T1NBX1RSVUUgaWYgYSBqdW1wIHdhcyBqdXN0IGRvbmUsIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9zdGVwKE00QURfQ29udGV4dCBjb250ZXh0LCBNNEFEX0J1ZmZlciAqcElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfQnVmZmVyICpwRGVjb2RlZFBDTUJ1ZmZlciwgTTRPU0FfQm9vbCBqdW1waW5nKQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDID0gKE00QURfTnVsbENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKlRoZSBWUFMgc2VuZHMgYSB6ZXJvIGJ1ZmZlciBhdCB0aGUgZW5kKi8KLSAgICBpZiAoMCA9PSBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIGlmIChwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA+IHBEZWNvZGVkUENNQnVmZmVyLT5tX2J1ZmZlclNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSNpZmRlZiBNNEFEX0ZPUkNFXzE2QklUUwotICAgIC8qaWYgcmVhZCBzYW1wbGVzIGFyZSA4IGJpdHMsIGNvbXBsZXRlIHRoZW0gdG8gMTYgYml0cyovCi0gICAgaWYgKHBDLT5tX3BBdWRpb1N0cmVhbWhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPT0gMSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNE9TQV9JbnQxNiAgdmFsOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSAoTTRPU0FfSW50MTYpKChNNE9TQV9VSW50OCkocElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzW2ldKSAtIDEyOCk7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzW2kqMl0gICA9IChNNE9TQV9JbnQ4KSh2YWw+PjgpOwotICAgICAgICAgICAgcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3NbaSoyKzFdID0gKE00T1NBX0ludDgpKHZhbCYweDAwZmYpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzLCAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgKTsKLSAgICB9Ci0jZWxzZSAvKk00QURfRk9SQ0VfMTZCSVRTKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgKHZvaWQgKilwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplICk7Ci0jZW5kaWYgLypNNEFEX0ZPUkNFXzE2QklUUyovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXRzIHRoZSBkZWNvZGVyIHZlcnNpb24KLSAqIEBub3RlICAgIFRoZSB2ZXJzaW9uIGlzIGdpdmVuIGluIGEgTTRfVmVyc2lvbkluZm8gc3RydWN0dXJlCi0gKgotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKE9VVCkgICAgICAgUG9pbnRlciB0byB0aGUgdmVyc2lvbiBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgcFZlcnNpb25JbmZvIHBvaW50ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICAgTTRBRF9OVUxMX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbykKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWZXJzaW9uSW5mbyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRBRF9OVUxMX2dldFZlcnNpb246IGludmFsaWQgcG9pbnRlciBwVmVyc2lvbkluZm8iKTsKLQotICAgIC8qIFVwIHVudGlsIG5vdywgdGhlIG51bGwgZGVjb2RlciB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KLQotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgICAgICAgID0gTTRBRF9OVUxMX01BSk9SOyAgICAgIC8qbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBwVmVyc2lvbkluZm8tPm1fbWlub3IgICAgICAgID0gTTRBRF9OVUxMX01JTk9SOyAgICAgIC8qbWlub3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gICAgPSBNNEFEX05VTExfUkVWSVNJT047ICAgIC8qcmV2aXNpb24gdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGdldEludGVyZmFjZSBmdW5jdGlvbiBkZWZpbml0aW9ucyBvZiBOWFAgTVAzIGRlY29kZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IHBvaW50ZXIgb24gYW4gTTRBRF9UeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUgc3VwcG9ydGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBhZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyBkZWNvZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIuCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICBpZiBPSwotICogQHJldHVybiAgICBNNEVSUl9BTExPQyBpZiBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFEX05VTExfZ2V0SW50ZXJmYWNlKCBNNEFEX1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRBRF9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSkKLXsKLSAgICAqcERlY29kZXJJbnRlcmZhY2UgPSAoICBNNEFEX0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRBRF9JbnRlcmZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9BVURJTywgKE00T1NBX0NoYXIgKikiTTRBRF9JbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBEZWNvZGVySW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwRGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZUF1ZGlvRGVjICAgICAgID0gTTRBRF9OVUxMX2NyZWF0ZTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjICAgICAgPSBNNEFEX05VTExfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U3RlcEF1ZGlvRGVjICAgICAgICAgPSBNNEFEX05VTExfc3RlcDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjICAgPSBNNEFEX05VTExfZ2V0VmVyc2lvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U3RhcnRBdWRpb0RlYyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZXNldEF1ZGlvRGVjICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgICAgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBSVJfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Mjg5N2IwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBSVJfQVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00QUlSX0FQSS5jCi0gKiBAYnJpZWYgIEFyZWEgb2YgSW50ZXJlc3QgUmVzaXplciAgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNkZWZpbmUgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNkZWZpbmUgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBJTEFUSU9OIENIRUNLUyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0JHUjU2NV9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX1JHQjU2NV9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0JHUjg4OF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX1JHQjg4OF9GT1JNQVRfU1VQUE9SVEVECi0jaWZuZGVmIE00QUlSX0pQR19GT1JNQVRfU1VQUE9SVEVECi0KLSNlcnJvciAiUGxlYXNlIGRlZmluZSBhdCBsZWFzdCBvbmUgaW5wdXQgZm9ybWF0IGZvciB0aGUgQUlSIGNvbXBvbmVudCIKLQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgIE00QUlSX1N0YXRlcwotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QUlSX2tDcmVhdGVkLCAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jcmVhdGUgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRBSVJfa0NvbmZpZ3VyZWQgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NvbmZpZ3VyZSBoYXMgYmVlbiBjYWxsZWQgKi8KLX1NNEFJUl9TdGF0ZXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfU3RhdGVzICAgICAgICAgICAgbV9zdGF0ZTsgICAgICAgIC8qKjwgSW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNEFJUl9JbnB1dEZvcm1hdFR5cGUgICBtX2lucHV0Rm9ybWF0OyAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCNTY1LCBKUEcsIGV0YyAuLi4gKi8KLSAgICBNNEFJUl9QYXJhbXMgICAgICAgICAgICBtX3BhcmFtczsgICAgICAgLyoqPCBDdXJyZW50IGlucHV0IFBhcmFtZXRlciBvZiAgdGhlIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9pbmNbNF07ICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfaW5jWzRdOyAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgaGVpZ2h0IGZvciBZVVYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydFs0XTsgICAgLyoqPCBob3Jpem9udGFsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAgLyoqPCBWZXJ0aWNhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1bNF07IC8qKjwgc2F2ZSBvZiBob3Jpem9udGFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1bNF07IC8qKjwgc2F2ZSBvZiB2ZXJ0aWNhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgIHB1OF9kYXRhX2luWzRdOyAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIHN0cmlwZSBtb2RlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9wcm9jUm93czsgICAgIC8qKjwgTnVtYmVyIG9mIHByb2Nlc3NlZCByb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHN0cmlwZSBtb2RlIG9ubHkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYk9ubHlDb3B5OyAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2UganVzdCBwZXJmb3JtIGEgY29weQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBhIGJpbGluZWFyIGludGVycG9sYXRpb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYkZsaXBYOyAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iRmxpcFk7ICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JSZXZlcnRYWTsgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IFggYW5kIFkgcHJvY2Vzc2luZyBvcmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgrLTkwsCByb3RhdGlvbikgKi8KLX1NNEFJUl9JbnRlcm5hbENvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTUFDUk9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcilcCi0gICAgIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIElNUExFTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgIGlucHV0Rm9ybWF0OiAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuIEludmFsaWQgZm9ybWF0VHlwZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SIDsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovCi0gICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgICBNNEFJUiwoTTRPU0FfQ2hhciAqKSJBSVIgaW50ZXJuYWwgY29udGV4dCIpIDsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgcEMpIDsKLQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGZvcm1hdCBpcyBzdXBwb3J0ZWQgKi8KLSAgICBzd2l0Y2goaW5wdXRGb3JtYXQpCi0gICAgewotI2lmZGVmIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMFA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotI2lmZGVmIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBBUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICBnb3RvIE00QUlSX2NyZWF0ZV9jbGVhbnVwIDsKLSAgICB9Ci0KLSAgICAvKio8IFNhdmUgaW5wdXQgZm9ybWF0IGFuZCB1cGRhdGUgc3RhdGUgKi8KLSAgICBwQy0+bV9pbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OwotICAgIHBDLT5tX3N0YXRlID0gTTRBSVJfa0NyZWF0ZWQ7Ci0KLSAgICAvKiBSZXR1cm4gdGhlIGNvbnRleHQgdG8gdGhlIGNhbGxlciAqLwotICAgICpwQ29udGV4dCA9IHBDIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotTTRBSVJfY3JlYXRlX2NsZWFudXA6Ci0gICAgLyogRXJyb3IgbWFuYWdlbWVudCA6IHdlIGRlc3Ryb3kgdGhlIGNvbnRleHQgaWYgbmVlZGVkICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQykKLSAgICB7Ci0gICAgICAgIGZyZWUocEMpIDsKLSAgICB9Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIHJldHVybiBlcnIgOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZSB0byBkZXN0cm95Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiBJbnRlcm5hbCBzdGF0ZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGlzIGZ1bmN0aW9uIGNhbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLSAgICBmcmVlKHBDKSA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzCi0gKiAgICAgICAgICBwcm9jZXNzaW5nIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0Q29vcmQ6ICAgIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0U2l6ZTogICAgKElOKSBpbnB1dCBST0kgc2l6ZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAgIChJTikgb3V0cHV0IHNpemUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ6IHRoZSByZXF1ZXN0ZWQgaW5wdXQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0gICAgTTRPU0FfVUludDMyICAgIGksdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gMzsKLSAgICB9Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiogU2F2ZSBwYXJhbWV0ZXJzICovCi0gICAgcEMtPm1fcGFyYW1zID0gKnBQYXJhbXM7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIGlucHV0Jm91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkmMHgxKSAgICB8fAotICAgICAgICAgICAgKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkgICAgfHwKLSAgICAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0gICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICYmKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KSkpCi0gICAgewotICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHJlc2l6ZSBmaWx0ZXIgKi8KLSAgICAgICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdTMyX3dpZHRoX2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0OlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KzEpPj4xOwotICAgICAgICAgICAgdTMyX3dpZHRoX291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KzEpPj4xOwotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aC4qLwotICAgICAgICAgICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICgodTMyX3dpZHRoX2luLTEpICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKHUzMl93aWR0aF9pbiAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICAgICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2luY1tpXSAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2luY1tpXSA9ICh1MzJfaGVpZ2h0X2luICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZAotICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3lfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWSBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeF9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeF9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBYIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3gmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqPCBSZXNldCB2YXJpYWJsZSB1c2VkIGZvciBzdHJpcGUgbW9kZSAqLwotICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLQotICAgIC8qKjwgSW5pdGlhbGl6ZSB2YXIgZm9yIFgvWSBwcm9jZXNzaW5nIG9yZGVyIGFjY29yZGluZyB0byBvcmllbnRhdGlvbiAqLwotICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX0ZBTFNFOwotICAgIHN3aXRjaChwUGFyYW1zLT5tX291dHB1dE9yaWVudGF0aW9uKQotICAgIHsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRCb3R0b206Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgLyoqPCBVcGRhdGUgc3RhdGUgKi8KLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDb25maWd1cmVkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIHRoZSByZXF1ZXN0ZWQgcmVzaXplZCBhcmVhIG9mIGludGVyZXN0IGFjY29yZGluZyB0bwotICogICAgICAgICAgc2V0dGluZ3MgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZQotICogICAgICAgICAgd2lkdGggd2lsbCBiZSB0aGUgc2FtZSwgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLgotICogICAgICAgICAgSW4gc3RyaXBlIG1vZGUsIGl0IGlzIGNhbGxlZCBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbgotICogICAgICAgICAgcmV0cmlldmVkLGFuZCAgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdXRwdXQgc3RyaXBlIGluIHRoZSBvdXRwdXQgcGljdHVyZQotICogICAgICAgICAgaXMgaW50ZXJuYWxseSBpbmNyZW1lbnRlZCBhdCBlYWNoIHN0ZXAuCi0gKiAgICAgICAgICBBbnkgY2FsbCB0byBNNEFJUl9jb25maWd1cmUgZHVyaW5nIHN0cmlwZSBwcm9jZXNzIHdpbGwgcmVzZXQgdGhpcyBvbmUgdG8gdGhlCi0gKiAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwaWN0dXJlLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCi0gKiBAcGFyYW0gICAgcE91dDogICAgICAgIChJTi9PVVQpICBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvdXRwdXQgUGxhbmUocykuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0gICAgTTRPU0FfVUludDMyIGksaixrLHUzMl94X2ZyYWMsdTMyX3lfZnJhYyx1MzJfeF9hY2N1bSx1MzJfeV9hY2N1bSx1MzJfc2hpZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfZGF0YV9pbiwgKnB1OF9kYXRhX2luX29yZywgKnB1OF9kYXRhX2luX3RtcCwgKnB1OF9kYXRhX291dDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfdG9wOwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X3NyY19ib3R0b207Ci0gICAgTTRPU0FfVUludDMyICAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00T1NBX0ludDMyICAgIGkzMl90bXBfb2Zmc2V0OwotICAgIE00T1NBX1VJbnQzMiAgICBuYl9wbGFuZXM7Ci0KLQotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBMb29wIG9uIGVhY2ggUGxhbmUgKi8KLSAgICBmb3IoaT0wO2k8bmJfcGxhbmVzO2krKykKLSAgICB7Ci0KLSAgICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotCi0gICAgICAgIHUzMl9zaGlmdCA9ICgoaT09MCl8fChpPT0zKSk/MDoxOyAvKio8IERlcGVuZCBvbiBMdW1hIG9yIENocm9tYSAqLwotCi0gICAgICAgIGlmKChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKVwKLSAgICAgICAgICAgIHx8KChNNE9TQV9UUlVFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpJiYoMCA9PSBwQy0+bV9wcm9jUm93cykpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEZvciBpbnB1dCwgdGFrZSBjYXJlIGFib3V0IFJPSSAqLwotICAgICAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcEluW2ldLnBhY19kYXRhICsgcEluW2ldLnVfdG9wbGVmdCBcCi0gICAgICAgICAgICAgICAgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3g+PnUzMl9zaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7Ci0KLSAgICAgICAgICAgIC8qKiBHbyBhdCBlbmQgb2YgbGluZS9jb2x1bW4gaW4gY2FzZSBYL1kgc2Nhbm5pbmcgaXMgZmxpcHBlZCAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PnUzMl9zaGlmdCkgLTEgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpXAotICAgICAgICAgICAgICAgICAgICAgKiBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBhY2N1bXVsYXRvcnMgaW4gY2FzZSB3ZSBhcmUgdXNpbmcgaXQgKGJpbGluZWFyIGludGVycG9sYXRpb24pICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSBmb3Igb3RoZXIgdGhhbiBmaXJzdCBzdHJpcGUsIHdlIG5lZWQgdG8gcmVjb3ZlciBpbnB1dAotICAgICAgICAgICAgICAgICBwb2ludGVyIGZyb20gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwQy0+cHU4X2RhdGFfaW5baV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IEluIGV2ZXJ5IG1vZGUsIG91dHB1dCBkYXRhIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfb3V0ICAgID0gcE91dFtpXS5wYWNfZGF0YSArIHBPdXRbaV0udV90b3BsZWZ0OwotCi0gICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnB1dCBvZmZzZXQgYXBwbGllZCBhZnRlciBlYWNoIHBpeGVsICovCi0gICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IC1wSW5baV0udV9zdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgbm8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBpcyBuZWVkZWQgYXMgaW5wdXQgYW5kIG91dHB1dCBkaW1lbnNpb25zCi0gICAgICAgICAgICBhcmUgdGhlIHNhbWUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IE5vICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBObyBmbGlwIG9uIFggYWJzY2lzc2EgKi8KLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvcHkgb25lIHdob2xlIGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXB1OF9kYXRhX291dCwgKHZvaWQgKilwdThfZGF0YV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKjwgSGVyZSB3ZSBoYXZlIGEgKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW5fdG1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBpbnB1dCBwb2ludGVyIGluIG9yZGVyIHRvIGdvIHRvIG5leHQvcGFzdCBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgKz0gaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqPCBCaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgIGlmKDMgIT0gaSkgICAgLyoqPCBvdGhlciB0aGFuIGFscGhhIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgLyoqICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfS8qKiAzICE9IGkgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkgKi8KLSAgICAgICAgICAgIC8qKiArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IC8qKjwgTTRPU0FfVFJVRSA9PSBwQy0+bV9iUmV2ZXJ0WFkgKi8KLSAgICAgICAgfS8qKiAzID09IGkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqPCBJbiBjYXNlIG9mIHN0cmlwZSBtb2RlLCBzYXZlIGN1cnJlbnQgaW5wdXQgcG9pbnRlciAqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wdThfZGF0YV9pbltpXSA9IHB1OF9kYXRhX2luOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqPCBVcGRhdGUgbnVtYmVyIG9mIHByb2Nlc3NlZCByb3dzLCByZXNldCBpdCBpZiB3ZSBoYXZlIGZpbmlzaGVkCi0gICAgICAgICB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgKz0gcE91dFswXS51X2hlaWdodDsKLSAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8PSBwQy0+bV9wcm9jUm93cykgICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzBmOWRjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDkwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuYwotICogQGJyaWVmICAgICAgIEltcGxlbWVudGF0aW9uIG9mIEFNUiBwYXJzZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFQSSBJbXBsZW1lbnRhdGlvbiBmb3IKLSAqICAgICAgICAgICAgICBBTVIgUGFyc2VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNEFNUlJfQ29yZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWF4aW11bSBiaXRyYXRlIHBlciBhbXIgdHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRBTVJSX05CX01BWF9CSVRfUkFURSAgICAxMjIwMAotI2RlZmluZSBNNEFNUlJfV0JfTUFYX0JJVF9SQVRFICAgIDIzODUwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQU1SIHJlYWRlciBjb250ZXh0IElECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEFNUlJfQ09OVEVYVElEICAgIDB4NDE0ZDUyNTIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBbiBBTVIgZnJhbWUgaXMgMjBtcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRBTVJSX0ZSQU1FX0xFTkdUSCAgICAgMjAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGb3IgdGhlIHNlZWssIHRoZSBmaWxlIGlzIHNwbGl0dGVkIGluIDQwIHNlZ21lbnRzIGZvciBmYXN0ZXIgc2VhcmNoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSAgICBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyA0MAotCi0jZGVmaW5lIE00QU1SUl9OQl9TQU1QTEVfRlJFUVVFTkNZIDgwMDAgICAgICAgIC8qKjwgTmFycm93IGJhbmQgc2FtcGxpbmcgcmF0ZSAqLwotI2RlZmluZSBNNEFNUlJfV0JfU0FNUExFX0ZSRVFVRU5DWSAxNjAwMCAgICAvKio8IFdpZGUgYmFuZCBzYW1wbGluZyByYXRlICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQU1SIHJlYWRlciB2ZXJzaW9uIG51bWJlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgTTRBTVJSX1ZFUlNJT05fTUlOT1IgMTEKLSNkZWZpbmUgTTRBTVJSX1ZFUlNJT05fUkVWSVNJT04gMwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BTVJSX0NvbnRleHQKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgQU1SIHJlYWRlciBjb250ZXh0IHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIG1fY29udGV4dElkIDsgICAgICAvKiBGaXhlZCBJZC4gdG8gY2hlY2sgZm9yIHZhbGlkIENvbnRleHQqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICBtX3BPc2FGaWxlUHRyRmN0OyAgLyogRmlsZSBmdW5jdGlvbiBwb2ludGVyICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIG1fcFN0cmVhbUhhbmRsZXI7ICAvKiBTdHJlYW0gRGVzY3JpcHRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICAgbV9wU2Vla0luZGV4OyAgICAgIC8qIFNlZWsgSW5kZXggVGFibGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgbV9zZWVrSW50ZXJ2YWw7ICAgIC8qIFN0b3JlcyB0aGUgc2VlayBJbnRlcnZhbCBzdG9yZWQgaW4gdGhlIEluZGV4ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIG1fbWF4QXVTaXplOyAgICAgICAvKiBTdG9yZXMgdGhlIG1heCBBdSBTaXplICovCi0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgIG1fcGRhdGFBZGRyZXNzOyAgICAvKiBQb2ludGVyIHRvIHN0b3JlIEFVIGRhdGEgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgbV9zdHJlYW1UeXBlOyAgICAgIC8qIFN0b3JlcyB0aGUgc3RyZWFtIHR5cGUgQU1SIE5CIG9yIFdCICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fcEFNUkZpbGU7ICAgICAgICAvKiBEYXRhIHN0b3JhZ2UgKi8KLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICAgbV9zdGF0dXM7ICAgICAgICAgIC8qIEFNUiBSZWFkZXIgU3RhdHVzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAvKiBzaXplIG9mIHN0cnVjdHVyZSovCi19IE00X0FNUlJfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQYXJzZXIgaW50ZXJuYWwgZnVuY3Rpb25zLCBub3QgdXNhYmxlIGZyb20gb3V0c2lkZSB0aGUgcmVhZGVyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEF1U2l6ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKTsKLU00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEF1U2l6ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9uIHRvIHRoZSBBTVIgUGFyc2VyLCByZXR1cm5zIHRoZSBBVSBzaXplIG9mIHRoZSBGcmFtZQotICogQG5vdGUgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUgZnJhbWV0eXBlIGFuZCByZXR1cm5zIHRoZQotICogICAgICAgICAgIGZyYW1lIGxlbmdodAotICogQHBhcmFtICAgIGZyYW1lVHlwZShJTikgICAgOiBBTVIgZnJhbWUgdHlwZQotICogQHBhcmFtICAgIHN0cmVhbVR5cGUoSU4pICAgIDogQU1SIHN0cmVhbSB0eXBlIE5CIG9yIFdCCi0gKiBAcmV0dXJucyAgVGhlIGZyYW1lIHNpemUgYmFzZWQgb24gdGhlIGZyYW1lIHR5cGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0QXVTaXplKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi17Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9OQl9BVVNJWkVbXT17MTMsMTQsMTYsMTgsMjAsMjEsMjcsMzIsNiw2LDZ9OwotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfV0JfQVVTSVpFW109ezE4LDI0LDMzLDM3LDQxLDQ3LDUxLDU5LDYxLDZ9OwotCi0gICAgaWYgKCBzdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfTkJfQVVTSVpFW2ZyYW1lVHlwZV07Ci0gICAgfQotICAgIGVsc2UgLyogTTRTWVNfa0FNUl9XQiAqLwotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfV0JfQVVTSVpFW2ZyYW1lVHlwZV07Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9uIHRvIHRoZSBBTVIgUGFyc2VyLCByZXR1cm5zIHRoZSBCaXQgcmF0ZSBvZiB0aGUgRnJhbWUKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzdHJlYW0gdHlwZSBhbmQgdGhlIGZyYW1ldHlwZSBhbmQgcmV0dXJucyB0aGUKLSAqICAgICAgICAgICBiaXQgcmF0ZSBmb3IgdGhlIGdpdmVuIGZyYW1lLgotICogQHBhcmFtICAgIGZyYW1lVHlwZShJTikgICAgOiBBTVIgZnJhbWUgdHlwZQotICogQHBhcmFtICAgIHN0cmVhbVR5cGUoSU4pICAgIDogQU1SIHN0cmVhbSB0eXBlIE5CIG9yIFdCCi0gKiBAcmV0dXJucyAgVGhlIGZyYW1lJ3MgYml0IHJhdGUgYmFzZWQgb24gdGhlIGZyYW1lIHR5cGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotewotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfTkJfQklUUkFURVtdPQotICAgICAgICB7NDc1MCw1MTUwLDU5MDAsNjcwMCw3NDAwLDc5NTAsMTAyMDAsMTIyMDAsMTIyMDAsMTIyMDAsMTIyMDB9OwotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfV0JfQklUUkFURVtdPQotICAgICAgICB7NjYwMCw4ODUwLDEyNjUwLDE0MjUwLDE1ODUwLDE4MjUwLDE5ODUwLDIzMDUwLDIzODUwLDEyMjAwfTsKLQotICAgIGlmICggc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX05CX0JJVFJBVEVbZnJhbWVUeXBlXTsKLSAgICB9Ci0gICAgZWxzZSAvKiBNNFNZU19rQU1SX1dCICovCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9XQl9CSVRSQVRFW2ZyYW1lVHlwZV07Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqICAgIHBTdHJlYW1Db250ZXh0OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZVBvczsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNEVSUl9GSUxFX05PVF9GT1VORCA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgOwotICAgIE00T1NBX1VJbnQzMiBkYXRhIDsKLSAgICBNNE9TQV9DaGFyICpNNF9Ub2tlbjsKLSAgICBNNE9TQV9VSW50MzIgKnRva2VuUHRyOwotCi0gICAgLyogSGVhZGVyIGZvciBBTVIgTkIgKi8KLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SXzEgICAgICAgPSAweDRkNDEyMTIzOwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfTkJfMiAgICA9IDB4MDAwMDBhNTI7Ci0KLSAgICAvKiBIZWFkZXIgZm9yIEFNUiBXQiAqLwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfV0JfMiAgICA9IDB4NDI1NzJkNTI7Ci0gICAgTTRPU0FfVUludDMyIE00X0FNUl9XQl8zICAgID0gMHgwMDAwMDAwYTsKLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSxNNEVSUl9QQVJBTUVURVIsIkZpbGUgRGVzYy4gTTRPU0FfTlVMTCIpOwotCi0gICAgTTRfVG9rZW4gPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9NZW1BZGRyMzIpKjMsIE00QU1SX1JFQURFUiwKLSAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikoIk00X1Rva2VuIikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gTTRfVG9rZW4pCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjMoKE00T1NBX05VTEwgPT0gTTRfVG9rZW4pLE00RVJSX0FMTE9DLCJNZW0gQWxsb2MgZmFpbGVkIC0gTTRfVG9rZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DIDsKLSAgICB9Ci0KLSAgICBwU3RyZWFtQ29udGV4dD0gKE00X0FNUlJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BTVJSX0NvbnRleHQpLCBNNEFNUl9SRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQiKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoTTRfVG9rZW4pOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DIDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBjb250ZXh0ICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkID0gTTRBTVJSX0NPTlRFWFRJRDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9BTVJSX0NvbnRleHQpOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0PXBGaWxlRnVuY3Rpb24gOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUgPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa09wZW5pbmcgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXggPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgPSAwOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSA9IDAgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgZXJyPXBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5vcGVuUmVhZCgmcFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgIChNNE9TQV9DaGFyKilwRmlsZURlc2NyaXB0b3IsTTRPU0Ffa0ZpbGVSZWFkICk7Ci0gICAgaWYgKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICAvKiBNNE9TQV9ERUJVR19JRjMoKGVyciAhPSBNNE5PX0VSUk9SKSxlcnIsIkZpbGUgb3BlbiBmYWlsZWQiKTsgKi8KLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dCk7Ci0gICAgICAgIGZyZWUoTTRfVG9rZW4pOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLSAgICAgICAgcmV0dXJuIGVyciA7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tPcGVuaW5nIDsKLQotICAgIHNpemUgPSA2OwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRfVG9rZW4sICZzaXplKTsKLSAgICBpZihzaXplICE9IDYpCi0gICAgewotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgdG9rZW5QdHIgPSAoTTRPU0FfVUludDMyKilNNF9Ub2tlbiA7Ci0gICAgLyogQ2hlY2sgZm9yIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBoZWFkZXIgY29tbW9uIHRvIFdCIGFuZCBOQiovCi0gICAgaWYgKCp0b2tlblB0ciAhPSBNNF9BTVJfMSkKLSAgICB7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICB0b2tlblB0cisrOwotICAgIGRhdGEgPSAqdG9rZW5QdHIgJiAweDAwMDBGRkZGIDsKLSAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCBwYXJ0IGlzIE5hcnJvdyBiYW5kIGhlYWRlciAqLwotICAgIGlmIChkYXRhIT0gTTRfQU1SX05CXzIpCi0gICAgewotICAgICAgICAvKiBTdHJlYW0gaXMgQU1SIFdpZGUgQmFuZCAqLwotICAgICAgICBmaWxlUG9zID0gNDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgICAgIHNpemUgPSA1OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00X1Rva2VuLCAmc2l6ZSk7Ci0gICAgICAgIGlmKHNpemUgIT0gNSkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgdG9rZW5QdHI9KE00T1NBX1VJbnQzMiopTTRfVG9rZW47Ci0gICAgICAgIC8qIENoZWNrIGZvciB0aGUgV2lkZSBiYW5kIGhhZGVyICovCi0gICAgICAgIGlmKCp0b2tlblB0ciE9IE00X0FNUl9XQl8yKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB0b2tlblB0cisrOwotICAgICAgICBkYXRhID0gKnRva2VuUHRyICYgMHgwMDAwMDBGRiA7Ci0gICAgICAgIGlmKGRhdGEhPSBNNF9BTVJfV0JfMykKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9IE00U1lTX2tBTVJfV0IgOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTdHJlYW0gaXMgYSBOYXJyb3cgYmFuZCBzdHJlYW0gKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9IE00U1lTX2tBTVIgOwotICAgIH0KLSAgICAvKiAgTm8gUHJvZmlsZSBsZXZlbCBkZWZpbmVkICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tPcGVuZWQ7Ci0KLSAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAqcENvbnRleHQgPSBwU3RyZWFtQ29udGV4dCA7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLWNsZWFudXA6Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKQotICAgIHsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPmNsb3NlUmVhZChwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSk7Ci0gICAgfQotCi0gICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgZnJlZShwU3RyZWFtQ29udGV4dCk7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9OT1RfQ09NUExJQU5UOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqICAgIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgICAgIGZyYW1lSGVhZGVyLCBmcmFtZVR5cGUgOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2l6ZSwgYXVDb3VudD0wOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZVBvczsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyZWFtRGVzYyksTTRFUlJfUEFSQU1FVEVSLCJTdHJlYW0gRGVzYy4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTSA7Ci0gICAgfQotCi0gICAgc2l6ZSA9IDE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotCi0gICAgLyogWEZGRiBGWFhYIC0+IEYgaXMgdGhlIEZyYW1lIHR5cGUgKi8KLSAgICBmcmFtZVR5cGUgPSAoIGZyYW1lSGVhZGVyICYgMHg3OCApID4+IDMgOwotCi0gICAgaWYgKCBmcmFtZVR5cGUgPT0gMTUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX0RBVEFfWUVUIDsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKSAmJiAoIGZyYW1lVHlwZSA+IDExICkpCi0gICAgewotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgIH0KLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApICYmICggZnJhbWVUeXBlID4gOSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICAvKiBBdmVyYWdlIGJpdCByYXRlIGlzIGFzc2lnbmVkIHRoZSBiaXRyYXRlIG9mIHRoZSBmaXJzdCBmcmFtZSAqLwotICAgIHBTdHJlYW1EZXNjLT5hdmVyYWdlQml0cmF0ZSA9IE00QU1SUl9nZXRCaXRyYXRlKGZyYW1lVHlwZSxwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLQotICAgIGZpbGVQb3MgPSAtMTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwKLSAgICAgICAgICZmaWxlUG9zKTsKLQotICAgIC8qIEluaXRpYWxpemUgcFN0cmVhbURlc2MgKi8KLSAgICBwU3RyZWFtRGVzYy0+cHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMCA7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtRGVzYy0+bWF4Qml0cmF0ZSA9IChwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09Ci0gICAgICAgIE00U1lTX2tBTVIgKT9NNEFNUlJfTkJfTUFYX0JJVF9SQVRFOk00QU1SUl9XQl9NQVhfQklUX1JBVEU7Ci0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1JRCA9IDE7Ci0gICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlOwotCi0gICAgLyogVGltZXNjYWxlIGVxdWFscyBTYW1wbGluZyBGcmVxdWVuY3k6IE5CLTgwMDAgSHosIFdCLTE2MDAwIEh6ICovCi0gICAgcFN0cmVhbURlc2MtPnRpbWVTY2FsZSA9IChwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKT84MDAwOjE2MDAwOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IE00T1NBX1RJTUVfVU5LTk9XTjsKLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyID0KLSAgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksCi0gICAgICAgICAgICAgTTRBTVJfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIiKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSBTdHJlYW0gRGVzYy4gaW50byB0aGUgQ29udGV4dCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5hdmVyYWdlQml0cmF0ZSA9IHBTdHJlYW1EZXNjLT5hdmVyYWdlQml0cmF0ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDAgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiA9IE00T1NBX1RJTUVfVU5LTk9XTjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+cHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnN0cmVhbUlEID0gMTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+c3RyZWFtVHlwZSA9IHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+dGltZVNjYWxlID0gcFN0cmVhbURlc2MtPnRpbWVTY2FsZSA7Ci0KLSAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIEFjY2VzcyBVbml0IGluIHRoZSBGaWxlIHRvIGdldCB0aGUgKi8KLSAgICAvKiBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtID0gMjAgbXMgKiBudW1iZXIgb2YgYWNjZXNzIHVuaXQgKi8KLSAgICB3aGlsZSgxKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0gICAgICAgIGlmICggc2l6ZSA9PSAwKQotICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICBmcmFtZVR5cGUgPSAoZnJhbWVIZWFkZXIgJiAweDc4KSA+PiAzIDsKLSAgICAgICAgLyogR2V0IHRoZSBmcmFtZSBzaXplIGFuZCBza2lwIHNvIG1hbnkgYnl0ZXMgKi8KLSAgICAgICAgaWYoZnJhbWVUeXBlICE9IDE1KXsKLSAgICAgICAgICAgIC8qIEdMQSAyMDA1MDYyOCB3aGVuIGZyYW1ldHlwZSBpcyA+MTAgd2UgcmVhZCBvdmVyIGEgdGFibGUgKi8KLSAgICAgICAgICAgIGlmKGZyYW1lVHlwZSA+IDEwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlIDsKLQotICAgICAgICAgICAgc2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIGlmKHNpemUgPiBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSA9IHNpemUgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsZVBvcyA9IHNpemUtMTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICBhdUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBFYWNoIEZyYW1lIGlzIDIwIG0gU2VjLiAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiA9IGF1Q291bnQgKiBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICBwU3RyZWFtRGVzYy0+ZHVyYXRpb24gPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gOwotCi0gICAgLyogUHV0IHRoZSBmaWxlIHBvaW50ZXIgYmFjayBhdCB0aGUgZmlyc3QgQWNjZXNzIHVuaXQgKi8KLSAgICBpZiggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSA2OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICB9Ci0gICAgaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKQotICAgIHsKLSAgICAgICAgZmlsZVBvcyA9IDk7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0ludDMyIHNpemUgPSAwIDsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSURzKSxNNEVSUl9QQVJBTUVURVIsIlN0cmVhbSBJZHMuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgd2hpbGUoIHBTdHJlYW1JRHNbc2l6ZV0gIT0gMCApCi0gICAgewotICAgICAgICBpZiggcFN0cmVhbUlEc1tzaXplKytdICE9IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRCA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGRhdGEgQWRkcmVzcyBmb3IgdXNlIGluIE5leHRBVSgpICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgewotICAgICAgICBzaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplIDsKLSAgICAgICAgLyogZGF0YUFkZHJlc3MgaXMgb3duZWQgYnkgUGFyc2VyLCBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGRlbGV0ZSBvciBmcmVlIGl0ICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyA9KE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZSArICg0IC0gc2l6ZSAlIDQpLAotICAgICAgICAgICAgTTRBTVJfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzIikpOwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMygoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpLE00RVJSX0FMTE9DLAotICAgICAgICAgICAgICAgICAgICAiTWVtIEFsbG9jIGZhaWxlZCAtIGRhdGFBZGRyZXNzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBzdGF0ZSBvZiBjb250ZXh0IHRvIFJlYWRpbmcgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmcgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX25leHRBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9DaGFyICAgICAgICBmcmFtZUhlYWRlciA7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgYXVTaXplOwotICAgIE00T1NBX1VJbnQzMiAgICBzaXplIDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEF1KSxNNEVSUl9QQVJBTUVURVIsIkFjY2VzcyBVbml0IC4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rUmVhZGluZyksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgaWYgKCBTdHJlYW1JRCAhPSAxICkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICAvKiBSZWFkIHRoZSBmcmFtZSBoZWFkZXIgYnl0ZSAqLwotICAgIHNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemU7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcywgJnNpemUpOwotICAgIGlmKHNpemUgIT0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgZnJhbWVIZWFkZXIgPSAoKE00T1NBX01lbUFkZHI4KXBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcylbMF07Ci0KLSAgICBmcmFtZVR5cGUgPSAoIGZyYW1lSGVhZGVyICYgMHg3OCApID4+IDMgOwotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkgJiYKLSAgICAgICAgKCBmcmFtZVR5cGUgPiAxMSApICYmICggZnJhbWVUeXBlICE9IDE1ICkpCi0gICAgewotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgIH0KLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApICYmCi0gICAgICAgICggZnJhbWVUeXBlID4gOSApICYmICggZnJhbWVUeXBlICE9IDE1ICkpCi0gICAgewotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgZnJhbWUgc2l6ZSAqLwotICAgIGlmKGZyYW1lVHlwZSA9PSAxNSkKLSAgICB7Ci0gICAgICAgIGF1U2l6ZSA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGF1U2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICB9Ci0KLSAgICBzaXplIC09IGF1U2l6ZSA7Ci0gICAgaWYoc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgICAgZmlsZVBvcyA9IC0oKE00T1NBX0ZpbGVQb3NpdGlvbilzaXplKTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgIH0KLQotICAgIHBBdS0+c2l6ZSA9IGF1U2l6ZSA7Ci0KLSAgICAvKiBldmVuIHdoZW4gZnJhbWVUeXBlID09IDE1IChubyBkYXRhIGZyYW1lKSwgQVJNIGNvcmUgZGVjb2RlciBvdXRwdXRzIGZ1bGwgUENNIGJ1ZmZlciAqLwotICAgIC8qaWYoZnJhbWVUeXBlID09IDE1ICkKLSAgICB7Ci0gICAgICAgIHBBdS0+Q1RTICs9IDA7Ci0gICAgfSovCi0gICAgLyplbHNlKi8KLSAgICB7Ci0gICAgICAgIHBBdS0+Q1RTICs9IE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgIH0KLQotCi0gICAgcEF1LT5EVFMgPSBwQXUtPkNUUyA7Ci0gICAgcEF1LT5hdHRyaWJ1dGUgPSBNNFNZU19rRnJhZ0F0dHJPazsKLQotICAgIHBBdS0+c3RyZWFtID0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXI7Ci0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyA7Ci0KLSAgICBpZihmcmFtZUhlYWRlciAmIDB4ODApCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIGltcGxlbWVudCBOZXh0QXUtPmZyZWVBdS0+TmV4dEF1IEZTTSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZ19uZXh0QVUgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBdSksTTRFUlJfUEFSQU1FVEVSLCJBY2Nlc3MgVW5pdCAuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVKSwgTTRFUlJfU1RBVEUsCi0gICAgICAgICAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgaWYgKCggU3RyZWFtSUQgIT0gMSApICYmICggU3RyZWFtSUQgIT0gMCkpCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHRoZSBzdGF0ZSB0byBSZWFkaW5nIHNvIGFzIHRvIGFsbG93IGFjY2VzcyB0byBuZXh0IEFVICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBjb3VudCwgcHJldkFVLCBuZXh0QVUgOwotICAgIE00T1NBX1VJbnQzMiBzaXplIDsKLSAgICBNNE9TQV9VSW50MzIgYXVTaXplIDsKLSAgICBNNE9TQV9VSW50MzIgcG9zaXRpb24sIHBhcnRTZWVrVGltZTsKLSAgICBNNE9TQV9VSW50MzIgYXVDb3VudCA9IDAsIHNraXBBdUNvdW50ID0gMCA7Ci0gICAgTTRPU0FfQ2hhciAgICBmcmFtZUhlYWRlciA7Ci0gICAgTTRPU0FfQ2hhciAgICBmcmFtZVR5cGUgOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZVBvczsKLSAgICBNNE9TQV9Eb3VibGUgdGltZV9kb3VibGU7Ci0KLSAgICAvKk1ha2UgZXhwbGljaXQgdGltZSBjYXN0LCBidXQgdGFrZSBjYXJlIHRoYXQgdGltZXNjYWxlIGlzIG5vdCB1c2VkICEhISovCi0gICAgTTRPU0FfVElNRV9UT19NUyh0aW1lX2RvdWJsZSwgdGltZSwgMTAwMCk7Ci0KLSAgICAqcE9idGFpbkNUUyA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa1JlYWRpbmcpICYmIFwKLSAgICAgICAgKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHRpbWVfZG91YmxlIDwgMCksTTRFUlJfUEFSQU1FVEVSLCJuZWdhdGl2ZSB0aW1lIik7Ci0KLSAgICAvKiBDb21pbmcgdG8gc2VlayBmb3IgdGhlIGZpcnN0IHRpbWUsIG5lZWQgdG8gYnVpbGQgdGhlIHNlZWtJbmRleCBUYWJsZSAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RvdWJsZSBkdXJhdGlvbl9kb3VibGU7Ci0KLSAgICAgICAgY291bnQgPSAwIDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00QU1SUl9OVU1fU0VFS19FTlRSSUVTICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgiKSk7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjMoKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCksTTRFUlJfQUxMT0MsCi0gICAgICAgICAgICAgICAgIk1lbSBBbGxvYyBGYWlsZWQgLSBTZWVrSW5kZXgiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBwb2ludCB0byB0aGUgZmlyc3QgQVUgKi8KLSAgICAgICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyppZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApKi8KLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDk7Ci0gICAgICAgIH0KLQotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLQotICAgICAgICAvKiBTZXQgdGhlIHBvc3Rpb24gdG8gYmVnaW5pbmcgb2YgZmlyc3QgQVUgKi8KLSAgICAgICAgcG9zaXRpb24gPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSAhPSBNNFNZU19rQU1SKT85OjY7Ci0KLSAgICAgICAgLypNYWtlIGV4cGxpY2l0IHRpbWUgY2FzdCwgYnV0IHRha2UgY2FyZSB0aGF0IHRpbWVzY2FsZSBpcyBub3QgdXNlZCAhISEqLwotICAgICAgICBNNE9TQV9USU1FX1RPX01TKGR1cmF0aW9uX2RvdWJsZSwgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uLCAxMDAwKTsKLQotICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIHNlZWsgSW50ZXJ2YWwgZHVyYXRpb24gYmFzZWQgb24gdG90YWwgZHV0YXRpb24gKi8KLSAgICAgICAgLyogSW50ZXJ2YWwgPSAoZHVyYXRpb24gLyBFTlRSSUVTKSBpbiBtdWx0aXBsZXMgb2YgQVUgZnJhbWUgbGVuZ3RoICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoZHVyYXRpb25fZG91YmxlIC8gTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMpIDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsIC89IE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgKj0gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgIHNraXBBdUNvdW50ID0gcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsIC8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFtjb3VudCsrXT1wb3NpdGlvbjsKLSAgICAgICAgd2hpbGUoY291bnQgPCBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNpemUgPSAxOwotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIHNpemUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhayA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZVR5cGUgPSAoZnJhbWVIZWFkZXIgJiAweDc4KSA+PiAzIDsKLSAgICAgICAgICAgIGlmKGZyYW1lVHlwZSAhPSAxNSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IGJ1Z2ZpeCBSb25hbiBDb3VzeW4gMDUvMDQvMjAwNjogSW4gdGhlIGNvcmUgcmVhZGVyIEFNUiwgdGhlCi0gICAgICAgICAgICAgICAgICogZnVuY3Rpb24gTTRBTVJSX3NlZWsgZG9lc24ndCBjaGVjayB0aGUgZnJhbWVUeXBlICovCi0gICAgICAgICAgICAgICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkgJiYgKCBmcmFtZVR5cGUgPiAxMCApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApICYmICggZnJhbWVUeXBlID4gOSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1U2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBhdVNpemUgOwotICAgICAgICAgICAgICAgIGZpbGVQb3MgPSBhdVNpemUtMTsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICAgICAgICAgICAgICBhdUNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBTa2lwIHRoZSBudW1iZXIgb2YgQVUncyBhcyBwZXIgaW50ZXJ2YWwgYW5kIHN0b3JlIGluIHRoZSBJbmRleCB0YWJsZSAqLwotICAgICAgICAgICAgaWYgKCAoc2tpcEF1Q291bnQgIT0gMCkgJiYgIShhdUNvdW50ICUgc2tpcEF1Q291bnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbY291bnQrK10gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0vKiBFbmQgb2YgQnVpbGRpbmcgdGhlIHNlZWsgdGFibGUgKi8KLQotICAgIC8qIFVzZSB0aGUgc2VlayB0YWJsZSB0byBzZWVrIHRoZSByZXF1aXJlZCB0aW1lIGluIHRoZSBzdHJlYW0gKi8KLQotICAgIC8qIElmIHdlIGFyZSBzZWVraW5nIHRoZSBiZWdpbmluZyBvZiB0aGUgZmlsZSBwb2ludCB0byBmaXJzdCBBVSAqLwotICAgIGlmICggc2Vla01vZGUgPT0gTTRTWVNfa0JlZ2lubmluZyApCi0gICAgewotICAgICAgICBpZiggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKmlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gOTsKLSAgICAgICAgfQotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zICk7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIE5lYXJlc3QgU2Vjb25kICovCi0gICAgaWYgKDAgIT0gcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsKQotICAgIHsKLSAgICAgICAgcG9zaXRpb24gPSAoTTRPU0FfVUludDMyKSh0aW1lX2RvdWJsZSAvIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qYXZvaWQgZGl2aXNpb24gYnkgMCovCi0gICAgICAgIHBvc2l0aW9uID0gMDsKLSAgICB9Ci0KLSAgICAvKiBXZSBoYXZlIG9ubHkgNDAgc2VlayBJbmRleC4gKi8KLSAgICBwb3NpdGlvbj0ocG9zaXRpb24gPj0gTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMpP000QU1SUl9OVU1fU0VFS19FTlRSSUVTLTE6cG9zaXRpb247Ci0KLSAgICAvKiBTZWVrSW5kZXggd2lsbCBwb2ludCB0byBuZWFyZXN0IEF1LCB3ZSBuZWVkIHRvIHNlYXJjaCBmb3IgdGhlCi0gICAgcmVxdWlyZWQgdGltZSBmb3JtIHRoYXQgcG9zaXRpb24gKi8KLSAgICBwYXJ0U2Vla1RpbWUgPSAoTTRPU0FfVUludDMyKXRpbWVfZG91YmxlIC0gcG9zaXRpb24gKiBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWw7Ci0KLSAgICBwb3NpdGlvbiA9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbcG9zaXRpb25dOwotCi0gICAgaWYoIXBvc2l0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRSA7Ci0gICAgfQotCi0gICAgLyogcG9pbnQgdGhlIGZpbGUgcG9pbnRlciB0byBuZWFyZXN0IEFVICovCi0gICAgZmlsZVBvcyA9IHBvc2l0aW9uOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAmZmlsZVBvcyApOwotCi0gICAgaWYgKCBwYXJ0U2Vla1RpbWUgPT0gMCkKLSAgICB7Ci0gICAgICAgICpwT2J0YWluQ1RTID0gdGltZTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgKnBPYnRhaW5DVFMgPSAoTTRPU0FfVGltZSkodGltZV9kb3VibGUgLSAoTTRPU0FfRG91YmxlKXBhcnRTZWVrVGltZSk7Ci0KLSAgICBzd2l0Y2goc2Vla01vZGUpCi0gICAgewotICAgICAgICAvKiBHZXQgdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rUHJldmlvdXNSQVA6Ci0gICAgICAgIGNhc2UgTTRTWVNfa05vUkFQcHJldmlvdXM6Ci0gICAgICAgICAgICBwb3NpdGlvbiA9IHBhcnRTZWVrVGltZSAvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICAgICAgaWYgKCAhKHBhcnRTZWVrVGltZSAlIE00QU1SUl9GUkFNRV9MRU5HVEgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiAtLSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAvKiBHZXQgdGhlIENsb3Nlc3QgQVUgZm9sbG93aW5nIHRoZSB0YXJnZXQgdGltZSAqLwotICAgICAgICBjYXNlIE00U1lTX2tOZXh0UkFQOgotICAgICAgICBjYXNlIE00U1lTX2tOb1JBUG5leHQ6Ci0gICAgICAgICAgICBwb3NpdGlvbiA9IChwYXJ0U2Vla1RpbWUgKyBNNEFNUlJfRlJBTUVfTEVOR1RIICkvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICBicmVhazsKLSAgICAgICAgLyogIEdldCB0aGUgY2xvc2VzdCBBVSB0byB0YXJnZXQgdGltZSAqLwotICAgICAgICBjYXNlIE00U1lTX2tDbG9zZXN0UkFQOgotICAgICAgICBjYXNlIE00U1lTX2tOb1JBUGNsb3Nlc3Q6Ci0gICAgICAgICAgICBwcmV2QVUgPSBwYXJ0U2Vla1RpbWUtKHBhcnRTZWVrVGltZS9NNEFNUlJfRlJBTUVfTEVOR1RIKSpNNEFNUlJfRlJBTUVfTEVOR1RIOwotICAgICAgICAgICAgbmV4dEFVID0KLSAgICAgICAgICAgICAgICAgKChwYXJ0U2Vla1RpbWUrTTRBTVJSX0ZSQU1FX0xFTkdUSCkvTTRBTVJSX0ZSQU1FX0xFTkdUSCkqTTRBTVJSX0ZSQU1FX0xFTkdUSCAtXAotICAgICAgICAgICAgICAgICAgICAgcGFydFNlZWtUaW1lIDsKLSAgICAgICAgICAgIGlmKHByZXZBVSA8IG5leHRBVSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBhcnRTZWVrVGltZSAvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gKHBhcnRTZWVrVGltZSArIE00QU1SUl9GUkFNRV9MRU5HVEggKS8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00U1lTX2tCZWdpbm5pbmc6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNvdW50ID0gMCA7Ci0gICAgLyogU2tpcCB0aGUgQWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbSB0byBza2lwIHRoZSBwYXJ0IHNlZWsgdGltZSwKLSAgICAgICB0byByZWFjaCB0aGUgcmVxdWlyZWQgdGFyZ2V0IHRpbWUgKi8KLSAgICB3aGlsZShjb3VudCA8IHBvc2l0aW9uICkKLSAgICB7Ci0gICAgICAgIHNpemUgPSAxOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICBpZiAoIHNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgdGhlIHRhcmdldCB0aW1lIGlzIGludmFsaWQsIHBvaW50IHRvIGJlZ2luaW5nIGFuZCByZXR1cm4gKi8KLSAgICAgICAgICAgICpwT2J0YWluQ1RTID0gMDsKLSAgICAgICAgICAgIGZpbGVQb3MgPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4WzBdOwotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRSA7Ci0gICAgICAgIH0KLSAgICAgICAgKnBPYnRhaW5DVFMgKz0gTTRBTVJSX0ZSQU1FX0xFTkdUSDsgLypTaG91bGQgdXNlIE00T1NBX0lOVDY0X0FERCAhISovCi0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGZyYW1lVHlwZSA9IChmcmFtZUhlYWRlciAmIDB4NzgpID4+IDMgOwotICAgICAgICBpZihmcmFtZVR5cGUgPT0gMTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF1U2l6ZSA9IDEgOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXVTaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlsZVBvcyA9IGF1U2l6ZS0xOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLQotICAgIC8qIENsb3NlIHRoZSBBTVIgc3RyZWFtICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPmNsb3NlUmVhZChwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSk7Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXM9TTRBTVJSX2tDbG9zZWQgOwotCi0gICAgLyogQ2hlY2sgaWYgQVUgZGF0YSBBZGRyZXNzIGlzIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGZyZWUgaXQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcykKLSAgICB7Ci0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3RyZWFtIGhhbmRsZXIgaXMgYWxsb2NhdGVkIG1lbW9yeSAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKiBTZWVrIHRhYmxlIGlzIGNyZWF0ZWQgb25seSB3aGVuIHNlZWsgaXMgdXNlZCwgc28gY2hlY2sgaWYgbWVtb3J5IGlzIGFsbG9jYXRlZCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCkKLSAgICB7Ci0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCk7Ci0gICAgfQotCi0gICAgLyogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0KLSAgICBpZiAoKCBzdHJlYW1JZCAhPSAxICkgJiYgKCBzdHJlYW1JZCAhPSAwKSkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICAqcFN0YXRlID0gcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFMV8xKCJNNEFNUlJfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbjogMHgleFxuIiwgcFZlcnNpb24pOwotICAgIE00T1NBX0RFQlVHX0lGMSgoKE00T1NBX1VJbnQzMikgcFZlcnNpb24gPT0gMCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBWZXJzaW9uIGlzIE5VTEwgaW4gTTRBTVJSX2dldFZlcnNpb24iKTsKLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRBTVJSX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNEFNUlJfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbi0+bV9yZXZpc2lvbiA9IE00QU1SUl9WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldG1heEFVc2l6ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00T1NBX1VJbnQzMiAqcE1heEF1U2l6ZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSwgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBTVJSX2dldG1heEFVc2l6ZTogQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBNYXhBdVNpemUpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBTVJSX2dldG1heEFVc2l6ZTogcE1heEF1U2l6ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcE1heEF1U2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000Q2hhbm5lbENvbnZlcnRlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmNhNTU1MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000Q2hhbm5lbENvbnZlcnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00Q2hhbm5lbENvdmVydGVyLmMKLSAqIEBicmllZgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi12b2lkIE1vbm9UbzJJXzE2KCBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pCi17Ci0gICAgc2hvcnQgaWk7Ci0gICAgc3JjICs9IG4tMTsKLSAgICBkc3QgKz0gKG4qMiktMTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgKmRzdC0tID0gKnNyYzsKLSAgICAgICAgKmRzdC0tID0gKnNyYy0tOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKQotewotICAgIHNob3J0IGlpOwotICAgIGxvbmcgVGVtcDsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgIFRlbXAgPSAobG9uZykqKHNyYysrKTsKLSAgICAgICAgVGVtcCArPSAobG9uZykqKHNyYysrKTsKLSAgICAgICAgKihkc3QrKykgPSAoc2hvcnQpKFRlbXAgPj4xKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRERUNPREVSX051bGwuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRERUNPREVSX051bGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyNjBlNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdA0KLSAqDQotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vKioNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGZpbGUgICAgTTRERUNPREVSX051bGwuYw0KLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOdWxsIGRlY29kZXIgcHVibGljIGludGVyZmFjZQ0KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgIm51bGwiIHZpZGVvIGRlY29kZXIsIGkuZS4gYSBkZWNvZGVyDQotICogICAgICAgICAgdGhhdCBkb2VzIG5vdGhpbmcNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIg0KLQ0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIg0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIg0KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCINCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIg0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiDQotI2luY2x1ZGUgIk00REVDT0RFUl9OdWxsLmgiDQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIE5VTEwgVmlkZW8gRGVjb2RlciB2ZXJzaW9uIGluZm9ybWF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLw0KLSNkZWZpbmUgTTRERUNPREVSX05VTExfTUFKT1IgICAgMQ0KLSNkZWZpbmUgTTRERUNPREVSX05VTExfTUlOT1IgICAgMA0KLSNkZWZpbmUgTTRERUNPREVSX05VTExfUkVWSVNJT04gMA0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQNCi0gKiBAYnJpZWYgICAgICAgRGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHZpZGVvIGRlY29kZXIgaW5zdGFuY2UNCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBmcmVlZCBieSB0aGUgdmlkZW8gZGVjb2Rlcg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgIG1fcExpYnJhcnk7ICAgICAgICAgICAgLy8gQ29yZSBsaWJyYXJ5IGlkZW50aWZpZXINCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fRGVjb2RlcklkOyAgICAgICAgICAgLy8gQ29yZSBkZWNvZGVyIGlkZW50aWZpZXINCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fUmVuZGVyZXJJZDsgICAgICAgICAgLy8gQ29yZSByZW5kZXJlciBpZGVudGlmaWVyDQotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogICBtX3BWaWRlb1N0cmVhbWhhbmRsZXI7IC8vIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbg0KLSAgICBNNF9BY2Nlc3NVbml0KiAgICAgICAgICAgbV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsgLy8gQWNjZXNzIHVuaXQgdXNlZCB0bw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBhbmQgZGVjb2RlIG9uZSBmcmFtZQ0KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgbV9wVXNlckRhdGE7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGFueSB1c2VyIGRhdGENCi0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogIG1fcFJlYWRlcjsgICAgICAgICAgICAgLy8gUmVhZGVyIGRhdGEgaW50ZXJmYWNlDQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBtX2JEb1JlbmRlcmluZzsgICAgICAgIC8vIERlY2lkZXMgaWYgcmVuZGVyIHJlcXVpcmVkDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgIC8vIFNpemUgb2YgdGhlIHN0cnVjdHVyZQ0KLQ0KLSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyKiBtX3BWaWRlb0ZpbHRlcjsgICAgICAgICAvLyBDb2xvciBjb252ZXJzaW9uIGZpbHRlcg0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAqcERlY1l1dkRhdGE7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIFl1diBkYXRhIHBsYW5lDQotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICpwRGVjWXV2V2l0aEVmZmVjdDsgICAgIC8vIFBvaW50ZXIgdG8gWXV2IHBsYW5lIHdpdGggY29sb3IgZWZmZWN0DQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBiWXV2V2l0aEVmZmVjdFNldDsgICAgIC8vIE9yaWdpbmFsIFl1diBkYXRhIE9SIFl1diB3aXRoIGNvbG9yIGVmZmVjdA0KLQ0KLX0gTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKiBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBBbGxvY2F0ZXMgdGhlIGNvbnRleHQNCi0gKg0KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAgICAoT1VUKSAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICBQb2ludGVyIHRvIGEgdmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uDQotICogQHBhcmFtICAgcFNyY0ludGVyZmFjZTogIChJTikgICAgUG9pbnRlciB0byB0aGUgTTRSRUFERVJfRGF0YUludGVyZmFjZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB0aGF0IG11c3QgYmUgdXNlZCBieSB0aGUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0NCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKSB3aGVyZSBkZWNvZGVkIGRhdGENCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc3RvcmVkDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIEEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZA0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIEF0IGxlYXN0IG9uZSBpbnB1dCBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJlYWRlckRhdGFJbnRlcmZhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0KiBwQWNjZXNzVW5pdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgew0KLQ0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPSBNNE9TQV9OVUxMOw0KLQ0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dCA9IChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgNCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQpLCBNNERFQ09ERVJfTVBFRzQsDQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQiKTsNCi0gICAgaWYgKHBTdHJlYW1Db250ZXh0ID09IDApIHsNCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCi0gICAgfQ0KLQ0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KTsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wTGlicmFyeSAgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyICAgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9EZWNvZGVySWQgICAgICAgICAgICAgPSAtMTsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fUmVuZGVyZXJJZCAgICAgICAgICAgID0gLTE7DQotDQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BVc2VyRGF0YSA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX2JEb1JlbmRlcmluZyA9IE00T1NBX1RSVUU7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BWaWRlb0ZpbHRlciA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5iWXV2V2l0aEVmZmVjdFNldCA9IE00T1NBX0ZBTFNFOw0KLQ0KLSAgICAqcENvbnRleHQ9cFN0cmVhbUNvbnRleHQ7DQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgRGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZA0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgew0KLQ0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPSAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKXBDb250ZXh0Ow0KLQ0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpLA0KLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRERUNPREVSX05VTExfZGVzdHJveTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsNCi0NCi0gICAgZnJlZShwU3RyZWFtQ29udGV4dCk7DQotDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgR2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIEluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldA0KLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIHdoZXJlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQ0KLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICBGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgcFZhbHVlKSB7DQotDQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBTZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6DQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0DQotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgew0KLQ0KLSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyICpwRmlsdGVyT3B0aW9uOw0KLQ0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCAqcFN0cmVhbUNvbnRleHQgPQ0KLSAgICAgICAgKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Kiljb250ZXh0Ow0KLQ0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsNCi0gICAgTTRPU0FfVUludDMyIGhlaWdodCA9IDA7DQotICAgIE00T1NBX1VJbnQ4ICpwX3NyYywqcF9kZXM7DQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwVGVtcERlY1l1dkRhdGEgPSBNNE9TQV9OVUxMOw0KLQ0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKSB7DQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVjWXV2RGF0YToNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGEgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdENvbnRpZ3VvdXM6DQotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0ID0gKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3Q6DQotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID0gKE00T1NBX0Jvb2wpKGludHB0cl90KXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91czoNCi0gICAgICAgICAgICBwVGVtcERlY1l1dkRhdGEgPSAgKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyOg0KLSAgICAgICAgICAgIHBGaWx0ZXJPcHRpb24gPSAoTTRERUNPREVSX091dHB1dEZpbHRlciopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgRGVjb2RlIHZpZGVvIEFjY2VzcyBVbml0cyB1cCB0byBhIHRhcmdldCB0aW1lDQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgdmlkZW8gdW50aWwgaXQgY2FuIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UNCi0gKiAgICAgICAgICBmb3Igd2hpY2ggdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUNCi0gKiAgICAgICAgICBwYXNzZWQgdGFyZ2V0ZWQgdGltZS4NCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UgcGFzc2VkIHRvDQotICogICAgICAgICAgTTRERUNPREVSX01QRUc0X2NyZWF0ZS4NCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1zZWMpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXNlYykNCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQ0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0DQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKEVPUykNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLQ0KLSAgICAvLyBEbyBub3RoaW5nOyBpbnB1dCB0aW1lIHN0YW1wIGl0c2VsZiByZXR1cm5lZA0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFJlbmRlcnMgdGhlIHZpZGVvIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4NCi0gKiBAbm90ZQ0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1zZWNzKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpDQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgT3V0cHV0IHBsYW5lIGZpbGxlZCB3aXRoIGRlY29kZWQgZGF0YQ0KLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbmRlcmVkIGFscmVhZHkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkNCi0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0Ow0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQgPQ0KLSAgICAgICAgKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Kiljb250ZXh0Ow0KLQ0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID09IE00T1NBX1RSVUUpIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCh2b2lkICopcF9zcmMscE91dHB1dFBsYW5lWzJdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV9zdHJpZGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGVycjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZQ0KLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLg0KLSAqDQotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICBpZiBPSw0KLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlIChNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotDQotICAgICpwRGVjb2RlckludGVyZmFjZSA9DQotICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoDQotICAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksDQotICAgICAgICAgTTRERUNPREVSX01QRUc0LCAoTTRPU0FfQ2hhciAqKSJNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UiKTsNCi0NCi0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUDsNCi0NCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICA9IE00REVDT0RFUl9OVUxMX2NyZWF0ZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICA9IE00REVDT0RFUl9OVUxMX2Rlc3Ryb3k7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9zZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZWNvZGUgICAgPSBNNERFQ09ERVJfTlVMTF9kZWNvZGU7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZW5kZXIgICAgPSBNNERFQ09ERVJfTlVMTF9yZW5kZXI7DQotDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5ZjA3ZGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBDTV9QQ01SZWFkZXIuYwotICogQGJyaWVmICAgUENNIHJlYWRlciBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ00gcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTiAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIG9wZW5zIGEgUENNIGZpbGUKLSAqICAgICAgICAgIC0gaW5pdGlhbGl6ZXMgUENNIGNvbnRleHQsCi0gKiAgICAgICAgICAtIHZlcmlmaWVzIFBDTSBmaWxlIGZvcm1hdAotICogICAgICAgICAgLSBGaWxsIGRlY29kZXIgY29uZmlnIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2VzIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ09wZW5pbmcnCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKE9VVCkgUG9pbnRlciBvbiB0aGUgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwVXJsOiAoSU4pIE5hbWUgb2YgdGhlIFBDTSBmaWxlCi0gKiBAcGFyYW0gICBwRmlsZUZ1bmN0aW9uczogKElOKSBQb2ludGVyIG9uIHRoZSBmaWxlIGFjY2VzcyBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IgZHVyaW5nIHRoZSBvcGVuaW5nCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgIHBDb250ZXh0IGFuZC9vciBwVXJsIGFuZC9vciBwRmlsZUZ1bmN0aW9uIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICB0aGUgZmlsZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGNvbXBsaWFudCwgbm8gUklGRiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGFjayBvZiBhbnkgbWFuZGF0b3J5IGNodW5rLgotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICB0aGUgUENNIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcgotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgZXJyb3JzICAgICAgICAgICBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi17Ci0gICAgTTRPU0FfRVJSICAgICAgIGVycjsKLSAgICBNNFBDTVJfQ29udGV4dCAqY29udGV4dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgcFRlbXBVUkw7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgdmFsdWVbNl07Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gcENvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFVybCkgfHwoTTRPU0FfTlVMTCA9PSBwRmlsZUZ1bmN0aW9uKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfb3BlblJlYWQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCljb250ZXh0OwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIGNvbnRleHQtPm1fb2Zmc2V0ID0gMDsKLQotICAgIGNvbnRleHQtPm1fc3RhdGUgICAgICAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX21pY3JvU3RhdGUgICAgICAgPSBNNFBDTVJfa0luaXQ7Ci0gICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX2ZpbGVDb250ZXh0ICAgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9wRGVjb2RlclNwZWNJbmZvID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIFNldCBzYW1wbGUgZnJlcXVlbmN5ICovCi0gICAgcFRlbXBVUkwgPSAoTTRPU0FfQ2hhciopcFVybCArIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKS0xMSk7Ci0gICAgTTRPU0FfY2hyTkNvcHkodmFsdWUsIHBUZW1wVVJMLCA1KTsKLSAgICBNNE9TQV9jaHJHZXRVSW50MzIocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSksCi0gICAgICAgICBNNE9TQV9OVUxMLCBNNE9TQV9rY2hyRGVjKTsKLQotICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBwVGVtcFVSTCArPSA2OwotICAgIE00T1NBX2Nock5Db3B5KHZhbHVlLCBwVGVtcFVSTCwgMSk7Ci0gICAgTTRPU0FfY2hyR2V0VUludDE2KHBUZW1wVVJMLCAmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKSwKLSAgICAgICAgIE00T1NBX05VTEwsIE00T1NBX2tjaHJEZWMpOwotCi0gICAgTTRPU0FfY2hyTkNvcHkocFVybCxwVXJsLCAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTIpKTsKLSAgICAvKiBPcGVuIHRoZSBmaWxlICovCi0gICAgY29udGV4dC0+bV9maWxlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+b3BlblJlYWQoJihjb250ZXh0LT5tX2ZpbGVDb250ZXh0KSwgcFVybCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlID0gMTY7Ci0gICAgY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjID0gY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSAqIDIgXAotICAgICAgICAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOwotICAgIGVyciA9IHBGaWxlRnVuY3Rpb24tPmdldE9wdGlvbihjb250ZXh0LT5tX2ZpbGVDb250ZXh0LCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsgIC8vIFJhdyBQQ00uICBIZW5jZSwgZ2V0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNodW5rIG9mIGRhdGEKLQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlLCBubyBwYiAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzICpcCi0gICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgLyA1MCkgKiBcCi0gICAgICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlIC8gOCk7Ci0gICAgfQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gMTYwMDApCi0gICAgewotICAgICAgICAvKiBBQUMgY2FzZSwgd2UgY2FuJ3QgcmVhZCBvbmx5IDIwIG1zIGJsb2NrcyAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9kYXRhU3RhcnRPZmZzZXQgPSAwOwotICAgIGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyA9IHBGaWxlRnVuY3Rpb247Ci0KLSAgICBjb250ZXh0LT5tX3BBdUJ1ZmZlciA9IChNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGNvbnRleHQtPm1fYmxvY2tTaXplLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJDb3JlIFBDTSByZWFkZXIgQWNjZXNzIFVuaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0LT5tX3BBdUJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgY29udGV4dC0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZihjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jLT5jbG9zZVJlYWQoY29udGV4dC0+bV9maWxlQ29udGV4dCk7Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBmcmVlKGNvbnRleHQpOwotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSAodW5pcXVlKSBzdHJlYW0gb2YgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIEFsbG9jYXRlcyBhbmQgZmlsbHMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgZGVjb2RlciBzcGVjaWZpYyBpbmZvcyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgcFN0cmVhbURlc2Mgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTdHJlYW1EZXNjOiAoSU4pIFN0cmVhbSBEZXNjcmlwdGlvbiBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgICAgICBlcnJvcnMgc2VlIE9TQUwgRmlsZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxlZCBlcnJvcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KXx8IChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKGMtPm1fc3RhdGUgPT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgUmVhZGVyJ3MgbV9zdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIE9ubHkgb25lIHN0cmVhbSBpcyBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIC8qIE5vdCB1c2VkICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDA7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgIC8qIEFsbG9jYXRlcyBkZWNvZGVyIHNwZWNpZmljIGluZm8gc3RydWN0dXJlICovCi0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyksIE00V0FWX1JFQURFUiwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfZ2V0TmV4dFN0cmVhbSIpOwotICAgIGlmKHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qIEZpbGwgZGVjb2RlclNwZWNpZmljSW5mbyBzdHJ1Y3R1cmUsIHdpdGggZGVjb2RlciBjb25maWcgc3RydWN0dXJlIGZpbGxlZCBpbiAnb3BlbnJlYWQnCi0gICAgICAgICBmdW5jdGlvbiAqLwotICAgIG1lbWNweSgodm9pZCAqKXBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgKHZvaWQgKikmYy0+bV9kZWNvZGVyQ29uZmlnLCBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pKTsKLQotICAgIC8qIEZpbGwgb3RoZXIgZmllbGRzIG9mIHBTdHJlYW1EZXNjIHN0cnVjdHVyZSAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAxMDAwOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKSgoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpXAotICAgICAgICAgLyAoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpKSpwU3RyZWFtRGVzYy0+dGltZVNjYWxlKTsKLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMgKiA4Oy8qIGluIGJpdHMsIG11bHRpcGx5IGJ5IDgqLwotICAgIHBTdHJlYW1EZXNjLT5tYXhCaXRyYXRlID0gcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlOyAvKiBQQ00gc3RyZWFtIGhhcyBjb25zdGFudCBiaXRyYXRlICovCi0KLSAgICAvKiBEZXRlcm1pbmVzIFN0cmVhbSB0eXBlICovCi0gICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlKQotICAgIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzVTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgICAgICBjYXNlIDI6Ci0vLyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzUzsgLyogPz8/IDhiaXRzIHN0ZXJlbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGVmaW5lZCA/ICovCi0vLyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHN3aXRjaChjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNVOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIH0KLQotICAgIGMtPm1fcERlY29kZXJTcGVjSW5mbyA9IHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgcmVhZGluZyB0aGUgdW5pcXVlIHN0cmVhbSBvZiBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBhIHN0cmVhbQotICogICAgICAgICAgLSBDaGVjayB0aGF0IHByb3ZpZGVkIFN0cmVhbUlkIGlzIGNvcnJlY3QgKGFsd2F5cyB0cnVlLCBvbmx5IG9uZSBzdHJlYW0uLi4pCi0gKiAgICAgICAgICAgIEluIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24sIGEgU3RyZWFtSWQgdGFibGUgaXMgaW5pdGlhbGl6ZWQgYXMgZm9sbG93OgotICogICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHBTdHJlYW1JRFsyXT17MSwwfTsKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICogICAgICAgICAgKHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGFibGUgcFN0cmVhbUlEIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCBhcyBhYm92ZSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBTdHJlYW1JRCBhbmQgaWYgdGhleSdyZSBPSywgY2hhbmdlIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYocFN0cmVhbUlEc1swXSA9PSAxIHx8IHBTdHJlYW1JRHNbMF0gPT0gMCkKLSAgICAvKiBGaXJzdCBhbmQgdW5pcXVlIHN0cmVhbSBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICB7Ci0gICAgICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7Ci0gICAgICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCBBVSBjb250YWluZWQgaW4gdGhlIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gcmVhZCBhbiBBVQotICogICAgICAgICAgLSBBbGxvY2F0ZXMgbWVtb3J5IHRvIHN0b3JlIHJlYWQgQVUKLSAqICAgICAgICAgIC0gUmVhZCBkYXRhIGZyb20gZmlsZSBhbmQgc3RvcmUgdGhlbSBpbnRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQotICogICAgICAgICAgLSBGaWxsIEFVIHN0cnVjdHVyZSBmaWxlZHMgKENUUy4uLikKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZ19uZXh0QVUKLSAqICAgICAgICAgICAgKEFVIGlzIHJlYWQgYW5kIGNhbiBiZSBkZWxldGVkKQotICogICAgICAgICAgLSBDaGVjayBpZiB0aGUgbGFzdCBBVSBoYXMgYmVlbiByZWFkIG9yIGlmIHdlJ3JlIGFib3V0IHRvIHJlYWQgaXQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4vT1VUKSBBY2NlcyBVbml0IFN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00TTRXQVJfTk9fREFUQV9ZRVQgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgaW4gdGhlIGZpbGUgdG8gcHJvdmlkZSBhIG5ldyBhY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gIE00V0FSX0VORF9PRl9TVFJFQU0gVGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgc2FtcGxlIG51bWJlciBpcyBiaWdnZXIgdGhlIG1heGltdW0gb25lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcEFVKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZyAmJiBjLT5tX21pY3JvU3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlcyBBVSBkYXRhQWRyZXNzICovCi0gICAgcEFVLT5kYXRhQWRkcmVzcyA9IGMtPm1fcEF1QnVmZmVyOwotICAgIHNpemVfcmVhZCAgICAgICAgPSBjLT5tX2Jsb2NrU2l6ZTsKLQotICAgIGlmKChjLT5tX29mZnNldCArIHNpemVfcmVhZCkgPj0gYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpCi0gICAgewotICAgICAgICBzaXplX3JlYWQgPSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCAtIGMtPm1fb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSBpbiBmaWxlLCBhbmQgY29weSBpdCB0byBBVSBTdHJ1Y3R1cmUgKi8KLSAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPnJlYWREYXRhKGMtPm1fZmlsZUNvbnRleHQsIChNNE9TQV9NZW1BZGRyOClwQVUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgKE00T1NBX1VJbnQzMiAqKSZzaXplX3JlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGVzIHRoZSBuZXcgbV9vZmZzZXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgYXQgZW5kIG9mIHJlYWRpbmcgb3Igbm90ICovCi0gICAgYy0+bV9vZmZzZXQgPSBjLT5tX29mZnNldCArIHNpemVfcmVhZDsKLQotICAgIC8qIEZpbGwgb3RoZXJzIHBhcmFtZXRlcnMgb2YgQVUgc3RydWN0dXJlICovCi0gICAgcEFVLT5DVFMgPQotICAgICAgICAgKE00T1NBX1RpbWUpKCgoTTRPU0FfRG91YmxlKWMtPm1fb2Zmc2V0LyhNNE9TQV9Eb3VibGUpYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKVwKLSAgICAgICAgICAgICoxMDAwKTsKLSAgICBwQVUtPkRUUyA9IHBBVS0+Q1RTOwotCi0gICAgcEFVLT5hdHRyaWJ1dGUgID0gMDsKLSAgICBwQVUtPmZyYWcgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBBVS0+bmJGcmFnICAgICA9IDA7Ci0gICAgcEFVLT5zdHJlYW0gICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQVUtPnNpemUgICAgICAgPSBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGVzICovCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogTm90IGNoYW5nZWQgLi4uICovCi0gICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nX25leHRBVTsgLyogQVUgaXMgcmVhZCBhbmQgY2FuIGJlIGRlbGV0ZWQgKi8KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgQVUgdG8gcmVhZCAqLwotICAgIC8qIGllOiBpZiBkZWNvZGVkIG5iIG9mIGJ5dGVzID0gbmIgb2YgYnl0ZXMgdG8gZGVjb2RlLAotICAgICAgICAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gbW9yZSBBVSB0byBkZWNvZGUgKi8KLSAgICBpZihjLT5tX29mZnNldCA+PSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIEFVIHByb3ZpZGVkIGluIHBhcmFtZXRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGZyZWUgYW4gQVUKLSAqICAgICAgICAgIC0gRnJlZSBkYXRhQWRkcmVzcyBmaWVsZCBvZiBBVSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZyAoYW5vdGhlciBBVSBjYW4gYmUgcmVhZCkKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4pIEFjY2VzIFVuaXQgU3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQgKSB8fCAoTTRPU0FfTlVMTCA9PSBwQVUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nICYmIGMtPm1fbWljcm9TdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIHBBVS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ2hhbmdlIHN0YXRlcyAqLwotICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7IC8qIE5vdCBjaGFuZ2VkIC4uLiAqLwotICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogQVUgaXMgZGVsZXRlZCwgYW5vdGhlciBBVSBjYW4gYmUgcmVhZCAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIHRpbWUsIE00U1lTX3NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUqIHBPYnRhaW5DVFNbXSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgaW50byB0aGUgUENNIGZpbGUgYXQgdGhlIHByb3ZpZGVkIHRpbWUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZWVrCi0gKiAgICAgICAgICAtIERldGVybWluZXMgZnJvbSBwcm92aWRlZCB0aW1lIG1fb2Zmc2V0IHRvIHNlZWsgaW4gZmlsZQotICogICAgICAgICAgLSBJZiBtX29mZnNldCBpcyBjb3JyZWN0LCBzZWVrIGluIGZpbGUKLSAqICAgICAgICAgIC0gVXBkYXRlIG5ldyBtX29mZnNldCBpbiBQQ00gcmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24gKG5vdCB1c2VkLCBvbmx5IDEgc3RyZWFtKQotICogQHBhcmFtICAgdGltZTogKElOKSBUYXJnZXRlZCB0aW1lCi0gKiBAcGFyYW0gICBzZWVrTW9kZTogKElOKSBTZWxlY3RzIHRoZSBzZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICBwT2J0YWluQ1RTW106IChPVVQpIFJldHVybmVkIFRpbWUgKG5vdCB1c2VkKQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICBTcGVjaWZpZWQgdGltZSBpcyBub3QgcmVhY2hhYmxlCi0gKiBAcGFyYW0gICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICBUaGlzIHNlZWsgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSBzZWVrQWNjZXNzTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIG9mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgYWxpZ25tZW50OwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgJiYgYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtBY2Nlc3NNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICAgICAgLyogRGV0ZXJtaW5lIG1fb2Zmc2V0IGZyb20gdGltZSovCi0gICAgICAgICAgICBvZmZzZXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRpbWUgKiAoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKSAvIDEwMDApKTsKLSAgICAgICAgICAgIC8qKiBjaGVjayB0aGUgYWxpZ25tZW50IG9uIHNhbXBsZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgYWxpZ25tZW50ID0gYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMqYy0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUvODsKLSAgICAgICAgICAgIGlmIChvZmZzZXQlYWxpZ25tZW50ICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0IC09IG9mZnNldCVhbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmFkZCB0aGUgaGVhZGVyIG9mZnNldCovCi0gICAgICAgICAgICBvZmZzZXQgKz0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAvKiBJZiBtX29mZnNldCBpcyBvdmVyIGZpbGUgc2l6ZSAtPiBJbnZhbGlkIHRpbWUgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoYy0+bV9kYXRhU3RhcnRPZmZzZXQgKyBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTZWVrIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBzaXplX3JlYWQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gYy0+bV9wRmlsZVJlYWRGdW5jLT5zZWVrKGMtPm1fZmlsZUNvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiAqKSAmc2l6ZV9yZWFkKTsKLSAgICAgICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBtX29mZnNldCBpbiBNNFBDTVJfY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGMtPm1fb2Zmc2V0ID0gb2Zmc2V0IC0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBQQ00gZmlsZSwgYW5kIGZyZWVzIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyBjbG9zZSB0aGUgUENNIGZpbGUKLSAqICAgICAgICAgIC0gQ2xvc2VzIHRoZSBmaWxlCi0gKiAgICAgICAgICAtIEZyZWUgc3RydWN0dXJlcwotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihjLT5tX3BEZWNvZGVyU3BlY0luZm8gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoYy0+bV9wRGVjb2RlclNwZWNJbmZvKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLSAgICBlbHNlIGlmKGMtPm1fbWljcm9TdGF0ZSA9PSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEF1QnVmZmVyKQotICAgIHsKLSAgICAgICAgZnJlZShjLT5tX3BBdUJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjLT5tX3BGaWxlUmVhZEZ1bmMpCi0gICAgewotICAgICAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjLT5tX2ZpbGVDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjKQotICAgIHsKLSAgICAgICAgZnJlZShjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IG9wdGlvbiBvZiB0aGUgUENNIFJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGdldCBhbiBvcHRpb24KLSAqICAgICAgICAgIC0gUmV0dXJuIGNvcnJlc3BvbmRpbmcgb3B0aW9uIHZhbHVlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6IChPVVQpIFZhcmlhYmxlIHdoZXJlIHRoZSBvcHRpb24gdmFsdWUgaXMgcmV0dXJuZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwVmFsdWUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPShNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZClcCi0gICAgICAgICAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIERlcGVuZCBvZiB0aGUgT3B0aW9uSUQsIHRoZSB2YWx1ZSB0byByZXR1cm4gaXMgZGlmZmVyZW50ICovCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFBDTVJfa1BDTWJsb2NrU2l6ZToKLSAgICAgICAgICAgICpwVmFsdWUgPSAmYy0+bV9ibG9ja1NpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNldCBvcHRpb24gb2YgdGhlIFBDTSBSZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZXQgYW4gb3B0aW9uCi0gKiAgICAgICAgICAtIFNldCBjb3JyZXNwb25kaW5nIG9wdGlvbiB2YWx1ZQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgVmFsdWU6IChJTikgVmFyaWFibGUgd2hlcmUgdGhlIG9wdGlvbiB2YWx1ZSBpcyBzdG9yZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIFZhbHVlKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0oTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZigoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpXAotICAgICAgICAgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBEZXBlbmQgb2YgdGhlIE9wdGlvbklELCB0aGUgdmFsdWUgdG8gc2V0IGlzIGRpZmZlcmVudCAqLwotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRQQ01SX2tQQ01ibG9ja1NpemU6Ci0gICAgICAgICAgICBjLT5tX2Jsb2NrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHVpbnRwdHJfdClWYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBDTVJfZ2V0VmVyc2lvbiAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRQQ01SX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb246IDB4JXgiLCBwVmVyc2lvbik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCgoTTRPU0FfVUludDMyKSBwVmVyc2lvbiA9PSAwKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFZlcnNpb24gaXMgTlVMTCBpbiBNNFBDTVJfZ2V0VmVyc2lvbiIpOwotCi0gICAgcFZlcnNpb24tPm1fbWFqb3IgPSBNNFBDTVJfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00UENNUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uLT5tX3JldmlzaW9uID0gTTRQQ01SX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0MmZmYjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfQVBJLmMKLSAqIEBicmllZiAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qMTYgYnl0ZXMgc2lnbmF0dXJlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGdlbmVyYXRlZCAzZ3AgZmlsZXMgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1NJR05BVFVSRSAgICAgIk5YUC1TVyA6IFBUTzNHUFAiCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiAgT3VyIGhlYWRlciAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotCi0vKioKLSAqICBPdXIgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCIKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0jZW5kaWYKLQotCi0vKioKLSAqICBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiBWYXJpb3VzIE1hZ2ljYWxzICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE00UFRPM0dQUF9RVUFOVElaRVJfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgLyoqPCBRdWFudGl6ZXIgc3RlcCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1BST0ZJTEVfTEVWRUwgICAgICAgICAgICAweEZGICAgIC8qKjwgTm8gc3BlY2lmaWMgcHJvZmlsZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICovCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fQU1SX1RJTUVfU0NBTEUgICAgICAgICAgIDgwMDAgICAgLyoqPCBBTVIgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0JJVFJBVEVfUkVHVUxBVElPTl9DVFNfUEVSSU9EX0lOX01TICAgNTAwICAgICAvKio8IE1BR0lDQUwgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX01BUkdFX09GX0ZJTEVfU0laRSAgICAgICAgICAgICAgICAgICAgMjUwMDAgICAvKio8IE1BR0lDQUwgKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZGVmaW5lICAgQU1SIDEyLjIga2JwcyBzaWxlbmNlIGZyYW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkUgICAgIDMyCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfRFVSQVRJT04gMjAKLWNvbnN0IE00T1NBX1VJbnQ4IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8xMjJfRlJBTUVbTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFXT0KLXsgMHgzQywgMHg5MSwgMHgxNywgMHgxNiwgMHhCRSwgMHg2NiwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwMSwgMHhFNywgMHhBRiwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSAgICAgMTMKLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTiAyMAotY29uc3QgTTRPU0FfVUludDggTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzA0OF9GUkFNRVtNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdID0KLXsgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiUHJpdmF0ZSIgZnVuY3Rpb25zICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqIHBDKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqICJFeHRlcm5hbCIgZnVuY3Rpb25zICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyhNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogcFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotZXh0ZXJuIE00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci1leHRlcm4gTTRPU0FfRVJSIE00UkVBREVSXzNHUF9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqICJTdGF0aWMiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cyk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cyk7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgIEdldCB0aGUgTTRQVE8zR1BQIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwVmVyc2lvbkluZm8gaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wVmVyc2lvbkluZm8pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFBUTzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgICA9IE00UFRPM0dQUF9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgICA9IE00UFRPM0dQUF9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgICA9IE00UFRPM0dQUF9WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBJbml0aWFsaXplcyB0aGUgTTRQVE8zR1BQIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoICAgTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQzsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRQVE8zR1BQX0luaXQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBBbGxvY2F0ZSB0aGUgTTRQVE8zR1BQIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikiTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9TdGVwKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgSW5pdCB0aGUgY29udGV4dC4gQWxsIHBvaW50ZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gTTRPU0FfTlVMTCBiZWNhdXNlIENsZWFuVXAoKQotICAgICAgICBjYW4gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgSW5pdCgpLiAqLwotICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEOwotICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotCi0gICAgLyoqCi0gICAgICogIFJlYWRlciBzdHVmZiAqLwotICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtICAgID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqICBXcml0ZXIgc3R1ZmYgKi8KLSAgICBwQy0+bV9wRW5jb2RlckhlYWRlciAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm89IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgQ29udGV4dHMgb2YgdGhlIHVzZWQgbW9kdWxlcyAgKi8KLSAgICBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rTm9FbmNvZGVyOwotCi0gICAgLyoqCi0gICAgICogIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIHBDLT5tX3BSZWFkZXJHbG9iSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckdsb2JJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJEYXRhSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wRW5jb2RlckludCAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcEVuY29kZXJFeHRlcm5hbEFQSSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcEVuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHRoZSBPU0FMIGZpbGUgZnVuY3Rpb24gc2V0ICovCi0gICAgcEMtPnBPc2FsRmlsZVJlYWQgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FsRmlsZVdyaXRlID0gcEZpbGVXcml0ZVB0ckZjdDsKLQotICAgIC8qKgotICAgICAqICBWaWRlbyByYXRlIGNvbnRyb2wgc3R1ZmYgKi8KLSAgICBwQy0+bV9tdEN0cyAgICAgICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fbXROZXh0Q3RzICAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX210QXVkaW9DdHMgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9BdWRpb09mZlNldCAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fZExhc3RWaWRlb1JlZ3VsQ3RzPSAwLjBGOwotICAgIHBDLT5tX1ByZXZBdWRpb0N0cyAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9EZWx0YUF1ZGlvQ3RzICAgICA9IDAuMEY7Ci0KLSAgICBwQy0+bV9NYXhGaWxlU2l6ZSAgICAgICA9IDA7Ci0gICAgcEMtPm1fQ3VycmVudEZpbGVTaXplICAgPSAwOwotCi0gICAgcEMtPm1fSXNMYXN0UGljdHVyZSAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkxhc3RJbnRlcm5hbENhbGxCYWNrID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fTmJDdXJyZW50RnJhbWUgICAgICAgID0gMDsKLQotICAgIHBDLT5wU2F2ZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpU2F2ZWREdXJhdGlvbiA9IDA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX0luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgU2V0IHRoZSBNNFBUTzNHUFAgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgIEl0IG9wZW5zIHRoZSBpbnB1dCBmaWxlLCBidXQgdGhlIG91dHB1dCBmaWxlIG1heSBub3QgYmUgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQYXJhbXMgICAgICAgICAgICAgKElOKSBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBwb2ludGVkIHN0cnVjdHVyZSBjYW4gYmUgZGUtYWxsb2NhdGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBiZWNhdXNlCi0gKiAgICAgICAgICBpdCBpcyBpbnRlcm5hbGx5IGNvcGllZCBieSB0aGUgUFRPM0dQUAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0LXJhdGUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkUgICAgICAgICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HICAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gcGFkZGluZyBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5IQU5ETEVEX0FVRElPX1RSQUNLX0lOUFVUX0ZJTEUgICAgVGhlIGlucHV0IGF1ZGlvIGZpbGUgY29udGFpbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdHJhY2sgZm9ybWF0IG5vdCBoYW5kbGVkIGJ5IFBUTzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICAgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAgICBtZWRpYUZhbWlseTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlcjsKLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICByZWFkZXJNZWRpYVR5cGU7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRQVE8zR1BQX09wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFBhcmFtcz0weCV4IiwgcENvbnRleHQsIHBQYXJhbXMpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsIFwKLSAgICAgICAgICAgICAgICAgICAgIk00UFRPM0dQUF9PcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMpLCAgTTRFUlJfUEFSQU1FVEVSLCBcCi0gICAgICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfT3BlbjogcFBhcmFtcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgcGFyYW1ldGVycyBjb3JyZWN0bmVzcyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wUGljdHVyZUNhbGxiYWNrRmN0KSwKLSAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0ZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBQaWN0dXJlQ2FsbGJhY2tDdHh0KSwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cE91dHB1dDNncHBGaWxlKSwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBUZW1wb3JhcnlGaWxlKSwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBUZW1wb3JhcnlGaWxlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqIFZpZGVvIEZvcm1hdCAqLwotICAgIGlmKCAoTTRWSURFT0VESVRJTkdfa0gyNjMgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rTVBFRzQgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rSDI2NCAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgIH0KLQotICAgICAvKioKLSAgICAgKiBWaWRlbyBCaXRyYXRlICovCi0gICAgaWYoISgoTTRWSURFT0VESVRJTkdfazE2X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syNF9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMzJfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazQ4X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s2NF9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rOTZfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazEyOF9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2sxOTJfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjU2X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI4OF9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2szODRfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNTEyX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazgwMF9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazJfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s1X01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rOF9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgaWYgKCEoKE00VklERU9FRElUSU5HX2tTUUNJRiA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FRVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rUUNJRiA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FWR0EgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tDSUYgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rVkdBICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLQotICAgICAgICAgIChNNFZJREVPRURJVElOR19rTlRTQyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1dWR0EgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0KLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazY0MF8zNjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s4NTRfNDgwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTI4MF83MjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMDgwXzcyMCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazk2MF83MjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2sxOTIwXzEwODAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIGlmICghKChNNFBUTzNHUFBfazUwX0tCICAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2s3NV9LQiAgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMTAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazE1MF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2syMDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMzAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazQwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2s1MDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rVU5MSU1JVEVEID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IDNHUFAgZmlsZSBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRTsKLSAgICB9Ci0KLSAgICAvKiBBdWRpbyBwYWRkaW5nICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcFBhcmFtcy0+cElucHV0QXVkaW9UcmFja0ZpbGUpIHsKLSAgICAgICAgaWYgKCghKCAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmUgICA9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSB8fAotICAgICAgICAgICAgICAgIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZT09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpIHx8Ci0gICAgICAgICAgICAgICAgKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wICAgPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkpKSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgYXVkaW8gcGFkZGluZyIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqPCBTaXplIGNoZWNrIGZvciBIMjYzIChvbmx5IHZhbGlkIHNpemVzIGFyZSBDSUYsIFFDSUYgYW5kIFNRQ0lGKSAqLwotICAgIGlmICgoTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rU1FDSUYgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rUUNJRiAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tDSUYgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbigpOlwKLSAgICAgICAgICAgICByZXR1cm5pbmcgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX0NSRUFURUQgIT0gcEMtPm1fU3RhdGUpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgdGhlIE00UFRPM0dQUF9QYXJhbXMgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopKCZwQy0+bV9QYXJhbXMpLAotICAgICAgICAgICAgICAgICh2b2lkICopcFBhcmFtcywgc2l6ZW9mKE00UFRPM0dQUF9QYXJhbXMpKTsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW46IG91dHB1dFZpZGVvQml0cmF0ZSA9ICVkIiwgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9QYXJhbXMucElucHV0QXVkaW9UcmFja0ZpbGUpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcmVhZGVyIGludGVyZmFjZSBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGF1ZGlvIGZpbGUgdHlwZSAqLwotICAgICAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLkF1ZGlvRmlsZUZvcm1hdCkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAmcmVhZGVyTWVkaWFUeXBlLCAmcEMtPm1fcFJlYWRlckdsb2JJbnQsCi0gICAgICAgICAgICAgICAgJnBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBBQUNfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgICAgICBlcnIgPSBNNFJFQURFUl8zR1BfZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBDLT5tX3BSZWFkZXJHbG9iSW50LAotICAgICAgICAgICAgICAgICAgICAmcEMtPm1fcFJlYWRlckRhdGFJbnQpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBNNFJFQURFUl8zR1BfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5IQU5ETEVEX0FVRElPX1RSQUNLX0lOUFVUX0ZJTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdENyZWF0ZSgmcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUludC0+bV9yZWFkZXJDb250ZXh0ID0gcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dDsKLSAgICAgICAgLyoqPCBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RTZXRPcHRpb24ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhbEZpbGVSZWFkKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckdsb2JJbnQtPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgT3BlbiB0aGUgaW5wdXQgYXVkaW8gZmlsZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0T3BlbihwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckdsb2JJbnQtPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3REZXN0cm95KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBHZXQgdGhlIGF1ZGlvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICB3aGlsZSAoTTROT19FUlJPUiA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RHZXROZXh0U3RyZWFtKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgJm1lZGlhRmFtaWx5LCAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgICAgICBpZigoZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkgfHwKLSAgICAgICAgICAgICAgICAgICAoZXJyID09ICgoTTRPU0FfVUludDMyKU00V0FSX1RPT19NVUNIX1NUUkVBTVMpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIC8qKjwgT25lIHN0cmVhbSBmb3VuZCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgRm91bmQgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgaWYgKChNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICAvKio8IEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfT3BlbigpOiBGb3VuZCBhbiBhdWRpbyBzdHJlYW0gaW4gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgQWxsb2NhdGUgYXVkaW8gQVUgdXNlZCBmb3IgcmVhZCBvcGVyYXRpb25zICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVID0gKE00X0FjY2Vzc1VuaXQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQWNjZXNzVW5pdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFAsKE00T1NBX0NoYXIgKikicFJlYWRlckF1ZGlvQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFJlYWRlckF1ZGlvQVUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFJlYWRlckF1ZGlvQVUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsIHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JJbnQtPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbylyZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKE00V0FSX05PX01PUkVfU1RSRUFNICE9IGVycikgLyoqPCBVbmV4cGVjdGVkIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYkludC0+bV9wRmN0R2V0TmV4dFN0cmVhbSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogd2hpbGUqLwotICAgIH0gLyppZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9QYXJhbXMucElucHV0QXVkaW9UcmFja0ZpbGUpKi8KLQotICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0UmVzZXQocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyRGF0YUludC0+bV9wRmN0UmVzZXQoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1heCBGaWxlIHNpemUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplKQotICAgIHsKLSAgICBjYXNlIE00UFRPM0dQUF9rNTBfS0I6ICBwQy0+bV9NYXhGaWxlU2l6ZSA9IDUwMDAwOyAgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazc1X0tCOiAgcEMtPm1fTWF4RmlsZVNpemUgPSA3NTAwMDsgIGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2sxMDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMTAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMTUwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDE1MDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazIwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAyMDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2szMDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMzAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rNDAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDQwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazUwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSA1MDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2tVTkxJTUlURUQ6Ci0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfT3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORyBFbmNvZGluZyBjb21wbGV0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsX3VpQXVkaW9TdGVwQ291bnQgPSAwOwotICAgIE00T1NBX0ludDMyICBKdW1wVG9UaW1lID0gMDsKLSAgICBNNE9TQV9UaW1lICBtdEluY0N0czsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX1N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoICEoKE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEID09IHBDLT5tX1N0YXRlKSB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSA9PSBwQy0+bV9TdGF0ZSkpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKgotICAgICAqICBJbiBjYXNlIHRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAsIHdlIHByZXBhcmUgdGhlIGRlY29kZXIsIHRoZSBlbmNvZGVyIGFuZCB0aGUgd3JpdGVyICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEID09IHBDLT5tX1N0YXRlKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6IFRoaXMgaXMgdGhlIGZpcnN0IHN0ZXAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgUHJlcGFyZSB0aGUgcmVhZGVyLCB0aGUgZGVjb2RlciwgdGhlIGVuY29kZXIsIHRoZSB3cml0ZXIuLi4gKi8KLSAgICAgICAgZXJyID0gTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcocEMpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGEpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOyAvKio8IHdlIG9ubHkgZG8gdGhhdCBpbiB0aGUgZmlyc3Qgc3RlcCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgUkVBTCBzdGVwIHdpbGwgYmUgdGhlIG5leHQgb25lICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIHRhcmdldGVkIGZpbGUgc2l6ZS4KLSAgICAgKiBXZSBkbyB0aGF0IGJlZm9yZSB0aGUgZW5jb2RpbmcsIGJlY2F1c2UgdGhlIGNvcmUgZW5jb2RlciBoYXMgdG8ga25vdyBpZiB0aGlzIGlzCi0gICAgICogdGhlIGxhc3QgZnJhbWUgdG8gZW5jb2RlICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RHZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5tX0N1cnJlbnRGaWxlU2l6ZSk7Ci0gICAgaWYgKCgwICE9IHBDLT5tX01heEZpbGVTaXplKSAmJgotICAgICAgICAvKio8IEFkZCBhIG1hcmdlIHRvIHRoZSBmaWxlIHNpemUgaW4gb3JkZXIgdG8gbmV2ZXIgZXhjZWVkIHRoZSBtYXggZmlsZSBzaXplICovCi0gICAgICAgKChwQy0+bV9DdXJyZW50RmlsZVNpemUgKyBNNFBUTzNHUFBfTUFSR0VfT0ZfRklMRV9TSVpFKSA+PSBwQy0+bV9NYXhGaWxlU2l6ZSkpCi0gICAgewotICAgICAgICBwQy0+bV9Jc0xhc3RQaWN0dXJlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiAgQXQgdGhhdCBwb2ludCB3ZSBhcmUgaW4gTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSBzdGF0ZQotICAgICogIFdlIHBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8gZW5jb2RpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioqKioqKioqKioqKiBWSURFTyBFTkNPRElORyAqKioqKioqKioqKioqKiovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9WaWRlb1N0YXRlKSAvKio8SWYgdGhlIHZpZGVvIGVuY29kaW5nIGlzIGdvaW5nIG9uKi8KLSAgICB7ICAgLyoqCi0gICAgICAgICAqIENhbGwgdGhlIGVuY29kZXIgICovCi0gICAgICAgIHBDLT5tX05iQ3VycmVudEZyYW1lKys7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgZnJhbWUgdGhlIHRvIGVuY29kZSAqLwotICAgICAgICBpZigocEMtPm1fUGFyYW1zLk5iVmlkZW9GcmFtZXMgPiAwKSBcCi0gICAgICAgICAgICAmJiAocEMtPm1fTmJDdXJyZW50RnJhbWUgPj0gcEMtPm1fUGFyYW1zLk5iVmlkZW9GcmFtZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9Jc0xhc3RQaWN0dXJlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJNNFBUTzNHUFBfU3RlcCgpOiBDYWxsaW5nIHBFbmNvZGVySW50LT5wRmN0RW5jb2RlIHdpdGggdmlkZW9DdHMgPSAlLjJmXAotICAgICAgICAgICAgICAgICAgICAgICBuYiA9ICVsdSIsIHBDLT5tX210Q3RzLCBwQy0+bV9OYkN1cnJlbnRGcmFtZSk7Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgLyoqPCBUaGUgaW5wdXQgcGxhbmUgaXMgbnVsbCBiZWNhdXNlIHRoZSBpbnB1dCBQaWN0dXJlIHdpbGwgYmUgb2J0YWluZWQgYnkgdGhlXAotICAgICAgICAgICAgVlBQIGZpbHRlciBmcm9tIHRoZSBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fbXRDdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX0lzTGFzdFBpY3R1cmUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lIDogTTRFTkNPREVSX2tOb3JtYWxGcmFtZSkgKTsKLSAgICAgICAgLyoqPCBMYXN0IHBhcmFtIHNldCB0byBNNE9TQV9UUlVFIHNpZ25hbHMgdGhhdCB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIHRvIGJlIGVuY29kZWQsXAotICAgICAgICBNNE9TQV9GQUxTRSBlbHNlICovCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIk00UFRPM0dQUF9TdGVwKCk6IHBFbmNvZGVySW50LT5wRmN0RW5jb2RlIHJldHVybnMgMHgleCwgdmlkRm9ybWF0ID0weCV4IiwKLSAgICAgICAgICAgIGVyciwgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgaWYoKE00Tk9fRVJST1IgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2hlY2sgaWYgbGFzdCBmcmFtZS4qCi0gICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fSXNMYXN0UGljdHVyZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogTGFzdCBwaWN0dXJlIik7Ci0gICAgICAgICAgICAgICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgLyoqPCBUaGUgdmlkZW8gZW5jb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHBFbmNvZGVySW50LT5wRmN0RW5jb2RlIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpICAgICAvKio8IFVuZXhwZWN0ZWQgZXJyb3IgY29kZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCgoTTRPU0FfVUludDMyKU00V0FSX1dSSVRFUl9TVE9QX1JFUSkgPT0gZXJyKSB8fAotICAgICAgICAgICAgICAgICAgICAoKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfU3RlcDogcmV0dXJuaW5nIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBFbmNvZGVySW50LT5wRmN0RW5jb2RlKGxhc3QpIChhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgRW5kIG9mIHZpZGVvIGVuY29kaW5nICovCi0KLQotICAgIC8qKioqKiogQVVESU8gVFJBTlNDT0RJTkcgKHJlYWQgKyBudWxsIGVuY29kaW5nICsgd3JpdGUpICoqKioqKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX0F1ZGlvU3RhdGUpCi0gICAgewotICAgICAgICB3aGlsZSAoIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fQXVkaW9TdGF0ZSkgJiYKLSAgICAgICAgICAgICAgICAocEMtPm1fbXRBdWRpb0N0cyA8IHBDLT5tX210TmV4dEN0cykpCi0KLSAgICAgICAgewotICAgICAgICAgICAgbF91aUF1ZGlvU3RlcENvdW50Kys7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBSZWFkIHRoZSBuZXh0IGF1ZGlvIEFVIGluIHRoZSBpbnB1dCBBdWRpbyBmaWxlICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJbnQtPm1fcEZjdEdldE5leHRBdShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLCBwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fbXRBdWRpb0N0cyA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyArIHBDLT5tX0F1ZGlvT2ZmU2V0OwotCi0gICAgICAgICAgICAgICAgaWYgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5BdWRpb1BhZGRpbmdNb2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX1NpbGVuY2U6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvIG5vdGhpbmcgaWYgdGhlIGlucHV0IGF1ZGlvIGZpbGUgZm9ybWF0IGlzIG5vdCBBTVIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBKdW1wIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0SnVtcChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLCAmSnVtcFRvVGltZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50LT5tX3BGY3RSZXNldChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9tdEF1ZGlvQ3RzICs9IDIwOyAvKjwgU0VNQyBidWcgZml4ZWQgYXQgTHVuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb09mZlNldCA9IHBDLT5tX210QXVkaW9DdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10SW5jQ3RzID0gKE00T1NBX1RpbWUpKChwQy0+bV9tdEF1ZGlvQ3RzKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKHBDLT5tX3BXcml0ZXJEYXRhSW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQsICZwQy0+bV9Xcml0ZXJBdWRpb0FVLCBtdEluY0N0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQX0FkZEFtclNpbGVuY2VTaWQgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKio8IEFkZCA9PiBubyBhdWRpbyBjdHMgaW5jcmVtZW50Li4uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9PZmZTZXQgPSBwQy0+bV9tdEF1ZGlvQ3RzICsgcEMtPm1fRGVsdGFBdWRpb0N0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mOiBzd2l0Y2ggKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogcFJlYWRlckRhdGFJbnQtPm1fcEZjdEdldE5leHRBdShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTYXZlIHRoZSBkZWx0YSBDdHMgKEFBQyBvbmx5KSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9EZWx0YUF1ZGlvQ3RzID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTIC0gcEMtPm1fUHJldkF1ZGlvQ3RzOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9QcmV2QXVkaW9DdHMgID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+bV9Xcml0ZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBDb3B5IGF1ZGlvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNFBUTzNHUFBfU3RlcCgpOiBDb3B5aW5nIGF1ZGlvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX3NpemUpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX3NpemUpOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTICA9IChNNE9TQV9UaW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPm1fQXVkaW9PZmZTZXQgKyBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyA9IChNNE9TQV9UaW1lKShwQy0+bV9tdEF1ZGlvQ3RzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNFBUTzNHUFBfU3RlcCgpOiBhdWRpbyBBVTogQ1RTPSVkIG1zIiwgcEMtPm1fbXRBdWRpb0N0cwotICAgICAgICAgICAgICAgICAgICAgICAgLypwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPm1fV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgTTRPU0FfVFJVRSA9PSBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQgPT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRmlsbCBpbiBhdWRpbyBhdSB3aXRoIHNpbGVuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fbXRBdWRpb0N0cyArPSAyMDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogUGFkZCB3aXRoIHNpbGVuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgbXRJbmNDdHMgPSAoTTRPU0FfVGltZSkocEMtPm1fbXRBdWRpb0N0cwotICAgICAgICAgICAgICAgICAgICAgICAgKiAocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKHBDLT5tX3BXcml0ZXJEYXRhSW50LAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQsICZwQy0+bV9Xcml0ZXJBdWRpb0FVLCBtdEluY0N0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogTTRQVE8zR1BQX0FkZEFtclNpbGVuY2VTaWQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgRG8gbm90aGluZyBpZiB0aGUgaW5wdXQgYXVkaW8gZmlsZSBmb3JtYXQgaXMgbm90IEFNUiAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyoqPCB3aGlsZSAqLwotICAgIH0gLyoqPCBFbmQgb2YgYXVkaW8gZW5jb2RpbmcgKi8KLQotICAgIHBDLT5tX210Q3RzID0gcEMtPm1fbXROZXh0Q3RzOwotCi0gICAgLyoqCi0gICAgICogIFRoZSB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCB3aGVuIG5vIHN0cmVhbSBpcyBiZWluZyBlbmNvZGVkIGFueW1vcmUgKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCA9PSBwQy0+bV9WaWRlb1N0YXRlKQotICAgIHsKLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEOwotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTogdHJhbnNjb2RpbmcgZmluaXNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgIHJldHVybiBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYikiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEZpbmlzaCB0aGUgTTRQVE8zR1BQIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgICAgb3NhRXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbGFzdENUUzsKLSAgICBNNEVOQ09ERVJfSGVhZGVyKiBlbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfQ2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9DbG9zZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKChwQy0+bV9TdGF0ZSAhPSBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCkgJiYKLSAgICAgICAgKHBDLT5tX1N0YXRlICE9IE00UFRPM0dQUF9rU3RhdGVfUkVBRFkpICYmCi0gICAgICAgIChwQy0+bV9TdGF0ZSAhPSBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIEZpbmlzaCB0aGUgZW5jb2RpbmcgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgPT0gcEMtPm1fU3RhdGUpCi0gICAgewotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotCi0gICAgaWYgKE00UFRPM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPm1fZUVuY29kZXJTdGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgb3NhRXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdG9wKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogbV9wRW5jb2RlckludC0+cEZjdFN0b3AgcmV0dXJucyAweCV4Iiwgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICB9Ci0KLSAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBvcGVuZWQ/IERvbid0IGNsb3NlIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgaWYgKE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPm1fZUVuY29kZXJTdGF0ZSkKLSAgICB7Ci0gICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0Q2xvc2UocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBtX3BFbmNvZGVySW50LT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4Iiwgb3NhRXJyKTsKLSAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIENsb3NlIDNHUCBvdXQgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCkgIC8qIGhhcHBlbnMgaW4gc3RhdGUgX1NFVCAqLwotICAgIHsKLSAgICAgICAgLyogSFcgZW5jb2RlcjogZmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotICAgICAgICBpZiAoKE00VklERU9FRElUSU5HX2tNUEVHNCA9PSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpCi0gICAgICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KSkKLSAgICAgICAgewotICAgICAgICAgICAgb3NhRXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RHZXRPcHRpb24ocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSZlbmNIZWFkZXIpOwotICAgICAgICAgICAgaWYgKCAoTTROT19FUlJPUiAhPSBvc2FFcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBvc2FFcnIpOwotICAgICAgICAgICAgICAgIC8qKjwgbm8gcmV0dXJuIGhlcmUsIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZGVhbGxvY2F0ZSBhZnRlciBjbG9zZSwgZXZlbiBpZiBcCi0gICAgICAgICAgICAgICAgaXQgZmFpbHMuICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0IHRoaXMgaGVhZGVyIGluIHRoZSB3cml0ZXIgKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNFBUTzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc2l6ZSA9IGVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpZW5jSGVhZGVyLT5wQnVmOwotICAgICAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rRFNJLCAmc3RyZWFtSGVhZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIgMHgleCkgICAiLCBvc2FFcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICBsYXN0Q1RTID0gKE00T1NBX1VJbnQzMilwQy0+bV9tdEN0czsKLQotICAgICAgICBvc2FFcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiwgJmxhc3RDVFMpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIG9zYUVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSBhbmQgY2xvc2UgdGhlIDNHUCBvdXRwdXQgZmlsZSAqLwotICAgICAgICBvc2FFcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdENsb3NlV3JpdGUocEMtPm1fcDNncFdyaXRlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2U6IHBXcml0ZXJHbG9iSW50LT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXgiLCBvc2FFcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4geWV0LCB3ZSBoYXZlIHRvIGNsb3NlIG90aGVyIHRoaW5ncyAqLwotICAgICAgICB9Ci0gICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0NMT1NFRDsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfQ2xvc2UoKTogcmV0dXJuaW5nIDB4JXgiLCBvc2FFcnIpOwotICAgIHJldHVybiBvc2FFcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE00UFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9DbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9DbGVhblVwOiBwQ29udGV4dCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlyc3QgY2FsbCBDbG9zZSwgaWYgbmVlZGVkLCB0byBjbGVhbiB0aGUgdmlkZW8gZW5jb2RlciAqLwotCi0gICAgaWYgKChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkgfHwgKE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgPT0gcEMtPm1fU3RhdGUpCi0gICAgICAgIHx8IChNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEID09IHBDLT5tX1N0YXRlKSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UFRPM0dQUF9DbG9zZShwQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwOiBNNFBUTzNHUFBfQ2xvc2UgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZyZWUgQXVkaW8gcmVhZGVyIHN0dWZmLCBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpIC8qKjwgbWF5IGJlIE00T1NBX05VTEwgaWYgTTRQVE8zR1BQX09wZW4gd2FzIG5vdFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgKi8KLSAgICB7Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdENsb3NlKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcFJlYWRlckdsb2JJbnQtPm1fcEZjdENsb3NlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0RGVzdHJveShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9BVSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZyZWUgdmlkZW8gZW5jb2RlciBzdHVmZiwgaWYgbmVlZGVkICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RDbGVhbnVwKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwOiBwRW5jb2RlckludC0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbykKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbyk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckdsb2JJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJHbG9iSW50KTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyRGF0YUludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckRhdGFJbnQpOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUludCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wRW5jb2RlckludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEVuY29kZXJJbnQpOwotICAgICAgICBwQy0+bV9wRW5jb2RlckludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckdsb2JJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJHbG9iSW50KTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckdsb2JJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJEYXRhSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyRGF0YUludCk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJEYXRhSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqPCBEbyBub3QgZnJlZSBwQy0+cE9zYU1lbW9yeVB0ckZjdCBhbmQgcEMtPnBPc2FNZW1vcnlQdHJGY3QsIGJlY2F1c2UgaXQncyBvd25lZCBieSB0aGUgXAotICAgIGFwcGxpY2F0aW9uICovCi0KLSAgICAvKioKLSAgICAgKiAgRnJlZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX0NsZWFuVXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBJTlRFUk5BTCBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICBQcmVwYXJlIGFsbCByZXNvdXJjZXMgYW5kIGludGVyZmFjZXMgZm9yIHRoZSB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgZmlyc3QgTTRPU0FfU3RlcCgpIGNhbGwKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgIChJTikgTTRQVE8zR1BQIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqIHBDKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIG91dHB1dEZpbGVUeXBlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpVmVyc2lvbjsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBlbmNGb3JtYXQ7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zICAgRW5jUGFyYW1zOyAgICAvKio8IEVuY29kZXIgYWR2YW5jZWQgcGFyYW1ldGVycyAqLwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgICAgIG9wdGlvblZhbHVlOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nIGNhbGxlZCB3aXRoIHBDPTB4JXgiLCBwQyk7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLwotICAgIC8qKioqKioqKiBWaWRlbyBFbmNvZGVyIFBhcmFtZXMgaW5pdCAqKioqKioqKi8KLSAgICAvKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqCi0gICAgICogIEdldCB0aGUgY29ycmVjdCBlbmNvZGVyIGludGVyZmFjZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBNUEVHNCBlbmNvZGVyIG5vdCBhdmFpbGFibGUhICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIE1QRUc0IGVuY29kZXIgYXZhaWxhYmxlISBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYgLyogc29mdHdhcmUgTVBFRzQgZW5jb2RlciBhdmFpbGFibGU/ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2MygmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSNlbHNlIC8qIHNvZnR3YXJlIEgyNjMgZW5jb2RlciBub3QgYXZhaWxhYmxlISAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBIMjYzIGVuY29kZXIgYXZhaWxhYmxlISBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYgLyogc29mdHdhcmUgSDI2MyBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAgICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSNlbHNlIC8qIHNvZnR3YXJlIEgyNjQgZW5jb2RlciBub3QgYXZhaWxhYmxlISAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogTm8gSDI2NCBlbmNvZGVyIGF2YWlsYWJsZSFcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIEgyNjQgZW5jb2RlciBhdmFpbGFibGU/ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgIH0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgic3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk6IGdldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRmlsbCBlbmNvZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIE00UFRPM0dQUCBzZXR0aW5ncyAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgc2l6ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRiA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1NRQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9RUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfUVFWR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRiA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfUUNJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9RVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9RVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRiA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9DSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9WR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1ZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotLyogK1BSIExWNTgwNyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9XVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9XVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfTlRTQ19IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfTlRTQ19XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotLyogLVBSIExWNTgwNyAqLwotLyogK0NSIEdvb2dsZSAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzY0MF8zNjBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4NTRfNDgwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl8xMjgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl8xMDgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfMTA4MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5NjBfNzIwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzk2MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl8xOTIwXzEwODBfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFOwotICAgIH0KLQotICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLQotICAgIC8qKgotICAgICAqIFZpZGVvIGJpdHJhdGUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyOF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjU2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI4OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szODRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNTEyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMF9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazJfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4X01CUFM6Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZvcm1hdCAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNCA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgICAgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgICAgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHJhdGUgKHNldCBpdCB0byBtYXggPSAzMCBmcHMpICovCi0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMzA7Ci0gICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0KLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIDNHUCBvdXQgaW5pdCAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogR2V0IHRoZSAzR1BQIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBlcnIgPSBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygmb3V0cHV0RmlsZVR5cGUsICZwQy0+bV9wV3JpdGVyR2xvYkludCwgJnBDLT5tX3BXcml0ZXJEYXRhSW50KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogSW5pdCB0aGUgM0dQUCB3cml0ZXIgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdE9wZW4oJnBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBwQy0+bV9QYXJhbXMucE91dHB1dDNncHBGaWxlLAotICAgICAgICBwQy0+cE9zYWxGaWxlV3JpdGUsIHBDLT5tX1BhcmFtcy5wVGVtcG9yYXJ5RmlsZSwgcEMtPnBPc2FsRmlsZVJlYWQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIExpbmsgdG8gdGhlIHdyaXRlciBjb250ZXh0IGluIHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPm1fcFdyaXRlckRhdGFJbnQtPnBXcml0ZXJDb250ZXh0ID0gcEMtPm1fcDNncFdyaXRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uIHN0cmluZyBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRQVE8zR1BQX1NJR05BVFVSRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBcCi0gICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgU2V0IHRoZSBwcm9kdWN0IHZlcnNpb24gaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIHVpVmVyc2lvbiA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IqMTAwICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUioxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT047Ci0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24sCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSZ1aVZlcnNpb24pOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogXAotICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBBbGxvY2F0ZSBhbmQgZmlsbCB0aGUgdmlkZW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gPQotICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJWaWRlb1N0cmVhbSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFdyaXRlclZpZGVvU3RyZWFtLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8gPQotICAgICAgICAoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyVmlkZW9TdHJlYW1JbmZvIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFdyaXRlclZpZGVvU3RyZWFtSW5mbyxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBWaWRlbyBwcm9wZXJ0aWVzIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5oZWlnaHQgICAgICAgID0gRW5jUGFyYW1zLkZyYW1lSGVpZ2h0OwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPndpZHRoICAgICAgICAgPSBFbmNQYXJhbXMuRnJhbWVXaWR0aDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5mcHMgICAgICAgICAgID0gMDsgICAgICAgIC8qKjwgTm90IHVzZWQgYnkgdGhlIGNvcmUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+SGVhZGVyLnBCdWYgICA9IE00T1NBX05VTEw7Ci0gICAgLyoqIE5vIGhlYWRlciwgd2lsbCBiZSBzZXQgYnkgc2V0T3B0aW9uICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+SGVhZGVyLlNpemUgICA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiAgRmlsbCBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtSUQgPSBNNFBUTzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZvcm1hdCAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7ICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBiaXRyYXRlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syODhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzg0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDBfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syX01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOF9NQlBTOgotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlID0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgOgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5kdXJhdGlvbiAgICAgICAgICAgICAgICAgID0gMDsgICAgICAgIC8qKjwgRHVyYXRpb24gaXMgbm90IGtub3duICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT50aW1lU2NhbGUgICAgICAgICAgICAgICAgID0gMDsgICAgLyoqPCBOb3QgdXNlZCBieSB0aGUgY29yZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPm1heEJpdHJhdGUgICAgICAgICAgICAgICAgPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+cHJvZmlsZUxldmVsICAgICAgICAgICAgICA9IDA7ICAgIC8qKjwgTm90IHVzZWQgYnkgdGhlIGNvcmUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvICAgICAgID0gKE00T1NBX01lbUFkZHIzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICAgPSBzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyk7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5DVFMgICAgICAgICA9IHBDLT5tX1dyaXRlclZpZGVvQVUuRFRTID0gMDsgIC8qKiBSZXNldCB0aW1lICovCi0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5zaXplICAgICAgICA9IDA7Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5mcmFnICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5uYkZyYWcgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBObyBmcmFnbWVudCAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuc3RyZWFtICAgICAgPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW07Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgICA9IEFVX1JBUDsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqICBJZiB0aGVyZSBpcyBhbiBhdWRpbyBpbnB1dCwgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIGF1ZGlvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlckF1ZGlvU3RyZWFtIik7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwV3JpdGVyQXVkaW9TdHJlYW0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8gPQotICAgICAgICAgICAgKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyksIE00UFRPM0dQUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJBdWRpb1N0cmVhbUluZm8iKTsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9TdHJlYW1JbmZvLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iU2FtcGxlc1BlclNlYyA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkgJiYgLyogYXVkaW8gY291bGQgaGF2ZSBiZWVuIGRpc2NhcmRlZCAqLwotICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIuU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBXcml0ZXIgd2lsbCBwdXQgYSBkZWZhdWx0IERTSSAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgIHN3aXRjaCAocEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmhhbmRsZWQgYXVkaW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZpbGwgQXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1JRCAgICAgICAgICAgICAgICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+ZHVyYXRpb24gICAgICAgICAgICAgICAgICA9IDA7LyoqPCBEdXJhdGlvbiBpcyBub3Qga25vd24geWV0ICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlICAgICAgICAgICAgICAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fQU1SX1RJTUVfU0NBTEU7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+cHJvZmlsZUxldmVsICAgICAgICAgICAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fUFJPRklMRV9MRVZFTDsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZSAgICAgICAgICAgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPm1heEJpdHJhdGUgICAgICAgICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIFwKLSAgICAgICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgICAgICAgICA9IHBDLT5tX1dyaXRlckF1ZGlvQVUuRFRTID0gMDsgIC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuc2l6ZSAgICAgICAgPSAwOwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLmZyYWcgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5uYkZyYWcgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLnN0cmVhbSAgICAgID0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtOwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLmF0dHJpYnV0ZSAgID0gQVVfUkFQOwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBWaWRlbyBFbmNvZGVyIEluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKgotICAgICAqIFBUTyB1c2VzIGl0cyBvd24gYml0cmF0ZSByZWd1bGF0aW9uLCBub3QgdGhlICJ0cnVlIiBjb3JlIHJlZ3VsYXRpb24gKi8KLSAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX1RSVUU7IC8vTTRPU0FfRkFMU0U7Ci0gICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IE00UFRPM0dQUF9RVUFOVElaRVJfU1RFUDsKLQotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+bV9QYXJhbXMudmlkZW9Qcm9maWxlOwotICAgIEVuY1BhcmFtcy52aWRlb0xldmVsID0gcEMtPm1fUGFyYW1zLnZpZGVvTGV2ZWw7Ci0KLSAgICAvKioKLSAgICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzICovCi0KLSAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgID0gMDsgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlICAgID0gMDsgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSAgICAgICAgID0gTTRPU0FfRkFMU0U7ICAgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgICAgICAgICAgICAgPSAxNTsgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgID0gMDsgICAgICAgICAgICAgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gICAgICAgICAgICA9IE00T1NBX1RSVUU7ICAgIC8qIHVzZSBBQyBwcmVkaWN0aW9uICovCi0gICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nICAgICAgICA9IE00T1NBX0ZBTFNFOyAgIC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB2aWRlbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RJbml0KCZwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsIHBDLT5tX3BXcml0ZXJEYXRhSW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQX2FwcGx5VlBQLCBwQywgcEMtPm1fcEVuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BFbmNvZGVyVXNlckRhdGEpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogRW5jb2RlckludC0+cEZjdEluaXQgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkOwotCi0gICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RPcGVuKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgJnBDLT5tX1dyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogRW5jb2RlckludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZDsKLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RhcnQpCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0YXJ0KHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqCi0gICAgICogTm8gbW9yZSAgc2V0b3B0aW9uIG9uICJNNEVOQ09ERVJfa1ZpZGVvRnJhZ21lbnRTaXplIiBoZXJlLgotICAgICAqIEl0IGlzIG5vdyBhdXRvbWF0aWNseSBhbmQgInNtYXJ0bHkiIHNldCBpbiB0aGUgZW5jb2RlciBzaGVsbC4gKi8KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogM0dQIG91dCBhZGQgc3RyZWFtcyAgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgICAgICAgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHZpZGVvIG1heCBhdSBzaXplICovCi0gICAgb3B0aW9uVmFsdWUuc3RyZWFtSUQgICAgPSBNNFBUTzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IChNNE9TQV9VSW50MzIpKDEuNUYgKiAoTTRPU0FfRmxvYXQpKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPndpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPmhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTTRQVE8zR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nLE00V1JJVEVSX2tNYXhBVVNpemU6ICV1IixvcHRpb25WYWx1ZS52YWx1ZSk7Ci0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHZpZGVvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heEFVU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdmlkZW8gbWF4IGNodW5jayBzaXplICovCi0gICAgb3B0aW9uVmFsdWUudmFsdWUgPSAoTTRPU0FfVUludDMyKSgoTTRPU0FfRmxvYXQpb3B0aW9uVmFsdWUudmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRQVE8zR1BQX1ZJREVPX0FVX1NJWkVfVE9fQ0hVTkNLX1NJWkVfUkFUSU8pOwotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyxNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZTogJXUiLG9wdGlvblZhbHVlLnZhbHVlKTsKLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbih2aWRlbyxcCi0gICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCBhdWRpbyBtYXggYXUgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSAgICAgICA9IE00UFRPM0dQUF9BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgb3B0aW9uVmFsdWUuc3RyZWFtSUQgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYXVkaW8gbWF4IGNodW5jayBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gTTRQVE8zR1BQX0FVRElPX01BWF9DSFVOS19TSVpFOyAvKio8IE1hZ2ljYWwgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDbG9zZSB0aGUgc3RyZWFtIHJlZ2lzdGVyaW5nIGluIG9yZGVyIHRvIGJlIHJlYWR5IHRvIHdyaXRlIGRhdGEgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFN0YXJ0V3JpdGluZyhwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFN0YXJ0V3JpdGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsIE00T1NBX1RpbWUgbXRJbmNDdHMpCi0gKiBAYnJpZWYgICBXcml0ZSBhbiBBTVIgMTIuMmticHMgc2lsZW5jZSBGUkFNRSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHRvIGZpeCB0aGUgJ2J6eicgYnVnLi4uCi0gKiBAcGFyYW0gICBwV3JpdGVyRGF0YUludEludGVyZmFjZSAoSU4pICAgIHdyaXRlciBkYXRhIGludGVyZmFjZXMKLSAqICAgICAgICAgIHBXcml0ZXJDb250ZXh0ICAgICAgICAgIChJTi9PVVQpd3JpdGVyIGNvbnRleHQKLSAqICAgICAgICAgIHBXcml0ZXJBdWRpb0FVICAgICAgICAgIChPVVQpICAgd3JpdGVyIGF1ZGlvIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICBtdEluY0N0cyAgICAgICAgICAgICAgICAoSU4pICAgIHdyaXRlciBDVFMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFN0YXJ0QVUocFdyaXRlckNvbnRleHQsIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lOiBwV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtZW1jcHkoKHZvaWQgKilwV3JpdGVyQXVkaW9BVS0+ZGF0YUFkZHJlc3MsCi0gICAgICh2b2lkICopTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzEyMl9GUkFNRSwgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFKTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+c2l6ZSAgICA9IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+Q1RTICAgICA9IG10SW5jQ3RzOwotICAgIHBXcml0ZXJBdWRpb0FVLT5uYkZyYWcgID0gMDsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wUHJvY2Vzc0FVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lOiBwV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShzaWxlbmNlKSBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwgTTRPU0FfVGltZSBtdEluY0N0cykKLSAqIEBicmllZiAgIFdyaXRlIGFuIEFNUiAxMi4ya2JwcyBzaWxlbmNlIEZSQU1FIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgdG8gZml4IHRoZSAnYnp6JyBidWcuLi4KLSAqIEBwYXJhbSAgIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlIChJTikgICAgd3JpdGVyIGRhdGEgaW50ZXJmYWNlcwotICogICAgICAgICAgcFdyaXRlckNvbnRleHQgICAgICAgICAgKElOL09VVCl3cml0ZXIgY29udGV4dAotICogICAgICAgICAgcFdyaXRlckF1ZGlvQVUgICAgICAgICAgKE9VVCkgICB3cml0ZXIgYXVkaW8gYWNjZXNzIHVuaXQKLSAqICAgICAgICAgIG10SW5jQ3RzICAgICAgICAgICAgICAgIChJTikgICAgd3JpdGVyIENUUwotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFN0YXJ0QVUocFdyaXRlckNvbnRleHQsIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKGF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICh2b2lkICopTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzA0OF9GUkFNRSwKLSAgICAgICAgICAgICAgICBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIHBXcml0ZXJBdWRpb0FVLT5zaXplICAgID0gTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgIHBXcml0ZXJBdWRpb0FVLT5DVFMgICAgID0gbXRJbmNDdHM7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPm5iRnJhZyAgPSAwOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBQcm9jZXNzQVUocFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZTogXAotICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShzaWxlbmNlKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NmE2NDk4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLSAqIEBicmllZiAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIHZpZGVvIHByZXByb2Nlc3NpbmcgbWFuYWdlbWVudC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqICAgIE9TQUwgRGVidWcgdXRpbGl0aWVzICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotLyoqCi0gKiAgICBPU0FMIE1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiB0aGUgTTRQVE8zR1BQIGludGVybmFsIGNvbnRleHQgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgdGhlIE00UFRPM0dQUCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKiBJZiB0aW1lIGluY3JlbWVudCBpcyB0b28gbG93IHRoZW4gd2UgaGF2ZSBhbiBpbmZpbml0ZSBhbGxvYyBsb29wIGludG8gTTRWaUVuY0NhcHR1cmVGcmFtZSgpICovCi0vKiBUaW1lIGluY3JlbWVudCBzaG91bGQgbWF0Y2ggMzAgZnBzIG1heGltdW0gKi8KLSNkZWZpbmUgTTRQVE8zR1BQX01JTl9USU1FX0lOQ1JFTUVOVCAzMy4zMzMzMzM0Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBDYWxsIGFuIGV4dGVybmFsIGNhbGxiYWNrIHRvIGdldCB0aGUgcGljdHVyZSB0byBlbmNvZGUKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNNFBUTzNHUFAgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlIHJlYWQgd2l0aCB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgZXJyOwotICAgIE00T1NBX0RvdWJsZSBtdER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqKiBOT1RFICoqKi8KLSAgICAvKiBJdCdzIE9LIHRvIGdldCBwUGxhbmVJbiA9PSBNNE9TQV9OVUxMIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHNpbmNlIGl0IGhhcyBiZWVuIGdpdmVuIE5VTEwgaW4gdGhlIHBGY3RFbmNvZGUoKSBjYWxsLiAgICAgICAgICAgICovCi0gICAgLyogSXQncyBiZWNhdXNlIHdlIHVzZSB0aGUgTTRQVE8zR1BQIGludGVybmFsIGNvbnRleHQgdG8gICAgICAgICAgICAqLwotICAgIC8qIHRyYW5zbWl0IHRoZSBlbmNvZGVyIGlucHV0IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgaW5wdXQgZGF0YSBpcyB0aGUgaW1hZ2UgcmVhZCBmcm9tIHRoZSBtX3BQaWN0dXJlQ2FsbGJhY2tGY3QgICAgKi8KLQotICAgIC8qKgotICAgICAqICAgIFRoZSBWUFAgY29udGV4dCBpcyBhY3R1YWxseSB0aGUgTTRQVE8zR1BQIGNvbnRleHQhICovCi0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogIEdldCB0aGUgcGljdHVyZSB0byBlbmNvZGUgKi8KLSAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkxhc3RJbnRlcm5hbENhbGxCYWNrKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QocEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tDdHh0LCBwUGxhbmVPdXQsCi0gICAgICAgICAgICAgJm10RHVyYXRpb24pOwotCi0gICAgICAgIC8qIEluIGNhc2Ugb2YgZXJyb3Igd2hlbiBnZXR0aW5nIFlVViB0byBlbmNvZGUgKGV4OiBlcnJvciB3aGVuIGRlY29kaW5nIGEgSlBFRykgKi8KLSAgICAgICAgaWYoKE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkUpICE9IGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgZW5kIG9mIGVuY29kaW5nIGlzIGFza2VkIGJ5IHRoZSBzaXplIGxpbWl0YXRpb24gc3lzdGVtLAotICAgICAgICAgKiB3ZSBtdXN0IGVuZCB0aGUgZW5jb2RpbmcgdGhlIHNhbWUgd2F5IHRoYXQgd2hlbiBpdCBpcyBhc2tlZCBieSB0aGUKLSAgICAgICAgICogcGljdHVyZSBjYWxsYmFjayAoYS5rLmEuIHRoZSBpbnRlZ3JhdG9yKS4KLSAgICAgICAgICogVGh1cyB3ZSBzaW11bGF0ZSB0aGUgTGFzdFBpY3R1cmUgY29kZSByZXR1cm46ICovCi0gICAgICAgIGlmIChNNE9TQV9UUlVFID09IHBDLT5tX0lzTGFzdFBpY3R1cmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkUpID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fYkxhc3RJbnRlcm5hbENhbGxCYWNrID0gTTRPU0FfVFJVRTsgLyogVG9nZ2xlIGZsYWcgZm9yIHRoZSBmaW5hbCBjYWxsIG9mIHRoZSBDQiovCi0gICAgICAgICAgICBwQy0+bV9Jc0xhc3RQaWN0dXJlICAgICAgICAgPSBNNE9TQV9UUlVFOyAvKiBUbyBzdG9wIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICBwQy0+cFNhdmVkUGxhbmUgICAgICAgICAgICAgPSBwUGxhbmVPdXQ7ICAvKiBTYXZlIHRoZSBsYXN0IFlVViBwbGFuZSBwdHIgKi8KLSAgICAgICAgICAgIHBDLT51aVNhdmVkRHVyYXRpb24gICAgICAgICA9IChNNE9TQV9VSW50MzIpbXREdXJhdGlvbjsgLyogU2F2ZSB0aGUgbGFzdCBkdXJhdGlvbiAqLwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgTm90IG5lY2Vzc2FyeSBoZXJlIGJlY2F1c2UgdGhlIGxhc3QgZnJhbWUgZHVyYXRpb24gaXMgc2V0IHRvIHRoZS1sYXN0LWJ1dC1vbmUgYnkKLSAgICAgICAgICAgICAgICB0aGUgbGlnaHQgd3JpdGVyICovCi0gICAgICAgIC8qKjwgT25seSBuZWNlc3NhcnkgZm9yIHBDLT5tX210TmV4dEN0cyBiZWxvdy4uLiovCi0gICAgICAgIG10RHVyYXRpb24gPSBwQy0+dWlTYXZlZER1cmF0aW9uOwotCi0KLSAgICAgICAgLyoqIENvcHkgdGhlIGxhc3QgWVVWIHBsYW5lIGludG8gdGhlIGN1cnJlbnQgb25lCi0gICAgICAgICAqICh0aGUgbGFzdCBwaWMgaXMgc3BsaXRlZCBkdWUgdG8gdGhlIGNhbGxiYWNrIGV4dHJhLWNhbGwuLi4gKi8KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBTYXZlZFBsYW5lW2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W2ldLnVfc3RyaWRlICogcFBsYW5lT3V0W2ldLnVfaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFRpbWVJbmNyZW1lbnQgc2hvdWxkIGJlIDMwIGZwcyBtYXhpbXVtICovCi0gICAgaWYobXREdXJhdGlvbiA8IE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQpCi0gICAgewotICAgICAgICBtdER1cmF0aW9uID0gTTRQVE8zR1BQX01JTl9USU1FX0lOQ1JFTUVOVDsKLSAgICB9Ci0KLSAgICBwQy0+bV9tdE5leHRDdHMgKz0gbXREdXJhdGlvbjsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfYXBwbHlWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MWYwZTI4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9BbXIuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgYW1yIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBBTVIgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotI2luY2x1ZGUgIk00QU1SUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfQW1yLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0FNUl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIGFtciByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0FNUl9Db250ZXh0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgbV9wQ29yZUNvbnRleHQ7ICAgICAvKio8IGNvcmUgYW1yIHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgbV9wQXVkaW9TdHJlYW07ICAgICAvKio8IHBvaW50ZXIgb24gdGhlIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAvKio8IGF1ZGlvIGFjY2VzcyB1bml0IHRvIGJlIGZpbGxlZCBieSB0aGUgY29yZSAqLwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIG1fbWF4RHVyYXRpb247ICAgICAgLyoqPCBkdXJhdGlvbiBvZiB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICBtX3BPc2FGaWxlUmVhZGVyRmN0czsgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLQotfSBNNFJFQURFUl9BTVJfQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBSZWFkZXJDb250ZXh0OwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfQU1SX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9BTVJfQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX21heER1cmF0aW9uID0gMDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQ29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICAqcENvbnRleHQgPSBwUmVhZGVyQ29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZGVzdHJveTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9kZXN0cm95KCk6IE00UkVBREVSX0FNUl9kZXN0cm95OiBjb250ZXh0IGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSAqIEBub3RlICAgICB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBBTVIgZmlsZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nIHRoZSBtZWRpYSB0byBvcGVuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9vcGVuKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9vcGVuOiBpbnZhbGlkIHBvaW50ZXIgcEZpbGVEZXNjcmlwdG9yIik7Ci0KLSAgICBlcnIgPSBNNEFNUlJfb3BlblJlYWQoICZwQy0+bV9wQ29yZUNvbnRleHQsIHBGaWxlRGVzY3JpcHRvciwgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX0FNUl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRBTVJSX1N0YXRlIFN0YXRlOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9jbG9zZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9jbG9zZSgpOiBNNFJFQURFUl9BTVJfY2xvc2U6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwKLSAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSktPm1fc3RyZWFtSWQpOwotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9jbG9zZTogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9nZXRTdGF0ZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QU1SUl9mcmVlQVUocEMtPm1fcENvcmVDb250ZXh0LAotICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKS0+bV9zdHJlYW1JZCwgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlOiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZWxldGUgdGhlIERTSSBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcENvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2Nsb3NlUmVhZChwQy0+bV9wQ29yZUNvbnRleHQpOwotICAgICAgICBwQy0+bV9wQ29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhCi0gKiBAbm90ZSAgICBjdXJyZW50IHZlcnNpb24gbmVlZHMgdG8gdHJhbnNsYXRlIE00U1lTX1N0cmVhbSB0byBNNF9TdHJlYW1IYW5kbGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgIChPVVQpICBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhbmQgZmlsbGVkIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgbW9kZSBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyUGFyYW0pCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEM9KE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlcjsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFGYW1pbHkgPT0gMCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyUGFyYW0gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBlcnIgPSBNNEFNUlJfZ2V0TmV4dFN0cmVhbSggcEMtPm1fcENvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRBTVJSX3N0YXJ0UmVhZGluZyhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXkpOwotICAgICAgICBpZiAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQyA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogTTRBTVJSX3N0YXJ0UmVhZGluZyByZXR1cm5zIE00RVJSX0FMTE9DISIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIGVsc2UgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqcE1lZGlhRmFtaWx5ID0gTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW87Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlciA9KE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAqcFN0cmVhbUhhbmRsZXJQYXJhbSA9IHBTdHJlYW1IYW5kbGVyOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbSA9IHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLQotICAgIC8qCi0gICAgICogQXVkaW8gc3RyZWFtIGhhbmRsZXIgZmllbGRzIGFyZSBpbml0aWFsaXNlZCB3aXRoIDAgdmFsdWUuCi0gICAgICogVGhleSB3aWxsIGJlIHByb3Blcmx5IHNldCBieSB0aGUgQU1SIGRlY29kZXIKLSAgICAgKi8KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCAgID0gMDsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gMDsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgICAgICAgID0gMDsKLQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvICAgID0gKE00T1NBX1VJbnQ4Kikoc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2R1cmF0aW9uICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5kdXJhdGlvbjsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9ICh2b2lkKikoaW50cHRyX3Qpc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLQotICAgIGlmIChzdHJlYW1EZXNjLmR1cmF0aW9uID4gcEMtPm1fbWF4RHVyYXRpb24pCi0gICAgewotICAgICAgICBwQy0+bV9tYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlICAgICAgICAgID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIE00QU1SUl9nZXRtYXhBVXNpemUocEMtPm1fcENvcmVDb250ZXh0LCAmcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzYy5zdHJlYW1UeXBlKQotICAgIHsKLSAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRTWVNfa0FNUl9XQjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAtMjA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAtMjA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC0gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uIDoKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwQy0+bV9tYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIgOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKilwVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBkZXByZWNhdGVkIGluIG5leHQgdmVyc2lvbnMKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBmb3IgcmVzZXQgZHVyaW5nIHBsYXliYWNrICovCi0gICAgLyogKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQXUtPkNUUyA9IC0yMDsKLSAgICBwQXUtPkRUUyA9IC0yMDsKLQotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICB0aGUgdGltZSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfM0dQX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLSAgICBlcnIgPSBNNEFNUlJfc2VlayhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa05vUkFQcHJldmlvdXMsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9zZWVrKClcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqICAgICAgICAgIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIE00T1NBX0FjY2Vzc1VuaXQgdG8gTTRfQWNjZXNzVW5pdAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEgKHRoZSBhdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIHRpbWVTY2FsZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BVklfZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRBTVJSX25leHRBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotCi0gICAgaWYgKGVyciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgdGltZVNjYWxlID0gKE00T1NBX0Zsb2F0KShNNE9TQV9JbnQzMikoaW50cHRyX3QpKHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkvMTAwMDsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICA9IChNNF9NZWRpYVRpbWUpcEF1LT5DVFMvKi90aW1lU2NhbGUqLzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTICA9IChNNF9NZWRpYVRpbWUpcEF1LT5EVFMvKi90aW1lU2NhbGUqLzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZSBpbXBsZW1lbnRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZSBpbXBsZW1lbnRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhVHlwZSA9PSAwKSwgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFUeXBlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyR2xvYmFsSW50ZXJmYWNlID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJEYXRhSW50ZXJmYWNlID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKLQotICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksCi0gICAgICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCi0gICAgewotICAgICAgICAqcFJkckRhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9IChNNFJFQURFUl9EYXRhSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9EYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyRGF0YUludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIGZyZWUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcE1lZGlhVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0KLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgICAgICAgID0gTTRSRUFERVJfQU1SX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgICAgID0gTTRSRUFERVJfQU1SX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9vcGVuOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENsb3NlICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX0FNUl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX0FNUl9zZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dFN0cmVhbSAgICA9IE00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCAgICAgPSBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lICAgPSBNNE9TQV9OVUxMOyAvKmFsbCBBVXMgYXJlIFJBUCovCi0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRBdTsKLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX1BjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzOTIzNjdmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfV2F2LmMKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIHBjbSByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgTTRSRUFERVIgaW50ZXJmYWNlCi0gKiAgICAgICAgIG9uIHRvcCBvZiB0aGUgUENNIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfUGNtLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9XQVZfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSB3YXYgcmVhZGVyIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBkZS1hbGxvY2F0ZWQgYnkgdGhlIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfUENNX0NvbnRleHQKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX2NvcmVDb250ZXh0OyAgICAgICAgLyoqPCBjb3JlIHdhdiByZWFkZXIgY29udGV4dCAqLwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIG1fcEF1ZGlvU3RyZWFtOyAgICAgICAvKio8IHBvaW50ZXIgb24gdGhlIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBieSB0aGUgY29yZSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgIG1fYXVkaW9BdTsgICAgICAgICAgICAvKio8IGF1ZGlvIGFjY2VzcyB1bml0IHRvIGJlIGZpbGxlZCBieSB0aGUgY29yZSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogIG1fcE9zYUZpbGVSZWFkZXJGY3RzOyAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotCi19IE00UkVBREVSX1BDTV9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQ3JlYXRlcyBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgICAgICAgKE9VVCkgIFBvaW50ZXIgdG8gYSB3YXYgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcFJlYWRlckNvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UkVBREVSX1BDTV9Db250ZXh0KSwKLSAgICAgICAgIE00UkVBREVSX1dBViwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfUENNX0NvbnRleHQiKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bV9jb3JlQ29udGV4dCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0gICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wT3NhRmlsZVJlYWRlckZjdHMgID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhlIGNvbnRleHQgaXMgdW4tYWxsb2NhdGVkCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9kZXN0cm95KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBJbml0aWFsaXplcyB0aGUgcmVhZGVyIGluc3RhbmNlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgICAgKElOKSAgICBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcEZpbGVEZXNjcmlwdG9yOiAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nIHRoZSBtZWRpYSB0byBvcGVuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGVyciA9IE00UENNUl9vcGVuUmVhZCgmKHBDLT5tX2NvcmVDb250ZXh0KSwgKE00T1NBX0NoYXIqKXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogRnJlZSBhdWRpbyBBVSBhbmQgYXVkaW8gc3RyZWFtICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3N0cmVhbUlkLAotICAgICAgICAgICAgICAgICAmcEMtPm1fYXVkaW9BdSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9jbG9zZTogRXJyb3Igd2hlbiBmcmVlaW5nIGF1ZGlvIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9jb3JlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8qIENsb3NlIHRoYSBQQ00gZmlsZSAqLwotICAgICAgIGVyciA9IE00UENNUl9jbG9zZVJlYWQocEMtPm1fY29yZUNvbnRleHQpOwotICAgICAgIHBDLT5tX2NvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCB2b2lkKiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9zZXRPcHRpb246IGludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKQotICAgIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKXBWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZXRyaWV2ZXMgdGhlIGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIsIGdpdmVuIGFuIG9wdGlvbiBJRC4KLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6IChJTikgb3B0aW9uIGlkZW50aWZpY2F0b3Igd2hvc2Ugb3B0aW9uIHZhbHVlIGlzIHRvIGJlIHJldHJpZXZlZC4KLSAqIEBwYXJhbSAgIHBWYWx1ZTogIChPVVQpIG9wdGlvbiB2YWx1ZSByZXRyaWV2ZWQuCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSByZXF1aXJlZCBvcHRpb24gaWRlbnRpZmljYXRvciBpcyB1bmtub3duCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQ29udGV4dCA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgICAgICA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBubyBjaGVjayBvZiBjb250ZXh0IGF0IHRoaXMgbGV2ZWwgYmVjYXVzZSBzb21lIG9wdGlvbiBkb2VzIG5vdCBuZWVkIGl0ICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChwVmFsdWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0T3B0aW9uOiBpbnZhbGlkIHBvaW50ZXIgb24gdmFsdWUiKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICAqKChNNE9TQV9VSW50MzIqKXBWYWx1ZSkgPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb247Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbjoKLSAgICAgICAgZXJyID0gTTRQQ01SX2dldFZlcnNpb24oKE00X1ZlcnNpb25JbmZvKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBCaXRyYXRlID0gKE00T1NBX1VJbnQzMiopcFZhbHVlOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQml0cmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZAotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZCBmaWxsZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00V0FSX05PX01PUkVfU1RSRUFNICAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQz0oTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotLyogICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOyovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIGZEdXJhdGlvbjsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKiBwRHNpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIGVyciA9IE00UENNUl9nZXROZXh0U3RyZWFtKCBwQy0+bV9jb3JlQ29udGV4dCwgJnN0cmVhbURlc2MpOwotICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9TVFJFQU0pCi0gICAgewotICAgICAgICBzdHJlYW1JZEFycmF5WzBdID0gMDsKLSAgICAgICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgICAgIGVyciA9IE00UENNUl9zdGFydFJlYWRpbmcocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXkpOyAvKnRvIHB1dCBpbiBvcGVuIGZ1bmN0aW9uKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsgLyphbHNvIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTSovCi0gICAgfQotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjLnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tBdWRpb1Vua25vd246Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNTOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fMTZiaXRzVToKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzhiaXRzVToKLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogZm91bmQgYXVkaW8gc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBVTktOT1dOIHN0cmVhbSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgIE00UkVBREVSX1dBViwgKE00T1NBX0NoYXIgKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gKE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLQotICAgIHBEc2kgPSAoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIE00T1NBX0RFQlVHX0lGMSgocERzaSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBpbiBzdHJlYW0iKTsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBwRHNpLT5TYW1wbGVGcmVxdWVuY3k7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgICA9IChNNE9TQV9VSW50MzIpKHBEc2ktPkJpdHNQZXJTYW1wbGUvOCk7Ci0gICAgLyogbV9ieXRlRnJhbWVMZW5ndGggaXMgYmFkbHkgbmFtZWQ6IGl0IGlzIG5vdCBpbiBieXRlcyBidXQgaW4gc2FtcGxlcyBudW1iZXIgKi8KLSAgICBpZihwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDApCi0gICAgewotICAgICAgICAvKiBBTVIgY2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCAgID0KLSAgICAgICAgICAgICAoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzUwKS9wRHNpLT5uYkNoYW5uZWxzKVwKLSAgICAgICAgICAgICAgICAvcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZTsvKi81MCB0byBnZXQgYXJvdW5kIDIwIG1zIG9mIGF1ZGlvKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQUFDIENhc2UgKi8KLSAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZS84KS8xNS42MjUpL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOwotICAgIH0KLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICAgPSBwRHNpLT5uYkNoYW5uZWxzOwotCi0gICAgTTRPU0FfVElNRV9UT19NUyggZkR1cmF0aW9uLCBzdHJlYW1EZXNjLmR1cmF0aW9uLCBzdHJlYW1EZXNjLnRpbWVTY2FsZSk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2R1cmF0aW9uICAgICAgICAgICAgICAgID0gKE00T1NBX0ludDMyKWZEdXJhdGlvbjsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3N0cmVhbUlkICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fcFVzZXJEYXRhICAgICAgICAgICAgICAgPQotICAgICAgICAodm9pZCopKGludHB0cl90KXN0cmVhbURlc2MudGltZVNjYWxlOyAvKnRyaWNrIHRvIGNoYW5nZSovCi0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlICAgICAgICAgID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fbWF4QVVTaXplICAgICAgICAgICAgICAgPQotICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGgqcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZVwKLSAgICAgICAgICAgICpwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHM7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX3N0cmVhbVR5cGUgICAgICAgICAgICAgID0gTTREQV9TdHJlYW1UeXBlQXVkaW9QY207Ci0KLSAgICAqcFN0cmVhbUhhbmRsZXIgPSBwQy0+bV9wQXVkaW9TdHJlYW07Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0OiAgICAoSU4pIHBvaW50ZXIgdG8gdGhlIGFjY2VzcyB1bml0KGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKSB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgcEF1LT5DVFMgICAgICAgICA9IDA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IDA7Ci0gICAgcEF1LT5hdHRyaWJ1dGUgICA9IDA7Ci0gICAgcEF1LT5uYkZyYWcgICAgICA9IDA7Ci0KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7LypwQnVmZmVyOyovCi0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXM6IHNlZWsgaXQgdG8gYmVnaW5uaW5nIGFuZCBtYWtlIGl0IHJlYWR5IHRvIGJlIHJlYWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgdGltZTY0ID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX1BDTV9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fcmVzZXQ6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX3Jlc2V0OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgcEF1LT5DVFMgPSAwOwotICAgIHBBdS0+RFRTID0gMDsKLQotICAgIC8qIFRoaXMgY2FsbCBpcyBuZWVkZWQgb25seSB3aGVuIHJlcGxheSBkdXJpbmcgcGxheWJhY2sgKi8KLSAgICBlcnIgPSBNNFBDTVJfc2VlayhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IHRoZSBuZXh0IGFjY2VzcyB1bml0IG9mIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0IGFmdGVyIGNyZWF0aW9uKQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm5zIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0gKiBAcmV0dXJucyBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICAgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgb24gdGhlIHN0cmVhbSBmb3IgbmV3IGFjY2VzcyB1bml0Ci0gKiBAcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbSAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgLyoga2VlcCB0cmFjZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gQVUgdG8gYmUgYWJsZSB0byBmcmVlIHRoZW0gYXQgZGVzdHJveSgpCi0gICAgICAgYnV0IGJlIGF3YXJlIHRoYXQgc3lzdGVtIGlzIHJpc2t5IGFuZCB3b3VsZCBuZWVkIHVwZ3JhZGUgaWYgbW9yZSB0aGFuCi0gICAgICAgb25lIHZpZGVvIGFuZCBvbmUgYXVkaW8gQVUgaXMgbmVlZGVkICovCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE5leHRBdTogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEF1LT5uYkZyYWcgPSAwOwotICAgIGVyciA9IE00UENNUl9uZXh0QVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotCi0gICAgaWYgKGVyciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICA9IChNNE9TQV9Eb3VibGUpcEF1LT5DVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgPSAoTTRPU0FfRG91YmxlKXBBdS0+RFRTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwVGltZSAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0IGluIHRoaXMgcmVhZGVyLCB3ZSBkbyBub3QgbW9kaWZ5IHRoZSB0aW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgIE00T1NBX0ludDMyKiBwVGltZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICB0aW1lNjQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9qdW1wOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX1BDTV9qdW1wOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwotCi0gICAgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IHBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2p1bXA6IEVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIGVyciA9IE00UENNUl9zZWVrKHBDLT5tX2NvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGdlbmVyaWMgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUgcmVhZGVyCi0gKgotICogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIHJlYWRlcgotICogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gKgotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotICogICAgICAgICAgICBFUlJfQUxMT0MgICAgICBpZiBhbiBhbGxvY2F0aW9uIGZhaWxlZAotICogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYVR5cGUgPT0gMCksICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhVHlwZSBwYXNzZWQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwgTTRSRUFERVJfV0FWLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00UkVBREVSX1BDTSBHbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9EYXRhSW50ZXJmYWNlKSwgTTRSRUFERVJfV0FWLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikgIk00UkVBREVSX1BDTSBEYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcE1lZGlhVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0KLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGUgICAgICAgICAgID0gTTRSRUFERVJfUENNX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgICAgID0gTTRSRUFERVJfUENNX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9vcGVuOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENsb3NlICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX1BDTV9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgICAgICA9IE00UkVBREVSX1BDTV9zZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dFN0cmVhbSAgICA9IE00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCAgICAgPSBNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgICAgID0gTTRSRUFERVJfUENNX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lICAgPSBNNE9TQV9OVUxMOyAvKmFsbCBBVXMgYXJlIFJBUCovCi0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgICAgID0gTTRSRUFERVJfUENNX2dldE5leHRBdTsKLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYjgzOTUyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGV4dGVybmFsIEJpdHN0cmVhbSBwYXJzZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDggY29kZTsKLSAgICBNNE9TQV9JbnQzMiBwcm9maWxlOwotICAgIE00T1NBX0ludDMyIGxldmVsOwotfSBjb2RlUHJvZmlsZUxldmVsOwotCi1zdGF0aWMgY29kZVByb2ZpbGVMZXZlbCBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW10gPSB7Ci0gICAgezB4MDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MDQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAotICAgIHsweDA1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9LAotICAgIHsweDA4LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAotICAgIHsweDExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgxMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MzMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDM0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHg0MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4NTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg3MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDgxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDgyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDkxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg5MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDk0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhhMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhhMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhhMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4YjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGMxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGQxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhkMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGYwLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4ZjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhmMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGYzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhmNSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9Ci19OwotCi1NNE9TQV9VSW50MzIgTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KHBhcnNpbmdDdHh0LG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00VkRfRVhURVJOQUxfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgICAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoIGJpdHNUb1dyaXRlLGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpCi17Ci0gICAgTTRWU19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgICAgICAgICA9IDA7Ci0gICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCAgICAgICAgICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9JbnQ4ICopcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpCi0gICAgewotICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmFuZG9tIGFjY2Vzc2libGUgdm9sICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsvKiB2aWRlbyBvYmplY3QgdHlwZSBpbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHZpZGVvIG9iamVjdCBsYXllciB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7IC8qIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCAoOCs4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogdm9sIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7LyogY2hyb21hIGZvcm1hdCArIGxvdyBkZWxheSAoMysxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2YnYgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgYml0cmF0ZSArIDIgbWFya2VyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgMSArIDE1ICsgMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSk7LyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIHZidiBidWZmZXIgc2l6ZSArIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSszKzExKzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7LyogZmlyc3QgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgcmV0dXJuIDA7IC8qIG9ubHkgcmVjdGFuZ3VsYXIgY2FzZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGggPSAoaSA9PSAwKSA/IDEgOiBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBGaXhlZCBWT1AgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCk7LyogRml4ZWQgVk9QIHRpbWUgaW5jcmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIC8qIDAgPSByZWN0YW5ndWxhciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ByaXRlIHN0YXRpYyA9IDEgYW5kIFNwcml0ZSBHTUMgPSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG93IGxhdGVuY3kgc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBxdWFudCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wcmVjaXNpb24gPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIG5vZ3JheSBxdWFudCB1cGRhdGUgKyBjb21wb3NpdGlvbiBtZXRob2QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBuZXdwcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgcmVzb2x1dGlvbiB2b3AgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWYgbGF5ZXIgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmhhbmNlbWVudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVByb2ZpbGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjUgOiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCNSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlzdWFsIG9iamVjdCBsYXllciBwcmlvcml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIGVuZCAtLS0tLSAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDE2IGluZGV4ID0gMjg7IC8qIHRoZSAyOXRoIGJ5dGUgaXMgU1BTIHN0YXJ0ICovCi0gICAgTTRPU0FfQm9vbCBjb25zdHJhaW50U2V0MzsKLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmICgoRFNJU2l6ZSA8PSBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbDogRFNJIGlzIGludmFsaWQiKTsKLSAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBjb25zdHJhaW50U2V0MyA9IChwRFNJW2luZGV4KzJdICYgMHgxMCk7Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGU6ICVkIGNvbnN0cmFpbjNmbGFnOiAlZCIsCi0gICAgICAgICAgcERTSVtpbmRleCsxXSwgcERTSVtpbmRleCszXSwgY29uc3RyYWludFNldDMpOwotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzFdKSB7Ci0gICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyMjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQyMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI0NDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIH0KLQotICAgIHN3aXRjaCAocERTSVtpbmRleCszXSkgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIGlmIChjb25zdHJhaW50U2V0MykKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMWI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDExOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwyMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw1MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcHJvZmlsZSAlIiBQUklkMzIgIiBsZXZlbCAlIiBQUklkMzIsCi0gICAgICAgICAgKnBQcm9maWxlLCAqcExldmVsKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MTYgaW5kZXggPSA3OyAvKiB0aGUgNXRoIGFuZCA2dGggYnl0ZXMgY29udGFpbiB0aGUgbGV2ZWwgYW5kIHByb2ZpbGUgKi8KLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICBBTE9HRSgiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBpbnZhbGlkIHBvaW50ZXIgZm9yIHBQcm9maWxlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKChEU0lTaXplIDwgaW5kZXgpIHx8IChwRFNJID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsOiBEU0kgaXMgaW52YWxpZCIpOwotICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBBTE9HVigiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGUgJWQiLAotICAgICAgICAgIHBEU0lbNl0sIHBEU0lbNV0pOwotICAgIC8qIGdldCB0aGUgSDI2MyBsZXZlbCAqLwotICAgIHN3aXRjaCAocERTSVs1XSkgewotICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWwzMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ1OgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw0NTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw1MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19IMjYzTGV2ZWw3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0KLSAgICAvKiBnZXQgSDI2MyBwcm9maWxlICovCi0gICAgc3dpdGNoIChwRFNJWzZdKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2Rpbmc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3k7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIH0KLSAgICBBTE9HVigiZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICUiIFBSSWQzMiAiIGxldmVsICUiIFBSSWQzMiwKLSAgICAgICAgICAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDggcHJvZmlsZUFuZExldmVsLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDMyIGkgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBBTE9HVigiZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwgcHJvZmlsZUFuZExldmVsICVkIiwgcHJvZmlsZUFuZExldmVsKTsKLSAgICBsZW5ndGggPSBzaXplb2YobXBlZzRQcm9maWxlTGV2ZWxUYWJsZSkgL3NpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlWzBdKTsKLSAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGlmIChtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmNvZGUgPT0gcHJvZmlsZUFuZExldmVsKSB7Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLnByb2ZpbGU7Ci0gICAgICAgICAgICAqcExldmVsID0gbXBlZzRQcm9maWxlTGV2ZWxUYWJsZVtpXS5sZXZlbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlICUiIFBSSWQzMiAiIGxldmVsICUiIFBSSWQzMiwKLSAgICAgICAgICAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX1Rvb2xzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmRiNGI0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9Ub29scy5jCi0gKiBAYnJpZWYKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgQml0c3RyZWFtIHBhcnNlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX1VJbnQzMiBNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICBNNE9TQV9VSW50MzIgbmJfYml0cykKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgY29kZTsKLSAgICBNNE9TQV9VSW50MzIgICAgaTsKLSAgICBjb2RlID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfYml0czsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPT0gOCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9NNE9TQV9tZW1jcHkoIChNNE9TQV9NZW1BZGRyOCkmKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSksIHBhcnNpbmdDdHh0LT5pbiwKLSAgICAgICAgICAgIC8vICAgICBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICAgICAgcGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlID0gKHVuc2lnbmVkIGNoYXIpKHBhcnNpbmdDdHh0LT5pbilbMF07Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+aW4rKzsKLSAgICAgICAgICAgIC8vZnJlYWQoJnN0cmVhbV9ieXRlLCBzaXplb2YodW5zaWduZWQgY2hhciksMSxpbik7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBjb2RlID0gKGNvZGUgPDwgMSk7Ci0gICAgICAgIGNvZGUgfD0gKChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgJiAweDgwKSA+PiA3KTsKLQotICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlIDw8IDEpOwotICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2luZGV4Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvZGU7Ci19Ci0KLU00T1NBX0VSUiBNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyMzIgZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cykKLXsKLSAgICBNNE9TQV9VSW50OCBpLGo7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBfZGVzdCA9IDAsIG1hc2sgPSAwLCB0ZW1wID0gMTsKLSAgICBNNE9TQV9VSW50MzIgaW5wdXQgPSBiaXRzVG9Xcml0ZTsKLSAgICBpbnB1dCA9IChpbnB1dCA8PCAoMzIgLSBuYl9iaXRzIC0gb2Zmc2V0KSk7Ci0KLSAgICAvKiBQdXQgZGVzdGluYXRpb24gYnVmZmVyIHRvIDAgKi8KLSAgICBmb3Ioaj0wO2o8MztqKyspCi0gICAgewotICAgICAgICBmb3IoaT0wO2k8ODtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChqKjgpK2kgPj0gb2Zmc2V0ICYmIChqKjgpK2kgPCBuYl9iaXRzICsgb2Zmc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hc2sgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtYXNrID0gfm1hc2s7Ci0gICAgKmRlc3RfYml0cyAmPSBtYXNrOwotCi0gICAgLyogUGFyc2UgaW5wdXQgYml0cywgYW5kIGZpbGwgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICgoaW5wdXQgJiAoMHg4MDAwMDAwMCA+PiBvZmZzZXQpKSA+PiAoMzEtb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgLy8qZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgzMSAtIGkpKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9iaXRzIHw9ICh0ZW1wIDw8ICgoNyooaisxKSktaStqKSk7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSAoaW5wdXQgPDwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZiYjQ2Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgLSMgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIHRyYW5zZm9ybSBSR0I1NjUgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAbm90ZSAgICBDb252ZXJ0IFJHQjU2NSB0byBZVVY0MjAsCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAqICAgICAgICAgICAgICAgICAgR2V0IDQgUkdCIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAqICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBSR0I1NjUgUGxhbmUKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byAgWVVWNDIwIGJ1ZmZlciBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX3JnYiwgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3JnYm5fZGF0YSwgKnB1OF9yZ2JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLSAgICBNNFZJRklfVUludDggY291bnRfbnVsbD0wOwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjEwLGkzMl9nMTAsaTMyX3IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjExLGkzMl9nMTEsaTMyX3IxMSx1MTZfcGl4NCk7Ci0gICAgICAgICAgICAvKiBJZiBSR0IgaXMgdHJhbnNwYXJlbnQgY29sb3IgKDAsIDYzLCAwKSwgd2UgdHJhbnNmb3JtIGl0IHRvIHdoaXRlICgzMSw2MywzMSkgKi8KLSAgICAgICAgICAgIGlmKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMCA9PSAwICYmIGkzMl9nMTAgPT0gNjMgJiYgaTMyX3IxMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjEwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjAxID09IDAgJiYgaTMyX2cwMSA9PSA2MyAmJiBpMzJfcjAxID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTEgPT0gMCAmJiBpMzJfZzExID09IDYzICYmIGkzMl9yMTEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjExID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQ29udmVydCBSR0IgdmFsdWUgdG8gWVVWICovCi0gICAgICAgICAgICBpMzJfdTAwID0gVTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMCA9IFkxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTAgPSBZMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAxID0gWTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMSA9IFkxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLQotICAgICAgICAgICAgLyogU3RvcmUgbHVtaW5hbmNlIGRhdGEgKi8KLSAgICAgICAgICAgIHB1OF95blswXSA9IChNNFZJRklfVUludDgpaTMyX3kwMDsKLSAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsKLSAgICAgICAgICAgIHB1OF95c1swXSA9IChNNFZJRklfVUludDgpaTMyX3kwMTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLSAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmMGJjMDYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9BdWRpb01peGluZy5jCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBhdWRpbyBtaXhpbmcgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKiBQdXQgdGhlIGRlZmluaXRpb24gb2Ygc2lsZW5jZSBmcmFtZXMgaGVyZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTdGF0aWMgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0Jvb2wgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoIE00T1NBX0ludDMyICphdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKTsKLS8qKgotICogICAgSW50ZXJuYWwgd2FybmluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDMwKQotCi0vKiBBIGRlZmluZSB1c2VkIHdpdGggU1NSQyAxLjA0IGFuZCBhYm92ZSB0byBhdm9pZCB0YWtpbmcKLWJsb2NrcyBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBNNFZTU19TU1JDX01JTkJMT0NLU0laRSAgICAgICAgNjAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpwRmlsZVdyaXRlUHRyRmN0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVSZWFkUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZVB0ckZjdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlCZWdpbkxvb3AgPiBwU2V0dGluZ3MtPnVpRW5kTG9vcCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBCZWdpbiBsb29wIHRpbWUgaXMgaGlnaGVyIHRoYW4gZW5kIGxvb3AgdGltZSEiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpLAotICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBcCi0gICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQscmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXphdGlvbiBvZiBjb250ZXh0IFZhcmlhYmxlcyAqLwotICAgIG1lbXNldCgodm9pZCAqKXBDICwwLAotICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0KSk7Ci0gICAgLyoqCi0gICAgKiBDb3B5IHRoaXMgc2V0dGluZyBpbiBjb250ZXh0ICovCi0gICAgcEMtPmlBZGRDdHMgPSBwU2V0dGluZ3MtPnVpQWRkQ3RzOwotICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBwU2V0dGluZ3MtPmJSZW1vdmVPcmlnaW5hbDsKLSAgICBwQy0+Yl9EdWNraW5nTmVlZGVlZCA9IHBTZXR0aW5ncy0+Yl9EdWNraW5nTmVlZGVlZDsKLSAgICBwQy0+SW5EdWNraW5nX3RocmVzaG9sZCA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBwQy0+ZkJUVm9sTGV2ZWwgPSBwU2V0dGluZ3MtPmZCVFZvbExldmVsOwotICAgIHBDLT5mUFRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZlBUVm9sTGV2ZWw7Ci0gICAgcEMtPkluRHVja2luZ19sb3dWb2x1bWUgPSBwU2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgcEMtPmJEb0R1Y2tpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ykxvb3AgPSBwU2V0dGluZ3MtPmJMb29wOwotICAgIHBDLT5iTm9Mb29waW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJqdW1wZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgLyoqCi0gICAgKiBJbml0IHNvbWUgY29udGV4dCB2YXJpYWJsZXMgKi8KLQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBZGRlZENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+Zk9yaWdGYWN0b3IgPSAxLjBGOwotICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjBGOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBJbml0IFBDLT5ld2MgbWVtYmVycyAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPSAxOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBEdW1teUF1QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIGZpbGVzeXN0ZW0gZnVuY3Rpb24gc2V0ICovCi0gICAgcEMtPnBPc2FGaWxlUmVhZFB0ciA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYUZpbGVXcml0UHRyID0gcEZpbGVXcml0ZVB0ckZjdDsKLQotICAgIC8qKgotICAgICogU3NyYyBzdHVmZiAqLwotICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlCZWdpbkxvb3AgPSBwU2V0dGluZ3MtPnVpQmVnaW5Mb29wOwotICAgIHBDLT51aUVuZExvb3AgPSBwU2V0dGluZ3MtPnVpRW5kTG9vcDsKLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyogIENhbGwgdGhlIG1lZGlhIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uIG1vZHVsZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIGlucHV0IGNsaXAsIGFkZGVkIGNsaXAgYW5kIG91dHB1dCBjbGlwIGFuZCBwcm9jZWVkIHdpdGggdGhlIHNldHRpbmdzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbihwQywgcFNldHRpbmdzKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU87Ci0gICAgZWxzZQotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLQotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgLypnSW5wdXRQYXJhbXMubHZCVENoYW5uZWxDb3VudCovCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgxNiwKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywKLSAgICAgICAgLyogZ0lucHV0UGFyYW1zLmx2T3V0U2FtcGxlUmF0ZSovKE00T1NBX0ludDMyKXBTZXR0aW5ncy0+b3V0cHV0QVNGLCAxKTsKLSAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBMVkF1ZGlvUmVzYW1wbGVyICkKLSAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICB9Ci0gICAgICAgIExWQXVkaW9zZXRTYW1wbGVSYXRlKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgLypnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUqLwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0KLSAgICBMVkF1ZGlvc2V0Vm9sdW1lKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2KSgweDEwMDAgKSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2KSgweDEwMDAgKSk7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8gbWl4aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgICAgcFByb2dyZXNzICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSBmaW5hbGl6YXRpb24gb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzogQXVkaW8gbWl4aW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKCBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogU3RhdGUgYXV0b21hdG9uICovCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU86Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8ocEMpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29tcHV0ZSB0aGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQotICAgICAgICAgICAgKiBOb3RlOiBhdWRpbyBhbmQgdmlkZW8gQ1RTIGFyZSBub3QgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICAgICAqIHRoZSBjYWxsIG9mIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyAqLwotCi0gICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IEZpcnN0IDAtNTAlIHNlZ21lbnQgaXMgZGVkaWNhdGVkIHRvIHN0YXRlIDoKLSAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTyAqLwotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoNTAgKiAocEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykKLSAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoZXJlIG1heSBiZSBubyBhdWRpbyB0cmFjayAoUmVtb3ZlIGF1ZGlvIHRyYWNrIGZlYXR1cmUpLgotICAgICAgICAgICAgKiBJbiB0aGF0IGNhc2Ugd2UgZG91YmxlIHRoZSBjdXJyZW50IHBlcmNlbnRhZ2UgKi8KLSAgICAgICAgICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duID09IHBDLT5ld2MuV3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCAqcFByb2dyZXNzKSA8PD0gMTsgLyoqPCB4MiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggKnBQcm9ncmVzcyA+PSA1MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIDQ5OyAvKio8IFZpZGVvIHByb2Nlc3NpbmcgaXMgbm90IGdyZWF0ZXIgdGhhbiA1MCUgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBWaWRlbyBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGF1ZGlvIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX0ZJUlNUX1NFR01FTlQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIE5vIGF1ZGlvLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIEZJTklTSEVEICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICE9IC1wQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICYmIChwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIC0gMC41KQotICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA+IHBDLT51aUVuZExvb3AKLSAgICAgICAgICAgICAgICAmJiBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+Ykxvb3AgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGp1bXBDVFMgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPgotICAgICAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW0sICZqdW1wQ1RTKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwOiBlcnJvciB3aGVuIGp1bXBpbmcgaW4gYWRkZWQgYXVkaW8gY2xpcDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVzZSBvZmZzZXQgdG8gZ2l2ZSBhIGNvcnJlY3QgQ1RTIC4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlJlbW92ZU9yaWdpbmFsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgocEMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UocEMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29tcHV0ZSB0aGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQotICAgICAgICAgICAgKiBOb3RlOiBhdWRpbyBhbmQgdmlkZW8gQ1RTIGFyZSBub3QgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICAgICAqIHRoZSBjYWxsIG9mIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyAqLwotICAgICAgICAgICAgaWYoIDAgIT0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogU2Vjb25kIDUwLTEwMCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGVzIDoKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU8uLi4gKi8KLSAgICAgICAgICAgICAgICAvKiBGb3IgQXVkaW8gdGhlIHByb2dyZXNzIGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uIGRBdG8gYW5kIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBpdCBpcyBtb3JlIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoNTAKLSAgICAgICAgICAgICAgICAgICAgKyAoNTAgKiBwQy0+ZXdjLmRBVG8gLSBwQy0+cElucHV0Q2xpcEN0eHQtPmlWb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAvIChwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbikpOyAvKio8IDUwIGZvciAxMDAvMiAqKi8KLQotICAgICAgICAgICAgICAgIGlmKCAqcFByb2dyZXNzID49IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDk5OyAvKio8IEl0J3Mgbm90IHJlYWxseSBmaW5pc2hlZCwgSSBwcmVmZXIgdG8gcmV0dXJuIGxlc3MgdGhhbiAxMDAlICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSA5OTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEF1ZGlvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW8gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUHJvZ3Jlc3MgcGVyY2VudGFnZTogZmluYWxpemUgZmluaXNoZWQgLT4gMTAwJSAqLwotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEF1ZGlvIG1peGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGNvcnJlY3Qgd2FybmluZyAqLwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IFN0YXRlIGVycm9yICgweCV4KSEgUmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgbGFzdENUUzsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKTogTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcDogcENvbnRleHQgaXNcCi0gICAgICAgICAgICAgTTRPU0FfTlVMTCwgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgSW5wdXQgM0dQUCBmaWxlICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBJbnB1dENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cElucHV0Q2xpcEN0eHQpOwotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgQWRkZWQgM0dQUCBmaWxlICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBZGRlZENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIDNHUCB3cml0ZXIuIEluIG5vcm1hbCB1c2UgY2FzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCwKLSAgICAgIGJ1dCBub3QgaW4gYWJvcnQgdXNlIGNhc2UgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICBsYXN0Q1RTID0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb247Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiwgJmxhc3RDVFMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSgKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlV3JpdGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuIHRoZSBlcnJvciBiZWNhdXNlIHdlIGhhdmUgb3RoZXIgdGhpbmdzIHRvIGZyZWUhICovCi0gICAgICAgIH0KLSAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNzcmMgc3R1ZmYgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5Tc3JjU2NyYXRjaCk7Ci0gICAgICAgIHBDLT5Tc3JjU2NyYXRjaCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJJbik7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgJiYgKE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwKSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUZW1wQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBUZW1wQnVmZmVyKTsKLSAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAocEMtPnBMVkF1ZGlvUmVzYW1wbGVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBMVkRlc3Ryb3kocEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDLT5TaGVsbEFQSSk7Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqICAgICAgICAgICAgICAgICAgU1RBVElDIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRBU0YgPSAwOwotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDLCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBUaGUgQWRkIFZvbHVtZSBtdXN0IGJlIChzdHJpY3RseSkgc3VwZXJpb3IgdGhhbiB6ZXJvICovCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IEFkZFZvbHVtZSBpcyB6ZXJvLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk87Ci0gICAgfQotICAgIC8qCi0gICAgZWxzZSBpZihwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkgLy8gSWYgdm9sdW1lIGlzIHNldCB0byAxMDAsIG5vIG1vcmUgb3JpZ2luYWwgYXVkaW8gLi4uCi0gICAgewotICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICAqLwotICAgIC8qKgotICAgICogQnVpbGQgdGhlIGlucHV0IGNsaXAgc2V0dGluZ3MgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MucEZpbGUgPQotICAgICAgICBwU2V0dGluZ3MtPnBPcmlnaW5hbENsaXBGaWxlOyAvKio8IElucHV0IDNHUFAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPklucHV0Q2xpcFNldHRpbmdzLkZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgcEMtPklucHV0Q2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgb3JpZ2luYWwgQXVkaW8vVmlkZW8gM0dQUCBjbGlwICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQy0+cElucHV0Q2xpcEN0eHQsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQy0+cElucHV0Q2xpcEN0eHQsICZwQy0+SW5wdXRDbGlwU2V0dGluZ3MsCi0gICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgLyoqCi0gICAgKiBJZiB0aGVyZSBpcyBubyB2aWRlbywgaXQncyBhbiBlcnJvciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogbm8gdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgY2xpcCBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBJbnB1dENsaXBDdHh0LAotICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQnVpbGQgdGhlIGFkZGVkIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgPQotICAgICAgICBwU2V0dGluZ3MtPnBBZGRlZEF1ZGlvVHJhY2tGaWxlOyAvKio8IEFkZGVkIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5GaWxlVHlwZSA9IHBTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgIDA7IC8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpRW5kQ3V0VGltZSAgID0gMDsvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM9Ci0gICAgICAgIHBTZXR0aW5ncy0+dWlOdW1DaGFubmVsczsKLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeT0gICAgcFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnBGaWxlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIGFkZGVkIEF1ZGlvIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQy0+cEFkZGVkQ2xpcEN0eHQsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwSW5pdChhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQy0+cEFkZGVkQ2xpcEN0eHQsICZwQy0+QWRkZWRDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfRkFMU0UsIE00T1NBX1RSVUUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvLCBpdCdzIGFuIGVycm9yICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogbm8gYXVkaW8gbm9yIHZpZGVvIHN0cmVhbSBpbiBjbGlwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgY2xpcCBwcm9wZXJ0aWVzICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDLT5wQWRkZWRDbGlwQ3R4dCwKLSAgICAgICAgICAgICZwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPm91dHB1dEFTRiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAxNjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjQwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAzMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBwYXJhbWV0ZXIgaW4gb3V0cHV0IEFTRiAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPT0gTTRPU0FfVFJVRQotICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUDMgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSAhPSBvdXRwdXRBU0YKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzKSApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXRBU0YgPSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDMyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAyMDQ4ICogcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGOwotCi0gICAgICAgICAgICBpZiggb3V0cHV0QVNGICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGNhbGwgU1NSQyBpbiBvcmRlciB0byBhbGlnbiBBU0YgYW5kL29yIG5iIG9mIGNoYW5uZWxzICovCi0gICAgICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgPCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTdGVyZW8gdG8gTW9ubyAqLwotICAgICAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA+IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE1vbm8gdG8gU3RlcmVvICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgY29tcGF0aWJpbGl0eSBjaGFydCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KHBDLAotICAgICAgICAgICAgJnBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICZwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGxvb3AgcGFyYW1ldGVycyAqLwotICAgICAgICBpZiggcEMtPnVpQmVnaW5Mb29wID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgIGJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBhZGRlZCBjbGlwIGF1ZGlvIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPaywgbGV0J3MgZ28gd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICovCi0gICAgICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBObyBhZGRlZCBmaWxlLCBmb3JjZSByZW1vdmUgb3JpZ2luYWwgKi8KLSAgICAgICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOwotICAgICAgICBwQy0+YlJlbW92ZU9yaWdpbmFsID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdmlkZW8gcHJvcGVydGllcyBvZiB0aGUgaW5wdXQgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0ZGF0YVBhcnRpdGlvbjsKLSAgICBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZTsKLSAgICBwQy0+ZXdjLm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0xldmVsOwotICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWRkIGEgbGluayB0byB2aWRlbyBkc2kgKi8KLSAgICBpZiggTTRTWVNfa0gyNjQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLQotICAgICAgICAvKiBGb3IgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyICovCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGdldCBEU0kgZm9yIEgyNjQgc3RyZWFtIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwiKTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGVuY0hlYWRlci0+cEJ1Zj0weCV4LCBzaXplPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPnBCdWYsIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBzZW5kIERTSSBmb3IgSDI2NCBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSAoSDI2NCksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAoTTRPU0FfVUludDE2KWVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBWaWRlb091dHB1dERzaSwgKHZvaWQgKillbmNIZWFkZXItPnBCdWYsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMLCBjYW5ub3QgZ2V0IHRoZSBEU0kiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBpbnB1dCBjbGlwIHZpZGVvIHN0cmVhbSB0eXBlID0gMHgleCIsCi0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgYXVkaW8gcHJvcGVydGllcyBvZiB0aGUgYWRkZWQgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICAvKiBpZiBvdXRwdXQgc2V0dGluZ3MgYXJlIGRpZmZlcmVudHMgZnJvbSBhZGRlZCBjbGlwIHNldHRpbmdzLAotICAgICAgICAgICAgd2UgbmVlZCB0byByZWVuY29kZSBCR00gKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNldCByZWFkZXIgRFNJIHRvIE5VTEwgKHVua25vd24pLCB3ZSB3aWxsIHVzZSBlbmNvZGVyIERTSSBsYXRlciAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5cCi0gICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMTIyMDA7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9IDMyMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5zY2FsZV9hdWRpbyA9IHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSAvIDEwMDAuMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSArPSBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMTYwOyAvKiBFVlJDIGZyYW1lcyBhcmUgMjAgbXMgYXQgODAwMCBIegotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCByZWFkZXIgRFNJIHRvIE5VTEwgKHVua25vd24pLCB3ZSB3aWxsIHVzZSBlbmNvZGVyIERTSSBsYXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSA4MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPT0gMTYwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IChNNE9TQV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogTm8gYXVkaW8gdHJhY2sgaW4gaW5wdXQgZmlsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQWRkIGEgbGluayB0byBhdWRpbyBkc2kgKi8KLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBjb21tb24gJ3NpbGVuY2UgZnJhbWUgc3R1ZmYnIHRvIENsaXBDb250ZXh0ICovCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAtcEMtPnBJbnB1dENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogQ29weSBjb21tb24gJ3NpbGVuY2UgZnJhbWUgc3R1ZmYnIHRvIENsaXBDb250ZXh0ICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhID0gcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAvKiBSZXNldCB0aW1lICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBBZGRDdHMgaXMgbG93ZXIgdGhhbiBvcmlnaW5hbCBjbGlwIGR1cmF0aW9uICovCi0gICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkKLSAgICAgICAgJiYgKHBDLT5pQWRkQ3RzID4gKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1aUFkZEN0cyBpcyBsYXJnZXIgdGhhbiB2aWRlbyBkdXJhdGlvbixcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrcyBhcmUgbm90IGNvbXBhdGlibGUsIHJlcGxhY2UgaW5wdXQgdHJhY2sgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQy0+cElucHV0Q2xpcEN0eHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gbWl4aW5nIGlzIHJlcXVpcmVkICovCi0gICAgaWYoICggKCBwQy0+Ykhhc0F1ZGlvKSAmJiAoTTRPU0FfRkFMU0UKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUpKQotICAgICAgICB8fCAoTTRPU0FfVFJVRSA9PSBwQy0+YlJlbW92ZU9yaWdpbmFsKSApIC8qfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFNldHRpbmdzLT51aUFkZFZvbHVtZSA+PSAxMDApKSAqLwotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5iQXVkaW9NaXhpbmdJc05lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBvdXRwdXQgYXVkaW8gY2FuIHN1cHBvcnQgc2lsZW5jZSBmcmFtZXMKLSAgICBUcmljayBpIHVzZSBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCBmaWxlZCB0byBzdG9yZSB0aGF0ICAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsKLQotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+aUFkZEN0cyA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgaUFkZEN0cyBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAwIDwgcEMtPnVpRW5kTG9vcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICB1aUVuZExvb3Agc2hvdWxkIGJlIHNldCB0byAwIHdpdGggdGhpcyBhdWRpbyB0cmFjayAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCA9PSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIGZhY3RvciB0byBhcHBseSB0byBzYW1wbGUgdG8gZG8gdGhlIG1peGluZyAqLwotICAgICAgICBwQy0+ZkFkZGVkRmFjdG9yID0gMC41MEY7Ci0gICAgICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDAuNTBGOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBTU1JDIGlzIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iX1NTUkNuZWVkZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG51bWVyYXRvciwgZGVub21pbmF0b3IsIHJhdGlvLCByYXRpb0J1ZmZlcjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0IHRoZSBTU1JDIG1vZHVsZSAqLwotICAgICAgICBTU1JDX1JldHVyblN0YXR1c19lbgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzOyAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYgTnJTYW1wbGVzTWluID0KLSAgICAgICAgICAgIDA7IC8qIE1pbmltYWwgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgKi8KLSAgICAgICAgTFZNX0lOVDMyCi0gICAgICAgICAgICBTY3JhdGNoU2l6ZTsgLyogVGhlIHNpemUgb2YgdGhlIHNjcmF0Y2ggbWVtb3J5ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgTFZNX0lOVDE2Ci0gICAgICAgICAgICAqcElucHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIGlucHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIHBPdXRwdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBpbiB0aGUgc2NyYXRjaCBidWZmZXIgICovCi0gICAgICAgIFNTUkNfUGFyYW1zX3Qgc3NyY1BhcmFtczsgICAgICAgICAgLyogTWVtb3J5IGZvciBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDExMDI1OgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjQwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBpbnZhbGlkIGFkZGVkIGNsaXAgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAxID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX01PTk87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX1NURVJFTzsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCggcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgb3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAoJWQgSHopLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgUmV0dXJuU3RhdHVzID0gMDsKLQotICAgICAgICBzd2l0Y2ggKHNzcmNQYXJhbXMuU1NSQ19Gc19Jbil7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxMjgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE3NjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTkyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX091dCl7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPTQ0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzIyMDUwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDg4MjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTkyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiggUmV0dXJuU3RhdHVzICE9IFNTUkNfT0sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjpcCi0gICAgICAgICAgICAgICAgRXJyb3IgY29kZSAlZCByZXR1cm5lZCBieSB0aGUgU1NSQ19HZXROclNhbXBsZXMgZnVuY3Rpb24iLAotICAgICAgICAgICAgICAgIFJldHVyblN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgKExWTV9JTlQxNikoKHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPiBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCkKLSAgICAgICAgICAgID8gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgOiBzc3JjUGFyYW1zLk5yU2FtcGxlc0luKTsKLQotICAgICAgICB3aGlsZSggTnJTYW1wbGVzTWluIDwgTTRWU1NfU1NSQ19NSU5CTE9DS1NJWkUgKQotICAgICAgICB7IC8qIERvbid0IHRha2UgYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA8PCAxKTsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPDwgMSk7Ci0gICAgICAgICAgICBOclNhbXBsZXNNaW4gPSAoTFZNX0lOVDE2KShOclNhbXBsZXNNaW4gPDwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmlTc3JjTmJTYW1wbEluID0gKExWTV9JTlQxNikoCi0gICAgICAgICAgICBzc3JjUGFyYW1zLgotICAgICAgICAgICAgTnJTYW1wbGVzSW4pOyAvKiBtdWx0aXBsaWNhdGlvbiBieSBOck9mQ2hhbm5lbHMgaXMgZG9uZSBiZWxvdyAqLwotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpOwotCi0gICAgICAgIG51bWVyYXRvciA9Ci0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICBkZW5vbWluYXRvciA9Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgKiBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotCi0gICAgICAgIGlmKCBudW1lcmF0b3IgJSBkZW5vbWluYXRvciA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcmF0aW9CdWZmZXIgPSAoTTRPU0FfVUludDMyKShudW1lcmF0b3IgLyBkZW5vbWluYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKSArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAqIHJhdGlvQnVmZmVyKSAvIChwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgIGlmKCByYXRpbyA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSXQgbWVhbnMgdGhhdCB0aGUgaW5wdXQgc2l6ZSBvZiBTU1JDIGJ1ZmZlckluIGlzIGJpZ2dlciB0aGFuIHRoZSBhc2tlZCBidWZmZXIgKi8KLSAgICAgICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmF0aW8rKzsgLyogV2UgdXNlIHRoZSBpbW1lZGlhdGUgc3VwZXJpb3IgaW50ZWdlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHJhdGlvICogKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIC8qIFRoZSAiMyIgdmFsdWUgYmVsb3cgc2hvdWxkIGJlIG9wdGltaXplZCAuLi4gb25lIGRheSAuLi4gKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqIHBDLT5ld2MudWlOYkNoYW5uZWxzLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVyIG5lZWRlZCBpbiBjYXNlIG9mIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZSAiMyIgdmFsdWUgYmVsb3cgc2hvdWxkIGJlIG9wdGltaXplZCAuLi4gb25lIGRheSAuLi4gKi8KLSAgICAgICAgICAgIHBDLT5wVGVtcEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dAotICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBUZW1wQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwVGVtcEJ1ZmZlciwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1pbmltdW1CdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPgotICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQuCi0gICAgICAgICAgICBtX2J1ZmZlclNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IFwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVyT3V0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLSAgICB9Ci0gICAgZWxzZSBpZiggKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyl8fAotICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTSkpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbWluYnVmZmVyID0gMDsKLQotICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IDIwNDggKiBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IDMyMDsKLQotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID4gMzIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5idWZmZXIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5idWZmZXIgPSBwQy0+bWluaW11bUJ1ZmZlckluOyAvKiBOb3QgcmVhbGx5IHBvc3NpYmxlIC4uLiovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIG91dHB1dCBhdWRpbyBmb3JtYXQsIGluIGNhc2Ugb2YgTVAzIHJlcGxhY2luZyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMiAqIG1pbmJ1ZmZlciwgTTRWU1MzR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBwQy0+cFBvc0luU3NyY0J1ZmZlckluOwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBwQy0+cFNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIGF1ZGlvIGVuY29kZXIgaXMgbmVlZGVkIHRvIGRvIGF1ZGlvIG1peGluZyBvciBhdWRpbyByZXNhbXBsaW5nICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkIHx8IE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBNNFZJREVPRURJVElOR19rTVAzCi0gICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICE9IG91dHB1dEFTRgotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0IHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluIGNhc2Ugb2YgUENNLCBNUDMgb3IgYXVkaW8gcmVwbGFjZSB3aXRoIHJlZW5jb2RpbmcsIHVzZSBlbmNvZGVyIERTSSAqLwotICAgICAgICBpZiggcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9PSAwICYmIChNNFZJREVPRURJVElOR19rUENNCi0gICAgICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+ZXdjLnBBdWRpb0VuY0RTSS5pbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIGFkZCB0aGUgbWF4IG91dHB1dCBmaWxlIHNpemUgZm9yIHRoZSBNTVMgdXNlIGNhc2UgaW4gVmlkZW9BcnRpc3QqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ciwgcFNldHRpbmdzLT5wT3V0cHV0Q2xpcEZpbGUsCi0gICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsIDApOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSgpCi0gKiBAYnJpZWYgICAgV3JpdGUgYW4gYXVkaW8gc2lsZW5jZSBmcmFtZSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHdoZW4gcGFkZGluZyB3aXRoIHNpbGVuY2UKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZTpcCi0gICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLQotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhLCBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSk7Ci0KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVGltZSkocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiQiAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvKSwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShzaWxlbmNlKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHZpZGVvLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDE2IG9mZnNldDsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIFZJREVPIHN0ZXAgOiBkVlRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZE91dHB1dFZpZEN0cywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlWb2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgdmlkZW8gQVUgKi8KLSAgICBlcnIgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLAotICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oKTogbV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9DVFMsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUpOwotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlclZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG9mZnNldCA9IDA7Ci0gICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyIGluZGljYXRvcnMgKi8KLSAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBpbnB1dCBzdHJlYW0gdHlwZSBIMjY0Iik7Ci0gICAgICAgIG9mZnNldCA9IDQ7Ci0gICAgfQotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUgIC09ICBvZmZzZXQ7Ci0gICAgLyoqCi0gICAgKiBDaGVjayB0aGF0IHRoZSB2aWRlbyBBVSBpcyBub3QgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQgKi8KLSAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IEFVIHNpemUgZ3JlYXRlciB0aGFuIE1heEF1U2l6ZSAoJWQ+JWQpIVwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRSIsCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXlsb2FkIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUpKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcGFyYW1ldGVycyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplOwotICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9DVFMgKyAwLjUpOwotICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgIE00T1NBX1RSQUNFMl8yKCJEIC0tLS0gd3JpdGUgOiBjdHMgID0gJWx1IFsgMHgleCBdIiwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGF1ZGlvLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBtaXggIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5TdGF0ZSwgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCk7Ci0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gcmVhZGluZyBzdGF0ZSB0byBlbmNvZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHJldHVybmluZyBNNE5PX0VSUk9SICgxLT4yKSIpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkICkgLyoqPCBNaXggKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIGFkZGVkIGF1ZGlvIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwIHx8IHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfVFJVRQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIG9mIHNhbXBsaW5nIGZyZXEgY29udmVyc2lvbiBhbmQvb3IgY2hhbm5lbCBjb252ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlYWQgbmV4dCBBVSB3aWxsIGJlICAgIGNhbGxlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJFIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIGZyb20gZW5jb2Rpbmcgc3RhdGUgdG8gcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIGEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG9yaWdpbmFsIGF1ZGlvIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkYgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFBlcmZvcm0gdGhlIGF1ZGlvIG1peGluZyAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vIG1peCwganVzdCBjb3B5IGFkZGVkIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGF1ZGlvIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKGxvb3ApIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiB0byBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUtZW5jb2RlIGZhaWxzIGVyciA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIGIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygzKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBkdXJhdGlvbiByZWFjaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyByZXBsIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5TdGF0ZSwgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCk7Ci0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBBZGRDdHMgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5pQWRkQ3RzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEZpcnN0IHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBzZWNvbmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgxLT4yKSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKGxvb3ApIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDItPjMpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgc2VnbWVudCAoc2lsZW5jZSkgaXMgb25seSBkb25lIGlmIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICogSW4gb3RoZXIgY2FzZSwgd2UgZmluaXNoIGhlcmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+RikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY2xpcCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOiBDbGlwIGR1cmF0aW9uIHJlYWNoZWQsXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBTSUQgKHNpbGVuY2UpIHBheWxvYWQgaW4gdGhlIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJvbSB0aGUgb3JpZ2luYWwgYXVkaW8gZmlsZSBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIGlucHV0IG9yaWdpbmFsIGF1ZGlvIEFVICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJHIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldCAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoKTogbV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWc6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldDsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgQVUgaXRzZWxmICovCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkggLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBhZGRlZCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZihwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUDMgfHwKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNIHx8Ci0gICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfVFJVRSB8fAotICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwKQotICAgIHsKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlcgotICAgICAgICAgICAgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgICAgICBNNE9TQV9UaW1lCi0gICAgICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgICAgIE00T1NBX01lbUFkZHI4IHRlbXBQb3NCdWZmZXI7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChwQyk7Ci0KLSAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQ6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQgZW5kIG9mIGFkZGVkIGZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgZnJhbWVUaW1lRGVsdGEgPSBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyLgotICAgICAgICAgICAgcFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgLyogVXBkYXRlIGRlY29kZWQgYnVmZmVyIGhlcmUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4gKyBwQy0+bWluaW11bUJ1ZmZlckluOwotICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+bWluaW11bUJ1ZmZlckluOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJKIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlYWQgdGhlIGFkZGVkIGF1ZGlvIEFVICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkkgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwcm9wZXJ0aWVzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLQotICAgICAgICAvKiogVEhFIENIRUNLIEJFTE9XIElTIEFEREVEIFRPIFBSRVZFTlQgSVNTVUVTIExJTktFRCBUTyBQUkUtQUxMT0NBVEVEIE1BWCBBVSBTSVpFCi0gICAgICAgIG1heCBBVSBzaXplIGlzIHNldCBiYXNlZCBvbiBNNFZTUzNHUFBfQVVESU9fTUFYX0FVX1NJWkUgZGVmaW5lZCBpbiBmaWxlCi0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oLCBJZiB0aGlzIGVycm9yIG9jY3VycyBpbmNyZWFzZSB0aGUgbGltaXQgc2V0IGluIHRoaXMgZmlsZQotICAgICAgICAqLwotICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAiRVJST1I6IGF1ZGlvIEFVIHNpemUgKCVkKSB0byBjb3B5IGxhcmdlciB0aGFuIGFsbG9jYXRlZCBvbmUgKCVkKSA9PiBhYm9ydCIsCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJQTEVBU0UgQ09OVEFDVCBTVVBQT1JUIFRPIEVYVEVORCBNQVggQVUgU0laRSBJTiBUSEUgUFJPRFVDVCBMSUJSQVJZIik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIG1peGVkIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJKIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBDb252ZXJ0IFBDTSBvZiBhZGRlZCB0cmFjayB0byB0aGUgcmlnaHQgQVNGIC8gbmIgb2YgQ2hhbm5lbHMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgaW50IHNzcmNFcnI7IC8qKjwgRXJyb3Igd2hpbGUgc3NyYyBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyIHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgIE00T1NBX1VJbnQzMiBvdXRGcmFtZUNvdW50ID0gdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzOwotICAgIC8qIERvIHdlIG5lZWQgdG8gZmVlZCBTU1JDIGJ1ZmZlciBJbiA/ICovCi0gICAgLyoqCi0gICAgKiBSQzogVGhpcyBpcyBub3QgcmVhbGx5IG9wdGltdW0gKG1lbW1vdmUpLiBXZSBzaG91bGQgaGFuZGxlIHRoaXMgd2l0aCBsaW5rZWQgbGlzdC4gKi8KLSAgICB3aGlsZSggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHBDLT5wU3NyY0J1ZmZlckluIDwgKE00T1NBX0ludDMyKXBDLT5taW5pbXVtQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgLyogV2UgbmVlZCB0byBnZXQgbW9yZSBQQ00gZGF0YSAqLwotICAgICAgICBpZiAocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLSAgICAgICAgfQotICAgICAgICBpZihwQy0+Ymp1bXBmbGFnKQotICAgICAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXBcCi0gICAgICAgICAgICAgICAgICAgIChwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmJqdW1wZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJFIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTm9Mb29waW5nID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnVpRW5kTG9vcCA9MDsgLyogVmFsdWUgMCBtZWFucyBubyBsb29waW5nIGlzIHJlcXVpcmVkICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRGVjaWRlIHdoYXQgdG8gZG8gd2hlbiBhdWRpbyBpcyBvdmVyICovCi0gICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEp1bXAoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbihwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6IHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6XAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKDItPjMpIGEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGRlY29kZWQgZGF0YSBpbnRvIFNTUkMgYnVmZmVyIGluICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLSAgICAgICAgLyogVXBkYXRlIHBvc2l0aW9uIHBvaW50ZXIgaW50byBTU1JDIGJ1ZmZlciBJbiAqLwotCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gKz0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIERvIHRoZSByZXNhbXBsaW5nIC8gY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZCAoPWZlZWQgYnVmZmVyIG91dCkgKi8KLSAgICBpZiggcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFICkKLSAgICB7Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAgICAgKnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgLyBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICAgICAgICAgIC8qIFdlIHVzZSBDaGFubmVsQ29udmVyc2lvbiB2YXJpYWJsZSBiZWNhdXNlIGluIGNhc2UgMiwgd2UgbmVlZCB0d2ljZSBsZXNzIGRhdGEgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luVGVtcEJ1ZmZlciwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyICs9IHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgU1NSQyBidWZmZXJJbiAqLwotICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiArIChwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NyY0VyciA9IDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsMCwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICAgICAgICAgIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KChzaG9ydCopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgIChzaG9ydCopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgICAgICAgICAgICAgaWYoIDAgIT0gc3NyY0VyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0OiBTU1JDX1Byb2Nlc3MgcmV0dXJucyAweCV4LCByZXR1cm5pbmcgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzcmNFcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3NyY0VycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbnZlcnQgU3RlcmVvPC0+TW9ubyAqLwotICAgICAgICBzd2l0Y2goIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogLyogTm8gY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTogLyogc3RlcmVvIHRvIG1vbm8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXBDLT5wVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzKTsgLyogQnVmZmVyIGlzIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFRlbXBCdWZmZXIsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8qIG1vbm8gdG8gc3RlcmVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDLT5wVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCl1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBUZW1wQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFRlbXBCdWZmZXIsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5UZW1wQnVmZmVyIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgIHsKLSAgICAgICAgLy9NNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgLy8gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpIC8KLSAgICAgICAgLy8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcykpOwotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcFRlbXBCdWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzKTsgLyogQnVmZmVyIGlzIGluIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6IC8qIG1vbm8gdG8gc3RlcmVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgICAgICAgICAgICAgKyAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtPQotICAgICAgICAgICAgICAgICAgICAgICAgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gbm9yIHNhbXBsLiBmcmVxLiBjb252ZXJzaW9uIG5lZWRlZCwganVzdCBidWZmZXIgbWFuYWdlbWVudCAqLwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIE00VlNTM0dQUF9nZXREZWNpYmVsU291bmQoIE00T1NBX1VJbnQzMiB2YWx1ZSApCi0gICAgewotICAgIGludCBkYlNvdW5kID0gMTsKLQotICAgIGlmKCB2YWx1ZSA9PSAwICkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiggdmFsdWUgPiAweDQwMDAgJiYgdmFsdWUgPD0gMHg4MDAwICkgICAgICAvLyAzMjc2OAotICAgICAgICBkYlNvdW5kID0gOTA7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MjAwMCAmJiB2YWx1ZSA8PSAweDQwMDAgKSAvLyAxNjM4NAotICAgICAgICBkYlNvdW5kID0gODQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MTAwMCAmJiB2YWx1ZSA8PSAweDIwMDAgKSAvLyA4MTkyCi0gICAgICAgIGRiU291bmQgPSA3ODsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwODAwICYmIHZhbHVlIDw9IDB4MTAwMCApIC8vIDQwMjgKLSAgICAgICAgZGJTb3VuZCA9IDcyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA0MDAgJiYgdmFsdWUgPD0gMHgwODAwICkgLy8gMjA0OAotICAgICAgICBkYlNvdW5kID0gNjY7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDIwMCAmJiB2YWx1ZSA8PSAweDA0MDAgKSAvLyAxMDI0Ci0gICAgICAgIGRiU291bmQgPSA2MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMTAwICYmIHZhbHVlIDw9IDB4MDIwMCApIC8vIDUxMgotICAgICAgICBkYlNvdW5kID0gNTQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA4MCAmJiB2YWx1ZSA8PSAweDAxMDAgKSAvLyAyNTYKLSAgICAgICAgZGJTb3VuZCA9IDQ4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwNDAgJiYgdmFsdWUgPD0gMHgwMDgwICkgLy8gMTI4Ci0gICAgICAgIGRiU291bmQgPSA0MjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDIwICYmIHZhbHVlIDw9IDB4MDA0MCApIC8vIDY0Ci0gICAgICAgIGRiU291bmQgPSAzNjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDEwICYmIHZhbHVlIDw9IDB4MDAyMCApIC8vIDMyCi0gICAgICAgIGRiU291bmQgPSAzMDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDA4ICYmIHZhbHVlIDw9IDB4MDAxMCApIC8vMTYKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDcgJiYgdmFsdWUgPD0gMHgwMDA4ICkgLy84Ci0gICAgICAgIGRiU291bmQgPSAyNDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDAzICYmIHZhbHVlIDw9IDB4MDAwNyApIC8vIDQKLSAgICAgICAgZGJTb3VuZCA9IDE4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDEgJiYgdmFsdWUgPD0gMHgwMDAzICkgLy8yCi0gICAgICAgIGRiU291bmQgPSAxMjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDAgJiYgdmFsdWUgPD0gMHgwMDAxICkgIC8vIDEKLSAgICAgICAgZGJTb3VuZCA9IDY7Ci0KLSAgICBlbHNlCi0gICAgICAgIGRiU291bmQgPSAwOwotCi0gICAgcmV0dXJuIGRiU291bmQ7Ci0gICAgfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgTWl4IHRoZSBjdXJyZW50IGF1ZGlvIEFVcyAoZGVjb2RlciwgbWl4LCBlbmNvZGUpCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGExOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTI7Ci0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZTsKLQotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jSW5CdWZmZXI7ICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGE7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotICAgIE00T1NBX01lbUFkZHI4IHRlbXBQb3NCdWZmZXI7Ci0gICAgLyogZHVja2luZyB2YXJpYWJsZSAqLwotICAgIE00T1NBX1VJbnQxNiBsb29wSW5kZXggPSAwOwotICAgIE00T1NBX0ludDE2ICpwUENNMTZTYW1wbGUgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIHBlYWtEYlZhbHVlID0gMDsKLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sgQVUgKi8KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKG9yaWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNiAqKXBDLT5wU3NyY0J1ZmZlck91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGFkZGVkIGF1ZGlvIHRyYWNrIEFVICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgZGVjb2RlZCB0aGUgc2FtZSBhbW91bnQgb2YgUENNIHNhbXBsZXMgKi8KLSAgICAgICAgaWYoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICAgICAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgYm90aCBjbGlwcyBBVSBtdXN0IGhhdmUgdGhlIHNhbWUgZGVjb2RlZCBQQ00gc2l6ZSEiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICogTWl4IHRoZSB0d28gZGVjb2RlZCBQQ00gYXVkaW9zICovCi0gICAgcFBDTWRhdGExID0KLSAgICAgICAgKE00T1NBX0ludDE2ICopcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgIHVpUENNc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgIC8gMjsgLypidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KSovCi0KLSAgICBpZiggcEMtPmJfRHVja2luZ05lZWRlZWQgKQotICAgIHsKLSAgICAgICAgbG9vcEluZGV4ID0gMDsKLSAgICAgICAgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLQotICAgICAgICBwUENNMTZTYW1wbGUgPSAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPgotICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAvL0NhbGN1bGF0ZSB0aGUgcGVhayB2YWx1ZQotICAgICAgICAgd2hpbGUoIGxvb3BJbmRleAotICAgICAgICAgICAgIDwgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgIC8gc2l6ZW9mKE00T1NBX0ludDE2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XQotICAgICAgICAgICAgICAgID8gcHJldmlvdXNEYlZhbHVlIDogLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9vcEluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+YXVkaW9Wb2x1bWVBcnJheVtwQy0+YXVkVm9sQXJySW5kZXhdID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9nZXREZWNpYmVsU291bmQocGVha0RiVmFsdWUpOwotCi0gICAgICAgIC8qIFdJTkRPV19TSVpFIGlzIDEwIGJ5IGRlZmF1bHQgYW5kIGNoZWNrIGZvciB0aHJlc2hvbGQgaXMgZG9uZSBhZnRlciAxMCBjeWNsZXMgKi8KLSAgICAgICAgaWYoIHBDLT5hdWRWb2xBcnJJbmRleCA+PSBXSU5ET1dfU0laRSAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+YkRvRHVja2luZyA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoKE00T1NBX0ludDMyICopJihwQy0+YXVkaW9Wb2x1bWVBcnJheSksCi0gICAgICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4LCBwQy0+SW5EdWNraW5nX3RocmVzaG9sZCk7Ci0KLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICpCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZSBmb3IgQmFja2dyb3VuZCBUcmFjayBhbmQgUHJpbWFyeSBUcmFjawotICAgICAgICAqZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMgdG8gZ2l2ZSBmYWRlLW91dCBmb3IgQmFja2dyb3VuZCBhbmQgZmFkZS1pbgotICAgICAgICAqZm9yIHByaW1hcnkKLSAgICAgICAgKgotICAgICAgICAqQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIgdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgICoKLSAgICAgICAgKkZvciBhIHdpbmRvdyBzaXplID0gMjUgKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAqCi0gICAgICAgICovCi0KLSAgICAgICAgaWYoIHBDLT5iRG9EdWNraW5nICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5kdWNraW5nRmFjdG9yCi0gICAgICAgICAgICAgICAgPiBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSApIC8vIEZBREUgT1VUIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3Igb2YgbG93IHZvbHVtZSBzdGVwcyB0byByZWFjaAotICAgICAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgLT0gKHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5kdWNraW5nRmFjdG9yIDwgMS4wICkgLy8gRkFERSBJTiBCRyBUcmFjawotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBvZiBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaAotICAgICAgICAgICAgICAgIC8vIG9yaWcudm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgKz0gKHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogZW5kaWYgLSBkdWNraW5nX2VuYWJsZSAqLwotCi0gICAgICAgIC8qIE1peGluZyBMb2dpYyAqLwotCi0gICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiB0ZW1wOwotCi0gICAgICAgICAgIC8qIHNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQgKi8KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgKiBwQy0+ZkJUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZQVFZvbExldmVsKTsKLQotICAgICAgICAgICAgLyogbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotCi0gICAgICAgICAgICAqcFBDTWRhdGEyID0gKE00T1NBX0ludDE2KSgoICpwUENNZGF0YTIpICogKHBDLT5kdWNraW5nRmFjdG9yKSk7Ci0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGEyIC8gMiArICpwUENNZGF0YTEgLyAyKTsKLQotCi0gICAgICAgICAgICBpZiggKnBQQ01kYXRhMSA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSAtKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICAgICAqIDI7IC8vIGJyaW5nIHRvIHNhbWUgQW1wbGl0dWRlIGxldmVsIGFzIGl0IHdhcyBvcmlnaW5hbAotCi0gICAgICAgICAgICAgICAgaWYoIHRlbXAgPiAzMjc2NyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gLTMyNzY2OyAvLyBsZXNzIHRoZW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNikoLXRlbXApOwotICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9ICggKnBQQ01kYXRhMSkKLSAgICAgICAgICAgICAgICAqIDI7IC8vIGJyaW5nIHRvIHNhbWUgQW1wbGl0dWRlIGxldmVsIGFzIGl0IHdhcyBvcmlnaW5hbAotCi0gICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gMzI3Njc7IC8vIGxlc3MgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICAgICBwUENNZGF0YTIrKzsKLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKQotICAgICAgIHsKLSAgICAgICAgLyogbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMSAqIHBDLT5mT3JpZ0ZhY3RvciAqIHBDLT5mUFRWb2xMZXZlbAotICAgICAgICAgICAgICAgKyAqcFBDTWRhdGEyICogcEMtPmZBZGRlZEZhY3RvciAqIHBDLT5mQlRWb2xMZXZlbCApOwotCi0gICAgICAgICAgICBwUENNZGF0YTErKzsKLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHBDLT5wU3NyY0J1ZmZlck91dCBidWZmZXIgKi8KLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iX1NTUkNuZWVkZWQgfHwgcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICArIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVyT3V0LCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtPQotICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgewotICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KSAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJLICoqKiogYmxlbmQgQVVzIik7Ci0KLSAgICAvKioKLSAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcChwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygpOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgIE00T1NBX1RSQUNFMl8yKCJMIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZXdjLmRBVG8gKz0gZnJhbWVUaW1lRGVsdGEgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIERlY29kZS9lbmNvZGUgYSBmZXcgQVUgYmFja3dhcmQgdG8gaW5pdGlhdGUgdGhlIGVuY29kZXIgZm9yIGxhdGVyIE1peCBzZWdtZW50LgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jSW5CdWZmZXI7ICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGEgPSAwOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLQotICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgLyoqCi0gICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oKTpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaUN1cnJlbnRDdHMgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgLyogRG8gbm90IGRvIHByZS1lbmNvZGUgc3RlcCBpZiB0aGVyZSBpcyBubyBtaXhpbmcgKHJlbW92ZSwgMTAwICUsIG9yIG5vdCBlZGl0YWJsZSkgKi8KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEFkdmFuY2UgaW4gdGhlIG9yaWdpbmFsIGF1ZGlvIHN0cmVhbSB0byByZWFjaCB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICogKFdlIGRvbid0IHdhbnQgaUF1ZGlvQ1RTIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSBqdW1wIGZ1bmN0aW9uLAotICAgICAgICAqIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jYWwgdmFyaWFibGUpLiAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlDdXJyZW50Q3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKio8IGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4uLiAqLwotICAgICAgICBpZiggaUN1cnJlbnRDdHMgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cElucHV0Q2xpcEN0eHQsICZpVGFyZ2V0Q3RzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNvZGUvZW5jb2RlIHVwIHRvIHRoZSB3YW50ZWQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiTSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJOICoqKiogcHJlLWVuY29kZSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbCi0gICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJPIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEluY3JlbWVudCB0aGUgYXVkaW8gQ1RTIGZvciB0aGUgbmV4dCBzdGVwICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsKLQotICAgIC8qKgotICAgICogU2ltdWxhdGUgYSB3cml0ZXIgaW50ZXJmYWNlIHdpdGggb3VyIHNwZWNpZmljIGZ1bmN0aW9uICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBQcm9jZXNzQVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBmb2xsb3cgdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFN0YXJ0QVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50U3RhcnRBVTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGlzIFZTUyAzR1BQIHNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wV3JpdGVyQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl9Db250ZXh0KQotICAgICAgICBwQzsgLyoqPCBXZSBnaXZlIHRoZSBpbnRlcm5hbCBjb250ZXh0IGFzIHdyaXRlciBjb250ZXh0ICovCi0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWwgPSBwQy0+ZXdjLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAvKiBObyBzdHJpY3QgcmVndWxhdGlvbiBpbiB2aWRlbyBlZGl0b3IgKi8KLSAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgIC8qIEFsc28gaXQgcHJldmVudHMgdG8gZHJvcCBpbXBvcnRhbnQgZnJhbWVzCi0gICAgICAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZCBibG9jayBlZmZldGNzKSAqLwotICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOwotCi0gICAgLyoqCi0gICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzIChkZWZhdWx0cykgKi8KLSAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9IDA7ICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7ICAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICBzd2l0Y2goIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA4OwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogTTRTWVNfSDI2NCIpOwotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OwotCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsgLyogZGVmYXVsdCAqLwotCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogVW5rbm93biB2aWRlb1N0cmVhbVR5cGUgMHgleCIsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgRW5jUGFyYW1zLkJpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RJbml0Iik7Ci0gICAgLyoqCi0gICAgKiBJbml0IHRoZSB2aWRlbyBlbmNvZGVyIChhZHZhbmNlZCBzZXR0aW5ncyB2ZXJzaW9uIG9mIHRoZSBlbmNvZGVyIE9wZW4gZnVuY3Rpb24pICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcEMtPmV3Yy5wRW5jQ29udGV4dCwKLSAgICAgICAgJnBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZSwgTTRWU1MzR1BQX2ludFZQUCwgcEMsCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoInZzczogYXVkaW8gbWl4IGVuY29kZXIgb3BlbiBwcm9maWxlIDolZCwgbGV2ZWwgJWQiLAotICAgICAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlLCBFbmNQYXJhbXMudmlkZW9MZXZlbCk7Ci0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RTdGFydCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBEZXN0cm95IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nID09IHBDLT5ld2MuZW5jb2RlclN0YXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBvcGVuZWQ/IERvbid0IGNsb3NlIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkID09IHBDLT5ld2MuZW5jb2RlclN0YXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlc2V0IHZhcmlhYmxlICovCi0gICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0Jvb2wgTTRWU1MzR1BQX2lzVGhyZXNob2xkQnJlYWNoZWQoIE00T1NBX0ludDMyICphdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlICkKLXsKLSAgICBNNE9TQV9Cb29sIHJlc3VsdCA9IDA7Ci0gICAgaW50IGk7Ci0gICAgaW50IGZpbmFsVmFsdWUgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBzdG9yZUNvdW50OyBpKysgKQotICAgICAgICBmaW5hbFZhbHVlICs9IGF2ZXJhZ2VWYWx1ZVtpXTsKLQotICAgIGZpbmFsVmFsdWUgPSBmaW5hbFZhbHVlIC8gc3RvcmVDb3VudDsKLQotCi0gICAgaWYoIGZpbmFsVmFsdWUgPiB0aHJlc2hvbGRWYWx1ZSApCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX1RSVUU7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBNNE9TQV9GQUxTRTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwNjEyZjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0NsaXAuYwotICogQGJyaWVmICAgIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGlucHV0IGNsaXAgbWFuYWdlbWVudC4KLSAqIEBub3RlICAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBzdGF0aWMsIGkuZS4gbm9uIHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0KLS8qKgotICogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLS8qIE9zYWwgaGVhZGVyIGZpbGVubyAqLwotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZGVmaW5lICAgIFN0YXRpYyBmdW5jdGlvbiBwcm90b3R5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkKLSAqIEBicmllZiAgICBPcGVuIGEgY2xpcC4gQ3JlYXRlcyBhIGNsaXAgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBoQ2xpcEN0eHQgICAgICAgICAgICAoT1VUKSBSZXR1cm4gdGhlIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzIG9mIHRoaXMgY2xpcC4gVGhlIG1vZHVsZSB3aWxsIGtlZXAgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoaXMgcG9pbnRlcgotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgYlNraXBBdWRpb1RyYWNrICAgICAgICAoSU4pIElmIHRydWUsIGRvIG5vdCBvcGVuIHRoZSBhdWRpbwotICogQHBhcmFtICAgIGJGYXN0T3Blbk1vZGUgICAgICAgIChJTikgSWYgdHJ1ZSwgdXNlIHRoZSBmYXN0IG1vZGUgb2YgdGhlIDNncHAgcmVhZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ubHkgdGhlIGZpcnN0IEFVIGlzIHJlYWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKiBoQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0ICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGhDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSW5pdDogaENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgKmhDbGlwQ3R4dCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0NsaXBDb250ZXh0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSAqaENsaXBDdHh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0NsaXBDb250ZXh0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcEluaXQoKTogY2xpcEN0eHQ9MHgleCIsICpoQ2xpcEN0eHQpOwotCi0KLSAgICAvKioKLSAgICAqIFVzZSB0aGlzIHNob3J0Y3V0IHRvIHNpbXBsaWZ5IHRoZSBjb2RlICovCi0gICAgcENsaXBDdHh0ID0gKmhDbGlwQ3R4dDsKLQotICAgIC8qIEluaWFsaXphdGlvbiBvZiBjb250ZXh0IFZhcmlhYmxlcyAqLwotICAgIG1lbXNldCgodm9pZCAqKXBDbGlwQ3R4dCwgMCxzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSk7Ci0KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIGNsaXAgY29udGV4dCAqLwotICAgIHBDbGlwQ3R4dC0+aVZvZmZzZXQgPSAwOwotICAgIHBDbGlwQ3R4dC0+aUFvZmZzZXQgPSAwOwotICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIHBDbGlwQ3R4dC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotCi0gICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPlZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5pVmlkZW9SZW5kZXJDdHMgPSAwOwotICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5pQWN0dWFsVmlkZW9CZWdpbkN1dCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9IDA7Ci0gICAgcENsaXBDdHh0LT5iVmlkZW9BdUF2YWlsYWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwQ3R4dC0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDbGlwQ3R4dC0+cEZpbGVSZWFkUHRyRmN0ID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2ICAgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIG1hcHMgdGhlIGZyZXF1ZW5jeSB2YWx1ZSB0byBhIHN0cmluZy4KLXN0YXRpYyBjb25zdCBjaGFyKiBmcmVxVG9TdHJpbmcoaW50IGZyZXEpIHsKLSAgICBzd2l0Y2ggKGZyZXEpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzgwMDAiOwotICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIHJldHVybiAiXzExMDI1IjsKLSAgICBjYXNlIDEyMDAwOgotICAgICAgICByZXR1cm4gIl8xMjAwMCI7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgcmV0dXJuICJfMTYwMDAiOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIHJldHVybiAiXzIyMDUwIjsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICByZXR1cm4gIl8yNDAwMCI7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgcmV0dXJuICJfMzIwMDAiOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIHJldHVybiAiXzQ0MTAwIjsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICByZXR1cm4gIl80ODAwMCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGU6ICVkIEh6IiwgZnJlcSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWwgdmFsdWUgdG8KLS8vIGEgc3RyaW5nIHRoYXQgd2lsbCBiZSBwYXJ0IG9mIGEgZmlsZSBuYW1lIGV4dGVuc2lvbgotc3RhdGljIGNvbnN0IGNoYXIqIGNoYW5uZWxUb1N0cmluZ0FuZEZpbGVFeHQoaW50IGNoYW5uZWxzKSB7Ci0gICAgc3dpdGNoIChjaGFubmVscykgewotICAgIGNhc2UgMToKLSAgICAgICAgcmV0dXJuICJfMS5wY20iOwotICAgIGNhc2UgMjoKLSAgICAgICAgcmV0dXJuICJfMi5wY20iOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJVbnN1cHBvcnRlZCAlZCBjaGFubmVscyIsIGNoYW5uZWxzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vKiBOb3RlOiBpZiB0aGUgY2xpcCBpcyBvcGVuZWQgaW4gZmFzdCBtb2RlLCBpdCBjYW4gb25seSBiZSB1c2VkIGZvciBhbmFseXNpcyBhbmQgbm90aGluZyBlbHNlLiAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwT3BlbiggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsIE00T1NBX0Jvb2wgYlNraXBBdWRpb1RyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJGYXN0T3Blbk1vZGUsIE00T1NBX0Jvb2wgYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIgIGR1bW15U3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQzMiBpRHVyYXRpb247Ci0gICAgTTRPU0FfVm9pZCAqZGVjb2RlclVzZXJEYXRhOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIGR1bW15OwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgdmlkZW9TaXplRnJvbURTSTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgRmlsdGVyT3B0aW9uOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogY2FsbGVkIHdpdGggcENsaXBDdHh0OiAweCV4LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWM9MHgleCIsCi0gICAgICAgIHBDbGlwQ3R4dCwgYkF2b2lkT3BlbmluZ1ZpZGVvRGVjKTsKLSAgICAvKioKLSAgICAqIEtlZXAgYSBwb2ludGVyIHRvIHRoZSBjbGlwIHNldHRpbmdzLiBSZW1lbWJlciB0aGF0IHdlIGRvbid0IHBvc3Nlc3MgaXQhICovCi0gICAgcENsaXBDdHh0LT5wU2V0dGluZ3MgPSBwQ2xpcFNldHRpbmdzOwotICAgIGlmKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogSW1hZ2Ugc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+U2hlbGxBUEksIE00REFfU3RyZWFtVHlwZVZpZGVvQVJHQjg4ODgpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgJmR1bW15U3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQsCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLAotICAgICAgICAgICAgICAgICAgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBcCi0gICAgICAgICAgICBWaWQgZGVjIHN0YXJ0ZWQ7IHBWaURlY0N0eHQ9MHgleCIsIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCk7Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGNvcnJlY3QgcmVhZGVyIGludGVyZmFjZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCZwQ2xpcEN0eHQtPlNoZWxsQVBJLAotICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBJbml0IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0Q3JlYXRlKCZwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAodXNlZCBieSB0aGUgZGVjb2RlciB0byBrbm93IHRoZSByZWFkZXIpICovCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgT1NBTCByZWFkIGZ1bmN0aW9uIHNldCAqLwotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pKHBDbGlwQ3R4dC0+cEZpbGVSZWFkUHRyRmN0KSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBmYXN0IG9wZW4gbW9kZSBpZiBhc2tlZCAoM0dQUCBvbmx5KSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gYkZhc3RPcGVuTW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKEZhc3RPcGVuTW9kZSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBza2lwIGF1ZGlvIG9wdGlvbiBpZiBhc2tlZCAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiU2tpcEF1ZGlvVHJhY2sgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHksIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKFZpZGVvT25seSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTSkgewotICAgICAgICAvLyBDb21wb3NlIHRoZSB0ZW1wIGZpbGVuYW1lIHdpdGggc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWwgaW5mb3JtYXRpb24uCi0gICAgICAgIGNvbnN0IGNoYXIqIGZyZXFTdHIgPSBmcmVxVG9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICBpZiAoZnJlcVN0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciogY2hhblN0ciA9IGNoYW5uZWxUb1N0cmluZ0FuZEZpbGVFeHQoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotCi0gICAgICAgIGlmIChjaGFuU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvY2F0ZSBvbmUgYnl0ZSBtb3JlIHRvIGhvbGQgdGhlIG51bGwgdGVybWluYXRvcgotICAgICAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0KLSAgICAgICAgICAgIHN0cmxlbihwQ2xpcFNldHRpbmdzLT5wRmlsZSkgKyBzdHJsZW4oZnJlcVN0cikgKyBzdHJsZW4oY2hhblN0cikgKyAxOwotCi0gICAgICAgIGNoYXIqIHBUZW1wRmlsZSA9IChjaGFyICopIG1hbGxvYyhsZW5ndGgpOwotICAgICAgICBpZiAocFRlbXBGaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbWFsbG9jICVkIGJ5dGVzIGZhaWwiLGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtc2V0KHBUZW1wRmlsZSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgbWVtY3B5KHBUZW1wRmlsZSwgcENsaXBTZXR0aW5ncy0+cEZpbGUsIHN0cmxlbihwQ2xpcFNldHRpbmdzLT5wRmlsZSkpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgZnJlcVN0ciwgc3RybGVuKGZyZXFTdHIpKTsKLSAgICAgICAgc3RybmNhdChwVGVtcEZpbGUsIGNoYW5TdHIsIHN0cmxlbihjaGFuU3RyKSk7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdE9wZW4oIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsIHBUZW1wRmlsZSk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwVGVtcEZpbGUpOwotICAgICAgICAgICAgcFRlbXBGaWxlID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBvcGVuIHBjbSBmaWxlIHJldHVybnMgZXJyb3IgOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAvKioKLSAgICAgICAgKiBPcGVuIHRoZSAzR1BQL01QMyBjbGlwIGZpbGUgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdE9wZW4oIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUpOwotICAgIH0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpRHVtbXksIHVpQ29yZUlkOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlNTM0dQUCBlcnJvciAqLwotICAgICAgICBNNE9TQV9FUlJfU1BMSVQoZXJyLCB1aUR1bW15LCB1aUNvcmVJZCwgdWlEdW1teSk7Ci0KLSAgICAgICAgaWYoIE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zICovCi0gICAgd2hpbGUoIGVyciA9PSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0U3RyZWFtKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgJm1lZGlhRmFtaWx5LCAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgIC8qaW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoICggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkKLSAgICAgICAgICAgIHx8IChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCBhIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgaWYoICggbWVkaWFGYW1pbHkgPT0gTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8pCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYSBIMjYzIG9yIE1QRUctNCBvciBIMjY0IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXA7ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RSZXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBOb3QgSDI2MyBvciBNUEVHLTQgKEgyNjQsIGV0Yy4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTU19lZGl0Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGVsc2UgaWYoICggbWVkaWFGYW1pbHkgPT0gTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8pCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb01wMwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb1BjbQotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gQU1SLU5CIG9yIEFBQyBvciBNUDMgYXVkaW8gc3RyZWFtIGluIGlucHV0IGNsaXA7ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RSZXNldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBOb3QgQU1SLU5CIG9yIEFBQyAoQU1SLVdCLi4uKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtICgweCV4KSBpbiBpbnB1dCAzZ3BwL21wMyBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBWaWRlbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgLyogSWYgZXh0ZXJuYWwgZGVjb2RlcnMgYXJlIHBvc3NpYmxlLCBpdCdzIGJlc3QgdG8gYXZvaWQgb3BlbmluZyB0aGUgZGVjb2RlciBpZiB0aGUgY2xpcCBpcyBvbmx5Ci0gIGdvaW5nIHRvIGJlIHVzZWQgZm9yIGFuYWx5c2lzLCBhcyB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0IGZvciB0aGUgYW5hbHlzaXMgaW4gdGhlIGNhc2Ugb2YgYQotICBwb3NzaWJsZSBleHRlcm5hbCBkZWNvZGVyIGFueXdheSwgYW5kIGVpdGhlciB0aGVyZSBjb3VsZCBiZSBubyBkZWNvZGVyIGF0IHRoaXMgcG9pbnQgb3IgdGhlIEhXCi0gIGRlY29kZXIgY291bGQgYmUgcHJlc2VudCwgd2hpY2ggd2Ugd2FudCB0byBhdm9pZCBvcGVuaW5nIGZvciB0aGF0LiBTZWUgY29tbWVudHMgaW4KLSAgaW50QnVpbGRBbmFseXNpcyBmb3IgbW9yZSBkZXRhaWxzLiAqLwotCi0gIC8qIENIQU5HRU1FIFRlbXBvcmFyaWx5IG9ubHkgZG8gdGhpcyBmb3IgTVBFRzQsIHNpbmNlIGZvciBub3cgb25seSBNUEVHNCBleHRlcm5hbCBkZWNvZGVycyBhcmUKLSAgc3VwcG9ydGVkLCBhbmQgdGhlIGZvbGxvd2luZyB3b3VsZG4ndCB3b3JrIGZvciBIMjYzIHNvIGEgcmVsZWFzZSB3aGVyZSBleHRlcm5hbCBkZWNvZGVycyBhcmUKLSAgcG9zc2libGUsIGJ1dCBub3QgdXNlZCwgd291bGRuJ3Qgd29yayB3aXRoIEgyNjMgc3R1ZmYuICovCi0KLSAgICAgICAgaWYoIGJBdm9pZE9wZW5pbmdWaWRlb0RlYyAmJiBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0Ci0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogT29wcyEgVGhlIG1lcmUgYWN0IG9mIG9wZW5pbmcgdGhlIGRlY29kZXIgYWxzbyByZXN1bHRzIGluIHRoZSBpbWFnZSBzaXplIGJlaW5nCi0gICAgICAgICAgICBmaWxsZWQgaW4gdGhlIHZpZGVvIHN0cmVhbSEgQ29tcGVuc2F0ZSBmb3IgdGhpcyBieSB1c2luZyBQYXJzZVZpZGVvRFNJIHRvIGZpbGwKLSAgICAgICAgICAgIHRoaXMgaW5mby4gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wZWc0IHN0cmVhbTsgdmlkIGRlYyBub3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJmR1bW15LCAmdmlkZW9TaXplRnJvbURTSSk7Ci0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGggPSB2aWRlb1NpemVGcm9tRFNJLm1fdWlXaWR0aDsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICB2aWRlb1NpemVGcm9tRFNJLm1fdWlIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBNcDQvSDI2My9IMjY0IHN0cmVhbTsgc2V0IGN1cnJlbnQgdmlkIGRlYyIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotCi0jZWxzZQotCi0gICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+VmlkZW9BVSwgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoICggKChNNE9TQV9VSW50MzIpTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCkgPT0gZXJyKQotICAgICAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIE91ciBkZWNvZGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggSDI2MyBwcm9maWxlIG90aGVyIHRoYW4gMC4KLSAgICAgICAgICAgICAgICAqIFNvIGl0IHJldHVybnMgdGhpcyBpbnRlcm5hbCBlcnJvciBjb2RlLgotICAgICAgICAgICAgICAgICogV2UgdHJhbnNsYXRlIGl0IHRvIG91ciBvd24gZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBWaWQgZGVjIHN0YXJ0ZWQ7IHBWaURlY0N0eHQ9MHgleCIsCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyRnVuY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSAmTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjA7Ci0gICAgICAgICAgICAgICAgRmlsdGVyT3B0aW9uLm1fcEZpbHRlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkZpbHRlck9wdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyIE9LIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgQXVkaW8gZGVjb2RlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcihwQ2xpcEN0eHQpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogQXVkaW8gZGVjIHN0YXJ0ZWQ7IGNvbnRleHQ9MHgleCIsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zdHJlYW1JRCA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUyA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0RUUyA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2F0dHJpYnV0ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX21heHNpemUgPSAwOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zdHJ1Y3RTaXplID0gc2l6ZW9mKHBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSAqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgIHsKLSAgICAgICAgLyogSWYgYWxyZWFkeSBjYWxjdWxhdGVkIHNldCBpdCB0byBwcmV2aW91cyB2YWx1ZSAqLwotICAgICAgICAvKiBCZWNhdXNlIGZhc3Qgb3BlbiBhbmQgZnVsbCBvcGVuIGNhbiByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUsCi0gICAgICAgICAgIGl0IGNhbiBtaXNtYXRjaCB1c2VyIHNldHRpbmdzICovCi0gICAgICAgIC8qIFZpZGVvIHRyYWNrIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYXVkaW8gdHJhY2sgKGlmIHZpZGVvIHRyYWNrIGlzIHNob3J0ZXIgdGhhbgotICAgICAgICAgICBhdWRpbyB0cmFjaywgaXQgY2FuIGxlZCB0byBjdXQgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQpICovCi0gICAgICAgIGlEdXJhdGlvbiA9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotCi0gICAgICAgIGlmKCBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBFbHNlIGNvbXB1dGUgaXQgZnJvbSBzdHJlYW1zICovCi0gICAgICAgIGlEdXJhdGlvbiA9IDA7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpRHVyYXRpb24gPSAoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pICYmICgoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pCi0gICAgICAgICAgICA+IGlEdXJhdGlvbikgJiYgaUR1cmF0aW9uID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpRHVyYXRpb24gPSAoTTRPU0FfSW50MzIpKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIHRpbWUgaXMgbm90IHVzZWQsIHdlIHNldCBpdCB0byB0aGUgdmlkZW8gdHJhY2sgZHVyYXRpb24gKi8KLSAgICBpZiggMCA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAoTTRPU0FfVUludDMyKWlEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPmlFbmRUaW1lID0gKE00T1NBX0ludDMyKXBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIC8qKgotICAgICogQnV0IHdlIGRvbid0IGhhdmUgdG8gZnJlZSB0aGUgYXVkaW8gc3RyZWFtLiBJdCB3aWxsIGJlIGZyZWVkIGJ5IHRoZSByZWFkZXIgd2hlbiBjbG9zaW5nIGl0Ki8KLSAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdpbGwgcmV0dXJuIGEgY29uc3RhbnQgc2lsZW5jZSBBTVIgQVUuCi0gICAgKiBXZSBzZXQgaXQgaGVyZSBvbmNlLCBpbnN0ZWFkIG9mIGF0IGVhY2ggcmVhZCBhdWRpbyBzdGVwLiAqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKGl0IG5lZWRzIHRvIGJlIHJlLWFsbG9jYXRlZCB0byBzdG9yZSBzaWxlbmNlCi0gICAgICBmcmFtZSBldmVudHVhbGx5KSovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3VycmVudFRpbWUoKQotICogQGJyaWVmICAgIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBhbmQgZGVjb2RlIHVwIHRvIHRoZSBjdXJyZW50IHZpZGVvIHRpbWUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgaUN0cyAgICAgICAgKElOKSBUYXJnZXQgQ1RTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaUN0cyApCi17Ci0gICAgTTRPU0FfSW50MzIgaVJhcEN0cywgaUNsaXBDdHM7Ci0gICAgTTRfTWVkaWFUaW1lIGREZWNvZGVUaW1lOwotICAgIE00T1NBX0Jvb2wgYkNsaXBKdW1wID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlICovCi0gICAgaUNsaXBDdHMgPSBpQ3RzIC0gcENsaXBDdHh0LT5pVm9mZnNldDsKLQotICAgIC8qKgotICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUAotICAgICogdG8gZGVjb2RlIGZyb20gdGhhdCBwb2ludC4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBkZWNvZGVyIG11c3QgYmUgdG9sZCB0byBqdW1wICovCi0gICAgICAgIGJDbGlwSnVtcCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVtZW1iZXIgdGhlIGNsaXAgcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgd2UgYXJlIGluIGRlY29kZVVwVG8oKSBwcm9jZXNzLCBjaGVjayBpZiB3ZSBuZWVkIHRvIGRvCi0gICAgb25lIG1vcmUgc3RlcCBvciBpZiBkZWNvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDbGlwQ3R4dC0+VnN0YXR1cyApCi0gICAgewotICAgICAgICAvKiBEbyBhIHN0ZXAgb2YgNTAwIG1zIGRlY29kaW5nICovCi0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzICs9IDUwMDsKLQotICAgICAgICBpZiggcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPiBpQ2xpcEN0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRhcmdldCB0aW1lIHJlYWNoZWQsIHdlIHN3aXRjaCBiYWNrIHRvIERFQ09ERSBtb2RlICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA9IGlDbGlwQ3RzOwotICAgICAgICAgICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJjICwsLCwgZGVjb2RlIHVwIHRvIDogJWxkIiwgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBKdXN0IGRlY29kZSBhdCBjdXJyZW50IGNsaXAgY3RzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImQgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgdXAgdG8gdGhlIHRhcmdldCAqLwotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IERlY29kaW5nIHVwVG8gQ1RTICUuM2YsIHBDbGlwQ3R4dD0weCV4IiwKLSAgICAgICAgZERlY29kZVRpbWUsIHBDbGlwQ3R4dCk7Ci0KLSAgICBkRGVjb2RlVGltZSA9IChNNE9TQV9Eb3VibGUpcENsaXBDdHh0LT5pVmlkZW9EZWNDdHM7Ci0gICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAmZERlY29kZVRpbWUsIGJDbGlwSnVtcCwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJhbWUgaW4gdGhlIGNsaXAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTk8gQVVESU8gLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgLyogSWYgdGhlcmUgaXMgbm8gYXVkaW8gdHJhY2ssIHdlIHJldHVybiBzaWxlbmNlIEFVcyAqLwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiYiAjIyMjIGJsYW5rIHRyYWNrIik7Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gQU1SLU5CLCBFVlJDIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBlbHNlIGlmKCAoIE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tFVlJDCi0gICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE5vIEFVIGF2YWlsYWJsZSwgc28gd2UgbXVzdCBtdXN0IHJlYWQgb25lIGZyb20gdGhlIG9yaWdpbmFsIHRyYWNrIHJlYWRlciAqLwotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZXQgdGhlIGN1cnJlbnQgQU1SIGZyYW1lIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlYWQgQVUgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgQU1SIGZyYW1lIENUUyAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICAqIHBDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikgJiYgKE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBsZXNzIGF1ZGlvIHRoYW4gdGhlIHN0cmVhbSBkdXJhdGlvbiBpbmRpY2F0ZWQsCi0gICAgICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiYSAjIyMjIHNpbGVuY2UgQVUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggTTRXQVJfTk9fTU9SRV9BVSAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUgKHNpbGVuY2UpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgZmF0YWwgZXJyb3IgKG9yIG5vIHNpbGVuY2UgaW4gRVZSQykgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktQU1SOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBiQXVkaW9GcmFtZUF2YWlsYWJsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR28gdG8gdGhlIG5leHQgQU1SIGZyYW1lIGluIHRoZSBBVSAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJbmNyZW1lbnQgQ1RTOiBvbmUgQU1SIGZyYW1lIGlzIDIwIG1zIGxvbmcgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBvaW50ZWQgQU1SIGZyYW1lICovCi0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KU00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IEFVIGZyYW1lIHNpemUgPT0gMCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FNUl9BVSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA+IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IEFVIGZyYW1lIHNpemUgZ3JlYXRlciB0aGFuIEFVIHNpemUhLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBpZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IEFVIGhhcyBiZWVuIHJlYWNoZWQgb3Igbm90ICovCi0gICAgICAgIGlmKCAoIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgKyBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUpCi0gICAgICAgICAgICA8IChwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyArIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iQXVkaW9GcmFtZUF2YWlsYWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsgLyoqPCB3aWxsIGJlIHVzZWQgZm9yIG5leHQgY2FsbCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gQUFDIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBlbHNlIGlmKCAoIE00VklERU9FRElUSU5HX2tBQUMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tBQUNwbHVzCi0gICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgIHx8IChNNFZJREVPRURJVElOR19rZUFBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX0NUUyAqIHBDbGlwQ3R4dC0+c2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICArIDAuNSk7Ci0KLSAgICAgICAgICAgIC8qIFBhdGNoIGJlY2F1c2UgbV9DVFMgaXMgdW5mb3J0dW5hdGVseSByb3VuZGVkIGluIDNncCByZWFkZXIgc2hlbGwgKi8KLSAgICAgICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9ICggKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIDIpCi0gICAgICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICAgICAqIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICogd2UgcmV0dXJuIHNpbGVuY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSBwQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKz0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmV0dXJuIHdpdGggTTRXQVJfTk9fTU9SRV9BVSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktQUFDOlwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tIE1QMywgb3RoZXJzIC0tLS0tLS0tLS0gKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLU1QMzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgKyAwLjUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuZCBpbml0aWFsaXplIHRoZSBhdWRpbyBkZWNvZGVyIGZvciB0aGUgY2xpcC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00X1N0cmVhbVR5cGUgYXVkaW90eXBlOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgTTRfQUFDVHlwZSBpQWFjVHlwZSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHByb3BlciBhdWRpbyBkZWNvZGVyICovCi0KLSAgICBhdWRpb3R5cGUgPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlOwotCi0gICAgLy9FVlJDCi0gICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAhPSBhdWRpb3R5cGUgKSAvKiBkZWNvZGVyIG5vdCBzdXBwb3J0ZWQgeWV0LCBidXQgYWxsb3cgdG8gZG8gbnVsbCBlbmNvZGluZyAqLwotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCZwQ2xpcEN0eHQtPlNoZWxsQVBJLCBhdWRpb3R5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGVzIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKCk6IEZhaWxzIHRvIGluaXRpYXRlIHRoZSBhdWRpbyBkZWNvZGVyLiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDbGlwQ3R4dC0+U2hlbGxBUEkuYkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtICE9IGF1ZGlvdHlwZSkgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWNcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIENyZWF0aW5nIGV4dGVybmFsIGF1ZGlvIGRlY29kZXIgb2YgdHlwZSAweCV4IiwgYXVkaW90eXBlKTsKLSAgICAgICAgICAgIC8qIEV4dGVybmFsIE9NWCBjb2RlY3MgYXJlIHVzZWQqLwotICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIC8qZ2V0IGZyb20gUmVhZGVyOyB0ZW1wb3JhcnksIHRpbGwgQXVkaW8gZGVjb2RlciBzaGVsbCBBUEkKLSAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gZ2V0IHRoZSBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmlBYWNUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaUFhY1R5cGUgPSBNNF9rQUFDOyAvL3NldCB0byBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgc3RyZWFtVHlwZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBpQWFjVHlwZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOiBBQUMgTkJDaGFucz0lZCwgU2FtcGxGcmVxPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNlbHNlCi0gICAgICAgIC8qIFRyaWNrLCBJIHVzZSBwVXNlckRhdGEgdG8gcmV0cmlldmUgYWFjIHByb3BlcnRpZXMsCi0gICAgICAgICAgIHdhaXRpbmcgZm9yIHNvbWUgYmV0dGVyIGltcGxlbWVudGF0aW9uLi4uICovCi0KLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgTTRPU0FfTlVMTCAvKiB0byBiZSBjaGFuZ2VkIHdpdGggSFcgaW50ZXJmYWNlcyAqLyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgfQotCi0gICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIEFNUiBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIEVWUkMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb01wMyA9PSBhdWRpb3R5cGUgKSB7Ci0gICAgICAgIC8qIE1QMyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IGF1ZGlvdHlwZSApCi0gICAgewotICAgICAgICAvKiBBQUMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogRGVjb2RlIGhpZ2ggcXVhbGl0eSBhYWMgYnV0IGRpc2FibGUgUFMgYW5kIFNCUiAqLwotICAgICAgICAvKiBCZWNhdXNlIHdlIGhhdmUgdG8gbWl4IGRpZmZlcmVudCBraW5kIG9mIEFBQyBzbyB3ZSBtdXN0IHRha2UgdGhlIGxvd2VzdCBjYXBhYmlsaXR5ICovCi0gICAgICAgIC8qIEluIE1DUyBpdCB3YXMgbm90IG5lZWRlZCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSAqLwotICAgICAgICBNNF9BYWNEZWNvZGVyQ29uZmlnIEFhY0RlY1BhcmFtOwotCi0gICAgICAgIEFhY0RlY1BhcmFtLm1fQUFDRGVjb2RlclByb2ZpbGUgPSBBQUNfa0FBQzsKLSAgICAgICAgQWFjRGVjUGFyYW0ubV9Eb3duU2FtcGxpbmdNb2RlID0gQUFDX2tEU19PRkY7Ci0KLSAgICAgICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tNb25vOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tTdGVyZW87Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0sIChNNE9TQV9EYXRhT3B0aW9uKSAmQWFjRGVjUGFyYW0pOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyApIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsCi0gICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyApCi0gICAgewotICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQgaW4gYWxsIGRlY29kZXJzICovCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplCi0gICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTpcCi0gICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgQXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgRGVjb2RlIHRoZSBjdXJyZW50IEFVRElPIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogU2lsZW5jZSBtb2RlICovCi0gICAgaWYoIHBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gKE00T1NBX1VJbnQ4ICopcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciApCi0gICAgewotICAgICAgICBpZiggcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9JbnQxNiksCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKTpcCi0gICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIGl0IHdpdGggMCAoPSBwY20gc2lsZW5jZSkgKi8KLSAgICAgICAgbWVtc2V0KHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywwLAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICogc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjgpIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHI7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgID0gcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MsIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemU7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotICAgIC8qKgotICAgICogU3RhbmRhcmQgZGVjb2RpbmcgbW9kZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIERlY29kZSBjdXJyZW50IEFNUiBmcmFtZSAqLwotICAgICAgICBpZiAoIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJJbi5tX3RpbWVTdGFtcFVzID0KLSAgICAgICAgICAgICAoaW50NjRfdCkgKHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKiAxMDAwTEwpOwotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLCAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dCwKLSAgICAgICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQYXNzIE51bGwgaW5wdXQgYnVmZmVyCi0gICAgICAgICAgICAvLyBSZWFkZXIgaW52b2tlZCBmcm9tIEF1ZGlvIGRlY29kZXIgc291cmNlCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCAmcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dCwKLSAgICAgICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkKLSAqIEBicmllZiAgICBKdW1wIGluIHRoZSBhdWRpbyB0cmFjayBvZiB0aGUgY2xpcC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcEp1bXBDdHMgICAgICAgICAgICAoSU4vT1VUKSBpbjp0YXJnZXQgQ1RTLCBvdXQ6IHJlYWNoZWQgQ1RTCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBKdW1wQ3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHM7Ci0gICAgTTRPU0FfSW50MzIgaUp1bXBDdHNNczsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0OiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwSnVtcEN0cyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBKdW1wQ3RzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlUYXJnZXRDdHMgPSAqcEp1bXBDdHM7Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvIHN0cmVhbSwgd2Ugc2ltdWxhdGUgYSBqdW1wIGF0IHRoZSB0YXJnZXQganVtcCBDVFMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiB0aGUgdGFyZ2V0IENUUyB3aWxsIGJlIHJlYWNoZWQgYXQgbmV4dCBSZWFkRnJhbWUgY2FsbCAodGh1cyB0aGUgLTIwKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSBpVGFyZ2V0Q3RzIC0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAvKiAoY3RzIGlzIG5vdCBhbiBpbnRlZ2VyIHdpdGggZnJlcXVlbmN5IDI0IGtIeiBmb3IgZXhhbXBsZSkgKi8KLSAgICAgICAgKnBKdW1wQ3RzID0gKCAoICpwSnVtcEN0cyArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAqIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0KLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIHBKdW1wQ3RzOyAvKiBzaW11bGF0ZSBhIHJlYWQgYXQganVtcCBwb3NpdGlvbiBmb3IgbGF0ZXIgc2lsZW5jZSBBVXMgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfSW50MzIgY3VycmVudF90aW1lID0gMDsKLSAgICAgICAgTTRPU0FfSW50MzIgbG9vcF9jb3VudGVyID0gMDsKLQotICAgICAgICBpZiggKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCAoIGxvb3BfY291bnRlciA8IE00VlNTM0dQUF9NUDNfSlVNUEVEX0FVX05VTUJFUl9NQVgpCi0gICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRfdGltZSA8IGlUYXJnZXRDdHMpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0OiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjdXJyZW50X3RpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTOwotICAgICAgICAgICAgICAgIGxvb3BfY291bnRlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlIGN1cnJlbnQgQVUgaXMgc3RvcmVkICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0gcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBKdW1wIGluIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlKdW1wQ3RzTXMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKnBKdW1wQ3RzIC8gcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmaUp1bXBDdHNNcyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCk6IG1fcEZjdEp1bXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpwSnVtcEN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShpSnVtcEN0c01zICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgIC8qIFBhdGNoIGJlY2F1c2UgbV9DVFMgaXMgdW5mb3J0dW5hdGVseSByb3VuZGVkIGluIDNncCByZWFkZXIgc2hlbGwgKi8KLSAgICAgICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAgICAgKnBKdW1wQ3RzID0gKCAoICpwSnVtcEN0cyArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsgLyogTm8gZnJhbWUgcmVhZCB5ZXQgKi8KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRvIGRldGVjdCBzb21lIG1heS1iZSBidWdzLCBJIHByZWZlciB0byByZXNldCBhbGwgdGhlc2UgYWZ0ZXIgYSBqdW1wICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluIEFNUiwgd2UgaGF2ZSB0byBtYW5hZ2UgbXVsdGktZnJhbWVkIEFVcywKLSAgICAgICAgICAgIGJ1dCBhbHNvIGluIEFBQyB0aGUganVtcCBjYW4gYmUgMSBBVSB0b28gbXVjaCBiYWNrd2FyZCAqLwotICAgICAgICAgICAgaWYoICpwSnVtcEN0cyA8IGlUYXJnZXRDdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSnVtcCBkb2Vzbid0IHJlYWQgYW55IEFVLCB3ZSBtdXN0IHJlYWQgYXQgbGVhc3Qgb25lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZWFkIEFVIGZyYW1lcyBhcyBsb25nIGFzIHdlIHJlYWNoIHRoZSBBVSBiZWZvcmUgdGhlIHRhcmdldCBDVFMKLSAgICAgICAgICAgICAgICAqIChzbyB0aGUgdGFyZ2V0IHdpbGwgYmUgcmVhY2hlZCB3aGVuIHRoZSB1c2VyIGNhbGwgUmVhZE5leHRBdWRpb0ZyYW1lKS4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSggcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChpVGFyZ2V0Q3RzIC0gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDbGlwQ3R4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHRoZSBDVFMgdGhhdCB3aWxsIGJlIHJlYWNoZWQgYXQgbmV4dCBSZWFkRnJhbWUgKi8KLSAgICAgICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSgpCi0gKiBAYnJpZWYgICAgQ2xvc2UgYSBjbGlwLiBEZXN0cm95IHRoZSBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBhdWRpbyBkZWNvZGVyIGNvbnRleHQgICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQXVkaW8gQVUgaXMgYWxsb2NhdGVkIGJ5IHJlYWRlci4KLSAgICAqIElmIG5vIGF1ZGlvIHRyYWNrLCBhdWRpbyBBVSBpcyBzZXQgYXQgJ3NpbGVudCcgKFNJRCkgYnkgVlNTLgotICAgICogQXMgYSBjb25zZXF1ZW5jZSwgaWYgYXVkaW8gQVUgaXMgc2V0IHRvICdzaWxlbnQnIChzdGF0aWMpCi0gICAgaXQgY2FuJ3QgYmUgZnJlZSB1bmxlc3MgaXQgaXMgc2V0IHRvIE5VTEwgKi8KLSAgICBpZiggKCAoTTRPU0FfTWVtQWRkcjgpTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OAotICAgICAgICA9PSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcykKLSAgICAgICAgfHwgKChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhCi0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKSApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyICovCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZSgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKEN0eHQ9MHgleCk6IHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgcENsaXBDdHh0KTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SLCBlcnIyOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgZGVjb2RlZCBhdWRpbyBidWZmZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQXVkaW8gQVUgaXMgYWxsb2NhdGVkIGJ5IHJlYWRlci4KLSAgICAqIElmIG5vIGF1ZGlvIHRyYWNrLCBhdWRpbyBBVSBpcyBzZXQgYXQgJ3NpbGVudCcgKFNJRCkgYnkgVlNTLgotICAgICogQXMgYSBjb25zZXF1ZW5jZSwgaWYgYXVkaW8gQVUgaXMgc2V0IHRvICdzaWxlbnQnIChzdGF0aWMpCi0gICAgaXQgY2FuJ3QgYmUgZnJlZSB1bmxlc3MgaXQgaXMgc2V0IHRvIE5VTEwgKi8KLSAgICBpZiggKCAoTTRPU0FfTWVtQWRkcjgpTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OAotICAgICAgICA9PSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcykKLSAgICAgICAgfHwgKChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhCi0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKSApCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyICovCi0gICAgICAgIGVycjIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICBlcnIgPSBlcnIyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgM0dQUCBvciBNUDMgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoKTogbV9wUmVhZGVyLT5tX3BGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICBlcnIgPSBlcnIyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXYgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IHBDbGlwQ3R4dD0weCV4IiwgcENsaXBDdHh0KTsKLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNsaXAgY29udGV4dCAqLwotICAgIGZyZWUocENsaXBDdHh0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEF1ZGlvRnJhbWUgICAoSU4pIEFNUk5CIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApCi17Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lVHlwZSA9ICggKCAqcEF1ZGlvRnJhbWUpICYoMHhGIDw8IDMpKSA+PiAzOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gOTU7Ci0gICAgICAgICAgICBicmVhazsgLyogIDQ3NTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTAzOwotICAgICAgICAgICAgYnJlYWs7IC8qICA1MTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDExODsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNTkwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMzQ7Ci0gICAgICAgICAgICBicmVhazsgLyogIDY3MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTQ4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3NDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE1OTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNzk1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyMDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTAyMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMjQ0OwotICAgICAgICAgICAgYnJlYWs7IC8qIDEyMDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDM5OwotICAgICAgICAgICAgYnJlYWs7IC8qIFNJRCAoU2lsZW5jZSkgKi8KLQotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBObyBkYXRhICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCk6IENvcnJ1cHRlZCBBTVIgZnJhbWUhIHJldHVybmluZyAwLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuICgxICsgKCggZnJhbWVTaXplICsgNykgLyA4KSk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAqcEF1ZGlvRnJhbWUpICYweDBGOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgYmxhbmsgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS84ICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gNDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvNCAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDgwOwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzIgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNzE7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEgKi8KLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBlcmFzdXJlICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoKTogQ29ycnVwdGVkIEVWUkMgZnJhbWUhIHJldHVybmluZyAwLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuICgxICsgKCggZnJhbWVTaXplICsgNykgLyA4KSk7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBRF9CdWZmZXIgb3V0cHV0QnVmZmVyOwotICAgIHVpbnQzMl90IG9wdGlvblZhbHVlID0wOwotCi0gICAgLy8gRGVjb2RlIGZpcnN0IGF1ZGlvIGZyYW1lIGZyb20gY2xpcCB0byBnZXQgcHJvcGVydGllcyBmcm9tIGNvZGVjCi0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLCAmKHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcykpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgKE00T1NBX0RhdGFPcHRpb24pIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICBpZiggcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMgIT0gTTRPU0FfTlVMTCApIHsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllczogXAotICAgICAgICAgICAgICAgICBtX3BGY3RTdGFydEF1ZGlvRGVjIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA+IDAgKSB7Ci0KLSAgICAgICAgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIFwKLSAgICAgICAgICAgICpzaXplb2Yoc2hvcnQpLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIm91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNE9TQV9OVUxMLCAmb3V0cHV0QnVmZmVyLCBNNE9TQV9GQUxTRSk7Ci0KLSAgICBpZiAoIGVyciA9PSBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0UgKSB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gY29kZWMgbm9kZQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscywgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID0gb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSwgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSA9IG9wdGlvblZhbHVlOwotICAgICAgICAvLyBSZXNldCBSZWFkZXIgc3RydWN0dXJlIHZhbHVlIGFsc28KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBvcHRpb25WYWx1ZTsKLQotICAgIH0gZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllczpcCi0gICAgICAgICAgICBtX3BGY3RTdGVwQXVkaW9EZWMgcmV0dXJucyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmVlKG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzKTsKLQotICAgIC8vIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzXAotICAgICAgICAgICAgRXJyb3IgaW4gcmVzZXRpbmcgcmVhZGVyOiAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotCi19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmM2ZDdhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYW5hbHlzaXMgb2YgaW5wdXQgY2xpcHMKLSAqIEBub3RlICAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBzdGF0aWMsIGkuZS4gbm9uIHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLQotLyoqCi0gKiAgICBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgYSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCBlZGl0aW5nCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZpbGxzIGEgQ2xpcEFuYWx5c2lzIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvCi0gKiAgICAgICAgY2xpcHMgYXJlIGNvbXBhdGlibGUKLSAqIEBwYXJhbSAgICBwQ2xpcCAgICAgICAgICAgICAgICAoSU4pIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgM0dQUC9NUDMgY2xpcCBmaWxlLgotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHBhcmFtICAgIEZpbGVUeXBlICAgICAgICAgICAgKElOKSBUeXBlIG9mIHRoZSBpbnB1dCBmaWxlICguM2dwLCAuYW1yLCAubXAzKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoIE00T1NBX1ZvaWQgKnBDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgRmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBDbGlwU2V0dGluZ3M7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAgY2FsbGVkIHdpdGggcENsaXA9MHgleCwgcENsaXBQcm9wZXJ0aWVzPTB4JXgiLAotICAgICAgICBwQ2xpcCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogcENsaXAgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcFByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBCdWlsZCBkdW1teSBjbGlwIHNldHRpbmdzLCBpbiBvcmRlciB0byB1c2UgdGhlIGVkaXRDbGlwT3BlbiBmdW5jdGlvbiAqLwotICAgIENsaXBTZXR0aW5ncy5wRmlsZSA9IHBDbGlwOwotICAgIENsaXBTZXR0aW5ncy5GaWxlVHlwZSA9IEZpbGVUeXBlOwotICAgIENsaXBTZXR0aW5ncy51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgQ2xpcFNldHRpbmdzLnVpRW5kQ3V0VGltZSA9IDA7Ci0KLSAgICAvKiBDbGlwIHByb3BlcnRpZXMgbm90IGJ1aWxkIHlldCwgc2V0IGF0IGxlYXN0IHRoaXMgZmxhZyAqLwotICAgIENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgY2xpcCBpbiBmYXN0IG9wZW4gbW9kZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgmcENsaXBDb250ZXh0LCBwRmlsZVJlYWRQdHJGY3QpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBGcmVlIHRoZSBjbGlwICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDbGlwQ29udGV4dCwgJkNsaXBTZXR0aW5ncywgTTRPU0FfRkFMU0UsCi0gICAgICAgIE00T1NBX1RSVUUsIE00T1NBX1RSVUUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBIZXJlIGl0IGlzIGJldHRlciB0byByZXR1cm4gdGhlIEVkaXRpbmcgc3BlY2lmaWMgZXJyb3IgY29kZSAqLwotICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICB8fCAoKChNNE9TQV9VSW50MzIpTTRFUlJfREVDT0RFUl9IMjYzX05PVF9CQVNFTElORSkgPT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbmFseXNlIHRoZSBjbGlwICovCi0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICE9IHBDbGlwQ29udGV4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQ2xpcENvbnRleHQsIHBDbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKHBDbGlwQ29udGV4dCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1NfaW50Q2xpcENsb3NlKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyBlZGl0aW5nICovCi0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICE9IENsaXBTZXR0aW5ncy5GaWxlVHlwZSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKHBDbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgIFZTUyAzR1BQIGVkaXRpbmcgYXNzZW1ibHkgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENsaXAxUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcENsaXAyUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXAxUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDJQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgdmlkZW9fZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgYXVkaW9fZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX0Jvb2wgYkNsaXAxSXNBQUMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJDbGlwMklzQUFDID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5IGNhbGxlZCB3aXRoIHBDbGlwMUFuYWx5c2lzPTB4JXgsXAotICAgICAgICAgICAgICAgICAgIHBDbGlwMkFuYWx5c2lzPTB4JXgiLCBwQ2xpcDFQcm9wZXJ0aWVzLCBwQ2xpcDJQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMVByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMVByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcDJQcm9wZXJ0aWVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBwQ2xpcDJQcm9wZXJ0aWVzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCAoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpCi0gICAgICAgIHx8IChNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwMVByb3BlcnRpZXMtPkZpbGVUeXBlKSApCi0gICAgewotICAgICAgICBpZiggcENsaXAxUHJvcGVydGllcyAhPSBwQ2xpcDJQcm9wZXJ0aWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogTVAzIENBTiBPTkxZIEJFIENVVCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBXZSBhcmUgaW4gVlNTIFNwbGl0dGVyIG1vZGUgKi8KLSAgICAgICAgICAgIGdvdG8gYXVkaW9fYW5hbHlzaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKiBBdWRpbyAqKioqKioqKioqKiovCi0KLWF1ZGlvX2FuYWx5c2lzOgotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBDbGlwMVByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBiQ2xpcDFJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAyUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIGF1ZGlvLCB0aGUgY2xpcHMgYXJlIGNvbXBhdGlibGVzIC4uLiAqLwotICAgIGlmKCAoIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAmJiAocENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgaGF2ZSBzYW1lIGF1ZGlvIHN0cmVhbSB0eXBlCi0gICAgICAgICogQW5kIGxldF9zIHNheSBBQUMsIEFBQysgYW5kIGVBQUMrIGFyZSBtaXhhYmxlICovCi0gICAgICAgIGlmKCAoIHBDbGlwMVByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgIT0gcENsaXAyUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKCggTTRPU0FfRkFMU0UgPT0gYkNsaXAxSXNBQUMpIHx8IChNNE9TQV9GQUxTRSA9PSBiQ2xpcDJJc0FBQykpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBBdWRpbyBTdHJlYW0gVHlwZSIpOwotCi0gICAgICAgICAgICBhdWRpb19lcnIgPSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIGdvdG8gYW5hbHlzaXNfZG9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJvdGggY2xpcHMgaGF2ZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICBpZiggcENsaXAxUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgTmIgb2YgQ2hhbm5lbHMiKTsKLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBTYW1wbGluZyBGcmVxdWVuY3kiKTsKLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWTsKLSAgICAgICAgICAgIGdvdG8gYW5hbHlzaXNfZG9uZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDbGlwMlByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfVFJVRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotYW5hbHlzaXNfZG9uZToKLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkKLSAqIEBicmllZiAgICBHZXQgdmlkZW8gYW5kIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpcCBzdHJlYW1zCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGZhdGFsIGVycm9ycyBvbmx5IChlcnJvcnMgdGhhdCBzaG91bGQgbm90IGhhcHBlbgotICogICAgICAgIGluIHRoZSBmaW5hbCBpbnRlZ3JhdGVkIHByb2R1Y3QpLgotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ2xpcFByb3BlcnRpZXMgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25maWdJbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgZHVtbXlTaXplOwotICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwgQVZDUHJvZmxlOwotCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQW5hbHlzZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9UaW1lU2NhbGUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+ZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKikgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCwwLAotICAgICAgICBzaXplb2YocENsaXBQcm9wZXJ0aWVzLT5mdHlwKSk7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIEFuYWx5c2lzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV92aWRlb1dpZHRoOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QRUc0OwotCi0gICAvKiBUaGlzIGlzc3VlIGlzIHNvIGluY3JlZGlibHkgc3R1cGlkIHRoYXQgaXQncyBkZXByZXNzaW5nLiBCYXNpY2FsbHksIGEgZmlsZSBjYW4gYmUgYW5hbHlzZWQKLSAgIG91dHNpZGUgb2YgYW55IGNvbnRleHQgKGJlc2lkZXMgdGhhdCBvZiB0aGUgY2xpcCBpdHNlbGYpLCBzbyB0aGF0IGZvciBpbnN0YW5jZSB0d28gY2xpcHMgY2FuCi0gICBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5IGJlZm9yZSBhbGxvY2F0aW5nIGFuIGVkaXQgY29udGV4dCBmb3IgZWRpdGluZyB0aGVtLiBCdXQgdGhpcwotICAgbWVhbnMgdGhlcmUgaXMgbm8gd2F5IGluIGhlY2sgdG8gcGFzcyBhbiBleHRlcm5hbCB2aWRlbyBkZWNvZGVyICh0byBiZWdpbiB3aXRoKSB0byB0aGlzCi0gICBmdW5jdGlvbiwgYXMgdGhleSB3b3JrIGJ5IGJlaW5nIHJlZ2lzdGVyZWQgaW4gYW4gZXhpc3RpbmcgY29udGV4dDsgZnVydGhlcm1vcmUsIGl0IGlzIGFjdHVhbGx5Ci0gICBwcmV0dHkgb3ZlcmtpbGwgdG8gdXNlIGEgZnVsbCBkZWNvZGVyIGZvciB0aGF0LCBtb3Jlc28gYSBIQVJEV0FSRSBkZWNvZGVyIGp1c3QgdG8gZ2V0IHRoZQotICAgY2xpcCBjb25maWcgaW5mby4gSW4gZmFjdCwgdGhlIGhhcmR3YXJlIGl0c2VsZiBkb2Vzbid0IHByb3ZpZGUgdGhpcyBzZXJ2aWNlLCBpbiB0aGUgY2FzZSBvZiBhCi0gICBIVyBkZWNvZGVyLCB0aGUgc2hlbGwgYnVpbGRzIHRoZSBjb25maWcgaW5mbyBpdHNlbGYsIHNvIHdlIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBkZWNvZGVyLCBvbmx5Ci0gICBhIGRldGFjaGVkIGZ1bmN0aW9uYWxpdHkgb2YgaXQuIFNvIGluIGNhc2UgSFcvZXh0ZXJuYWwgZGVjb2RlcnMgbWF5IGJlIHByZXNlbnQsIHdlIGluc3RlYWQgdXNlCi0gICBkaXJlY3RseSB0aGUgRFNJIHBhcnNpbmcgZnVuY3Rpb24gb2YgdGhlIHNoZWxsIEhXIGRlY29kZXIgKHdoaWNoIHdlIGtub3cgdG8gYmUgcHJlc2VudCwgc2luY2UKLSAgIEhXIGRlY29kZXJzIGFyZSBwb3NzaWJsZSkgdG8gZ2V0IHRoZSBjb25maWcgaW5mby4gTm90aWNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBldmVuIGlmIHRoZQotICAgc29mdHdhcmUgZGVjb2RlciBpcyBhY3R1YWxseSBwcmVzZW50IGFuZCBldmVuIGlmIGl0IHdpbGwgZW5kIHVwIGJlaW5nIGFjdHVhbGx5IHVzZWQ6IGZpZ3VyaW5nCi0gICBvdXQgdGhlIGNvbmZpZyBkb2VzIG5vdCBpbnZvbHZlIGFjdHVhbCBkZWNvZGluZyBub3IgdGhlIHBhcnRpY3VsYXJpdGllcyBvZiBhIHNwZWNpZmljIGRlY29kZXIsCi0gICBpdCdzIHRoZSBmYWN0IHRoYXQgaXQncyBNUEVHNCB0aGF0IG1hdHRlcnMsIHNvIGl0IHNob3VsZCBub3QgYmUgZnVuY3Rpb25hbGx5IGFueSBkaWZmZXJlbnQKLSAgIGZyb20gdGhlIHdheSBpdCB3YXMgZG9uZSBiZWZvcmUgKGFuZCBpdCdzIGxpZ2h0IGVub3VnaCBmb3IgcGVyZm9ybWFuY2Ugbm90IHRvIGJlIGFueSBwcm9ibGVtCi0gICAgICAgICB3aGF0c29ldmVyKS4gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWNDb25maWdJbmZvLCAmZHVtbXlTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9UaW1lU2NhbGUgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLnVpVGltZVNjYWxlOwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0ZGF0YVBhcnRpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8uYkRhdGFQYXJ0aXRpb247Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRydmxjID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iVXNlT2ZSVkxDOwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+Yk1QRUc0cmVzeW5jaE1hcmtlciA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlVc2VPZlJlc3luY2hNYXJrZXI7Ci0gICAgICAgICAgICAgICAgZXJyID0gZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoRGVjQ29uZmlnSW5mby51aVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgLyogSDI2MyB0aW1lIHNjYWxlIGlzIGFsd2F5cyAzMDAwMCAqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotCi0gICAgICAgICAgICAgICAgZXJyID0gZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRBVkNQcm9maWxlQW5kTGV2ZWwocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IHZpZGVvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAvKiogV2UgZG8gbm90IHJldHVybiBlcnJvciBoZXJlLgotICAgICAgICAgICAgICAgICAgICogIFRoZSB2aWRlbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcFZpZGVvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLQotICAgICAgICAvKiBpZiB2aWRlbyBiaXRyYXRlIG5vdCBhdmFpbGFibGUgcmV0cmlldmUgYW4gZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLAotICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIGF1ZGlvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSAtPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwQXVkaW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0gMDsKLQotICAgIC8qKgotICAgICogQXVkaW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tFVlJDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rUENNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpczogdW5rbm93biBpbnB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IhIiwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIE00Tk9fRVJST1I7IC8qKjwgV2UgZG8gbm90IHJldHVybiBlcnJvciBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXVkaW8gZm9ybWF0IGNvbXBhdGliaWxpdHkgY2hlY2sgd2lsbCBiZSBkb25lIGxhdHRlciAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlEZWNvZGVkUGNtU2l6ZSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBCdWdmaXggUDRNRTAwMDAxMTI4OiBXaXRoIHNvbWUgSU1UQyBmaWxlcywgdGhlIEFNUiBiaXQgcmF0ZSBpcyAwIGticHMKLSAgICAgICAgYWNjb3JkaW5nIHRoZSBHZXRQcm9wZXJ0aWVzIGZ1bmN0aW9uICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0FNUl9OQiA9PSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKkJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDEyLjIga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZSAwIGticHMgdmFsdWUhKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gTTRWU1MzR1BQX0FNUl9ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQyA9PSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKkJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDkuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVZSQ19ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIHZpZGVvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgLT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOZXcgYWFjIHByb3BlcnRpZXMgKi8KLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjCi0gICAgICAgICAgICA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgPSBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogR2V0ICdmdHlwJyBhdG9tICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3gsICZwQ2xpcFByb3BlcnRpZXMtPmZ0eXApOwotCi0gICAgLyoqCi0gICAgKiBXZSB3cml0ZSB0aGUgVlNTIDNHUFAgdmVyc2lvbiBpbiB0aGUgY2xpcCBhbmFseXNpcyB0byBiZSBzdXJlIHRoZSBpbnRlZ3JhdG9yIGRvZXNuJ3QKLSAgICAqIG1peCBvbGRlciBhbmFseXNpcyByZXN1bHRzIHdpdGggbmV3ZXIgbGlicmFyaWVzICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUjsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMV0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlOwotCi0gICAgaWYoIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbgotICAgICAgICA+IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcER1cmF0aW9uID0gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uOwotCi0gICAgLyogUmVzZXQgY29tcGF0aWJpbGl0eSBjaGFydCAqLwotICAgIHBDbGlwUHJvcGVydGllcy0+YlZpZGVvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBBbmFseXNpcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQW5hbHlzZWQgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCkKLSAqIEBicmllZiAgICBDaGVjayBpZiB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWlOYk9mVmFsaWRTdHJlYW1zID0gMDsKLSAgICBNNE9TQV9FUlIgdmlkZW9fZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgYXVkaW9fZXJyID0gTTROT19FUlJPUjsKLSAgICAvKioqKioqKioqIGZpbGUgdHlwZSAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUiA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmc6XAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gcENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKioqKioqKiogVmlkZW8gKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lVmlkZW8KLSAgICAgICAgIT0gcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGEgdmlkZW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKiBDaGVjayB2aWRlbyBmb3JtYXQgaXMgTVBFRy00LCBIMjYzIG9yIEgyNjQgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyo8IEtPLCB3ZSByZXR1cm4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogdW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0Iik7Ci0gICAgICAgICAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQXVkaW8gb25seSBzdHJlYW0gYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBWU1MgZWRpdGluZyBmZWF0dXJlCi0gICAgICAgICh1bmxlc3MgaW4gdGhlIE1QMyBjYXNlKSAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IE5vIHZpZGVvIHN0cmVhbSBpbiBjbGlwIik7Ci0gICAgICAgIHZpZGVvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBBdWRpbyAqKioqKioqKiovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIsIEVWUkMgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIHN3aXRjaCggcENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAvKjwgT0ssIHdlIHByb2NlZWQsIG5vIHJldHVybiAqLwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICBhdWRpb19lcnIgPSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdmFsaWQgc3RyZWFtIGluIHRoZSBmaWxlLi4uICovCi0gICAgaWYoIHZpZGVvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIHZpZGVvX2VycjsKLQotICAgIGlmKCBhdWRpb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiBhdWRpb19lcnI7Ci0KLSAgICBpZiggMCA9PSB1aU5iT2ZWYWxpZFN0cmVhbXMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiBGaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIGF1ZGlvIG1peGVyCi0gKiBAcGFyYW0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBJbnB1dENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEFkZGVkQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0Jvb2wgYkNsaXAxSXNBQUMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJDbGlwMklzQUFDID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHNldHRpbmdzICovCi0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGF0IGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIFZTUzNHUFAgbGlicmFyeSAqLwotICAgIGlmKCAoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKQotICAgICAgICB8fCAocElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMl0KLSAgICAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OiBUaGUgY2xpcCBhbmFseXNpcyBoYXMgYmVlbiBnZW5lcmF0ZWRcCi0gICAgICAgICAgICBieSBhbm90aGVyIHZlcnNpb24sIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOwotICAgIH0KLQotICAgIGlmKCAoIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzBdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKQotICAgICAgICB8fCAocEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMl0KLSAgICAhPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OiBUaGUgY2xpcCBhbmFseXNpcyBoYXMgYmVlbiBnZW5lcmF0ZWRcCi0gICAgICAgICAgICBieSBhbm90aGVyIHZlcnNpb24sIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOwotICAgIH0KLQotICAgIC8qKioqKioqKiogaW5wdXQgZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOwotICAgIH0KLQotICAgIC8qKioqKioqKiogaW5wdXQgYXVkaW8gKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcElucHV0Q2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIHN3aXRjaCggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBhZGRlZCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQWRkZWRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0KLSAgICAgICAgICAgICAgICBpZiggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPT0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOiAvKlJDKi8KLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogVGhlIHdyaXRlciBjYW5ub3Qgd3JpdGUgdGhpcyAgaW50byBhIDNncHAgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6XAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgfQotCi0gICAgaWYoIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAhPSBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgIC8qIE1vcmVvdmVyLCBhdWRpbyBlbmNvZGVyIG1heSBiZSBuZWVkZWQgaW4gY2FzZSBvZiBhdWRpbyByZXBsYWNpbmcuLi4gKi8KLSAgICAgICAgICAgIHBDLT5iX1NTUkNuZWVkZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgIDwgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgID4gcEFkZGVkQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1vbm8gdG8gU3RlcmVvICovCi0gICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfVFJVRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjZWQ5MzcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZTUzNHUFBfQ29kZWNzLmMKLSAqIEBicmllZiAgVlNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYXVkaW8vdmlkZW8KLSAqICAgICAgICAgICAgY29kZWMgbWFuaXB1bGF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBkZWJ1ZyBzZXJ2aWNlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIgLyoqPCBJbnRlcm5hbCB0eXBlcyBvZiB0aGUgVlNTICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbaV0gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0LHBXdHJHbG9iYWxJbnRlcmZhY2Ugb3IgcFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UgKnBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBXdHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJEYXRhSW50ZXJmYWNlID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwV3RyR2xvYmFsSW50ZXJmYWNlPTB4JXgsXAotICAgICAgICBwV3RyRGF0YUludGVyZmFjZT0weCV4IiwKLSAgICAgICAgcEMsIHBXdHJHbG9iYWxJbnRlcmZhY2UsIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIGlmKCAoIE1lZGlhVHlwZSA9PSBNNFdSSVRFUl9rVW5rbm93bikgfHwgKE1lZGlhVHlwZSA+PSBNNFdSSVRFUl9rVHlwZV9OQikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgbWVkaWEgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBhIHdyaXRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBTYXZlIHdyaXRlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyA9IHBXdHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBEYXRhRmN0cyA9IHBXdHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiVlNTOiBNNFZTUzNHUFBfcmVnaXN0ZXJFbmNvZGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIE1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UsIE1lZGlhVHlwZSk7Ci0KLSAgICBpZiggTWVkaWFUeXBlID49IE00RU5DT0RFUl9rVmlkZW9fTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIHZpZGVvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGVuY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBlbmNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBlbmNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIGFuZCBleHRlcm5hbCBBUEkgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGVuY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0gICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgY29udGV4dCB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZTogICAgICAgICAgICAgICAgKElOKSBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlICkKLXsKLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWU1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiVlNTOiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIgY2FsbGVkIHBDb250ZXh0PTB4JXgsIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIE1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UsIE1lZGlhVHlwZSk7Ci0KLSAgICBpZiggTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qCi0gICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbTWVkaWFUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBlbmNvZGVyICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXI6IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlWzB4JXhdID0gMHgleCIsCi0gICAgICAgIE1lZGlhVHlwZSwgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmRyRGF0YUludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckdsb2JhbEludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGdsb2JhbCBpbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckRhdGFJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBkYXRhIGludGVyZmFjZSIpOwotCi0gICAgaWYoIG1lZGlhVHlwZSA9PSBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93bgotICAgICAgICB8fCBtZWRpYVR5cGUgPj0gTTRSRUFERVJfa01lZGlhVHlwZV9OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBhIHJlYWRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVttZWRpYVR5cGVdID0gcFJkckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UgKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICAvKiBhIGRlY29kZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotCi0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiRGVjb2RlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLQotI2Vsc2UgLyogZXh0ZXJuYWwgZGVjb2RlcnMgYXJlIHBvc3NpYmxlICovCi0gICAgICAgIC8qIGNhbiBiZSBsZWdpdGltYXRlLCBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIG9uZSB2ZXJzaW9uIHRoYXQgY2FuIHVzZSBleHRlcm5hbCBkZWNvZGVycwotICAgICAgICBidXQgd2hpY2ggc3RpbGwgaGFzIHRoZSBidWlsdC1pbiBvbmUgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgYW4gZXh0ZXJuYWwgZGVjb2RlcjsgaW4KLSAgICAgICAgdGhpcyBjYXNlIHRoZSBuZXcgZGVjb2RlciBzaW1wbHkgcmVwbGFjZXMgdGhlIG9sZCBvbmUgKGkuZS4gd2UgdW5yZWdpc3RlciBpdCBmaXJzdCkuICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KLSAgICAgICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotI2VuZGlmIC8qIGFyZSBleHRlcm5hbCBkZWNvZGVycyBwb3NzaWJsZT8gKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIHdpbGwgYmUgc2V0IGJ5IHRoZSByZWdpc3RyYXRpb24gZnVuY3Rpb24gaW4gdGhlIGNhc2UKLSAgICBvZiBhbiBleHRlcm5hbCBkZWNvZGVyIChhZGQgaXQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBmdW5jdGlvbiBpbiB0aGUgbG9uZyBydW4/KSAqLwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIFZTUyB0byByZWdpc3RlciBOWFAgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmKCBkZWNvZGVyVHlwZSA+PSBNNEFEX2tUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCBhdWRpbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtkZWNvZGVyVHlwZV0gPQotICAgICAgICBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZGVjb2RlciAqLwotICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnM6IHBDPTB4JXgiLCBwQyk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tBdWRpb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0pOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0pOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0gICAgcEMtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnM6IHBDPTB4JXgiLCBwQyk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGRlY29kZXJzIGludGVyZmFjZXMqLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbaV0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRXcml0ZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHdyaXRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIHdyaXRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rM0dQUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucEdsb2JhbEZjdHM7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucERhdGFGY3RzOwotCi0gICAgaWYoIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMCi0gICAgICAgIHx8IHBDLT5wV3JpdGVyRGF0YUZjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXI6IHBDPTB4JXgsIG1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIG1lZGlhVHlwZSk7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMigiTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXI6IHBDPTB4JXgsIG1lZGlhVHlwZT0weCV4IiwKLSAgICAgICAgcEMsIG1lZGlhVHlwZSk7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXI6IGVuY29kZXIgdHlwZSBBTVIiKTsKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFBQyIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQsCi0gICAgICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF09MHgleCxcCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IDB4JXgiLAotICAgICAgICBlbmNvZGVyVHlwZSwgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdLAotICAgICAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMpOwotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00UkVBREVSX01lZGlhVHlwZSByZWFkZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDM6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZU1QMzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTToKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wUmVhZGVyID0gcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbcmVhZGVyVHlwZV07Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtyZWFkZXJUeXBlXTsKLQotICAgIGlmKCBwQy0+bV9wUmVhZGVyID09IE00T1NBX05VTEwgfHwgcEMtPm1fcFJlYWRlckRhdGFJdCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4ODoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVZVVY0MjBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgaWYoIHBDLT5tX3BWaWRlb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlQU1STkI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUzoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUY6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBQUM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbToKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZVBDTTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjhiN2Q1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0LmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIgLyoqPCBPU0FMIHN0cmluZyBtYW5hZ2VtZW50ICovCi0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgInN0cmluZy5oIiAgICAgICAgIC8qKjwgZm9yIHN0cmNweSAoRG9uJ3Qgd2FudCB0byBnZXQgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE00T1NBX1N0cmluZy4uLikgKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlNYXN0ZXJDbGlwICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKCkKLSAqIEBicmllZiAgICBHZXQgdGhlIFZTUyAzR1BQIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbkluZm8gKQotewotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfR2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsCi0gICAgICAgIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFZlcnNpb25JbmZvKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX0dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBNNFZTU19WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciA9IE00VlNTX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gTTRWU1NfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgM0dQUCBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KCBNNFZTUzNHUFBfRWRpdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQzsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgXAotICAgICAgICBwRmlsZVJlYWRQdHJGY3Q9MHgleCwgcEZpbGVXcml0ZVB0ckZjdD0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVSZWFkUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRJbml0OiBwRmlsZVdyaXRlUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIFZTUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIk00VlNTM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLSAgICAgICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMsIDAsc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KSk7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00VlNTM0dQUF9JbnRlcm5hbENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLQotICAgIC8qIEluaXQgdGhlIGNvbnRleHQuICovCi0gICAgcEMtPnVpQ2xpcE51bWJlciA9IDA7Ci0gICAgcEMtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0gICAgcEMtPnBDMSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDMiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djFbMF0ucGFjX2RhdGEgPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djJbMF0ucGFjX2RhdGEgPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2M1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnl1djRbMF0ucGFjX2RhdGEgPSBwQy0+eXV2NFsxXS5wYWNfZGF0YSA9IHBDLT4KLSAgICAgICAgeXV2NFsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID0gMDsKLSAgICBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID0gMDsKLSAgICBwQy0+YlRyYW5zaXRpb25FZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YlN1cHBvcnRTaWxlbmNlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gMC4wOwotICAgIHBDLT5ld2MuZEFUbyA9IDAuMDsKLSAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDA7Ci0gICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAwOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5pbmZvU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gMC4wOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0ID0gMDsKLSAgICBwQy0+ZXdjLlZwcEVycm9yID0gMDsKLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICAvKioKLSAgICAqIEtlZXAgdGhlIE9TQUwgZmlsZSBmdW5jdGlvbnMgcG9pbnRlciBzZXQgaW4gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLQotICAgIGVyciA9IE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBtYWluIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICBwQy0+QXN0YXRlID0gTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIC8qIFRoZSBmbGFnIGlzIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KLSAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcEMtPmJJc01NUyA9IE00T1NBX0ZBTFNFOwotCi0gICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMxID0gMDsKLSAgICBwQy0+Yklzc2Vjb25kQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0SW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+RWZmZWN0c1sgXSB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgQ2xpcCBwYXRoIHNpemUgKG5lZWRlZCBmb3IgVVRGIDE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIKLU00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBuYkVmZmVjdHMgKQotewotICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBjbGlwIHNldHRpbmdzIHRvIGRlZmF1bHQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9IE00T1NBX05VTEw7ICAgICAgICAvKio8IG5vIGZpbGUgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9VbnN1cHBvcnRlZDsgLyoqPCB1bmRlZmluZWQgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBGaWxlICkKLSAgICB7Ci0gICAgICAgIC8vcENsaXBTZXR0aW5ncy0+cEZpbGUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3MtPnBGaWxlIik7Ci0gICAgICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSBiZWNhdXNlIG9mIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZmlsZVBhdGhTaXplICsgMSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzLT5wRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA6IEVSUk9SIGFsbG9jYXRpbmcgZmlsZW5hbWUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvL21lbWNweShwQ2xpcFNldHRpbmdzLT5wRmlsZSwgcEZpbGUsIHN0cmxlbihwRmlsZSkrMSk7Ci0gICAgICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSBiZWNhdXNlIG9mIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5ncy0+cEZpbGUsICh2b2lkICopcEZpbGUsIGZpbGVQYXRoU2l6ZSArIDEpOwotICAgIH0KLQotICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSB0byBzdXBwb3J0IFVURjE2IGNvbnZlcnNpb24qLwotICAgIHBDbGlwU2V0dGluZ3MtPmZpbGVQYXRoU2l6ZSA9IGZpbGVQYXRoU2l6ZSArIDE7Ci0gICAgLyoqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkZpbGVUeXBlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzBdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzFdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WZXJzaW9uWzJdID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9IDA7Ci0KLSAgICBwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZSA9IDA7IC8qKjwgbm8gYmVnaW4gY3V0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lID0gMDsgICAvKio8IG5vIGVuZCBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHZpZGVvIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfZWRpdFNldERlZmF1bHRTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzRGVzdCBpcyBOVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NPcmlnKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NPcmlnIGlzIE5VTEwiKTsKLQotICAgIC8qIENvcHkgcGxhaW4gc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICh2b2lkICopcENsaXBTZXR0aW5nc09yaWcsIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSk7Ci0KLSAgICAvKiBEdXBsaWNhdGUgZmlsZW5hbWUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgPQotICAgICAgICAvLyAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxLCBNNFZTUzNHUFAsCi0gICAgICAgIC8vICJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCi0gICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQ2xpcFNldHRpbmdzT3JpZy0+ZmlsZVBhdGhTaXplICsgMSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qRkI6IGNsaXAgcGF0aCBzaXplIGlzIG5lZWRlZCBmb3IgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAvL21lbWNweShwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUsIHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgLy8gc3RybGVuKHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSkrMSk7Ci0gICAgICAgIC8qRkIgMjAwOC8xMC8xNjogYmFkIGFsbG9jYXRpb24gc2l6ZSB3aGljaCByYWlzZXMgYSBjcmFzaCovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUsCi0gICAgICAgICAgICBwQ2xpcFNldHRpbmdzT3JpZy0+ZmlsZVBhdGhTaXplLyorMSovKTsKLSAgICAgICAgKCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgKilwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUpW3BDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICB9Ci0KLSAgICAvKiBEdXBsaWNhdGUgZWZmZWN0cyAqLwotICAgIC8qIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMpLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogZnJlZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICB7Ci0gICAgICAgIGZyZWUocENsaXBTZXR0aW5ncy0+cEZpbGUpOwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogZnJlZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgLyogICAgaWYoTTRPU0FfTlVMTCAhPSBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzKQotICAgIHsKLSAgICBmcmVlKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgIHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwU2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfSBSQyAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbigpCi0gKiBAYnJpZWYgICAgIFNldCB0aGUgVlNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICAgIEl0IG9wZW5zIHRoZSBpbnB1dCBmaWxlLCBidXQgdGhlIG91dHB1dCBmaWxlIG1heSBub3QgYmUgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICAgcFNldHRpbmdzICAgICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbiggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG91dHB1dEZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IDNHUFAgb3IgTVAzICh3ZSBkb24ndCBkbyBBTVIgb3V0cHV0KSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUMxZHVyYXRpb24sIHVpQzJkdXJhdGlvbjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBDbGlwTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wQ2xpcExpc3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoIHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID4gMSkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoICggcEMtPlN0YXRlICE9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQpCi0gICAgICAgICYmIChwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IFN0YXRlIGVycm9yICgweCV4KSEgUmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgYW55IHByZXZpb3VzbHkgYWxsb2NhdGVkIGludGVybmFsIHNldHRpbmdzIGxpc3QgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIHVzZXIgc2V0dGluZ3MgaW4gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGNsaXAgbGlzdCAqLwotICAgIHBDLT5wQ2xpcExpc3QgPQotICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykKLSAgICAgICAgKiBwQy0+dWlDbGlwTnVtYmVyLCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQ2xpcExpc3QiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQ2xpcExpc3QgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiB1bmFibGUgdG8gYWxsb2NhdGUgcEMtPlNldHRpbmdzLnBDbGlwTGlzdCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pLAotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sIE00T1NBX1RSVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBlZmZlY3RzIGxpc3QgUkMgKi8KLQotICAgIC8qRkIgYnVnIGZpeCAxOS4wMy4yMDA4IGlmIHRoZSBudW1iZXIgb2YgZWZmZWN0cyBpcyAwIC0+IGNyYXNoKi8KLSAgICBpZiggcFNldHRpbmdzLT5uYkVmZmVjdHMgPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLSAgICAgICAgcEMtPnBFZmZlY3RzTGlzdCA9IChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBFZmZlY3RzTGlzdCIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wRWZmZWN0c0xpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiB1bmFibGUgdG8gYWxsb2NhdGUgcEMtPnBFZmZlY3RzTGlzdCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT5uYkVmZmVjdHM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHBDLT5wRWZmZWN0c0xpc3RbaV0pLAotICAgICAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0IFJDICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VSW50OCkgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogQWxsb2NhdGUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzID0gMDsKLSAgICAgICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRlc3QgdGhlIGNsaXAgYW5hbHlzaXMgZGF0YSwgaWYgaXQgaXMgbm90IHByb3ZpZGVkLCBhbmFseXNlIHRoZSBjbGlwcyBieSBvdXJzZWx2ZXMuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBBbmFseXNpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGludGVncmF0b3IgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAocEMtPnBDbGlwTGlzdFtpXS5wRmlsZSwKLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlLCAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBjbGlwIGNvbXBhdGliaWxpdHkgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGFsbCB0aGUgY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygKLSAgICAgICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCVkKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgdGhlIG1hc3RlciBjbGlwIHZlcnN1cyBhbGwgdGhlIG90aGVyIG9uZXMuCi0gICAgICAgIChpbmNsdWRpbmcgbWFzdGVyIGNsaXAgd2l0aCBpdHNlbGYsIGVsc2UgdmFyaWFibGVzIGZvciBtYXN0ZXIgY2xpcAotICAgICAgICBhcmUgbm90IHByb3Blcmx5IHNldHRlZCkgKi8KLSAgICAgICAgaWYocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcyk7Ci0gICAgICAgICAgICAvKiBpbiBjYXNlIG9mIHdhcm5pbmcgcmVnYXJkaW5nIGF1ZGlvIGluY29tcGF0aWJpbGl0eSwKLSAgICAgICAgICAgICAgICBlZGl0aW5nIGNvbnRpbnVlcyAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZCkgcmV0dXJucyAweCV4ISIsIGksIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFNlYXJjaCBhdWRpbyB0cmFja3MgdGhhdCBjYW5ub3QgYmUgZWRpdGVkIDoKLSAgICAqICAgLSBkZWxldGUgYWxsIGF1ZGlvIGVmZmVjdHMgZm9yIHRoZSBjbGlwCi0gICAgKiAgIC0gaWYgbWFzdGVyIGNsaXAgaXMgZWRpdGFibGUgbGV0IHRoZSB0cmFuc2l0aW9uCi0gICAgKGJhZCB0cmFjayB3aWxsIGJlIHJlcGxhY2VkIGxhdGVyIHdpdGggc2lsZW5jZSkKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBub3QgZWRpdGFibGUgc3dpdGNoIHRvIGEgZHVtbXkgdHJhbnNpdGlvbiAob25seSBjb3B5L3Bhc3RlKSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgICAgICAgICBmb3IgKCB1aUZ4ID0gMDsgdWlGeCA8IHBDLT5uYkVmZmVjdHM7IHVpRngrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzTGlzdFt1aUZ4XS5BdWRpb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpIDwgKHBDLT51aUNsaXBOdW1iZXIgLSAxKSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5BdWRpb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICAgID0gTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFdlIGFkZCBhIHRyYW5zaXRpb24gb2YgZHVyYXRpb24gMCBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGNsaXAuCi0gICAgKiBJdCB3aWxsIHN1cHByZXNzIGEgd2hvbGUgYnVuY2ggYSB0ZXN0IGxhdHRlciBpbiB0aGUgcHJvY2Vzc2luZy4uLiAqLwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3QgPSAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykKLSAgICAgICAgKiAocEMtPnVpQ2xpcE51bWJlciksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucFRyYW5zaXRpb25MaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqPCBjb3B5IHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBUcmFuc2l0aW9uTGlzdFtpXSksCi0gICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICB9Ci0KLSAgICAvKio8IFdlIGZpbGwgdGhlIGxhc3QgImR1bW15IiB0cmFuc2l0aW9uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSAwOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLlZpZGVvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIKLSAgICAgICAgLSAxXS5BdWRpb1RyYW5zaXRpb25UeXBlID0gTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU7Ci0KLSAgICAvKioKLSAgICAqIEF2b2lkIHdlaXJkIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgIT1NNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygmcEMtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjayByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCAocFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSAtIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2krMV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSsxXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSAtIHBDLT5wQ2xpcExpc3RbaSsxXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE1heGltdW0gdHJhbnNpdGlvbiBkdXJhdGlvbiBiZXR3ZWVuIGNsaXAgbiBhbmQgY2xpcCBuKzEgaXMgdGhlIGR1cmF0aW9uCi0gICAgICAgICogb2YgdGhlIHNob3J0ZXN0IGNsaXAgKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMxZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbiBpcyB0aGUgZW5kIGN1dCB0aW1lICovCi0gICAgICAgICAgICB1aUMxZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMxZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAvKio8IENoZWNrIHRoYXQgdGhlIHRyYW5zaXRpb24gaXMgc2hvcnRlciB0aGFuIGNsaXAgbiAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzFkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMxZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdWlDMmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2kgKyAxXS5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBkdXJhdGlvbiBvZiBjbGlwIG4rMSBpcyB0aGUgZW5kIGN1dCB0aW1lICovCi0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IFN1YnN0cmFjdCBiZWdpbiBjdXQgKi8KLSAgICAgICAgdWlDMmR1cmF0aW9uIC09IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuKzEgKi8KLSAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPiB1aUMyZHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID0gdWlDMmR1cmF0aW9uIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEF2b2lkIHdlaXJkIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygmcEMtPnBUcmFuc2l0aW9uTGlzdFtpXSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgdGhhdCB0d28gdHJhbnNpdGlvbnMgYXJlIG5vdCBvdmVybGFwcGluZwotICAgICAgICAgIChubyBvdmVybGFwcGluZyBwb3NzaWJsZSBmb3IgZmlyc3QgY2xpcCkgKi8KLSAgICAgICAgaWYoIGkgPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoZXJlIGlzIGEgdHJhbnNpdGlvbiBvdmVybGFwIGlmIHRoZSBzdW0gb2YgdGhlIGR1cmF0aW9uIG9mCi0gICAgICAgICAgICAgIHR3byBjb25zZWN1dGl2ZSB0cmFuc2l0aW9ucwotICAgICAgICAgICAgKiBpcyBoaWdoZXIgdGhhbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgaW4tYmV0d2Vlbi4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdLnVpVHJhbnNpdGlvbkR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKyBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uKSA+PSB1aUMxZHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBPdmVybGFwcGluZyB0cmFuc2l0aW9ucyBvbiBjbGlwICVkLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiLAotICAgICAgICAgICAgICAgICAgICBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogT3V0cHV0IGNsaXAgZHVyYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBzdW0gb2YgdGhlIGNsaXAgZHVyYXRpb24gKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiArPQotICAgICAgICAgICAgICAgIHBDLT4KLSAgICAgICAgICAgICAgICBwQ2xpcExpc3RbCi0gICAgICAgICAgICAgICAgICAgIGldLkNsaXBQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwVmlkZW9EdXJhdGlvbjsgLyogT25seSB2aWRlbyB0cmFjayBkdXJhdGlvbiBpcyBpbXBvcnRhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIGRldmlhdGlvbiBpZiBhdWRpbyB0cmFjayBpcyBsb25nZXIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWU7IC8qKjwgQWRkIGVuZCBjdXQgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09Ci0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOyAvKio8IFJlbW92ZSBiZWdpbiBjdXQgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1vdmUgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uIChpdCBpcyBjb3VudGVkIHR3aWNlKSAqLwotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiAtPSBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIEdldCB2aWRlbyBwcm9wZXJ0aWVzIGZyb20gb3V0cHV0IHByb3BlcnRpZXMgKi8KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGggYW5kIGhlaWdodCAqLwotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDEyODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTc2OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMTQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDI4ODsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogK1BSIExWNTgwNyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLQotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDk2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE5MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxMDg4OyAvLyBuZWVkIHRvIGJlIG11bHRpcGxlcyBvZiAxNgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3Blbjogbm8gb3V0cHV0IHZpZGVvIHNpemUgZ2l2ZW4sIGRlZmF1bHQgdG8gUUNJRiEiKTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTc2OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMTQ0OwotICAgICAgICAgICAgcEMtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUgICAgICAgID0gMzA7Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nICA9IDA7Ci0gICAgLyogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICBzd2l0Y2gocEMtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa1ZpZGVvVW5rbm93bjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgYXVkaW8gcHJvcGVydGllcyBvZiB0aGUgbWFzdGVyIGNsaXAgdG8gdGhlIG91dHB1dCBwcm9wZXJ0aWVzICovCi0gICAgcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPQotICAgICAgICBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT4KLSAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZSA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgcEMtPmV3Yy5zY2FsZV9hdWRpbyA9IHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSAvIDEwMDAuMDsKLQotICAgIHN3aXRjaCggcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICBwQy0+YlN1cHBvcnRTaWxlbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIDEwMjQ7IC8qIEFBQyBpcyBhbHdheXMgMTAyNC9GcmVxIHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rTVAzOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UsIG1wMyBjb3JlIHJlYWRlciByZXR1cm4gYSB0aW1lIGluIG1zICovCi0gICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gMS4wOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMTYwOyAvKiBFVlJDIGZyYW1lcyBhcmUgMjAgbXMgYXQgODAwMCBIegotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ha2VzIGl0IGVhc2llciB0byBmYWN0b3JpemUgYW1yIGFuZCBldnJjIGNvZGUpICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8cEMtPnVpQ2xpcE51bWJlcjsgaSsrKSB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX0ZBTFNFKSB7Ci0gICAgICAgICAgICAvKiogSWYgbm90IHRyYW5zY29kZWQgaW4gQW5hbHlzaXMgcGhhc2UsIGNoZWNrCi0gICAgICAgICAgICAgKiBpZiB0cmFuc2NvZGluZyByZXF1aXJlZCBub3cKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSAhPQotICAgICAgICAgICAgICAgICAgcEMtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpfHwKLSAgICAgICAgICAgICAgICAgIChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCkgfHwKLSAgICAgICAgICAgICAgICAgIChwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PQotICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tIMjY0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa01QRUc0ICYmCi0gICAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlICE9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkpIHsKLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKiBJZiBiVHJhbnNjb2RpbmdSZXF1aXJlZCBpcyB0cnVlLCBpdCBtZWFucyB0aGUgY2xpcCBoYXMKLSAgICAgICAgICAgICAqIGJlZW4gdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5iVHJhbnNjb2RpbmdSZXF1aXJlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogV2UgcHJvZHVjZSBhIDNncHAgZmlsZSwgdW5sZXNzIGl0IGlzIG1wMyAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT4KLSAgICAgICAgcENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICBvdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDM7Ci0gICAgZWxzZQotICAgICAgICBvdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgLyoqCi0gICAgKiBCZXdhcmUsIGEgbnVsbCBkdXJhdGlvbiB3b3VsZCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gZXJyb3IgKGJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4pICovCi0gICAgaWYoIDAgPT0gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICogT3BlbiBmaXJzdCBjbGlwICovCi0gICAgcEMtPnVpQ3VycmVudENsaXAgPSAwOwotCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gMC4wOwotICAgIHBDLT5ld2MuZEFUbyA9IDAuMDsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLSAgICAvKiBSQzogdG8ga25vdyB3aGVuIGEgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERvIHRoZSB2aWRlbyBzdHVmZiBpbiAzR1BQIEF1ZGlvL1ZpZGVvIGNhc2UgKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgRGVjb2RlciBTcGVjaWZpYyBJbmZvIGZvciB0aGUgb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyBzdHJlYW1zICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaShwQywKLSAgICAgICAgICAgIHBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW5jcmVtZW50IGZvciB0aGUgdHJhbnNpdGlvbiBmaWxlICovCi0gICAgICAgIHN3aXRjaCggcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rN181X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyA3LjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxMi41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMTUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDIwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAyNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMzAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFNZU19rTVBFR180ID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQWxwaGE7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTVBFRy00IGNhc2UuCi0gICAgICAgICAgICAqIFRpbWUgc2NhbGUgb2YgdGhlIHRyYW5zaXRpb24gZW5jb2RlciBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlCi0gICAgICAgICAgICAqIHRpbWVzY2FsZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0gICAgICAgICAgICAqIFNvIHRoZSBmcmFtZSBkdXJhdGlvbiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHRpbWUgc2NhbGUsCi0gICAgICAgICAgICAqIGJ1dCB3aXRob3V0IGJlZWluZyB0b28gc2hvcnQuCi0gICAgICAgICAgICAqIEZvciB0aGF0LCB3ZSBtdXN0IGNvbXB1dGUgYWxwaGEgKGludGVnZXIpIHNvIHRoYXQ6Ci0gICAgICAgICAgICAqICAgICAgICAgICAgIChhbHBoYSB4IDEwMDApL0VuY29kZXJUaW1lU2NhbGUgPiBNaW5GcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAqKi8KLQotICAgICAgICAgICAgdWlBbHBoYSA9IChNNE9TQV9VSW50MzIpKCggcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKiBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGUpIC8gMTAwMC4wICsgMC41KTsKLQotICAgICAgICAgICAgaWYoIHVpQWxwaGEgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAoIHVpQWxwaGEgKiAxMDAwLjApIC8gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00U1lTX2tIMjYzID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4oKTogaW52YWxpZCB2aWRlb0ZyYW1lUmF0ZSBmb3IgSDI2MyxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIE1QMyBvdXRwdXQgZmlsZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlKHBDLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVGhlIElEM3YyIHRhZyBjb3VsZCBiZSBhdCBhbnkgcGxhY2UgaW4gdGhlIG1wMyBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBUaGUgbXAzIHJlYWRlciBvbmx5IGNoZWNrcyBmZXcgYnl0ZXMgaW4gdGhlIGJlZ2lubmluZyBvZgotICAgICAgICAgICBzdHJlYW0gdG8gbG9vayBmb3IgYSBJRDN2MiB0YWcgICovCi0gICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgaWYgdGhlIElEM3YyIHRhZyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB0aGUgcmVhZGVyIGRvCi0gICAgICAgIGFzIHRoZXJlIGlzIG5vIHRoZXNlIG1ldGFkYXRhICovCi0KLSAgICAgICAgLyogUmV0cmlldmUgdGhlIGRhdGEgb2YgdGhlIElEM3YyIFRhZyAqLwotICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjJUYWcsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9lZGl0T3BlbjogTTRNUDNSX2dldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV3JpdGUgdGhlIGRhdGEgb2YgdGhlIElEM3YyIFRhZyBpbiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgZnJlZShtcDN0YWdCdWZmZXIubV9wRGF0YSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogV3JpdGVEYXRhKElEM3YyVGFnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIDNHUFAgb3V0cHV0IGZpbGUgKi8KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiAxMS8xMi8yMDA4IENSMzI4MyBNTVMgdXNlIGNhc2UgaW4gVmlkZW9BcnRpc3Q6IFNldCBtYXggb3V0cHV0IGZpbGUgc2l6ZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsCi0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIsIHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBEZWZhdWx0IGVycm9yIGNhc2UgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IGludmFsaWQgb3V0cHV0RmlsZVR5cGUgPSAweCV4LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX09VVFBVVF9GSUxFX1RZUEVfRVJST1IiLAotICAgICAgICAgICAgb3V0cHV0RmlsZVR5cGUpOwotICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUjsgLyoqPCB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biB0byB0aGUgdXNlciAqLwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSBzdGF0ZSAqLwotICAgIGlmKCBNNFNZU19rTVAzID09IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluIHRoZSBNUDMgY2FzZSB3ZSB1c2UgYSBzcGVjaWFsIGF1ZGlvIHN0YXRlICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBzdGFydCB3aXRoIHRoZSB2aWRlbyBwcm9jZXNzaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSBzdGF0ZS4KLSAgICAqIFRoZSBmaXJzdCBjbGlwIGlzIGluZGVwZW5kYW50IHRvIHRoZSAidmlydHVhbCBwcmV2aW91cyBjbGlwcyIsCi0gICAgKiBzbyBpdCdzIGxpa2UgaWYgd2Ugd2hlcmUgaW4gUmVhZC9Xcml0ZSBtb2RlIGJlZm9yZSBpdC4gKi8KLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0T3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgZWRpdGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSBlZGl0aW5nIG9wZXJhdGlvbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTogRWRpdGlvbiBpcyBkb25lLCB1c2VyIHNob3VsZCBub3cgY2FsbAotICogICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgdWlQcm9ncmVzc0F1ZGlvLCB1aVByb2dyZXNzVmlkZW8sIHVpUHJvZ3Jlc3M7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfZWRpdFN0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQcm9ncmVzcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0U3RlcDogcFByb2dyZXNzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uIGFuZCBzZWxlY3QgY29ycmVjdCBwcm9jZXNzaW5nICovCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU86Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyhwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMyhwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcHJvZ3Jlc3MuCi0gICAgKiBXZSBkbyB0aGUgY29tcHV0aW5nIHdpdGggMzJiaXRzIHByZWNpc2lvbiBiZWNhdXNlIGluIHNvbWUgKHZlcnkpIGV4dHJlbWUgY2FzZSwgd2UgbWF5IGdldAotICAgICogdmFsdWVzIGhpZ2hlciB0aGFuIDI1NiAoLi4uKSAqLwotICAgIHVpUHJvZ3Jlc3NBdWRpbyA9Ci0gICAgICAgICggKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHVpUHJvZ3Jlc3NWaWRlbyA9ICgoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cyAqIDEwMCkpIC8gcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb247Ci0KLSAgICB1aVByb2dyZXNzID0gdWlQcm9ncmVzc0F1ZGlvICsgdWlQcm9ncmVzc1ZpZGVvOwotCi0gICAgaWYoICggcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRTWVNfa0F1ZGlvVW5rbm93bikKLSAgICAgICAgJiYgKHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICE9IE00U1lTX2tWaWRlb1Vua25vd24pICkKLSAgICAgICAgdWlQcm9ncmVzcyAvPSAyOwotCi0gICAgLyoqCi0gICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZiggdWlQcm9ncmVzcyA+IDEwMCApCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KXVpUHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gdGhlIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCgpOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0VSUiByZXR1cm5lZEVycm9yID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbGFzdENUUzsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfZWRpdENsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgYXV0aG9yaXplIGNsb3NpbmcgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCA9PSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogV3Jvbmcgc3RhdGUgKDB4JXgpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGhlcmUgbWF5IGJlIGFuIGVuY29kZXIgdG8gZGVzdHJveSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfZWRpdERlc3Ryb3lWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogTVAzIGNhc2UgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPmNsb3NlV3JpdGUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgb3V0cHV0IDNHUFAgY2xpcCwgaWYgaXQgaGFzIGJlZW4gb3BlbmVkICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbGFzdCBWaWRlbyBDVFMgKi8KLSAgICAgICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IHBGY3RDbG9zZVdyaXRlKE9VVCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBvdXRwdXQgdmlkZW8gRFNJLCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBWaWRlb091dHB1dERzaSk7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCBhdWRpbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDEsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIGNsaXAyLCBpZiBuZWVkZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEMyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMyKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgID09IHJldHVybmVkRXJyb3IgKSAvKio8IHdlIHJldHVybiB0aGUgZmlyc3QgZXJyb3IgdGhhdCBoYXBwZW5lZCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBDMiA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB0ZW1wb3JhcnkgWVVWIHBsYW5lcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIFJDICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1sxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFswXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsyXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJDIEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJDIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKCBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0KTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICAqICBGcmVlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZihwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSk7Ci0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYocEMtPm1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQ7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UoKTogcmV0dXJuaW5nIDB4JXgiLCByZXR1cm5lZEVycm9yKTsKLSAgICByZXR1cm4gcmV0dXJuZWRFcnJvcjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCkKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCggTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ29udGV4dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCwgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UsIGlmIG5lZWRlZC4KLSAgICAqIEluICJ0aGVvcnkiLCB3ZSBzaG91bGQgbm90IGNsb3NlIGlmIHdlIGFyZSBpbiBDUkVBVEVEIHN0YXRlLgotICAgICogQnV0IGluIHByYWN0aWNlLCBpbiBjYXNlIHRoZSBvcGVuaW5nIGZhaWxlZCwgaXQgbWF5IGhhdmUgYmVlbiBwYXJ0aWFsbHkgZG9uZS4KLSAgICAqIEluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGZyZWUgc29tZSBvcGVuZWQgcmVzc291cmNlcyBieSBjYWxsaW5nIENsb3NlLiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogY2FsbGluZyBNNFZTUzNHUFBfZWRpdENsb3NlIik7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXAoKTogTTRWU1MzR1BQX2VkaXRDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHZpZGVvIGVuY29kZXIgZHVtbXkgQVUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBEdW1teUF1QnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlcik7Ci0gICAgICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgQXVkaW8gZW5jb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2V0dGluZ3MgY29waWVkIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QocEMpOwotCi0gICAgLyoqCi0gICAgKiBGaW5hbGx5LCBGcmVlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWZkZWYgV0lOMzIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoKQotICogQGJyaWVmICAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBlcnJvciBjb2RlCi0gKiBAbm90ZSAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgKGFuZCBsb25nIGVub3VnaCEpCi0gKiBAcGFyYW0gICAgZXJyICAgICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20KLSAqIEBwYXJhbSAgICBzTWVzc2FnZSAgICAgICAgKElOL09VVCkgQWxsb2NhdGVkIHN0cmluZyBpbiB3aGljaCB0aGUgZGVzY3JpcHRpb24gd2lsbCBiZSBjb3BpZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIElucHV0IGVycm9yIGlzIGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjpJbnB1dCBlcnJvciBpcyBub3QgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSggTTRPU0FfRVJSIGVyciwgTTRPU0FfQ2hhciAqc01lc3NhZ2UgKQotewotICAgIHN3aXRjaCggZXJyICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkciKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9FRkZFQ1RfS0lORDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9FRkZFQ1RfS0lORCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX0VGRkVDVF9UWVBFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX0VGRkVDVF9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEwiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9UUkFOU0lUSU9OX05VTEw6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk8iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT046Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOREVGSU5FRF9BVURJT19UUkFDS19GSUxFX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BVURJT19NSVhJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0siKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBOb3QgYSBWU1MzR1BQIGVycm9yICovCi0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLyogV0lOMzIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKiogICBTVEFUSUMgRlVOQ1RJT05TICAgKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2soKQotICogQGJyaWVmICAgIFNpbXBsaWZ5IHRoZSBnaXZlbiBjbGlwIHNldHRpbmdzCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgcENsaXAgICAgKElOL09VVCkgQ2xpcCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfRUZGRUNUX05VTEw6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXAgKQotewotICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uOyAvKio8IHRoZSBjbGlwIGR1cmF0aW9uIG9uY2UgdGhlIGN1dHMgYXJlIGRvbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlEdXJhdGlvbjsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLQotICAgIC8qKgotICAgICogSWYgYmVnaW4gY3V0IGlzIHRvbyBmYXIsIHJldHVybiBhbiBlcnJvciAqLwotICAgIHVpRHVyYXRpb24gPSBwQ2xpcC0+Q2xpcFByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0KLSAgICBpZiggcENsaXAtPnVpQmVnaW5DdXRUaW1lID4gdWlEdXJhdGlvbiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2s6ICVkID4gJWQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIiwKLSAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgdWlEdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIGVuZCBjdXQgaXMgdG9vIGZhciwgc2V0IHRvIHplcm8gKGl0IG1lYW5zIG5vIGVuZCBjdXQpICovCi0gICAgaWYoIHBDbGlwLT51aUVuZEN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIHBDbGlwLT51aUVuZEN1dFRpbWUgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBhY3R1YWwgY2xpcCBkdXJhdGlvbiAob25jZSBjdXRzIGFyZSBkb25lKSAqLwotICAgIGlmKCAwID09IHBDbGlwLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gZW5kIGN1dCAqLwotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHVpRHVyYXRpb24gLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPj0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2s6ICVkID4gJWQsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUIiwKLSAgICAgICAgICAgICAgICBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUsIHBDbGlwLT51aUVuZEN1dFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQ7Ci0gICAgICAgIH0KLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb24gPSBwQ2xpcC0+dWlFbmRDdXRUaW1lIC0gcENsaXAtPnVpQmVnaW5DdXRUaW1lOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soKQotICogQGJyaWVmICAgIFNpbXBsaWZ5IHRoZSBnaXZlbiB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBnaXZlbiBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwVHJhbnNpdGlvbiAgICAoSU4vT1VUKSBUcmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9UUkFOU0lUSU9OX05VTEw6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKnBUcmFuc2l0aW9uICkKLXsKLSAgICAvKioKLSAgICAqIE5vIHRyYW5zaXRpb24gKi8KLSAgICBpZiggMCA9PSBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcFRyYW5zaXRpb24tPlZpZGVvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggKCBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZQotICAgICAgICA9PSBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgJiYgKE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5BdWRpb1RyYW5zaXRpb25UeXBlKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbiBpcyBzZXQgKi8KLSAgICBpZiggKCBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICYmIChNNE9TQV9OVUxMID09IHBUcmFuc2l0aW9uLT5FeHRWaWRlb1RyYW5zaXRpb25GY3QpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBtaW5pbWFsIHRyYW5zaXRpb24gZHVyYXRpb24gKi8KLSAgICBpZiggKCBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPiAwKQotICAgICAgICAmJiAocFRyYW5zaXRpb24tPnVpVHJhbnNpdGlvbkR1cmF0aW9uCi0gICAgICAgIDwgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTikgKQotICAgIHsKLSAgICAgICAgcFRyYW5zaXRpb24tPnVpVHJhbnNpdGlvbkR1cmF0aW9uID0KLSAgICAgICAgICAgIE00VlNTM0dQUF9NSU5JTUFMX1RSQU5TSVRJT05fRFVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgc2V0dGluZ3MgY29waWVkIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2V0dGluZ3MgbGlzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQ2xpcExpc3QgKQotICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoJihwQy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKHBDLT5wQ2xpcExpc3QpOwotICAgICAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVHJhbnNpdGlvbkxpc3QgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRyYW5zaXRpb25MaXN0KTsKLSAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoKQotICogQGJyaWVmICAgICAgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAgZmlsZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwT3V0cHV0RmlsZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9Ci0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHItPm9wZW5Xcml0ZSgmcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgcE91dHB1dEZpbGUsCi0gICAgICAgIE00T1NBX2tGaWxlV3JpdGUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlOiBXcml0ZU9wZW4gcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKQotICogQGJyaWVmICAgQ3JlYXRlcyBhbmQgcHJlcGFyZSB0aGUgb3V0cHV0IE1QMyBmaWxlCi0gKiBAbm90ZSAgICBDcmVhdGVzIHRoZSB3cml0ZXIsIENyZWF0ZXMgdGhlIG91dHB1dCBmaWxlLCBBZGRzIHRoZSBzdHJlYW1zLAotICAgICAgICAgICBSZWFkaWVzIHRoZSB3cml0aW5nIHByb2Nlc3MKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBPc2FGaWxlV3JpdFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwVGVtcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heE91dHB1dEZpbGVTaXplICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aVZlcnNpb247Ci0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSB0ZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgY2FsbGVkIHdpdGggcENfZXdjPTB4JXgsIHBPdXRwdXRGaWxlPTB4JXgiLAotICAgICAgICBwQ19ld2MsIHBPdXRwdXRGaWxlKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDX2V3YyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcENfZXdjIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcE91dHB1dEZpbGUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6IHBPdXRwdXRGaWxlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qIFNldCB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcihwQ19TaGVsbEFQSSwgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIG91dHB1dCBmaWxlICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbigmcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgcE91dHB1dEZpbGUsIHBPc2FGaWxlV3JpdFB0ciwgcFRlbXBGaWxlLCBwT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgc2lnbmF0dXJlIG9wdGlvbiBvZiB0aGUgd3JpdGVyICovCi0gICAgZXJyID0KLSAgICAgICAgcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywgKE00T1NBX0RhdGFPcHRpb24pIk5YUC1TVyA6IFZTUyAgICAiKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoxMS8xMi8yMDA4IENSMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0OgotICAgIFNldCB0aGUgbWF4IG91dHB1dCBmaWxlIHNpemUgb3B0aW9uIGluIHRoZSB3cml0ZXIgc28gdGhhdCB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZQotICAgIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4gZmlsZSBzaXplIGxpbWl0YXRpb24qLwotICAgIGlmKCBtYXhPdXRwdXRGaWxlU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSwgJm1heE91dHB1dEZpbGVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICB3cml0ZXIgc2V0IG9wdGlvbiBNNFdSSVRFUl9rTWF4RmlsZVNpemUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2ZXJzaW9uIG9wdGlvbiBvZiB0aGUgd3JpdGVyICovCi0gICAgdWlWZXJzaW9uID0KLSAgICAgICAgKE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgKiAxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICogMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OKTsKLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiwgKE00T1NBX0RhdGFPcHRpb24pICZ1aVZlcnNpb24pOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB2aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtSW5mby5oZWlnaHQgPSBwQ19ld2MtPnVpVmlkZW9IZWlnaHQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoID0gcENfZXdjLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmZwcyA9Ci0gICAgICAgICAgICAwLjA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgIHBDX2V3Yy0+cFZpZGVvT3V0cHV0RHNpOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDX2V3Yy0+Ci0gICAgICAgICAgICB1aVZpZGVvT3V0cHV0RHNpU2l6ZTsgLyoqPCBQcmV2aW91c2x5IGNvbXB1dGVkIG91dHB1dCBEU0kgc2l6ZSAqLwotCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlOwotCi0gICAgICAgIHN3aXRjaCggcENfZXdjLT5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgICAgICAvKio8IFdlIEhBVkUgdG8gcHV0IGEgdmFsdWUgaGVyZS4uLiAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPnVpVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ubWF4Qml0cmF0ZSA9IHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCEiLAotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmR1cmF0aW9uID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICBzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyk7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKSAmKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuQ1RTID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7ICAgIC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zdHJlYW0gPSAmKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBBVSBzaXplICovCi0gICAgICAgIHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSA9IChNNE9TQV9VSW50MzIpKDEuNUYKLSAgICAgICAgICAgICooTTRPU0FfRmxvYXQpKHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoCi0gICAgICAgICAgICAqIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCkKLSAgICAgICAgICAgICogTTRWU1MzR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZTsKLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBtYXggdmlkZW8gY2h1bmsgc2l6ZSAqLwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSAoTTRPU0FfVUludDMyKShwQ19ld2MtPnVpVmlkZW9NYXhBdVNpemUgXAotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyk7IC8qKjwgZnJvbSBtYXggQVUgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IENodW5jayBzaXplICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIHN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIGlmKCBwQ19ld2MtPnBBdWRpb091dHB1dERzaSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDX2V3Yy0+dWlBdWRpb091dHB1dERzaVNpemU7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBwQ19ld2MtPnBBdWRpb091dHB1dERzaTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgRFNJICovCi0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5BdWRpb1N0cmVhbVR5cGU7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5wcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJTYW1wbGVzUGVyU2VjID0KLSAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGUgPSBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW1JbmZvLm5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ19ld2MtPnVpTmJDaGFubmVsczsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJCaXRzUGVyU2FtcGxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tNUDM6IC8qKjwgdGhlcmUgY2FuJ3QgYmUgTVAzIHRyYWNrIGluIDNHUFAgZmlsZSAtPiBlcnJvciAqLwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBvdXRwdXQgYXVkaW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCEiLAotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICZzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGluayB0aGUgQVUgYW5kIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICAtcENfZXdjLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5EVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuZnJhZyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwgJnBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCBhdWRpbyBBVSBzaXplICovCi0gICAgICAgIHBDX2V3Yy0+dWlBdWRpb01heEF1U2l6ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCBhdWRpbyBjaHVuY2sgc2l6ZSAqLwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBNNFZTUzNHUFBfQVVESU9fTUFYX0NIVU5DS19TSVpFOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGwgc3RyZWFtcyBhZGRlZCwgd2UncmUgbm93IHJlYWR5IHRvIHdyaXRlICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnRXcml0aW5nKAotICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpCi0gKiBAYnJpZWYgICAgR2VuZXJhdGUgYSBIMjYzIG9yIE1QRUctNCBkZWNvZGVyIHNwZWNpZmljIGluZm8gY29tcGF0aWJsZSB3aXRoIGFsbCBpbnB1dCB2aWRlbwotICogICAgICAgICAgICB0cmFja3MuIENvcHkgYXVkaW8gZHNpIGZyb20gbWFzdGVyIGNsaXAuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlNYXN0ZXJDbGlwICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmVzeW5jaE1hcmtlckRzaUluZGV4OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1Gb3JEc2k7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25maWdJbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgZHVtbXlTaXplOwotICAgIE00T1NBX0Jvb2wgYkdldERTaUZyb21FbmNvZGVyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIHBTdHJlYW1Gb3JEc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSDI2MyBjYXNlICovCi0gICAgaWYoIE00U1lTX2tIMjYzID09IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICBwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplID0gNzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+ZXdjLnVpVmlkZW9PdXRwdXREc2lTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2MykiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSAoSDI2MyksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogKFdlIG92ZXJyaWRlIHRoZSBpbnB1dCB2ZW5kb3IgaW5mby4KLSAgICAgICAgKiBBdCBsZWFzdCB3ZSBrbm93IHRoYXQgbm90aGluZyBzcGVjaWFsIHdpbGwgYmUgdHJpZWQgd2l0aCBQSExQLXN0YW1wZWQKLSAgICAgICAgICBlZGl0ZWQgc3RyZWFtcy4uLikgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMF0gPSAnUCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzFdID0gJ0gnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVsyXSA9ICdMJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbM10gPSAnUCc7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlciB2ZXJzaW9uIGlzIDAgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNF0gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIExldmVsIGlzIHRoZSBzaXh0aCBieXRlIGluIHRoZSBEU0kgKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNV0gPSBwQy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFByb2ZpbGUgaXMgdGhlIHNldmVudGggYnl0ZSBpbiB0aGUgRFNJKi8KLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbNl0gPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNUEVHLTQgY2FzZSAqLwotICAgIGVsc2UgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgfHwKLSAgICAgICAgTTRTWVNfa0gyNjQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAvKiBGb3IgTVBFRzQgYW5kIEguMjY0IGVuY29kZXIgY2FzZQotICAgICAgICAqIEZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6IGdldCBEU0kgZm9yIEgyNjQgc3RyZWFtIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgICBzZW5kIERTSSBmb3IgdmlkZW8gc3RyZWFtIHRvIDNHUCB3cml0ZXIiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIG5ldyBEU0kgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZW5jSGVhZGVyLT5TaXplLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjY0KSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwVmlkZW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSAoTTRPU0FfVUludDE2KWVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBWaWRlb091dHB1dERzaSwgKHZvaWQgKillbmNIZWFkZXItPnBCdWYsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+U2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybmVkIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMLCBjYW5ub3QgZ2V0IHRoZSBEU0kiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBTdHJlYW1Gb3JEc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIENvbXB1dGUgQXVkaW8gRFNJICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIHVpTWFzdGVyQ2xpcCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2xpcCBpcyBhbHJlYWR5IG9wZW5lZCAqLwotICAgICAgICAgICAgcFN0cmVhbUZvckRzaSA9ICYocEMtPnBDMS0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV2UgY2FuIHVzZSB0aGUgZmFzdCBvcGVuIG1vZGUgdG8gZ2V0IHRoZSBEU0kgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdCgmcENsaXAsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcENsaXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXAsICZwQy0+cENsaXBMaXN0W3VpTWFzdGVyQ2xpcF0sCi0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX1RSVUUsIE00T1NBX1RSVUUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQ2xpcC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBBdWRpb091dHB1dERzaSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcEF1ZGlvT3V0cHV0RHNpLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcFN0cmVhbUZvckRzaS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2ksCi0gICAgICAgICAgICAodm9pZCAqKXBTdHJlYW1Gb3JEc2ktPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiBhIGNsaXAgaGFzIGJlZW4gdGVtcG9yYXJpbHkgb3BlbmVkIHRvIGdldCBpdHMgRFNJLCBjbG9zZSBpdCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkKLSAqIEBicmllZiAgICBTd2l0Y2ggZnJvbSB0aGUgY3VycmVudCBjbGlwIHRvIHRoZSBuZXh0IG9uZQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMxICkKLSAgICB7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lKTsKLSAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBmaXJzdCBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQy0+cEMxKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAgaW5jcmVtZW50IGNsaXAgY291bnRlciAqLwotICAgICAgICBwQy0+dWlDdXJyZW50Q2xpcCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgbGFzdCBjbGlwICovCi0gICAgaWYoIHBDLT51aUN1cnJlbnRDbGlwID49IHBDLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgcEMtPnBDMSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0ZJTklTSEVEOwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQzEpIHJldHVybnMgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlIG5leHQgY2xpcCBoYXMgYWxyZWFkeSBiZSBvcGVuZWQsIHNldCBpdCBhcyBmaXJzdCBjbGlwICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMiApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gcEMtPnBDMjsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+cEMyLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBwQy0+cEMyLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdDsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBlbHNlIG9wZW4gaXQgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50T3BlbkNsaXAocEMsICZwQy0+cEMxLAotICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXBdKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6IE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIHNlY29uZCBjbGlwIGhhcyBub3QgYmVlbiBvcGVuZWQgeWV0LAotICAgICAgICAgIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBoYXMgYmVlbiBubyB0cmFuc2l0aW9uLgotICAgICAgICAqIFNvIGJvdGggb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyB0aW1lcyBhcmUgT0suCi0gICAgICAgICogU28gd2UgY2FuIHNldCBib3RoIHZpZGVvMiBhbmQgYXVkaW8gb2Zmc2V0cyAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgdmlkZW8gb2Zmc2V0ICovCi0KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgcEMtPnBDMS0+aVZvZmZzZXQgKz0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgYXVkaW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBhdWRpbyBvZmZzZXQgKi8KLSAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgKz0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDIwMDUtMDMtMjQ6IEJ1Z0ZpeCBmb3IgYXVkaW8tdmlkZW8gc3luY2hybzoKLSAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgKiBJdCBsZWFkcyB0byBhbiBhdWRpYmxlIGRlc3luY2hybyB3aGVuIHRoZXJlIGFyZSBhIGxvdCBvZiBjbGlwcyBhc3NlbWJsZWQuCi0gICAgICAgICogVGhpcyBidWcgZml4IGFsbG93cyB0byByZXN5bmNoIHRoZSBhdWRpbyB0cmFjayB3aGVuIHRoZSBkZWx0YSBpcyBoaWdoZXIKLSAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgKiBXZSBTdGVwIG9uZSBBVSBpbiB0aGUgc2Vjb25kIGNsaXAgYW5kIHdlIGNoYW5nZSB0aGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5LiAqLwotICAgICAgICBpZiggKCBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzEtPmlWb2Zmc2V0ICpwQy0+cEMxLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC09IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IHN0YXJ0aW5nIHN0YXRlIGZvciB0aGlzIGNsaXAgcHJvY2Vzc2luZyAqLwotICAgIGlmKCBNNFNZU19rTVAzID09IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluIHRoZSBNUDMgY2FzZSB3ZSB1c2UgYSBzcGVjaWFsIGF1ZGlvIHN0YXRlICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBzdGFydCB3aXRoIHRoZSB2aWRlbyBwcm9jZXNzaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotCi0gICAgICAgIGlmKCBwQy0+VnN0YXRlICE9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIG5vdCBhIHRyYW5zaXRpb24gdGhlbiByZXNldCBwcmV2aW91cyB2aWRlbyBzdGF0ZSAqLwotICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBUaGUgZmxhZ3MgYXJlIHNldCB0byBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGNsaXAgKi8KLSAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCB2aWRlbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAbm90ZSAgICBJZiB0aGVyZSBpcyBhdWRpbyBvbiB0aGUgY3VycmVudCBjbGlwLCBwcm9jZXNzIGl0LCBlbHNlIHN3aXRjaCB0byB0aGUgbmV4dCBjbGlwCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCwgbm93IHdlIGRvIHRoZSBhdWRpbyAqLwotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0FVRElPOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcChwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgYXVkaW8gdHJhY2sgaXMgcmVhY2hlZAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW86IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTdGFydCB3aXRoIHRoZSB2aWRlbyAqLwotICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpCi0gKiBAYnJpZWYgICAgT3BlbiBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7IC8qKjwgc2hvcnRjdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogXCIlc1wiIiwKLSAgICAgICAgKE00T1NBX0NoYXIgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoaENsaXAsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIGlmKCAqaENsaXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgqaENsaXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgc2hvcnRjdXQgKi8KLSAgICBwQ2xpcCA9ICpoQ2xpcDsKLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICAgICAgcENsaXAtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgICAgIHBDbGlwLT5pRW5kVGltZSA9IHBDbGlwU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXAsIHBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfRkFMU0UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLSAgICAgICAgKmhDbGlwID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMgPSAmcENsaXAtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQ2xpcC0+dWlTaWxlbmNlUGNtU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlUGNtU2l6ZTsKLSAgICBwQ2xpcC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwLT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQ2xpcC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgcENsaXAtPnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLQotICAgIHBDbGlwLT5pQXVkaW9GcmFtZUN0cyA9IC1wQ2xpcC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAvKiBSZXNldCB0aW1lICovCi0KLSAgICAvKioKLSAgICAqIElmIHRoZSBhdWRpbyB0cmFjayBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgYXVkaW8gZm9ybWF0LAotICAgICogd2UgcmVtb3ZlIGl0LiBTbyBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHNpbGVuY2UgKi8KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2socENsaXApOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWN0dWFsIGJlZ2luIGN1dCAqLwotICAgIGlmKCAwID09IHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDbGlwLT5pVm9mZnNldCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQWN0dWFsVmlkZW9CZWdpbkN1dCA9IDA7Ci0gICAgICAgIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgdGhlIHZpZGVvIHRvIHRoZSB0YXJnZXQgYmVnaW4gY3V0IHRvIGdldCB0aGUgYWN0dWFsIGJlZ2luIGN1dCB2YWx1ZSAqLwotICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICBpQ3RzID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDbGlwLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwLT5wVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogbV9wRmN0SnVtcChWKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVXBkYXRlIGNsaXAgb2Zmc2V0IHdpdGggdGhlIHZpZGVvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gLXBDbGlwLT5pQWN0dWFsVmlkZW9CZWdpbkN1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgdGhlIGF1ZGlvIHRvIHRoZSB2aWRlbyBhY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa01QMyAhPSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICAgICAgICAgIGlDdHMgPSAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dAotICAgICAgICAgICAgICAgICAgICAqIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDbGlwLCAmaUN0cyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KEEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gLWlDdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBGb3IgdGhlIE1QMywgdGhlIGp1bXAgaXMgbm90IGRvbmUgYmVjYXVzZSBvZiB0aGUgVkJSLAotICAgICAgICAgICAgICAgICAgaXQgY291bGQgYmUgbm90IGVub3VnaCBhY2N1cmF0ZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rVmlkZW9Vbmtub3duICE9IHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGlmICgocENsaXBTZXR0aW5ncy0+RmlsZVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkpIHsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFJlYWQgdGhlIGZpcnN0IFZpZGVvIEFVIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgcENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJnBDbGlwLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIChhbHJlYWR5ISkgcmVhY2ggdGhlIGVuZCBvZiB0aGUgY2xpcCwgd2UgZmlsdGVyIHRoZSBlcnJvci4KLSAgICAgICAgICAgICAgICAqIEl0IHdpbGwgYmUgY29ycmVjdGx5IG1hbmFnZWQgYXQgdGhlIGZpcnN0IHN0ZXAuICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcCi0gICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoICA9IHBDbGlwUHJvcGVydGllcy0+dWlTdGlsbFBpY1dpZHRoOwotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0ID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljSGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8qIHN0YXRlIGNoZWNrIG5vdCB0byBhbGxvY2F0ZSBidWZmZXIgZHVyaW5nIHNhdmUgc3RhcnQgKi8KLQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFZpZGVvIHJlc2l6ZSBtYW5hZ2VtZW50ICAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGlucHV0IGNsaXAgaXMgYSByb3RhdGUgdmlkZW8gb3IgdGhlIG91dHB1dCByZXNvbHV0aW9uIGlzIGRpZmZlcmVudAotICAgICAgICAqIGZyb20gdGhlIGlucHV0IHJlc29sdXRpb24sIHRoZW4gdGhlIHZpZGVvIGZyYW1lIG5lZWRzIHRvIGJlIHJvdGF0ZWQKLSAgICAgICAgKiBvciByZXNpemVkLCBmb3JjZSB0byByZXNpemUgbW9kZSAqLwotICAgICAgICBpZiAoKChNNE9TQV9VSW50MzIpcEMtPmV3Yy51aVZpZGVvV2lkdGggIT0KLSAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgIT0KLSAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT52aWRlb1JvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0KLSAgICAgICAgICAgIGlmIChwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSB2aWRlbyBwbGFuZSB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgIHJlY2VpdmUgdGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlIHJlc2l6aW5nICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgWSBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoICA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgVSBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoICA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgViBwbGFuZSAqLwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIHZpZGVvIGlzIGN1cnJlbnRseSBpbiByZWFkaW5nIG1vZGUgKi8KLSAgICAgICAgcENsaXAtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICB9Ci0KLSAgICBpZiggKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICAmJiAoTTRWSURFT0VESVRJTkdfa01QMyAhPSBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgZmlyc3QgQXVkaW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXApOwotCi0gICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGF1ZGlvIGlzIGN1cnJlbnRseSBpbiByZWFkaW5nIG1vZGUgKi8KLSAgICAgICAgcENsaXAtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRBdmVyYWdlVmlkZW9CaXRyYXRlKCkKLSAqIEBicmllZiAgICBBdmVyYWdlIGJpdHJhdGUgb2YgdGhlIG91dHB1dCBmaWxlLCBjb21wdXRlZCBmcm9tIGlucHV0IGJpdHJhdGVzLAotICogICAgICAgICAgZHVyYXRpb25zLCB0cmFuc2l0aW9ucyBhbmQgY3V0cy4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ1NfMCwgKnBDU18xLCAqcENTXzI7Ci0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFQwLCAqcFQyOwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9VSW50MzIgdDBfZHVyYXRpb24sIHQyX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0MF9iaXRyYXRlLCB0Ml9iaXRyYXRlOwotICAgIE00T1NBX1VJbnQzMiBjMV9kdXJhdGlvbjsKLQotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9kdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxfYml0c3VtOwotCi0gICAgdG90YWxfZHVyYXRpb24gPSAwOwotICAgIHRvdGFsX2JpdHN1bSA9IDA7Ci0KLSAgICAvKiBMb29wIG9uIHRoZSBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBwQ1NfMSA9ICZwQy0+cENsaXBMaXN0W2ldOwotCi0gICAgICAgIHQwX2R1cmF0aW9uID0gMDsKLSAgICAgICAgdDBfYml0cmF0ZSA9IHBDU18xLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgdDJfZHVyYXRpb24gPSAwOwotICAgICAgICB0Ml9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qIFRyYW5zaXRpb24gd2l0aCB0aGUgcHJldmlvdXMgY2xpcCAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ1NfMCA9ICZwQy0+cENsaXBMaXN0W2kgLSAxXTsKLSAgICAgICAgICAgIHBUMCA9ICZwQy0+cFRyYW5zaXRpb25MaXN0W2kgLSAxXTsKLQotICAgICAgICAgICAgaWYoIHBUMC0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICE9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0MF9kdXJhdGlvbiA9IHBUMC0+dWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICBpZiggcENTXzAtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID4gdDBfYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0MF9iaXRyYXRlID0gcENTXzAtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRyYW5zaXRpb24gd2l0aCB0aGUgbmV4dCBjbGlwICovCi0gICAgICAgIGlmKCBpIDwgcEMtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ1NfMiA9ICZwQy0+cENsaXBMaXN0W2kgKyAxXTsKLSAgICAgICAgICAgIHBUMiA9ICZwQy0+cFRyYW5zaXRpb25MaXN0W2ldOwotCi0gICAgICAgICAgICBpZiggcFQyLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQyX2R1cmF0aW9uID0gcFQyLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMi0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0Ml9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMi0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgZm9yIGN1dCB0aW1lcyAqLwotICAgICAgICBpZiggcENTXzEtPnVpRW5kQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gPSBwQ1NfMS0+dWlFbmRDdXRUaW1lOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlCZWdpbkN1dFRpbWUgPiAwICkKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uIC09IHBDU18xLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICBjMV9kdXJhdGlvbiAtPSB0MF9kdXJhdGlvbiArIHQyX2R1cmF0aW9uOwotCi0gICAgICAgIC8qIENvbXB1dGUgYml0c3VtIGFuZCBkdXJhdGlvbiAqLwotICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBjMV9kdXJhdGlvbiArIHQwX2R1cmF0aW9uIC8gMiArIHQyX2R1cmF0aW9uIC8gMjsKLQotICAgICAgICB0b3RhbF9iaXRzdW0gKz0KLSAgICAgICAgICAgIGMxX2R1cmF0aW9uICogKHBDU18xLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSAvIDEwMDApCi0gICAgICAgICAgICArICh0MF9iaXRyYXRlIC8gMTAwMCkgKiB0MF9kdXJhdGlvbiAvIDIKLSAgICAgICAgICAgICsgKHQyX2JpdHJhdGUgLyAxMDAwKSAqIHQyX2R1cmF0aW9uIC8gMjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLnVpVmlkZW9CaXRyYXRlID0gKCB0b3RhbF9iaXRzdW0gLyB0b3RhbF9kdXJhdGlvbikgKiAxMDAwOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0QXVkaW8uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDY4ODNkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXRBdWRpby5jCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBlZGl0IEFQSSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLSNkZWZpbmUgUFdSX0ZYUF9GUkFDVF9NQVggICAgICAgICAgICAoMzI3NjgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwMW9yQ2xpcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfSW50MTYgKnBQQ01kYXRhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBqdW1waW5nIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcC4KLSAqIEBub3RlICAgIE9uIG9uZSBzdGVwLCB0aGUganVtcCBvZiBzZXZlcmFsIEFVIGlzIGRvbmUKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcCA9IHBDLT5wQzE7IC8qKjwgc2hvcnRjdXQgKi8KLSAgICBNNE9TQV9JbnQzMiBKdW1wQ3RzOwotCi0gICAgSnVtcEN0cyA9IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dDsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZKdW1wQ3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBKdW1wQ3RzID49IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9NUDM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIGNsaXAgb2Zmc2V0IHdpdGggdGhlIGF1ZGlvIGJlZ2luIGN1dCAqLwotICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtSnVtcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcCA9IHBDLT5wQzE7IC8qKjwgc2hvcnRjdXQgKi8KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPndyaXRlRGF0YShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwQ2xpcC0+cEF1ZGlvRnJhbWVQdHIsIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXApOwotCi0gICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvID0KLSAgICAgICAgICAgICggcENsaXAtPmlBdWRpb0ZyYW1lQ3RzICsgcENsaXAtPmlBb2Zmc2V0KSAvIHBDbGlwLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICBpZiggKE00T1NBX0ludDMyKShwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgLyBwQ2xpcC0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgICAgICA+PSBwQ2xpcC0+aUVuZFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNFJFQURFUl9CdWZmZXIgbXAzdGFnQnVmZmVyOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlIGR1cmF0aW9uIGlzIGJldHRlciByZXNwZWN0ZWQgaWYgdGhlIGZpcnN0IEFVIGFuZCBsYXN0IEFVIGFyZSBib3RoIGFib3ZlCi0gICAgICAgICAgICB0aGUgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5wT3NhRmlsZVdyaXRQdHItPndyaXRlRGF0YShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgLyogVGhlIElEM3YxIHRhZyBpcyBhbHdheXMgYXQgdGhlIGVuZCBvZiB0aGUgbXAzIGZpbGUgc28gdGhlIGVuZCBvZiB0aGUgY3V0dGluZwotICAgICAgICAgICAgcHJvY2VzcyBpcyB3YWl0ZWQgKi8KLSAgICAgICAgICAgIC8qIGJlZm9yZSB3cml0aW5nIHRoZSBtZXRhZGF0YSBpbiB0aGUgb3V0cHV0IGZpbGUqLwotCi0gICAgICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXAtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjFUYWcsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZtcDN0YWdCdWZmZXIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogV3JpdGUgdGhlIGRhdGEgb2YgdGhlIElEM3YxIFRhZyBpbiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgICAgIGlmKCAwICE9IG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCltcDN0YWdCdWZmZXIubV9wRGF0YSwgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZyZWUgYmVmb3JlIHRoZSBlcnJvciBjaGVja2luZyBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRXJyb3IgY2hlY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKElEM3YxVGFnKSByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBUaGUgRW5kIEN1dCBoYXMgYmVlbiByZWFjaGVkICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzIDogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRPU0FfRkFMU0UKLSAgICAgICAgICAgID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkgLyoqPCBSZWFjaGVkIGVuZCBvZiBjbGlwICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbygKLSAgICAgICAgICAgICAgICBwQyk7IC8qKjwgQ2xpcCBkb25lLCBkbyB0aGUgbmV4dCBvbmUgKi8KLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcE1QMzogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgaW50MzJfdCBhdVRpbWVTdGFtcCA9IC0xOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfQm9vbCBiU3RvcEF1ZGlvOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQgKi8KLSAgICBpZiggKCBwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KQotICAgICAgICA+PSBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBpcyBkb25lIGZvciB0aGlzIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKHBDKTsKLQotICAgICAgICAvKiBSQzogdG8ga25vdyB3aGVuIGEgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICYmIGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEF1ZGlvIE1vZGUsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBvdXRwdXQgQ1RTICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKAotICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Bc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgQVVESU8gc3RlcCA6IGRBVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kQVRvLCBwQy0+QXN0YXRlLCBwQy0+cEMxLT5pQW9mZnNldCk7Ci0KLSAgICBiU3RvcEF1ZGlvID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBzd2l0Y2goIHBDLT5Bc3RhdGUgKQotICAgIHsKLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IFJFQURfV1JJVEUgTU9ERSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQlpaWiBidWcgZml4IChyZWFkLXdyaXRlIGNhc2UpOgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgZmlyc3QgQU1SIEFVIG9mIHRoZSBzdHJlYW0gd2l0aCBhIHNpbGVuY2UgQVUuCi0gICAgICAgICAgICAgICAgKiBJdCByZW1vdmVzIGFubm95aW5nICJCWlpaIiBhdWRpbyBnbGl0Y2guCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGlmIHRoZXJlIGlzIGEgYmVnaW4gY3V0LgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBmb3IgdGhlIGZpcnN0IGNsaXAuCi0gICAgICAgICAgICAgICAgKiBCZWNhdXNlIG9mIGFub3RoZXIgYnVnZml4ICgyMDA1LTAzLTI0KSwgdGhlIGZpcnN0IEFVIHdyaXR0ZW4gbWF5IGJlCi0gICAgICAgICAgICAgICAgKiB0aGUgc2Vjb25kIG9uZSB3aGljaCBDVFMgaXMgMjAuIEhlbmNlIHRoZSBjdHM8MjEgdGVzdC4KLSAgICAgICAgICAgICAgICAqICh0aGUgQlpaWiBlZmZlY3Qgb2NjdXJzIGV2ZW4gd2l0aCB0aGUgc2Vjb25kIEFVISkgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBNNE9TQV9GQUxTRSA9PSBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4pCi0gICAgICAgICAgICAgICAgICAgICYmICgwICE9IHBDLT51aUN1cnJlbnRDbGlwKSAmJiAocEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgPCAocEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKyAxKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSBhIHNpbGVuY2UgQVUgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkEgIyMjIyBzaWxlbmNlIEFVIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIChNNE9TQV9VSW50MzIpcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZQotICAgICAgICAgICAgICAgICAgICA8IHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZD4lZCkhIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplLCBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGlzIGJvb2xlYW4gaXMgb25seSB1c2VkIHRvIGZpeCB0aGUgQlpaIGJ1Zy4uLiAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbiA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigiQiAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKjExLzEyLzIwMDggQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0Ci0gICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZQotICAgICAgICAgICAgICAgICAgICBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEF1ZGlvIGlzIG5vdyBpbiByZWFkIG1vZGUgKHRoZXJlIG1heSBiZSBhICJpZihzdGF0dXMhPVJFQUQpIiBoZXJlLAotICAgICAgICAgICAgICAgIGJ1dCBpdCBpcyByZW1vdmVkIGZvciBvcHRpbWl6YXRpb24pICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyB3ZSBzaW1wbHkgZW5kIGhlcmUuKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IERFQ09ERV9FTkNPREUgTU9ERSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX0RFQ09ERV9FTkNPREU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvIERFQ09ERV9FTkNPREUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCBhIGZldyBBVSBiYWNrd2FyZCB0byBkZWNvZGUvZW5jb2RlCi0gICAgICAgICAgICAgICAgKHdpdGhvdXQgd3JpdGluZyByZXN1bHQpIGZyb20gdGhhdCBwb2ludC4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgPT0gcEMtPnBDMS0+QXN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpVGFyZ2V0Q3RzLCBpQ3VycmVudEN0czsKLQotICAgICAgICAgICAgICAgICAgICBpZiggMAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gcEMtPnBDMS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQXVkaW9GcmFtZUN0cyApIC8qKjxkb24ndCB0cnkgdG8gcHJlLWRlY29kZSBpZiBjbGlwIGlzIGF0IGl0cyBiZWdpbm5pbmcuICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJEIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSAqKioqIHByZS1lbmNvZGUiKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy9pZigwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdKQotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgYXVkaW8gdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IE9LIGZvciBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRpbWVzdGFtcCBvZiBsYXN0IHJlYWQgQVUKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdUNUUywKLSAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZhdVRpbWVTdGFtcCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXVUaW1lU3RhbXAgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBpbnZhbGlkIGF1ZGlvIFwKLSAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCByZXR1cm5lZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzID0gYXVUaW1lU3RhbXA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KHBDLCAxLCAoTTRPU0FfSW50MTYKLSAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RW5kQXVkaW9FZmZlY3QgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSBvdXRwdXQgYXVkaW8gQ1RTICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBNYXkgaGFwcGVuIHdpdGggY29ycnVwdGVkIGlucHV0IGZpbGVzICh3aGljaCBoYXZlIHN0dHMgZW50cmllcyBub3QKLSAgICAgICAgICAgICAgICBtdWx0aXBsZSBvZiBTaWxlbmNlRnJhbWVEdXJhdGlvbikgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA8IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKGRlY29kZS1lbmNvZGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiAoWWVzLCB0aGUgQnp6IGJ1ZyBtYXkgYWxzbyBvY2N1ciB3aGVuIHdlIHJlLWVuY29kZS4gSXQgZG9lc24ndAotICAgICAgICAgICAgICAgICogIG9jY3VyIGF0IHRoZSBkZWNvZGUgYmVmb3JlIHRoZSBlbmNvZGUsIGJ1dCBhdCB0aGUgcGxheWJhY2shKQotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgZmlyc3QgQU1SIEFVIG9mIHRoZSBlbmNvZGVkIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBTVIgQVUgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkcgIyMjIyBzaWxlbmNlIEFVIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgZmlsdGVyZWQgUENNIGF1ZGlvIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkggKysrKyBlbmNvZGUgQVUiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggMCAhPSBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSApCi0gICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogU2V0IEFVIHNpemUgKi8KLQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAgICAgICAgIDBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJJIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJKIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgVFJBTlNJVElPTiBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gVFJBTlNJVElPTiIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhIGZldyBBVXMgYmFja3dhcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlDdXJyZW50Q3RzID0gcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wQzEsICZpVGFyZ2V0Q3RzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxKTsgLyoqPCByZWFkIEFVIHdoZXJlIHdlIGp1bXBlZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiSyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTi1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGEpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUvZW5jb2RlIHVwIHRvIHRoZSB3YW50ZWQgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA8IGlDdXJyZW50Q3RzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAvIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTCAqKioqIHByZS1lbmNvZGUiKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTi1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IE9LIGZvciBkZWNvZGluZyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgZmlyc3QgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoQzEpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBzZWNvbmQgaW5wdXQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAgICAgIT0gcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIkVSUiA6IEF1ZGlvVHJhbnNpdGlvbjogYm90aCBjbGlwcyBBVSBtdXN0IGhhdmUgdGhlIHNhbWUgZGVjb2RlZFwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBDTSBzaXplISBwYzEgc2l6ZT0weCV4LCBwQzIgc2l6ZSA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAgICAgLypPTVggQXVkaW8gZGVjb2RlciB1c2VkLgotICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgICAgICogU28gUENNIGJ1ZmZlciBzaXplcyBtaWdodCBiZSAwIG9yIGRpZmZlcmVudCBmb3IgY2xpcDEgYW5kIGNsaXAyLgotICAgICAgICAgICAgICAgICAgICAqIFNvIG5vIG5lZWQgdG8gcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiAsIHBjMSBBdWRCdWZmIHNpemU9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMyIEF1ZEJ1ZmYgc2l6ZSA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotCi0jZW5kaWYgLy8gTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBhdWRpbyBlZmZlY3Qgb24gY2xpcDEgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KHBDLCAxLCAoTTRPU0FfSW50MTYKLSAgICAgICAgICAgICAgICAgICAgICAgICopcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMiAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDIsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgdHJhbnNpdGlvbiBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uKHBDLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJOICoqKiogYmxlbmQgQVVzIik7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICBhIFBDTSBidWZmZXIgZm9yIGV2ZXJ5IGRlY29kZVN0ZXAgY2FsbC4qCi0gICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAuIEluIHRoaXMgY2FzZSBkb25vdCBjYWxsIGVuY29kZSBTdGVwKi8KLQotICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTICs9IGZyYW1lVGltZURlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJPIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKjExLzEyLzIwMDggQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZpZGVvQXJ0aXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgc2Vjb25kYXJ5RXJyb3I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lIGluIHRoZSBzZWNvbmQgY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RXJyb3IgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIlEgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKHNlY29uZGFyeUVycm9yKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMyKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00V0FSX05PX01PUkVfQVUgPT0gc2Vjb25kYXJ5RXJyb3IpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBpbnZhbGlkIGludGVybmFsIHN0YXRlICgweCV4KSwgXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+QXN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGZvcmNlZCB0byBzdG9wIGF1ZGlvICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gYlN0b3BBdWRpbyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBpcyBkb25lIGZvciB0aGlzIGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBwcm9jZXNzIG1vZGUgd2UgbXVzdCB1c2UsIGRlcGVuZGluZyBvbiB0aGUgb3V0cHV0IENUUy4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBjb25zdCBNNE9TQV9JbnQzMiBURCA9IHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGUgcHJldmlvdXNBc3RhdGUgPSBwQy0+QXN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBpdHMgYmVnaW4gZWZmZWN0IG9yIGVuZCBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcEMtPnBDMS0+aUFvZmZzZXQKLSAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbyArIDAuNSkgPj0gKHBDLT5wQzEtPmlFbmRUaW1lIC0gVEQpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBhcmUgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT047Ci0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRG8gd2UgZW50ZXIgdGhlIHRyYW5zaXRpb24gc2VjdGlvbiA/ICovCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gIT0gcHJldmlvdXNBc3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3BlbiBzZWNvbmQgY2xpcCBmb3IgdHJhbnNpdGlvbiwgaWYgbm90IHlldCBvcGVuZWQgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQzIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BDLT51aUN1cnJlbnRDbGlwICsgMV0pOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBzaG9ydCB0cmFuc2l0aW9uIGFuZCBiYWQgbHVjayAoLi4uKSwgdGhlcmUgbWF5IGJlIG5vIHZpZGVvIEFVCi0gICAgICAgICAgICAgICAgKiBpbiB0aGUgdHJhbnNpdGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZC4KLSAgICAgICAgICAgICAgICAqIFNvIHdlIG11c3QgdXBkYXRlIHRoZSB2aWRlbyBvZmZzZXQgaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIC8qKjwgQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQWRkIGN1cnJlbnQgYXVkaW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCBvZmZzZXQKLSAgICAgICAgICAgICogKHZpZGVvIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aGVuIGRvaW5nIHRoZSB2aWRlbyB0cmFuc2l0aW9uKSAqLwotICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgKz0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIDIwMDUtMDMtMjQ6IEJ1Z0ZpeCBmb3IgYXVkaW8tdmlkZW8gc3luY2hybzoKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIGEgcG9ydGlvbiBvZiB0aGUgZHVyYXRpb24gb2YgYW4gYXVkaW8gQVUgb2YgZGVzeW5jaHJvIGF0IGVhY2ggYXNzZW1ibHkuCi0gICAgICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgICAgICogVGhpcyBidWcgZml4IGFsbG93cyB0byByZXN5bmNoIHRoZSBhdWRpbyB0cmFjayB3aGVuIHRoZSBkZWx0YSBpcyBoaWdoZXIKLSAgICAgICAgICAgICogdGhhbiBvbmUgYXVkaW8gQVUgZHVyYXRpb24uCi0gICAgICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgICAgICBpZiggKCBwQy0+cEMyLT5pQW9mZnNldAotICAgICAgICAgICAgICAgIC0gKE00T1NBX0ludDMyKShwQy0+cEMyLT5pVm9mZnNldCAqcEMtPnBDMi0+c2NhbGVfYXVkaW8gKyAwLjUpKQotICAgICAgICAgICAgICAgICAgICA+IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFkdmFuY2Ugb25lIEFNUiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIlogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXBkYXRlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseSovCi0gICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBiZWdpbiBhbmQgZW5kIGVmZmVjdHMgZm9yIGNsaXAyICovCi0gICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQywgMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBub3QgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIGN1cnJlbnQgbW9kZSBpcyBSZWFkL1dyaXRlIG9yIERlY29kZS9FbmNvZGUgKi8KLSAgICAgICAgaWYoIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+QXN0YXRlID0gTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBjcmVhdGUvZGVzdHJveSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFID09IHByZXZpb3VzQXN0YXRlKQotICAgICAgICAmJiAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAoTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFICE9IHBDLT5Bc3RhdGUpICkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpQXVkaW9CaXRyYXRlOwotCi0gICAgICAgIC8qIENvbXB1dGUgbWF4IGJpdHJhdGUgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGVzIGJpdHJhdGVzIGFuZCB0cmFuc2l0aW9ucyAqLwotICAgICAgICBpZiggcEMtPkFzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBNYXggb2YgdGhlIHR3byBibGVuZGVkIGZpbGVzICovCi0gICAgICAgICAgICBpZiggcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID4gcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQzItPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTYW1lIGFzIGlucHV0IGZpbGUgKi8KLSAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlID0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGU6IE00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggYXVkaW8gZWZmZWN0IG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudCB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4OwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgQkMsIEVDOwotICAgIE00T1NBX0ludDggKnBpQ2xpcEFjdGl2ZUVmZmVjdDsKLSAgICBNNE9TQV9JbnQzMiB0OwotCi0gICAgaWYoIDEgPT0gdWlDbGlwTnVtYmVyICkKLSAgICB7Ci0gICAgICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXA7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAxQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0gICAgZWxzZSAvKio8ICgyID09IHVpQ2xpcE51bWJlcikgKi8KLSAgICB7Ci0gICAgICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXAgKyAxOwotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBpQ2xpcEFjdGl2ZUVmZmVjdCA9ICYocEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBCQyA9IHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dDsKLSAgICBFQyA9IHBDbGlwLT5pRW5kVGltZTsKLQotICAgIC8qKgotICAgIENoYW5nZSB0aGUgYWJzb2x1dCB0aW1lIHRvIGNsaXAgcmVsYXRlZCB0aW1lCi0gICAgIFJDIHQgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAtIHBDbGlwLT5pQW9mZnNldC9wQ2xpcC0+c2NhbGVfYXVkaW8gKyAwLjUpOwotICAgIDwgcm91bmRpbmcgKi87Ci0gICAgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvLyotIHBDbGlwLT5pQW9mZnNldC9wQ2xpcC0+c2NhbGVfYXVkaW8qLwotICAgICAgICArIDAuNSk7IC8qKjwgcm91bmRpbmcgKi8KLSAgICA7Ci0KLSAgICAvKioKLSAgICAqIERlZmF1bHQ6IG5vIGVmZmVjdCBhY3RpdmUgKi8KLSAgICAqcGlDbGlwQWN0aXZlRWZmZWN0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZSB0aHJlZSBlZmZlY3RzICovCi0gICAgLy8gUkMgICAgZm9yICh1aUZ4SW5kZXg9MDsgdWlGeEluZGV4PHBDLT5wQ2xpcExpc3RbdWlDbGlwSW5kZXhdLm5iRWZmZWN0czsgdWlGeEluZGV4KyspCi0gICAgZm9yICggdWlGeEluZGV4ID0gMDsgdWlGeEluZGV4IDwgcEMtPm5iRWZmZWN0czsgdWlGeEluZGV4KysgKQotICAgIHsKLSAgICAgICAgLyoqIFNob3J0Y3V0LCByZXZlcnNlIG9yZGVyIGJlY2F1c2Ugb2YgcHJpb3JpdHkgYmV0d2VlbiBlZmZlY3RzCi0gICAgICAgICggRW5kRWZmZWN0IGFsd2F5cyBjbGVhbiApICovCi0gICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+bmJFZmZlY3RzIC0gMSAtIHVpRnhJbmRleF0pOwotCi0gICAgICAgIGlmKCBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICE9IHBGeC0+QXVkaW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGlmIHRoZXJlIGlzIGFjdHVhbGx5IGEgdmlkZW8gZWZmZWN0ICovCi0gICAgICAgICAgICBpZiggKCB0ID49IChNNE9TQV9JbnQzMikoLypCQyArKi9wRngtPnVpU3RhcnRUaW1lKSkKLSAgICAgICAgICAgICAgICAmJiAvKio8IEFyZSB3ZSBhZnRlciB0aGUgc3RhcnQgdGltZSBvZiB0aGUgZWZmZWN0PyAqLwotICAgICAgICAgICAgICAgICh0IDwgKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUgKyBwRngtPgotICAgICAgICAgICAgICAgIHVpRHVyYXRpb24pKSApIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSBwQy0+bmJFZmZlY3RzIC0gMSAtIHVpRnhJbmRleDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhlIGZpcnN0IGVmZmVjdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gdGhlIHNlY29uZCBvbmUsCi0gICAgICAgICAgICAgICAgICB0aGVuIHRoZSB0aGlycyBvbmUuCi0gICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB1aUZ4SW5kZXggPSBwQy0+bmJFZmZlY3RzOyAvKiogZ2V0IG91dCBvZiB0aGUgZm9yIGxvb3AgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBCdWdmaXg6IFRoZSBkdXJhdGlvbiBvZiB0aGUgZW5kIGVmZmVjdCBoYXMgYmVlbiBzZXQgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgIGFubm91bmNlZCBjbGlwIGR1cmF0aW9uLgotICAgICAgICAgICAgKiBJZiB0aGUgYW5ub3VuY2VkIGR1cmF0aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVhbCBvbmUsIHRoZSBlbmQgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgYXBwbGllZCBhdAotICAgICAgICAgICAgKiB0aGUgdmVyeSBlbmQgb2YgdGhlIGNsaXAuIFRvIHNvbHZlIHRoaXMgaXNzdWUgd2UgZm9yY2UgdGhlIGVuZCBlZmZlY3QuICovCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCB0byBwUENNZGF0YQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHVpQ2xpcDFvckNsaXAyICAgIChJTi9PVVQpIDEgZm9yIGZpcnN0IGNsaXAsIDIgZm9yIHNlY29uZCBjbGlwCi0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3M7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIKLSAgICAgICAgaTMyc2FtcGxlOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zOwotICAgIE00T1NBX0ludDMyIGlEdXI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKCAxICE9IHVpQ2xpcDFvckNsaXAyKSAmJiAoMiAhPSB1aUNsaXAxb3JDbGlwMiksCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRCZWdpbkF1ZGlvRWZmZWN0OiB1aUNsaXAxb3JDbGlwMiBpbnZhbGlkIik7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXAxb3JDbGlwMiApCi0gICAgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MgPSAmKHBDLT5wQ2xpcExpc3RbcEMtPgotICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0pOyAvKio8IEdldCBhIHNob3J0Y3V0IHRvIHRoZSBjbGlwIHNldHRpbmdzICovCi0gICAgICAgIC8vIFJDICAgICAgICBwRnggPSAmKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdF0pOy8qKjwgR2V0IGEgc2hvcnRjdXQKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+Ci0gICAgICAgICAgICBwRWZmZWN0c0xpc3RbcEMtPgotICAgICAgICAgICAgaUNsaXAxQWN0aXZlRWZmZWN0XSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYyKCggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA8IDApCi0gICAgICAgICAgICB8fCAocEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+IDIpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IGlDbGlwMUFjdGl2ZUVmZmVjdCBpbnZhbGlkIik7Ci0gICAgfQotICAgIGVsc2UgLyoqPCBpZiAoMj09dWlDbGlwMW9yQ2xpcDIpICovCi0gICAgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MgPSAmKHBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICsgMV0pOyAvKio8IEdldCBhIHNob3J0Y3V0IHRvIHRoZSBjbGlwIHNldHRpbmdzICovCi0gICAgICAgIC8vIFJDICAgICAgICBwRnggPSAmKHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbcEMtPmlDbGlwMkFjdGl2ZUVmZmVjdF0pOy8qKjwgR2V0IGEgc2hvcnRjdXQKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+Ci0gICAgICAgICAgICBwRWZmZWN0c0xpc3RbcEMtPgotICAgICAgICAgICAgaUNsaXAyQWN0aXZlRWZmZWN0XSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGFjdGl2ZSBlZmZlY3QgKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYyKCggcEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCA8IDApCi0gICAgICAgICAgICB8fCAocEMtPmlDbGlwMkFjdGl2ZUVmZmVjdCA+IDIpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IGlDbGlwMkFjdGl2ZUVmZmVjdCBpbnZhbGlkIik7Ci0gICAgfQotCi0gICAgaUR1ciA9IChNNE9TQV9JbnQzMilwRngtPnVpRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgaVBvcyA9Ci0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICsgMC41IC0gcENsaXAtPmlBb2Zmc2V0IC8gcENsaXAtPnNjYWxlX2F1ZGlvKQotICAgICAgICAtIHBDbGlwLT5pQWN0dWFsQXVkaW9CZWdpbkN1dCAtIHBGeC0+dWlTdGFydFRpbWU7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCBpUG9zID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zID0gaUR1cjsKLSAgICB9Ci0gICAgZWxzZSBpZiggaVBvcyA8IDAgKQotICAgIHsKLSAgICAgICAgaVBvcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zIGlzIHRoZSBlZmZlY3QgcHJvZ3Jlc3MsIGluIGEgMCB0byBpRHVyIGJhc2UgKi8KLSAgICBzd2l0Y2goIHBGeC0+QXVkaW9FZmZlY3RUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzICovCi0gICAgICAgICAgICB3aGlsZSggdWlQQ01zaXplLS0gPiAwICkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBzd2l0Y2ggZnJvbSAwLT5EdXIgdG8gRHVyLT4wIGluIG9yZGVyIHRvIGRvIGZhZGVPVVQgaW5zdGVhZCBvZiBmYWRlSU4gKi8KLSAgICAgICAgICAgIGlQb3MgPSBpRHVyIC0gaVBvczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE9yaWdpbmFsIHNhbXBsZXMgYXJlIHNpZ25lZCAxNmJpdHMuCi0gICAgICAgICAgICAqIFdlIGNvbnZlcnQgaXQgdG8gc2lnbmVkIDMyYml0cyBhbmQgbXVsdGlwbHkgaXQgYnkgaVBvcy4KLSAgICAgICAgICAgICogU28gd2UgbXVzdCBhc3N1cmUgdGhhdCBpUG9zIGlzIG5vdCBoaWdoZXIgdGhhdCAxNmJpdHMgbWF4LgotICAgICAgICAgICAgKiBpUG9zIG1heCB2YWx1ZSBpcyBpRHVyLCBzbyB3ZSB0ZXN0IGlEdXIuICovCi0gICAgICAgICAgICB3aGlsZSggaUR1ciA+IFBXUl9GWFBfRlJBQ1RfTUFYICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpRHVyID4+PQotICAgICAgICAgICAgICAgICAgICAyOyAvKio8IGRpdmlkZSBieSAyIHdvdWxkIGJlIG1vcmUgbG9naWNhbCAoaW5zdGVhZCBvZiA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgYnV0IHdlIGhhdmUgZW5vdWdoIGR5bmFtaWMuLikgKi8KLSAgICAgICAgICAgICAgICBpUG9zID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlID0gKnBQQ01kYXRhOwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSAqPSBpUG9zOwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSAvPSBpRHVyOwotICAgICAgICAgICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogdW5rbm93biBhdWRpbyBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiLAotICAgICAgICAgICAgICAgIHBGeC0+QXVkaW9FZmZlY3RUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3Q6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oKQotICogQGJyaWVmICAgIEFwcGx5IHRyYW5zaXRpb24gZWZmZWN0IHRvIHR3byBQQ00gYnVmZmVyCi0gKiBAbm90ZSAgICBUaGUgcmVzdWx0IG9mIHRoZSB0cmFuc2l0aW9uIGlzIHB1dCBpbiB0aGUgZmlyc3QgYnVmZmVyLgotICogICAgICAgICAgSSBrbm93IGl0J3Mgbm90IGJlYXV0aWZ1bCwgYnV0IGl0IGZpdHMgbXkgY3VycmVudCBuZWVkcywgYW5kIGl0J3MgZWZmaWNpZW50IQotICogICAgICAgICAgU28gd2h5IGJvdGhlciB3aXRoIGEgdGhpcmQgb3V0cHV0IGJ1ZmZlcj8KLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGExICAgIChJTi9PVVQpIEZpcnN0IGlucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICBwUENNZGF0YTIgICAgKElOKSBTZWNvbmQgaW5wdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSBTaXplIG9mIGJvdGggUENNIGJ1ZmZlcnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApCi17Ci0gICAgTTRPU0FfSW50MzIgaTMyc2FtcGxlMSwKLSAgICAgICAgaTMyc2FtcGxlMjsgLyoqPCB3ZSB3aWxsIGNhc3QgZWFjaCBJbnQxNiBzYW1wbGUgaW50byB0aGlzIEludDMyIHZhcmlhYmxlICovCi0gICAgTTRPU0FfSW50MzIgaVBvczEsIGlQb3MyOwotICAgIE00T1NBX0ludDMyIGlEdXIgPSAoTTRPU0FfSW50MzIpcEMtPgotICAgICAgICBwVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgZW5kIGN1dCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgaVBvczEgPSBwQy0+cEMxLT5pRW5kVGltZSAtIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvCi0gICAgICAgICsgMC41IC0gcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbyk7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCBpUG9zMSA+IGlEdXIgKQotICAgIHsKLSAgICAgICAgaVBvczEgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zMSA8IDAgKQotICAgIHsKLSAgICAgICAgaVBvczEgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICogUG9zaXRpb24gb2Ygc2Vjb25kIGNsaXAgaW4gdGhlIHRyYW5zaXRpb24gKi8KLSAgICBpUG9zMiA9IGlEdXIgLSBpUG9zMTsKLQotICAgIC8qKgotICAgICogQXQgdGhpcyBwb2ludCwgaVBvczIgaXMgdGhlIHRyYW5zaXRpb24gcHJvZ3Jlc3MsIGluIGEgMCB0byBpRHVyIGJhc2UuCi0gICAgKiBpUG9zMSBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSBpRFVyIHRvIDAgYmFzZS4gKi8KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlOgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MxID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgICAgICBpUG9zMiA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMsIGFwcGx5IHRoZSBmYWRlIGZhY3RvciBvbiBlYWNoICovCi0gICAgICAgICAgICB3aGlsZSggdWlQQ01zaXplLS0gPiAwICkgLyoqPCBkZWNyZW1lbnRpbmcgY291bnRlciB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgPSAqcFBDTWRhdGExOyAvKio8IEdldCBjbGlwMSBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUxICo9IGlQb3MxOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyID0gKnBQQ01kYXRhMjsgLyoqPCBHZXQgY2xpcDIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMiAqPSBpUG9zMjsgICAgIC8qKjwgbXVsdGlwbHkgYnkgZmFkZSBudW1lcmF0b3IgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyIC89IGlEdXI7ICAgICAgLyoqPCBkaXZpZGUgYnkgZmFkZSBkZW5vbWluYXRvciAqLwotCi0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSsrID0gKE00T1NBX0ludDE2KShpMzJzYW1wbGUxCi0gICAgICAgICAgICAgICAgICAgICsgaTMyc2FtcGxlMik7IC8qKjwgbWl4IHRoZSB0d28gc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIHBQQ01kYXRhMisrOyAvKio8IGRvbid0IGZvcmdldCB0byBpbmNyZW1lbnQgdGhlIHNlY29uZCBidWZmZXIgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBQQ00gZnJhbWVzICovCi0gICAgICAgICAgICBpZiggaVBvczEgPCAoaUR1ciA+PiAxKSApIC8qKjwgc2Vjb25kIGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgUENNIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBQQ01kYXRhMiwgdWlQQ01zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiB0aGUgb3V0cHV0IG11c3QgYmUgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gICAgICAgICAgICAqIEZvciB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgbm9uLXRyYW5zaXRpb24gaXQncyBhbHJlYWR5IHRoZSBjYXNlIQotICAgICAgICAgICAgKiBTbyB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZS4uLgotICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFIiwKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5BdWRpb1RyYW5zaXRpb25UeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFJlc2V0IHRoZSBhdWRpbyBlbmNvZGVyIChDcmVhdGUgaXQgaWYgbmVlZGVkKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoIE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgKnBDX2V3YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIElmIGFuIGVuY29kZXIgYWxyZWFkeSBleGlzdCwgd2UgZGVzdHJveSBpdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGVzIGEgbmV3IGVuY29kZXIgICovCi0gICAgc3dpdGNoKCBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAgICAgLy9FVlJDCi0gICAgICAgICAgICAvLyAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rRVZSQzsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gTTRFTkNPREVSX2tNb25vOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZTUzNHUFBfRVZSQ19ERUZBVUxUX0JJVFJBVEU7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0gTTRFTkNPREVSX2tBbXJOb1NJRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcjogaW52YWxpZCBpbnB1dCBBQUMgc2FtcGxpbmcgZnJlcXVlbmN5XAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkIEh6KSwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFUl9JTklUX0ZBSUxFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gKHBDX2V3Yy0+dWlOYkNoYW5uZWxzID09IDEpCi0gICAgICAgICAgICAgICAgPyBNNEVOQ09ERVJfa01vbm8gOiBNNEVOQ09ERVJfa1N0ZXJlbzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmU7IC8vTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIKLSAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYk1TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJQTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlROUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSGlnaFNwZWVkID0KLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgLyogUXVhbnRpZnkgdmFsdWUgKGNlaWwgb25lKSAqLwotICAgICAgICAgICAgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDE2MDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAxNjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMjQwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDI0MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAzMjAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMzIwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDQ4MDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA0ODAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNjQwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDY0MDAwOwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gOTYwMDA7Ci0KLSAgICAgICAgICAgIC8qIFNwZWNpYWwgcmVxdWlyZW1lbnQgb2Ygb3VyIGVuY29kZXIgKi8KLSAgICAgICAgICAgIGlmKCAoIHBDX2V3Yy0+dWlOYkNoYW5uZWxzID09IDIpCi0gICAgICAgICAgICAgICAgJiYgKHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA8IDMyMDAwKSApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMzIwMDA7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGlzZSB0aGUgYXVkaW8gZW5jb2RlciAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgY2FsbGVkIHdpdGggdXNlcmRhdGEgMHgleCIsCi0gICAgICAgIHBDX1NoZWxsQVBJLT5wQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhKTsKLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgIHBDX1NoZWxsQVBJLT5wQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhKTsKLQotI2Vsc2UKLQotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCAvKiBubyBIVyBlbmNvZGVyICovKTsKLQotI2VuZGlmCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogT3BlbiB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4ocENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAmcENfZXdjLT5BdWRpb0VuY1BhcmFtcywgJnBDX2V3Yy0+cEF1ZGlvRW5jRFNJLAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIGdyYWJiaW5nICovKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRWaWRlby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxOWY0MTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdFZpZGVvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI3VuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMIDEKLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqIGNvbXBvbmVudCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIgLyoqPCB2aWRlbyBlZmZlY3RzICovCi0KLS8qZm9yIHRyYW5zaXRpb24gYmVoYXZpb3VyKi8KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNHhWU1NfQUJTKGEpICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfVm9pZAotTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KAotICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0KTsKLQotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICk7Ci0KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICk7Ci1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwQ3RzU2VjICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCggTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlXaWR0aCwgTTRPU0FfVUludDMyIHVpSGVpZ2h0ICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKAotICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlSW4sIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKAotICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcElucGxhbmUsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYklzQ2xpcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgdmlkZW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHMsIGlOZXh0Q3RzOwotICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtZTsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCBlbmQgY3V0LiBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nCi0gICAgICogdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICovCi0gICAgaWYgKCAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldAotICAgICAgICArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0KSA+PSBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgewotICAgICAgICAvKiBSZS1hZGp1c3QgdmlkZW8gdG8gcHJlY2lzZSBjdXQgdGltZSAqLwotICAgICAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9ICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSkKLSAgICAgICAgICAgIC0gcEMtPnBDMS0+aVZvZmZzZXQgKyBwQy0+aUluT3V0VGltZU9mZnNldCAtIHBDLT5wQzEtPmlFbmRUaW1lOwotICAgICAgICBpZiAoIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IDwgMCApIHsKLSAgICAgICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogRG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZXMgaWYgd2UgYXJlIGluIGRlY29kZVVwVG8oKSAqLwotICAgIGlmICggKE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gIT0gcEMtPnBDMS0+VnN0YXR1cykKLSAgICAgICAgJiYgKCggcEMtPnBDMiA9PSBNNE9TQV9OVUxMKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgVmlkZW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlKAotICAgICAgICAgICAgcEMpOyAvKio8IFRoaXMgZnVuY3Rpb24gY2hhbmdlIHRoZSBwQy0+VnN0YXRlIHZhcmlhYmxlISAqLwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN3aXRjaCggcEMtPlZzdGF0ZSApCi0gICAgewotICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBSRUFEX1dSSVRFIik7Ci0KLSAgICAgICAgICAgICAgICBiU2tpcEZyYW1lID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgZGVjb2RpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byBiZSBzdXJlCi0gICAgICAgICAgICAgICAgKiB0byBnZXQgdG8gdGhlIGdvb2QgcG9zaXRpb24uICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEICE9IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSnVtcCB0byB0YXJnZXQgdmlkZW8gdGltZSAodGMgPSB0by1UKSAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEMxLT5wVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IG1fcFJlYWRlci0+bV9wRmN0SnVtcChWMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cEMxLT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPnBDMS0+VmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dEF1IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkEgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgZnJhbWUgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuIGluIEJFR0lOIENVVCBzdGVwIC0+IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPT0gaUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPnBDMS0+aVZpZGVvUmVuZGVyQ3RzID49IGlDdHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFRoaXMgZnJhbWUgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuIGluIEJFR0lOIENVVCBzdGVwIC0+IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUKQotICAgICAgICAgICAgICAgICAgICAmJiAocEMtPnBDMS0+VmlkZW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICArIHBDLT5wQzEtPmlWb2Zmc2V0IDw9IHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVtZW1iZXIgdGhlIGNsaXAgcmVhZGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRDsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIC8vIFJvdW5kaW5nIGlzIHRvIGNvbXBlbnNhdGUgcmVhZGVyIGltcHJlY2lzaW9uIChtX0NUUyBpcyBhY3R1YWxseSBhbiBpbnRlZ2VyKQotICAgICAgICAgICAgICAgIGlDdHMgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0IC0gMTsKLSAgICAgICAgICAgICAgICBpTmV4dEN0cyA9IGlDdHMgKyAoKE00T1NBX0ludDMyKXBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbikgKyAxOwotICAgICAgICAgICAgICAgIC8qIEF2b2lkIHRvIHdyaXRlIGEgbGFzdCBmcmFtZSBvZiBkdXJhdGlvbiAwICovCi0gICAgICAgICAgICAgICAgaWYoIGlOZXh0Q3RzID4gcEMtPnBDMS0+aUVuZFRpbWUgKQotICAgICAgICAgICAgICAgICAgICBpTmV4dEN0cyA9IHBDLT5wQzEtPmlFbmRUaW1lOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiB0aGUgQVUgaXMgZ29vZCB0byBiZSB3cml0dGVuLCB3cml0ZSBpdCwgZWxzZSBqdXN0IHNraXAgaXQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCBNNE9TQV9GQUxTRSA9PSBiU2tpcEZyYW1lKQotICAgICAgICAgICAgICAgICAgICAmJiAoKCBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTID49IGlDdHMpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTIDwgaU5leHRDdHMpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA+IDApKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wQzEtPlZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMgPSAoTTRPU0FfVGltZSlwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaW1lKXBDLT5wQzEtPmlWb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZvciBoLjI2NCBzdHJlYW0gZG8gbm90IHJlYWQgdGhlIDFzdCA0IGJ5dGVzIGFzIHRoZXkgYXJlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9ycyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gNDsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wQzEtPlZpZGVvQVUubV9zaXplIC0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUgPiBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6IEFVIHNpemUgZ3JlYXRlciB0aGFuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhBdVNpemUgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSwgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5wQzEtPlZpZGVvQVUubV9kYXRhQWRkcmVzcyArIG9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0Ci0gICAgICAgICAgICAgICAgICAgIC1zdHJlYW0gdGltZSovCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyhwQywgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWx1IFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5DVFMsIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlYWQgbmV4dCBBVSBmb3IgbmV4dCBzdGVwICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQyAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3ZXRoZXIgdG8gcmVhZCBvciB0byBpbmNyZW1lbnQgdGltZSBpbmNyZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTID49IGlOZXh0Q3RzKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoTk9fTU9SRV9BVSBvciByZWFkZXIgaW4gYWR2YW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN3aXRjaCAoZnJvbSBBRlRFUl9DVVQpIHRvIG5vcm1hbCBtb2RlIGJlY2F1c2UgdGltZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm8gbW9yZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbiBvdGhlciBjYXNlcyAocmVhZGVyIGxhdGUpLCBqdXN0IGxldCB0aGUgcmVhZGVyIGNhdGNoIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kVlRvICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEMtPnBDMS0+VmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8ICAgQkVHSU5fQ1VUIE1PREUgICB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBERUNPREVfRU5DT0RFIC8gQkVHSU5fQ1VUIik7Ci0KLSAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCBlcnI9JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgdmlkZW8gdXAgdG8gdGhlIHRhcmdldCB0aW1lCi0gICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCApICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLCAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RGVjb2RlVmlkZW9VcFRvQ3RzIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkUgKysrKyBlbmNvZGUgQVUiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZShyZW5kZXJpbmcsZmlsdGVyaW5nIGFuZCB3cml0aW5nIHdpbGwgYmUgZG9uZQotICAgICAgICAgICAgICAgICBpbiBlbmNvZGVyIGNhbGxiYWNrcykqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUICkKLSAgICAgICAgICAgICAgICAgICAgRnJhbWVNb2RlID0gTTRFTkNPREVSX2tJRnJhbWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa05vcm1hbEZyYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPmV3Yy5wRW5jQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgRnJhbWVNb2RlKTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIGhhZCBhIFZQUCBlcnJvci4uLiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IHBDLT5ld2MuVnBwRXJyb3IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUsIHJldHVybmluZyBWcHBFcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZiAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEMtPmV3Yy5WcHBFcnJvcjsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FCi0gICAgICAgICAgICAgICAgICAgIGlzIHJldHVybmVkKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0RW5jb2RlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEluY3JlbWVudCB0aW1lIGJ5IHRoZSBlbmNvZGluZyBwZXJpb2QgKGZvciBiZWdpbiBjdXQsIGRvIG5vdCBpbmNyZW1lbnQgdG8gbm90Ci0gICAgICAgICAgICAgICAgbG9vc2UgUC1mcmFtZXMpICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgVFJBTlNJVElPTiBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8gVFJBTlNJVElPTiIpOwotCi0gICAgICAgICAgICAgICAgLyogRG9uJ3QgZGVjb2RlIG1vcmUgdGhhbiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggISgoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gIT0gcEMtPnBDMS0+VnN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMi0+VnN0YXR1cykpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgY2xpcDEgdmlkZW8gdXAgdG8gdGhlIHRhcmdldCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICh3aWxsIGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODgocEMsIHBDLT5wQzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCBlcnI9JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzEpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMyLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMiB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICh3aWxsIGp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpZiBuZWVkZWQpICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMi0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRkFMU0UgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50RGVjb2RlVmlkZW9VcFRvQ3RzKEMyKSByZXR1cm5zIGVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcEMtPnBDMi0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgdmlkZW8gcHJlLXByb2Nlc3NpbmcgZXJyb3IgYmVmb3JlIGNhbGxpbmcgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gTTROT19FUlJPUjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJGICoqKiogYmxlbmQgQVVzIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgZnJhbWUgKHJlbmRlcmluZywgZmlsdGVyaW5nIGFuZCB3cml0aW5nIHdpbGwgYmUgZG9uZQotICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPmV3Yy5wRW5jQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMsIE00RU5DT0RFUl9rTm9ybWFsRnJhbWUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJZiBlbmNvZGUgcmV0dXJucyBhIHByb2Nlc3MgZnJhbWUgZXJyb3IsIGl0IGlzIGxpa2VseSB0byBiZSBhIFZQUCBlcnJvciAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IHBDLT5ld2MuVnBwRXJyb3IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUsIHJldHVybmluZyBWcHBFcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgLyoqPCAuLi5vciBhbiBlbmNvZGVyIGVycm9yICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MpID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSBpcwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIF9fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgRVJST1IgQ0FTRSB8Ki8KLSAgICAgICAgICAgIC8qfF9fX19fX19fX19fX3wqLwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIHZpZGVvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGNvbnN0IE00T1NBX0ludDMyICB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgIC8qKjwgVHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICBNNE9TQV9JbnQzMiBpVG1wOwotCi0gICAgY29uc3QgTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlIHByZXZpb3VzVnN0YXRlID0gcEMtPlZzdGF0ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgQ2xpcDEgaXMgb24gaXRzIGJlZ2luIGN1dCwgb3IgaW4gYW4gZWZmZWN0IHpvbmUgKi8KLSAgICBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMocEMsIDEpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgaW4gdGhlIHRyYW5zaXRpb24gd2l0aCBuZXh0IGNsaXAgKi8KLSAgICBpZiggKCBURCA+IDApICYmICgoIHQgLSBwQy0+cEMxLT5pVm9mZnNldCkgPj0gKHBDLT5wQzEtPmlFbmRUaW1lIC0gVEQpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBhcmUgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT047Ci0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiBzZWNvbmQgY2xpcCBmb3IgdHJhbnNpdGlvbiwgaWYgbm90IHlldCBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50T3BlbkNsaXAocEMsICZwQy0+cEMyLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W3BDLT51aUN1cnJlbnRDbGlwICsgMV0pOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfZWRpdE9wZW5DbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAoYXVkaW8gb3V0cHV0IENUUyBpcyBub3QgeWV0IGF0IHRoZSB0cmFuc2l0aW9uLCBzbyBhdWRpbwotICAgICAgICAgICAgKiAgb2Zmc2V0IGNhbid0IGJlIHVwZGF0ZWQgeWV0KS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBwQy0+cEMyLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBVcGRhdGUgdHJhbnNpdGlvbiBkdXJhdGlvbiBkdWUgdG8gdGhlIGFjdHVhbCB2aWRlbyB0cmFuc2l0aW9uIGJlZ2lubmluZyB0aW1lLgotICAgICAgICAgICAgKiBJdCB3aWxsIGF2b2lkIGRlc3luY2hyb25pemF0aW9uIHdoZW4gZG9pbmcgdGhlIGF1ZGlvIHRyYW5zaXRpb24uICovCi0gICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBpVG1wID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cylcCi0gICAgICAgICAgICAgLSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCArIHBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChpVG1wIDwgKE00T1NBX0ludDMyKXBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgLyoqPCBUZXN0IGluIGNhc2Ugb2YgYSB2ZXJ5IHNob3J0IHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24gLT0gaVRtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRG9uJ3QgZm9yZ2V0IHRvIGFsc28gY29ycmVjdCB0aGUgdG90YWwgZHVyYXRpb24gdXNlZCBmb3IgdGhlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgICogKGl0IHdhcyBjb21wdXRlZCB3aXRoIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIGR1cmF0aW9uKS4gKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiArPSBpVG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqPCBObyAiZWxzZSIgaGVyZSBiZWNhdXNlIGl0J3MgaGFyZCBwcmVkaWN0IHRoZSBlZmZlY3Qgb2YgMCBkdXJhdGlvbiB0cmFuc2l0aW9uLi4uKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGVmZmVjdHMgZm9yIGNsaXAyICovCi0gICAgICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBub3QgaW4gYSB0cmFuc2l0aW9uICovCi0gICAgICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGVmZmVjdCB3ZSBnbyB0byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgaWYoKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB8fCAocEMtPm5iQWN0aXZlRWZmZWN0czEgPiAwKSB8fAotICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5iVHJhbnNjb2RpbmdSZXF1aXJlZCA9PSBNNE9TQV9UUlVFKSkgewotICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICAvKiBXZSBkbyBhIGJlZ2luIGN1dCwgZXhjZXB0IGlmIGFscmVhZHkgZG9uZSAodGltZSBpcyBub3QgcHJvZ3Jlc3NpbmcgYmVjYXVzZSB3ZSB3YW50Ci0gICAgICAgIHRvIGNhdGNoIGFsbCBQLWZyYW1lcyBhZnRlciB0aGUgY3V0KSAqLwotICAgICAgICBlbHNlIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQ2xpcDFBdEJlZ2luQ3V0ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpIHsKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApIHsKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBFbHNlIHdlIGFyZSBpbiBkZWZhdWx0IGNvcHkvcGFzdGUgbW9kZSAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICAgICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRCaXRyYXRlOwotICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgLyogRG8gd2UgbmVlZCB0byByZWVuY29kZSB0aGUgdmlkZW8gdG8gZG93bmdyYWRlIHRoZSBiaXRyYXRlIG9yIG5vdCA/ICovCi0gICAgICAgICAgICAgICAgLyogTGV0J3MgY29tcHV0ZSB0aGUgY2lycmVudCBiaXRyYXRlIG9mIHRoZSBjdXJyZW50IGVkaXRlZCBjbGlwICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwgJmN1cnJlbnRCaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIG5leHQgYml0cmF0ZSBvZiBlZGl0ZWQgY2xpcDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgY3VycmVudEJpdHJhdGUgLT0gMTIyMDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlICovCi0gICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRCaXRyYXRlID4gcEMtPnVpTU1TVmlkZW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighKChwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9PSBNNE9TQV9UUlVFKSAmJgotICAgICAgICAgICAgICAgICAgICAocEMtPlZzdGF0ZSA9PSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUpKSAmJgotICAgICAgICAgICAgICAgICAgICBwQy0+YkVuY29kZVRpbGxFb0YgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGVzdCBpZiB3ZSBnbyBpbnRvIGNvcHkvcGFzdGUgbW9kZSBvciBpbnRvIGRlY29kZS9lbmNvZGUgbW9kZQotICAgICAgICAgICAgICAgICAqIElmIGFuIGV4dGVybmFsIGVmZmVjdCBoYXMgYmVlbiBhcHBsaWVkIG9uIHRoZSBjdXJyZW50IGNsaXAKLSAgICAgICAgICAgICAgICAgKiB0aGVuIGNvbnRpbnVlIHRvIGJlIGluIGRlY29kZS9lbmNvZGUgbW9kZSB0aWxsIGVuZCBvZgotICAgICAgICAgICAgICAgICAqIGNsaXAgdG8gYXZvaWQgSC4yNjQgZGlzdG9ydGlvbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBjcmVhdGUgYW4gZW5jb2RlciAqLwotICAgIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAoKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHBDLT5Wc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDcmVhdGUgdGhlIGVuY29kZXIsIGlmIG5vdCBjcmVhdGVkIGFscmVhZHkqLwotICAgICAgICBpZiAocEMtPmV3Yy5lbmNvZGVyU3RhdGUgPT0gTTRWU1MzR1BQX2tOb0VuY29kZXIpIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIFwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICYmIHBDLT5ld2MucEVuY0NvbnRleHQgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDcmVhdGUgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTogTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlciByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2hlbiB3ZSBnbyBmcm9tIGZpbHRlcmluZyB0byByZWFkL3dyaXRlLCB3ZSBtdXN0IGFjdCBsaWtlIGEgYmVnaW4gY3V0LAotICAgICogYmVjYXVzZSB0aGUgbGFzdCBmaWx0ZXJlZCBpbWFnZSBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlLiAqLwotICAgIGVsc2UgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmIChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcEMtPlZzdGF0ZSkgLyoqPCByZWFkIG1vZGUgKi8KLSAgICAgICAgJiYgKHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkgKQotICAgIHsKLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgZGVzdHJveSBhbiBlbmNvZGVyICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OCi0gICAgICAgID09IHByZXZpb3VzVnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiAoKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUCi0gICAgICAgID09IHBDLT5Wc3RhdGUpKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIERlc3Ryb3kgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQotICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCAqcEFVICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aU1heEF1U2l6ZTsKLQotICAgIC8qKgotICAgICogR2l2ZW4gY29udGV4dCBpcyBhY3R1YWxseSB0aGUgVlNTM0dQUCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgcEFVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3RhcnRBVTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTdGFydEFVOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSgpCi0gKiBAYnJpZWYgICAgUHJvY2Vzc0FVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRQcm9jZXNzQVUoIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCAqcEFVICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogRml4IHRoZSBlbmNvZGVkIEFVIHRpbWUgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZE91dHB1dFZpZEN0cyA9IHBBVS0+Q1RTOwotICAgIC8qKgotICAgICogVXBkYXRlIHRpbWUgaW5mbyBmb3IgdGhlIENvdW50ZXIgVGltZSBTeXN0ZW0gdG8gYmUgZXF1YWwgdG8gdGhlIGJpdC1zdHJlYW0gdGltZSAqLwotICAgIE00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyhwQywgcEFVKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgcEFVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCkKLSAqIEBicmllZiAgICBXZSBpbXBsZW1lbnQgb3VyIG93biBWaWRlb1ByZVByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZQUCggTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfTWVkaWFUaW1lIHRzOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwVG1wID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcExhc3REZWNvZGVkRnJhbWUgPSBNNE9TQV9OVUxMIDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcFRlbXAxWzNdLHBUZW1wMlszXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcFBsYW5lQ2xpcDFbM10scFRlbXBQbGFuZUNsaXAyWzNdOwotICAgIE00T1NBX1VJbnQzMiAgaSA9IDAsIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgLyoqCi0gICAgKiBWUFAgY29udGV4dCBpcyBhY3R1YWxseSB0aGUgVlNTM0dQUCBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDEsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXAyLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcFBsYW5lQ2xpcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IFZQUCBlcnJvciByZW1lbWJlcmVkIGluIGNvbnRleHQgKi8KLSAgICBwQy0+ZXdjLlZwcEVycm9yID0gTTROT19FUlJPUjsKLQotICAgIC8qKgotICAgICogQXQgdGhlIGVuZCBvZiB0aGUgZWRpdGluZywgd2UgbWF5IGJlIGNhbGxlZCB3aGVuIG5vIG1vcmUgY2xpcCBpcyBsb2FkZWQuCi0gICAgKiAoYmVjYXVzZSB0byBjbG9zZSB0aGUgZW5jb2RlciBwcm9wZXJseSBpdCBtdXN0IGJlIHN0ZXBwZWQgb25lIG9yIHR3aWNlLi4uKSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgbXVzdCBmaWxsIHRoZSBpbnB1dCBvZiB0aGUgZW5jb2RlciB3aXRoIGEgZHVtbXkgaW1hZ2UsIGJlY2F1c2UKLSAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMF0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3N0cmlkZSAqIHBQbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGFib3J0KSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVHJhbnNpdGlvbkVmZmVjdCApCi0gICAgewotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsIHBDLT5ld2MudWlWaWRlb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDEpIHJldHVybnMgMHgleCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMikgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDMpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MiwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDQpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwQy0+eXV2MywgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDMpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAxIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbmRlciBDbGlwMSAqLwotICAgICAgICBpZiggcEMtPnBDMS0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMxLCB0cywgTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMSwgcFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0KTsKLSAgICAgICAgICAgIGlmICgoTTROT19FUlJPUiAhPSBlcnIpICYmCi0gICAgICAgICAgICAgICAgIChNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBlcnIpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgLyoqIFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAqIGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgIChNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSA9PSBlcnIpKSB7Ci0gICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICBpZiAocEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFswXS51X2hlaWdodCAqIHBUbXBbMF0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMV0udV9oZWlnaHQgKiBwVG1wWzFdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzJdLnVfaGVpZ2h0ICogcFRtcFsyXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8zKCJDYW4gbm90IGZpbmQgYW4gaW5wdXQgZnJhbWUuIFNldCBlcnJvciAweCV4IGluICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwMiBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMyLT5pVm9mZnNldDsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAyICovCi0gICAgICAgIGlmKCBwQy0+cEMyLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdChwQywgcEMtPnBDMiwgdHMsIE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAyLCBwVGVtcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIGlmIChwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbihwQywgcFRtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24gcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBQbGFuZUNsaXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBQbGFuZUNsaXAxW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAyW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMltpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAyW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBUZW1wMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKioqKioqKioqKioqKioqKiBObyBUcmFuc2l0aW9uIGNhc2UgKioqKioqKioqKioqKioqKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gdHJhbnNpdGlvbiBjYXNlIik7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlbmRlciAqLwotICAgICAgICBpZiAocEMtPnBDMS0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgZmFsc2UiKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgIENoZWNrIGlmIHJlc2l6aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfRkFMU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilNNE9TQV9GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0UmVuZGVyKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHl1dkZyYW1lV2lkdGggPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVIZWlnaHQgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSb3RhdGVWaWRlbyhwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVWaWRlbygpIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbiBpbnRlcm1lZGlhdGUKLSAgICAgICAgICAgICAgICAgICAgKiBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCwgdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAqIEhlcmUgc2tpcCB0aGUgZnJhbWluZyhvdmVybGF5KSBlZmZlY3Qgd2hlbiBhcHBseWluZyB2aWRlbyBFZmZlY3QuICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgcFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBQcmVwYXJlIG92ZXJsYXkgdGVtcG9yYXJ5IGJ1ZmZlciBpZiBvdmVybGF5IGV4aXN0ICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCwgcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgsIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUuICovCi0gICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSkgZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwVG1wOwotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSkgZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgICAgICAgICAgaWYgKDAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgICAgICAgICAxODAgIT0gcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dkZyYW1lV2lkdGgsIHl1dkZyYW1lSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IE5PIHJlc2l6ZSByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIGlmIChwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcm1lZGlhdGUgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUZW1wMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFZpRGVjQ3R4dCwgJnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGZyYW1lIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSxwUGxhbmVPdXQsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICAgICAgcEMtPnBDMS0+aVZpZGVvUmVuZGVyQ3RzID0gKE00T1NBX0ludDMyKXRzOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmVuZGVyZHVwIHRydWUiKTsKLQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aCkpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgKiBpbnRlcm1lZGlhdGUgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCwgdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgICAgICAgICAqIEhlcmUgc2tpcCB0aGUgZnJhbWluZyhvdmVybGF5KSBlZmZlY3Qgd2hlbiBhcHBseWluZyB2aWRlbyBFZmZlY3QuICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLHBUZW1wMSwgYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWU9IHBUZW1wMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgsIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERvIHJlbmRlcmluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLCBwVG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFwcGx5IG92ZXJsYXkgaWYgb3ZlcmxheSBpcyBleGlzdCAqLwotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wMiwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgIHBMYXN0RGVjb2RlZEZyYW1lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMF0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVswXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMV0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcExhc3REZWNvZGVkRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocExhc3REZWNvZGVkRnJhbWVbMl0udV9oZWlnaHQgKiBwTGFzdERlY29kZWRGcmFtZVsyXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8zKCJDYW4gbm90IGZpbmQgYW4gaW5wdXQgZnJhbWUuIFNldCBlcnJvciAweCV4IGluICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+bmJBY3RpdmVFZmZlY3RzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHdlIGRvIG5vdCBza2lwIHRoZSBvdmVybGF5IGVmZmVjdCBzaW5jZQotICAgICAgICAgICAgICAgICAgICAgKiBvdmVybGF5IGFuZCB2aWRlbyBhcmUgYm90aCBvZiBzYW1lIHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXN0RGVjb2RlZEZyYW1lLCBwVG1wLGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRWUFA6IFJlbmRlcmVkIGF0IENUUyAlLjNmIiwgdHMpOwotCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBUZW1wMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAyW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMltpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAyW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIG92ZXJsYXkgZnJvbSBwUGxhbmVJbiB0byBwUGxhbmVPdXQKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgKElOL09VVCkgT3V0cHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLQotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgZXh0UHJvZ3Jlc3M7Ci0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfVUludDggTnVtQWN0aXZlRWZmZWN0cyA9MDsKLSAgICBNNE9TQV9VSW50MzIgQ3RzID0gMDsKLSAgICBNNE9TQV9JbnQzMiBuZXh0RWZmZWN0VGltZTsKLSAgICBNNE9TQV9JbnQzMiB0bXA7Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgcENsaXAgPSBwQy0+cEMxOwotICAgIGlmIChwQy0+Yklzc2Vjb25kQ2xpcCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9IGVsc2UgewotICAgICAgICBOdW1BY3RpdmVFZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICB9Ci0gICAgZm9yIChpPTA7IGk8TnVtQWN0aXZlRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgIGlmIChwQy0+Yklzc2Vjb25kQ2xpcCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV1dKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIFZpZGVvRWZmZWN0VGltZSA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpICsKLSAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwRngtPnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCBvbmx5LAotICAgICAgICAgKiBza2lwIG90aGVyIGNvbG9yIGVmZmVjdCB3aGljaCBoYWQgYmVlbiBhcHBsaWVkICovCi0gICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQgYmVjYXVzZSBlZmZlY3Qgc2hvdWxkIGZpbmlzaAotICAgICAgICAgKiBvbiB0aGUgbGFzdCBmcmFtZSB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZSAvICgoTTRPU0FfRmxvYXQpcEZ4LT51aUR1cmF0aW9uKTsKLQotICAgICAgICBpZiAoUGVyY2VudGFnZURvbmUgPCAwLjApIHsKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA+IDEuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAxLjA7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAwMCkgKi8KLSAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMDApOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgcHJvZ3Jlc3MgaW5mbyBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgZXh0UHJvZ3Jlc3MudWlQcm9ncmVzcyA9IChNNE9TQV9VSW50MzIpdG1wOwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICBleHRQcm9ncmVzcy51aUNsaXBUaW1lID0gZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lIC0gcENsaXAtPmlWb2Zmc2V0OwotICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIG5leHRFZmZlY3RUaW1lID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cyBcCi0gICAgICAgICAgICArIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbik7Ci0gICAgICAgIGlmIChuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwRngtPkV4dFZpZGVvRWZmZWN0RmN0KHBGeC0+cEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgIHBQbGFuZUluLCBwUGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlIC0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheTogXAotICAgICAgICAgICAgICAgIEV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkKLSAqIEBicmllZiAgICBBcHBseSB2aWRlbyBlZmZlY3QgZnJvbSBwUGxhbmVJbiB0byBwUGxhbmVPdXQKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgKElOKSBJbnB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIGJTa2lwRnJhbWluZ0VmZmVjdCAoSU4pIHNraXAgZnJhbWluZyBlZmZlY3QgZmxhZwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLQotICAgIE00T1NBX0RvdWJsZSBWaWRlb0VmZmVjdFRpbWU7Ci0gICAgTTRPU0FfRG91YmxlIFBlcmNlbnRhZ2VEb25lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVUZW1wSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBPdXQ7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgIHBUZW1wWXV2UGxhbmVbM107Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotCi0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICBOdW1BY3RpdmVFZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wWXV2UGxhbmUsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBwbGFuZSBpZiBuZWVkZWQgUkMgKi8KLSAgICBpZiAoTnVtQWN0aXZlRWZmZWN0cyA+IDEpIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wWXV2UGxhbmUsIHBQbGFuZU91dC0+dV93aWR0aCwKLSAgICAgICAgICAgICAgICAgIHBQbGFuZU91dC0+dV9oZWlnaHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKDQpIHJldHVybnMgMHgleCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4uLikgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzICAlIDIgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZUluOwotICAgICAgICBwUGxhbmVUZW1wT3V0ID0gcFRlbXBZdXZQbGFuZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGk8TnVtQWN0aXZlRWZmZWN0czsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpCi0gICAgICAgIHsKLQotCi0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV1dKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVmZmVjdCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIFZpZGVvRWZmZWN0VGltZSA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2l0aW9uRHVyYXRpb24tIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwRngtPnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0KLQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lKi8KLSAgICAgICAgLyogd2hpY2ggaXMgcHJlc2VudGVkIGZyb20gQ1RTID0gZW9mLXRpbWVJbmNyZW1lbnQgdGlsbCBDVFMgPSBlb2YgKi8KLSAgICAgICAgUGVyY2VudGFnZURvbmUgPSBWaWRlb0VmZmVjdFRpbWUKLSAgICAgICAgICAgIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24vKi0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKi8pOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA8IDAuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDAuMDsKLQotICAgICAgICBpZiggUGVyY2VudGFnZURvbmUgPiAxLjAgKQotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAxLjA7Ci0KLSAgICAgICAgc3dpdGNoKCBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDI0KTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZVRlbXBJbiwKLSAgICAgICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcE91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KSAqLwotICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKCAxLjAgLSBQZXJjZW50YWdlRG9uZSkgKiAxMDI0KTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZVRlbXBJbiwKLSAgICAgICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcE91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYoIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBuZXh0RWZmZWN0VGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobmV4dEVmZmVjdFRpbWUgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSBza2lwIHRoZSBmcmFtaW5nIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICogZG8gdGhlIGZyYW1pbmcgZWZmZWN0IGFmdGVyIGFwcGx5IHJlbmRlcmluZyBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgocEZ4LT54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMF0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMF0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFsxXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblsxXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzJdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzJdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzJdLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwRngtPkV4dFZpZGVvRWZmZWN0RmN0KHBGeC0+cEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW4sIHBQbGFuZVRlbXBPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3Q6IHVua25vd24gZWZmZWN0IHR5cGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VGRkVDVF9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBSQyBVcGRhdGVzIHBUZW1wUGxhbmVJbiBhbmQgcFRlbXBQbGFuZU91dCBkZXBlbmRpbmcgb24gY3VycmVudCBlZmZlY3QgKi8KLSAgICAgICAgaWYgKCgoaSAlIDIgPT0gMCkgJiYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKSkKLSAgICAgICAgICAgIHx8ICgoaSAlIDIgIT0gMCkgJiYgKE51bUFjdGl2ZUVmZmVjdHMgJSAyICE9IDApKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFBsYW5lVGVtcEluID0gcFRlbXBZdXZQbGFuZTsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wT3V0ID0gcFRlbXBZdXZQbGFuZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvcihpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgIGlmKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwVGVtcFl1dlBsYW5lW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3Q6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24oKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIHRyYW5zaXRpb24gZWZmZWN0IHBDMStwQzItPnBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpUHJvZ3Jlc3M7Ci0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgZXh0UHJvZ3Jlc3M7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIGNvbnN0IE00T1NBX0ludDMyIGlEdXIgPSAoTTRPU0FfSW50MzIpcEMtPgotICAgICAgICBwVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgZW5kIGN1dCB3ZSBhcmUsIGluIGNsaXAtYmFzZSB0aW1lLgotICAgICogSXQgaXMgZG9uZSB3aXRoIGludGVnZXJzIGJlY2F1c2UgdGhlIG9mZnNldCBhbmQgYmVnaW4gY3V0IGhhdmUgYmVlbiByb3VuZGVkIGFscmVhZHkuICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKChNNE9TQV9Eb3VibGUpcEMtPnBDMS0+aUVuZFRpbWUpIC0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKwotICAgICAgICAoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pVm9mZnNldCk7Ci0gICAgLyoqCi0gICAgKiBXZSBtdXN0IHJlbW92ZSB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lLCBlbHNlIHdlIHdvdWxkIGFsbW9zdCBuZXZlciByZWFjaCB0aGUgZW5kCi0gICAgKiAoSXQncyBraW5kIG9mIGEgInBpbGUgYW5kIGludGVydmFscyIgaXNzdWUpLiAqLwotICAgIGlQcm9ncmVzcyAtPSAoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotCi0gICAgaWYoIGlQcm9ncmVzcyA8IDAgKSAvKio8IFNhbml0eSBjaGVja3MgKi8KLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiwgb24gYSBiYXNlIDEwMDAgKi8KLSAgICBpUHJvZ3Jlc3MgPSAoICggaUR1ciAtIGlQcm9ncmVzcykgKiAxMDAwKSAvIGlEdXI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVja3MgKi8KLSAgICBpZiggaVByb2dyZXNzIDwgMCApCi0gICAgewotICAgICAgICBpUHJvZ3Jlc3MgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUHJvZ3Jlc3MgPiAxMDAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDEwMDA7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5UcmFuc2l0aW9uQmVoYXZpb3VyICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWRVcDoKLSAgICAgICAgICAgIGlQcm9ncmVzcyA9ICggaVByb2dyZXNzICogaVByb2dyZXNzKSAvIDEwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0xpbmVhcjoKLSAgICAgICAgICAgIC8qZG8gbm90aGluZyovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkRG93bjoKLSAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiAxMDAwKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1Nsb3dNaWRkbGU6Ci0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoaVByb2dyZXNzICogNTAwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaVByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoICggKCBpUHJvZ3Jlc3MgLSA1MDApICogKGlQcm9ncmVzcyAtIDUwMCkpCi0gICAgICAgICAgICAgICAgICAgIC8gNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0Zhc3RNaWRkbGU6Ci0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKCggaVByb2dyZXNzICogaVByb2dyZXNzKSAvIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KCggaVByb2dyZXNzIC0gNTAwKSAqIDUwMCkgKyA1MDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qZG8gbm90aGluZyovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlOgotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgZXJyID0gTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBDLT55dXYxLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBDLT55dXYyLAotICAgICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSAqKXBQbGFuZU91dCwgaVByb2dyZXNzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCByZXR1cm5zIGVycm9yIDB4JXgsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVFJBTlNJVElPTl9GSUxURVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOgotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFRoaXMgaXMgYSBzdHVwaWQtbm9uIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBOb25lIHRyYW5zaXRpb24uLi4KLSAgICAgICAgICAgICogV2UgY29weSB0aGUgWVVWIGZyYW1lICovCi0gICAgICAgICAgICBpZiggaVByb2dyZXNzIDwgNTAwICkgLyoqPCBmaXJzdCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgWVVWIGZyYW1lcyAqLwotICAgICAgICAgICAgaSA9IDM7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBpLS0gPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICh2b2lkICopcFBsYW5lW2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbaV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbaV0udV9oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgcHJvZ3Jlc3MgaW5mbyBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMilpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQy0+cEMxLT5pVm9mZnNldDsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS5FeHRWaWRlb1RyYW5zaXRpb25GY3QoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIHBDLT55dXYyLCBwUGxhbmVPdXQsICZleHRQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gdHJhbnNpdGlvbiBmdW5jdGlvbiByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjogdW5rbm93biB0cmFuc2l0aW9uIHR5cGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS5WaWRlb1RyYW5zaXRpb25UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKCkKLSAqIEBicmllZiAgICBVcGRhdGUgYml0IHN0cmVhbSB0aW1lIGluZm8gYnkgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBjb21wbGlhbnQgd2l0aAotICogICAgICAgICAgcGxheWVycyB1c2luZyBiaXQgc3RyZWFtIHRpbWUgaW5mbwotICogQG5vdGUgICAgSDI2MyB1c2VzIGFuIGFic29sdXRlIHRpbWUgY291bnRlciB1bmxpa2UgTVBFRzQgd2hpY2ggdXNlcyBHcm91cCBPZiBWb3BzCi0gKiAgICAgICAgICAoR09WLCBzZWUgdGhlIHN0YW5kYXJkKQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgICAgIChJTi9PVVQpIHJldHVybnMgdGltZSB1cGRhdGVkIHZpZGVvIEFVLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvZmZzZXQgYmV0d2VlbiBzeXN0ZW0gYW5kIHZpZGVvIHRpbWUgKE1QRUc0IG9ubHkpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBjbGlwIChNUEVHNCBvbmx5KQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX1VJbnQ4IHVpVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUN0cyA9IDA7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlBZGQ7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3VyckdvdjsKLSAgICBNNE9TQV9JbnQ4IGlEaWZmOwotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgPSBwQy0+cEMxOwotICAgIE00T1NBX0ludDMyICpwT2Zmc2V0ID0gJihwQy0+ZXdjLmlNcGVnNEdvdk9mZnNldCk7Ci0KLSAgICAvKioKLSAgICAqIFNldCBIMjYzIHRpbWUgY291bnRlciBmcm9tIHN5c3RlbSB0aW1lICovCi0gICAgaWYoIE00U1lTX2tIMjYzID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIHVpVG1wID0gKE00T1NBX1VJbnQ4KSgoTTRPU0FfVUludDMyKSggKCBwQVUtPkNUUyAqIDMwKSAvIDEwMDEgKyAwLjUpCi0gICAgICAgICAgICAlIE00VlNTM0dQUF9FRElUX0gyNjNfTU9EVUxPX1RJTUUpOwotICAgICAgICBNNFZTUzNHUFBfaW50U2V0SDI2M1RpbWVDb3VudGVyKChNNE9TQV9NZW1BZGRyOCkocEFVLT5kYXRhQWRkcmVzcyksCi0gICAgICAgICAgICB1aVRtcCk7Ci0gICAgfQotICAgIC8qCi0gICAgKiBTZXQgTVBFRzQgR09WIHRpbWUgY291bnRlciByZWdhcmRpbmcgdmlkZW8gYW5kIHN5c3RlbSB0aW1lICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQVUtPnN0cmVhbS0+c3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAqIElmIEdPVi4KLSAgICAgICAgKiBiZXdhcmUgb2YgbGl0dGxlL2JpZyBlbmRpYW4hICovCi0gICAgICAgIC8qIGNvcnJlY3Rpb246IHJlYWQgOCBiaXRzIGJsb2NrIGluc3RlYWQgb2Ygb25lIDMyIGJpdHMgYmxvY2sgKi8KLSAgICAgICAgTTRPU0FfVUludDggKnRlbXA4ID0gKE00T1NBX1VJbnQ4ICopKHBBVS0+ZGF0YUFkZHJlc3MpOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcDMyID0gMDsKLQotICAgICAgICB0ZW1wMzIgPSAoIDB4MDAwMDAwZmYgJiAoTTRPU0FfVUludDMyKSgqdGVtcDgpKQotICAgICAgICAgICAgKyAoMHgwMDAwZmYwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMSkpKSA8PCA4KQotICAgICAgICAgICAgKyAoMHgwMGZmMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMikpKSA8PCAxNikKLSAgICAgICAgICAgICsgKDB4ZmYwMDAwMDAgJiAoKE00T1NBX1VJbnQzMikoKih0ZW1wOCArIDMpKSkgPDwgMjQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJSQzogVGVtcDMyOiAweCV4LCBkYXRhQWRkcmVzczogMHgleFxuIiwgdGVtcDMyLAotICAgICAgICAgICAgKihwQVUtPmRhdGFBZGRyZXNzKSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9FRElUX0dPVl9IRUFERVIgPT0gdGVtcDMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzCi0gICAgICAgICAgICAgICAgKyAxKTsgLyoqPCBKdW1wIHRvIHRoZSB0aW1lIGNvZGUgKGp1c3QgYWZ0ZXIgdGhlIDMyIGJpdHMgaGVhZGVyKSAqLwotICAgICAgICAgICAgdWlBZGQgPSAoTTRPU0FfVUludDMyKShwQVUtPkNUUykrKCAqcE9mZnNldCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5iTXBlZzRHb3ZTdGF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9GQUxTRTogLyo8IElOSVQgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAoIHVpQWRkICsgOTk5KSAvIDEwMDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICggKnBPZmZzZXQpICs9ICgoIHVpQ3RzICogMTAwMCkgLSB1aUFkZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdmFsdWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnVpTXBlZzRQcmV2R292VmFsdWVTZXQgPSB1aUN0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhdGUgdG8gJ2ZpcnN0JyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5iTXBlZzRHb3ZTdGF0ZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX1RSVUU6IC8qPCBVUERBVEUgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IGN1cnJlbnQgR292IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YocFRtcCwgJnVpQ3Vyckdvdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvIHRpbWUgPSBmbG9vciBvciBjZWlsIChzeXN0ZW0gdGltZSArIG9mZnNldCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzID0gKHVpQWRkIC8gMTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpRGlmZiA9IChNNE9TQV9JbnQ4KSh1aUN1cnJHb3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZUdldCAtIHVpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPnVpTXBlZzRQcmV2R292VmFsdWVTZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjZWlsaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggaURpZmYgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyArPSAoTTRPU0FfVUludDMyKShpRGlmZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgdXBkYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZUdldCA9IHVpQ3VyckdvdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YocFRtcCwgdWlDdHMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gZWZmZWN0IG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudCB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKQotewotICAgIE00T1NBX1VJbnQ4IHVpQ2xpcEluZGV4OwotICAgIE00T1NBX1VJbnQ4IHVpRnhJbmRleCwgaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00T1NBX0ludDMyIE9mZiwgQkMsIEVDOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgTTRPU0FfSW50MzIgdCA9IChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLQotICAgIHVpQ2xpcEluZGV4ID0gcEMtPnVpQ3VycmVudENsaXA7Ci0gICAgaWYgKHVpQ2xpcE51bWJlciA9PSAxKSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQ2xpcCA9IHBDLT5wQzI7Ci0gICAgICAgIHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIC8qKgotICAgICogU2hvcnRjdXRzIGZvciBjb2RlIHJlYWRhYmlsaXR5ICovCi0gICAgT2ZmID0gcENsaXAtPmlWb2Zmc2V0OwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgaSA9IDA7Ci0KLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMoRW5kRWZmZWN0IGFsd2F5cyBjbGVhbiApKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5WaWRlb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgIGlmKHVpQ2xpcE51bWJlciA9PTEpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/Ci0gICAgICAgICAgICAgICAgICogb3IgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoICh0ID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSkpICYmCi0gICAgICAgICAgICAgICAgICAgICh0IDw9IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpICkgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0KHMpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3RbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY291bnRlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgQXJlIHdlIGludG8gdGhlIGVmZmVjdCBkdXJhdGlvbj8gKi8KLSAgICAgICAgICAgICAgICBpZiAoICgoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKCAoTTRPU0FfSW50MzIpKHQgKyBwQy0+cFRyYW5zaXRpb25MaXN0W3VpQ2xpcEluZGV4XS51aVRyYW5zaXRpb25EdXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDFbaV0gPSBwQy0+bmJFZmZlY3RzLTEtdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBVcGRhdGUgY291bnRlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBGb3IgYWxsIGV4dGVybmFsIGVmZmVjdHMgc2V0IHRoaXMgZmxhZyB0byB0cnVlLiAqLwotICAgICAgICAgICAgICAgICAgICBpZihwRngtPlZpZGVvRWZmZWN0VHlwZSA+IE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogVGhlIHRoaXJkIGVmZmVjdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIHRoZW4gdGhlIHNlY29uZCBvbmUsIHRoZW4gdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVuY2UsIGFzIHNvb24gYXMgd2UgZm91bmQgYW4gYWN0aXZlIGVmZmVjdCwgd2UgY2FuIGdldCBvdXQgb2YgdGhpcyBsb29wICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00VklERU9FRElUSU5HX2tIMjY0ICE9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIE1wZWc0IGFuZCBIMjYzIGNsaXBzLCBmdWxsIGRlY29kZSBlbmNvZGUgbm90IHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoMT09dWlDbGlwTnVtYmVyKQotICAgIHsKLSAgICAvKioKLSAgICAgKiBTYXZlIG51bWJlciBvZiBhY3RpdmUgZWZmZWN0cyAqLwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzID0gaTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSBpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUgKi8KLSAgICB0IC09IE9mZjsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIG9uIHRoZSBiZWdpbiBjdXQgKGZvciBjbGlwMSBvbmx5KSAqLwotICAgIGlmKCAoIDAgIT0gQkMpICYmICh0ID09IEJDKSAmJiAoMSA9PSB1aUNsaXBOdW1iZXIpICkKLSAgICB7Ci0gICAgICAgIHBDLT5iQ2xpcDFBdEJlZ2luQ3V0ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsKLQotICAgIC8qKgotICAgICogU2ltdWxhdGUgYSB3cml0ZXIgaW50ZXJmYWNlIHdpdGggb3VyIHNwZWNpZmljIGZ1bmN0aW9uICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBQcm9jZXNzQVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBmb2xsb3cgdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFN0YXJ0QVUgPQotICAgICAgICBNNFZTUzNHUFBfaW50U3RhcnRBVTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGlzIFZTUyAzR1BQIHNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wV3JpdGVyQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl9Db250ZXh0KQotICAgICAgICBwQzsgLyoqPCBXZSBnaXZlIHRoZSBpbnRlcm5hbCBjb250ZXh0IGFzIHdyaXRlciBjb250ZXh0ICovCi0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZW5jb2RlciBpbnRlcmZhY2UsIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2Rlcjogc2V0Q3VycmVudEVuY29kZXIgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IGVuY29kZXIgc2hlbGwgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gVlNTIHNldHRpbmdzICovCi0KLSAgICAvKiBDb21tb24gcGFyYW1ldGVycyAqLwotICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLSAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKiBObyBzdHJpY3QgcmVndWxhdGlvbiBpbiB2aWRlbyBlZGl0b3IgKi8KLSAgICAgICAgLyogQmVjYXVzZSBvZiB0aGUgZWZmZWN0cyBhbmQgdHJhbnNpdGlvbnMgd2Ugc2hvdWxkIGFsbG93IG1vcmUgZmxleGliaWxpdHkgKi8KLSAgICAgICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMgKHdpdGggYSBiYWQgcmVzdWx0IG9uIHNoZWR1bGluZyBhbmQKLSAgICAgICAgYmxvY2sgZWZmZXRjcykgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gVmFyaWFibGUgZnJhbWVyYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rMzBfRlBTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBJbiBjYXNlIG9mIE1NUyBtb2RlLCB3ZSBuZWVkIHRvIGVuYWJsZSBiaXRyYXRlIHJlZ3VsYXRpb24gdG8gYmUgc3VyZSAqLwotICAgICAgICAvKiB0byByZWFjaCB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUgc2l6ZSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX1RSVUU7Ci0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+TU1TdmlkZW9GcmFtZXJhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzIChkZWZhdWx0cykgKi8KLSAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9IDA7ICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gMTA7ICAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWw9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaCAoIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA4OwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IChNNE9TQV9VSW50OCkoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9PSAwICkKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsgLyogZGVmYXVsdCAqLwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIC8vRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00VklERU9FRElUSU5HX2s1X0ZQUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogVW5rbm93biB2aWRlb1N0cmVhbVR5cGUgMHgleCIsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlNTVNWaWRlb0JpdHJhdGU7IC8qIFJDICovCi0gICAgICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IDA7IC8qIFdlIGxldCB0aGUgZW5jb2RlciBjaG9vc2UgdGhlIHRpbWVzY2FsZSAqLwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0T3BlbiIpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RTdGFydCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlciggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwKAotICAgICAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKQotICogQGJyaWVmICAgIE1vZGlmeSB0aGUgdGltZSBjb3VudGVyIG9mIHRoZSBnaXZlbiBIMjYzIHZpZGVvIEFVCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBBdURhdGFCdWZmZXIgICAgKElOL09VVCkgSDI2MyBWaWRlbyBBVSB0byBtb2RpZnkKLSAqIEBwYXJhbSAgICB1aUN0cyAgICAgICAgICAgIChJTikgICAgIE5ldyB0aW1lIGNvdW50ZXIgdmFsdWUKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0SDI2M1RpbWVDb3VudGVyKCBNNE9TQV9NZW1BZGRyOCBwQXVEYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUN0cyApCi17Ci0gICAgLyoKLSAgICAqICBUaGUgSDI2MyB0aW1lIGNvdW50ZXIgaXMgOCBiaXRzIGxvY2F0ZWQgb24gdGhlICJ4IiBiZWxvdzoKLSAgICAqCi0gICAgKiAgIHwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLXwKLSAgICAqICAgID8/Pz8/Pz8/ID8/Pz8/Pz8/ID8/Pz8/P3h4IHh4eHh4eD8/Ci0gICAgKi8KLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIDIgYml0cyBvbiB0aGUgdGhpcmQgYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbMl0gPSAoIHBBdURhdGFCdWZmZXJbMl0gJiAweEZDKSB8ICgoIHVpQ3RzID4+IDYpICYgMHgzKTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIDYgYml0cyBvbiB0aGUgZm91cnRoIGJ5dGUgKi8KLSAgICBwQXVEYXRhQnVmZmVyWzNdID0gKCAoIHVpQ3RzIDw8IDIpICYgMHhGQykgfCAocEF1RGF0YUJ1ZmZlclszXSAmIDB4Myk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoKQotICogQGJyaWVmICAgIE1vZGlmeSB0aGUgdGltZSBpbmZvIGZyb20gR3JvdXAgT2YgVk9QIHZpZGVvIEFVCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBBdURhdGFCdWZmZXIgICAgKElOKSAgICBNUEVHNCBWaWRlbyBBVSB0byBtb2RpZnkKLSAqIEBwYXJhbSAgICB1aUN0c1NlYyAgICAgICAgICAgIChJTikgICAgIE5ldyBHT1YgdGltZSBpbmZvIGluIHNlY29uZCB1bml0Ci0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldE1QRUc0R292KCBNNE9TQV9NZW1BZGRyOCBwQXVEYXRhQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUN0c1NlYyApCi17Ci0gICAgLyoKLSAgICAqICBUaGUgTVBFRy00IHRpbWUgY29kZSBsZW5ndGggaXMgMTggYml0czoKLSAgICAqCi0gICAgKiAgICAgaGggICAgIG1tICAgIG1hcmtlciAgICBzcwotICAgICogICAgeHh4eHh8eHh4IHh4eCAgICAgMSAgICB4eHh4IHh4ID8/Pz8/PwotICAgICogICB8LS0tLS0gLS0tfC0tLSAgICAgLSAgICAtLS0tfC0tIC0tLS0tLXwKLSAgICAqLwotICAgIE00T1NBX1VJbnQ4IHVpSGg7Ci0gICAgTTRPU0FfVUludDggdWlNbTsKLSAgICBNNE9TQV9VSW50OCB1aVNzOwotICAgIE00T1NBX1VJbnQ4IHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBsYXN0IGJpdHMgc3MgKi8KLSAgICB1aVNzID0gKE00T1NBX1VJbnQ4KSh1aUN0c1NlYyAlIDYwKTsgLyoqPCBtb2R1bG8gcGFydCAqLwotICAgIHBBdURhdGFCdWZmZXJbMl0gPSAoKCAoIHVpU3MgJiAweDAzKSA8PCA2KSB8IChwQXVEYXRhQnVmZmVyWzJdICYgMHgzRikpOwotCi0gICAgaWYoIHVpQ3RzU2VjIDwgNjAgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIDMgbGFzdCBiaXRzIG9mIG1tLCB0aGUgbWFya2VyIGJpdCAoMHgxMCAqLwotICAgICAgICBwQXVEYXRhQnVmZmVyWzFdID0gKCggMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMF0gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHVpVG1wID0gKE00T1NBX1VJbnQ4KSh1aUN0c1NlYyAvIDYwKTsgLyoqPCBpbnRlZ2VyIHBhcnQgKi8KLSAgICAgICAgdWlNbSA9IChNNE9TQV9VSW50OCkodWlUbXAgJSA2MCk7Ci0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCB1aU1tIDw8IDUpIHwgKDB4MTApIHwgKHVpU3MgPj4gMikpOwotCi0gICAgICAgIGlmKCB1aVRtcCA8IDYwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFdyaXRlIHRoZSA1IGJpdHMgb2YgaGggYW5kIDMgb2YgbW0gKG91dCBvZiA2KSAqLwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICB1aUhoID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAvIDYwKTsKLSAgICAgICAgICAgIHBBdURhdGFCdWZmZXJbMF0gPSAoKCB1aUhoIDw8IDMpIHwgKHVpTW0gPj4gMykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgR2V0IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHBDdHNTZWMgICAgICAgICAgICAoT1VUKSAgICBDdXJyZW50IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50R2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpwQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHNzICovCi0gICAgdWlTcyA9ICgoIHBBdURhdGFCdWZmZXJbMl0gJiAweEMwKSA+PiA2KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweDBGKSA8PCAyKTsKLSAgICB1aUN0c1NlYyA9IHVpU3MgKyB1aVRtcDsKLQotICAgIC8qKgotICAgICogUmVhZCBtbSAqLwotICAgIHVpTW0gPSAoKCBwQXVEYXRhQnVmZmVyWzFdICYgMHhFMCkgPj4gNSk7Ci0gICAgdWlUbXAgPSAoKCBwQXVEYXRhQnVmZmVyWzBdICYgMHgwNykgPDwgMyk7Ci0gICAgdWlNbSA9IHVpTW0gKyB1aVRtcDsKLSAgICB1aUN0c1NlYyA9ICggdWlNbSAqIDYwKSArIHVpQ3RzU2VjOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIGhoICovCi0gICAgdWlIaCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweEY4KSA+PiAzKTsKLQotICAgIGlmKCB1aUhoICkKLSAgICB7Ci0gICAgICAgIHVpQ3RzU2VjID0gKCB1aUhoICogMzYwMCkgKyB1aUN0c1NlYzsKLSAgICB9Ci0KLSAgICAvKgotICAgICogaW4gc2VjICovCi0gICAgKnBDdHNTZWMgPSB1aUN0c1NlYzsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCkKLSAqIEBicmllZiAgICBBbGxvY2F0ZSB0aGUgdGhyZWUgWVVWIDQ6MjowIHBsYW5lcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwUGxhbmVzICAgIChJTi9PVVQpIHZhbGlkIHBvaW50ZXIgdG8gMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi0gKiBAcGFyYW0gICAgdWlXaWR0aCAgICAoSU4pICAgICBJbWFnZSB3aWR0aAotICogQHBhcmFtICAgIHVpSGVpZ2h0KElOKSAgICAgSW1hZ2UgaGVpZ2h0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKQotewotICAgIGlmIChwUGxhbmVzID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogSW52YWxpZCBwUGxhbmVzIHBvaW50ZXIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBub3QgTlVMTCBhbmQgc2FtZSBzaXplIHdpdGggdGFyZ2V0IHNpemUsCi0gICAgICogZG8gbm90IG1hbGxvYyBhZ2FpbiovCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCAmJgotICAgICAgICBwUGxhbmVzWzBdLnVfd2lkdGggPT0gdWlXaWR0aCAmJgotICAgICAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID09IHVpSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIHBQbGFuZXNbMF0udV93aWR0aCA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X2hlaWdodCA9IHVpSGVpZ2h0OwotICAgIHBQbGFuZXNbMF0udV9zdHJpZGUgPSB1aVdpZHRoOwotICAgIHBQbGFuZXNbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgIGlmIChwUGxhbmVzWzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBQbGFuZXNbMF0udV9zdHJpZGUKLSAgICAgICAgKiBwUGxhbmVzWzBdLnVfaGVpZ2h0LCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBQbGFuZXNbMF0ucGFjX2RhdGEiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBQbGFuZXNbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiB1bmFibGUgdG8gYWxsb2NhdGUgcFBsYW5lc1swXS5wYWNfZGF0YSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBQbGFuZXNbMV0udV93aWR0aCA9IHBQbGFuZXNbMF0udV93aWR0aCA+PiAxOwotICAgIHBQbGFuZXNbMV0udV9oZWlnaHQgPSBwUGxhbmVzWzBdLnVfaGVpZ2h0ID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X3N0cmlkZSA9IHBQbGFuZXNbMV0udV93aWR0aDsKLSAgICBwUGxhbmVzWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1sxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1sxXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMV0udV9oZWlnaHQsIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAicFBsYW5lc1sxXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1sxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzFdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1syXS51X3dpZHRoID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMl0udV9oZWlnaHQgPSBwUGxhbmVzWzFdLnVfaGVpZ2h0OwotICAgIHBQbGFuZXNbMl0udV9zdHJpZGUgPSBwUGxhbmVzWzJdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X3RvcGxlZnQgPSAwOwotICAgIGlmIChwUGxhbmVzWzJdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwUGxhbmVzWzJdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBQbGFuZXNbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBQbGFuZXNbMl0udV9zdHJpZGUKLSAgICAgICAgKiBwUGxhbmVzWzJdLnVfaGVpZ2h0LCBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBQbGFuZXNbMl0ucGFjX2RhdGEiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBQbGFuZXNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiB1bmFibGUgdG8gYWxsb2NhdGUgcFBsYW5lc1syXS5wYWNfZGF0YSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKXBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMF0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMF0udV9zdHJpZGUqcFBsYW5lc1swXS51X2hlaWdodCk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1sxXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1sxXS51X3N0cmlkZSpwUGxhbmVzWzFdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzJdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzJdLnVfc3RyaWRlKnBQbGFuZXNbMl0udV9oZWlnaHQpOwotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSogQGJyaWVmICAgIEl0IENvdmVydHMgYW5kIHJlc2l6ZXMgYSBBUkdCODg4OCBpbWFnZSB0byBZVVY0MjAKLSogQG5vdGUKLSogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAoSU4pIFRoZSBBUkdCODg4IGlucHV0IGZpbGUKLSogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlci4KLSogICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCODg4OCBpbWFnZSAgd2lsbCBiZSBjb252ZXJ0ZWQgYW5kIHJlc2l6ZWQgdG8gb3V0cHV0Ci0qICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSogQHBhcmFtIHdpZHRoICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0qIEBwYXJhbSBoZWlnaHQgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSogQHJldHVybiAgIE00Tk9fRVJST1I6IE5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpIHsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiID0gd2lkdGggKiBoZWlnaHQgKiA0OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfcmdiODg4ID0gd2lkdGggKiBoZWlnaHQgKiAzOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVUludDggKnBBcmdiUGxhbmUgPQotICAgICAgICAoTTRPU0FfVUludDgqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImFyZ2IgZGF0YSIpOwotICAgIGlmIChwQXJnYlBsYW5lID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwOiBcCi0gICAgICAgICAgICBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBBUkdCIHBsYW5lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBHZXQgZmlsZSBzaXplICovCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JJbiwgcEZpbGVJbiwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDogXAotICAgICAgICAgICAgQ2FuIG5vdCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocEFyZ2JQbGFuZSk7Ci0gICAgICAgIHBBcmdiUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwQXJnYlBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIENhbiBub3QgcmVhZCBBUkdCODg4OCBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCBjbG9zZSBBUkdCODg4OCAgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPQotICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX3JnYjg4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJSR0I4ODggcGxhbmUxIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJnYiBwbGFuZTEiKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS51X2hlaWdodCA9IGhlaWdodDsKLSAgICByZ2JQbGFuZTEudV93aWR0aCA9IHdpZHRoOwotICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgcmdiUGxhbmUxLnVfdG9wbGVmdCA9IDA7Ci0KLQotICAgIC8qKiBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgKi8KLSAgICBmb3IgKGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZTEucGFjX2RhdGFbal0gPSBwQXJnYlBsYW5lW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocEFyZ2JQbGFuZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiByZXNpemluZyBpcyByZXF1aXJlZCB3aXRoIGNvbG9yIGNvbnZlcnNpb24gKi8KLSAgICBpZih3aWR0aCAhPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggfHwgaGVpZ2h0ICE9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIHsKLQotICAgICAgICBmcmFtZVNpemVfcmdiODg4ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDM7Ci0gICAgICAgIHJnYlBsYW5lMi5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplX3JnYjg4OCwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikicmdiIFBsYW5lMiIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJnYiBwbGFuZTIiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgcmdiUGxhbmUyLnVfd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMi51X3N0cmlkZSA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCozOwotICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiUGxhbmUxLCAmcmdiUGxhbmUyKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHJlc2l6aW5nIFJHQjg4OCB0byBSR0I4ODg6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLypDb252ZXJ0aW5nIFJlc2l6ZWQgUkdCODg4IHRvIFlVVjQyMCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMiwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIGNvbnZlcnRpbmcgZnJvbSBSR0I4ODggdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUxLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgIH0KLWNsZWFudXA6Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIGV4aXQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZShNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cGxhbmUpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QUlSX1BhcmFtcyBhaXJQYXJhbXM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzVGVtcFszXTsKLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0KLSAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMF0ucGFjX2RhdGEsIFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVswXS51X2hlaWdodCpwT3V0cGxhbmVbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMV0udV9oZWlnaHQqcE91dHBsYW5lWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVsyXS5wYWNfZGF0YSwgVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzJdLnVfaGVpZ2h0KnBPdXRwbGFuZVsyXS51X3N0cmlkZSkpOwotICAgIH0KLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rUmVzaXppbmcpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4KLSAgICAgICAgKiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIgaW1hZ2UgcGxhbmUgKi8KLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucGxhbmUsIHBPdXRwbGFuZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVswXS5wYWNfZGF0YSArIHBPdXRwbGFuZVswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVsxXS5wYWNfZGF0YSArIHBPdXRwbGFuZVsxXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0KLSAgICAgICAgICAgIHBPdXRwbGFuZVsyXS5wYWNfZGF0YSArIHBPdXRwbGFuZVsyXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVVID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyogVG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAvKiBJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcElucGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBJbnBsYW5lLT51X3dpZHRoOwotICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwT3V0cGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBhaXJQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBPdXRwbGFuZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBPdXRwbGFuZVsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcE91dHBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFkiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInBJbWFnZVBsYW5lVGVtcCBVIikgOwotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBBbGxvYyBFcnJvciIpOwotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInBJbWFnZVBsYW5lVGVtcCBWIikgOwotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBBbGxvYyBFcnJvciIpOwotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVVID0gcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSwgVV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSwgVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocElucGxhbmUtPnVfaGVpZ2h0ICogcE91dHBsYW5lLT51X3dpZHRoKSAvcElucGxhbmUtPnVfd2lkdGg7Ci0KLSAgICAgICAgICAgIGlmIChoZWlnaHQgPD0gcE91dHBsYW5lLT51X2hlaWdodCkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCB0aGUgYm90dG9tIHNpZGUgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwT3V0cGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBOdW1iZXIgb2YgbGluZXMgYXQgdGhlIHRvcCAqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpICoKLSAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSAqCi0gICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSAqCi0gICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcE91dHBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocElucGxhbmUtPnVfd2lkdGggKiBwT3V0cGxhbmUtPnVfaGVpZ2h0KS9wSW5wbGFuZS0+dV9oZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFdpZHRoIGFuZCBoZWlnaHQgaGF2ZSB0byBiZSBldmVuICovCi0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCAqLwotICAgICAgICAgICAgaWYgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PQotICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0Nyb3BwaW5nKSB7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcE91dHBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgIGlmICgoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqCi0gICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPAotICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyogSGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwSW5wbGFuZS0+dV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBXaWR0aCB3aWxsIGJlIGNyb3BwZWQgKi8KLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KS9haXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBPdXRwbGFuZTsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fYWlyX2NvbnRleHQpIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmcEMtPm1fYWlyX2NvbnRleHQsIE00QUlSX2tZVVY0MjBQKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRBSVJfY3JlYXRlIHJldHVybmVkIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2NvbmZpZ3VyZShwQy0+bV9haXJfY29udGV4dCwgJmFpclBhcmFtcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcElucGxhbmUsIHBQbGFuZVRlbXApOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlOiBcCi0gICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMF0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVksICh2b2lkICopcEluUGxhbmVZLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lWSArPSBwT3V0cGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVsxXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lVSwgKHZvaWQgKilwSW5QbGFuZVUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBPdXRwbGFuZVsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzJdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVYgKz0gcE91dHBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwT3V0cGxhbmVbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci1jbGVhblVwOgotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiBwQ2xpcEN0eHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgZm9yIFlVViBwbGFuZQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID0KLSAgICAgKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXYiKTsKLQotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljSGVpZ2h0OwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPQotICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfaGVpZ2h0ID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGggPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoID4+IDE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhICsKLSAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aCk7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCAoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5wRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXYsCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGgsCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljSGVpZ2h0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgWVVWIGRhdGEgdG8gdGhlIGRlY29kZXIgdXNpbmcgc2V0b3B0aW9uCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiAoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSA9IE00T1NBX1RSVUU7Ci0KLSAgICAvLyBBbGxvY2F0ZSBZdXYgcGxhbmUgd2l0aCBlZmZlY3QKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikicFBsYW5lWXV2V2l0aEVmZmVjdCIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9zdHJpZGUgPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCAqIHBDLT5ld2MudWlWaWRlb1dpZHRoICogMS41LAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJpbWFnZUNsaXAgWVVWIGRhdGEiKTsKLSAgICBpZiAocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoID0KLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9zdHJpZGUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSArCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCk7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQgPj4xOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoID0KLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV9zdHJpZGUgPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoCi0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSArCi0gICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMV0udV93aWR0aCk7Ci0KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdENvbnRpZ3VvdXMsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYklzQ2xpcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggbnVtRWZmZWN0cyA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBEZWNvZGVyUmVuZGVyRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB5dXZGcmFtZVdpZHRoID0gMCwgeXV2RnJhbWVIZWlnaHQgPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwVG1wID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcFszXTsKLSAgICBNNE9TQV9VSW50OCBpID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXAsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgLyogUmVzaXplIG9yIHJvdGF0ZSBjYXNlICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoLAotICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotICAgICAgICAgICAgICAgIC8vIFNhdmUgd2lkdGggYW5kIGhlaWdodCBvZiB1bi1yb3RhdGVkIGZyYW1lCi0gICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVWaWRlbygpIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV3IHZpZGVvIHNpemUgZm9yIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocFJlc2l6ZVBsYW5lLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbnVtRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAvKiBJZiB2aWRlbyBmcmFtZSBuZWVkIHRvIGJlIHJlc2l6ZWQgb3Igcm90YXRlZCwKLSAgICAgICAgICAgICAqIHRoZW4gYXBwbHkgdGhlIG92ZXJsYXkgYWZ0ZXIgdGhlIGZyYW1lIHdhcyByZW5kZXJlZCB3aXRoIHJlbmRlcmluZyBtb2RlLgotICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lLCBwUmVzaXplUGxhbmUsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdCgpIGVyciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFJlc2l6ZVBsYW5lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgaWYgKChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgIChwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKSB7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCwgcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcFRlbXA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIChwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSxwVG1wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGV4aXN0Ki8KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLCBwQy0+eXV2Mik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0OwotICAgICAgICB9Ci0gICAgICAgIC8vIGZyZWUgdGhlIHRlbXAgYnVmZmVyCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT55dXYyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIG51bGwgZGVjb2RlciBzZXRPcHRpb24gZXJyb3IgMHgleCAiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHJlc2l6ZSBmcmFtZSBwbGFuZQotICAgICAgICBpZiAoMCAhPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgJiYKLSAgICAgICAgICAgIDE4MCAhPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMpIHsKLQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBObyByb3RhdGUgb3Igbm8gcmVzaXplIGNhc2UqLwotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywgcFBsYW5lTm9SZXNpemUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsIHBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT55dXYxLCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQy0+Yklzc2Vjb25kQ2xpcCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsIHBQbGFuZU5vUmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT55dXYyLCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdCBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywgcFRtcCwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4LCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSb3RhdGVWaWRlbyhNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgb3V0UGxhbmVbM107Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWUgIT0gMTgwKSB7Ci0gICAgICAgIC8vIFN3YXAgd2lkdGggYW5kIGhlaWdodCBvZiBpbiBwbGFuZQotICAgICAgICBvdXRQbGFuZVswXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQ7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9zdHJpZGUgPSBvdXRQbGFuZVswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVswXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVswXS51X3N0cmlkZSpvdXRQbGFuZVswXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgWSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRQbGFuZVsxXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoLzI7Ci0gICAgICAgIG91dFBsYW5lWzFdLnVfc3RyaWRlID0gb3V0UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgb3V0UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgb3V0UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAob3V0UGxhbmVbMV0udV9zdHJpZGUqb3V0UGxhbmVbMV0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgib3V0IFUgcGxhbmUgZm9yIHJvdGF0aW9uIikpOwotICAgICAgICBpZiAob3V0UGxhbmVbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzJdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMl0udV9zdHJpZGUgPSBvdXRQbGFuZVsyXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsyXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsyXS51X3N0cmlkZSpvdXRQbGFuZVsyXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgViBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN3aXRjaChyb3RhdGlvbkRlZ3JlZSkgewotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgb3V0UGxhbmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIHBQbGFuZUluKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjcwOgotICAgICAgICAgICAgTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uRGVncmVlKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMF0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCpwUGxhbmVJblswXS51X2hlaWdodCkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblsxXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblsxXS51X3dpZHRoKnBQbGFuZUluWzFdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzJdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzJdLnVfd2lkdGgqcFBsYW5lSW5bMl0udV9oZWlnaHQpKTsKLSAgICAgICAgLy8gQ29weSBZLCBVIGFuZCBWIHBsYW5lcwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotCi0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgLy8gU3dhcCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW4gcGxhbmUKLSAgICAgICAgdWludDMyX3QgdGVtcCA9IDA7Ci0gICAgICAgIHRlbXAgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblswXS51X3dpZHRoID0gcFBsYW5lSW5bMF0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9zdHJpZGUgPSBwUGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgICAgIHRlbXAgPSBwUGxhbmVJblsxXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblsxXS51X3dpZHRoID0gcFBsYW5lSW5bMV0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9zdHJpZGUgPSBwUGxhbmVJblsxXS51X3dpZHRoOwotCi0gICAgICAgIHRlbXAgPSBwUGxhbmVJblsyXS51X3dpZHRoOwotICAgICAgICBwUGxhbmVJblsyXS51X3dpZHRoID0gcFBsYW5lSW5bMl0udV9oZWlnaHQ7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfaGVpZ2h0ID0gdGVtcDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9zdHJpZGUgPSBwUGxhbmVJblsyXS51X3dpZHRoOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBpZiAocGxhbmVJbiA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJOVUxMIGluIHBsYW5lLCBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBsYW5lSW5bMF0udV93aWR0aCA9IHdpZHRoOwotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVJblswXS51X3N0cmlkZSA9IHBsYW5lSW5bMF0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMV0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICBwbGFuZUluWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lSW5bMl0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZUluWzJdLnVfc3RyaWRlID0gcGxhbmVJblsxXS51X3dpZHRoOwotCi0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjMwZjcwNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKLSAqIEBicmllZiAgICBNZWRpYSByZWFkZXJzIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgc3Vic2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBtZWRpYQotICogICAgICAgICAgICByZWFkZXJzIGFuZCBkZWNvZGVycyBmb3IgdGhlIFZTUy4gUG90ZW50aWFsIHN1cHBvcnQgY2FuCi0gKiAgICAgICAgICAgIGJlIGFjdGl2YXRlZCBvciBkZS1hY3RpdmF0ZWQKLSAqICAgICAgICAgICAgdXNpbmcgY29tcGlsYXRpb24gZmxhZ3Mgc2V0IGluIHRoZSBwcm9qZWN0cyBzZXR0aW5ncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAgICAgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIFZTUyBzcGVjaWZpYyB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIiAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIG1vZHVsZSAqLwotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBSZWFkZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHJlYWRlciBtdXN0IGJlIGRlZmluZWQgKi8KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotI2Vycm9yICJubyByZWFkZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgTVBFRzQgZGVjb2RlciAqLwotI2lmICFkZWZpbmVkKE00VlNTX1NVUFBPUlRfVklERUNfM0dQKSAmJiAhZGVmaW5lZChNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMpCi0jZXJyb3IgIldhaXQsIHdoYXQ/IgotLyogIkhleSwgdGhpcyBpcyB0aGUgVlNTM0dQUCBzcGVha2luZy4gUHJheSB0ZWxsLCBob3cgdGhlIGhlY2sgZG8geW91IGV4cGVjdCBtZSB0byBiZSBhYmxlIHRvIGRvCi1hbnkgZWRpdGluZyB3aXRob3V0IGEgYnVpbHQtaW4gdmlkZW8gZGVjb2Rlciwgbm9yIHRoZSBwb3NzaWJpbGl0eSB0byByZWNlaXZlIGFuIGV4dGVybmFsIG9uZT8hCi1TZXJpb3VzbHksIEknZCBsb3ZlIHRvIGtub3cuIiAqLwotI2VuZGlmCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggcmVhZGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLSNlbmRpZgotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIGF1ZGlvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9OdWxsLmgiCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jaW5jbHVkZSAiTTRBRF9OdWxsLmgiCi0jZW5kaWYKLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogV3JpdGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSB3cml0ZXIgbXVzdCBiZSBkZWZpbmVkICovCi0vLyNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSNlcnJvciAibm8gd3JpdGVyIHJlZ2lzdGVyZWQiCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAqLwotLy8jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SICovCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggd3JpdGVyIHRvIHN1YnNjcmliZSAqLwotLy8jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0vKmV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfQU1SX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOyovCi0vLyNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTClcCi0gICAgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgaW4gdGhlIFZTUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDb250ZXh0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgICAgIHJlYWRlck1lZGlhVHlwZTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSAgICAgd3JpdGVyTWVkaWFUeXBlOwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBwV3JpdGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICBhdWRpb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICBhdWRpb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqIHBBdWRpb0NvZGVjSW50ZXJmYWNlOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgIHZpZGVvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgIHZpZGVvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBwVmlkZW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgcFZpZGVvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSAzR1AgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1SIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotICAgIGVyciA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9NUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICovCi0KLSAgICAvKiAtLS0gUENNIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNCi0gICAgZXJyID0gTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ00gaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQQ00gcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHZpZGVvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBNUEVHNCAmIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmdmlkZW9EZWNvZGVyVHlwZSwgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoIHBDb250ZXh0LCB2aWRlb0RlY29kZXJUeXBlLCBwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QRUc0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmdmlkZW9EZWNvZGVyVHlwZSwgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9IMjY0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgSDI2NCBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotICAgIGVyciA9IE00REVDT0RFUl9OVUxMX2dldEludGVyZmFjZSgKLSAgICAgICAgICAgICAgJnZpZGVvRGVjb2RlclR5cGUsICZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VkQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogXAotICAgICAgICBjYW4ndCByZWdpc3RlciB2aWRlbyBOVUxMIGRlY29kZXIiKTsKLSNlbmRpZgotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUk5CIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBBTVJOQiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFNUk5CIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFBQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFBQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgKi8KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgTVAzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVAzIGRlY29kZXIiKTsKLSNlbmRpZiAgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19NUDMgKi8KLQotCi0gICAgLyogLS0tIE5VTEwgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSAgICBlcnIgPSBNNEFEX05VTExfZ2V0SW50ZXJmYWNlKCAmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIE5VTEwgRGVjb2RlciBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLCBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEVWUkMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLQotICAgIC8qIC0tLSAzR1BQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotICAgIC8qIHJldHJpZXZlcyB0aGUgM0dQUCB3cml0ZXIgbWVkaWEgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCAmd3JpdGVyTWVkaWFUeXBlLCAmcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgJnBXcml0ZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciggcENvbnRleHQsIHdyaXRlck1lZGlhVHlwZSwgcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQUCB3cml0ZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBNUEVHNCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgIC8qIHJldHJpZXZlcyB0aGUgTVBFRzQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIE1QRUc0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotICAgIC8qIC0tLSBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBIMjYzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfSDI2MyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2MyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0gICAgLyogcmV0cmlldmVzIHRoZSBIMjY0IGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0NvZGVjVHlwZSwgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogTTRIMjY0RSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2NCBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUgotICAgIC8qIHJldHJpZXZlcyB0aGUgQU1SIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9Db2RlY1R5cGUsICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBTVIgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDCi0gICAgLyogcmV0cmlldmVzIHRoZSBBQUMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FBQygmYXVkaW9Db2RlY1R5cGUsICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBQUMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgKi8KLQotICAgIC8qIC0tLSBFVlJDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0VWUkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEVWUkMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRFVlJDX2dldEludGVyZmFjZXMoICZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRFVlJDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLCBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBFVlJDIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQyAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgcENvbnRleHQtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSA9IE00T1NBX1RSVUU7ICAgLyogd2hlbiBOWFAgU1cgY29kZWNzIGFyZSByZWdpc3RlcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhbGxvdyB1bnJlZ2lzdHJhdGlvbiovCi0jZW5kaWYKLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWY1NDEwYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00eFZTU19BUEkuYwotICogQGJyaWVmICAgIEFQSSBvZiBlWHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiBPU0FMIG1haW4gdHlwZXMgYW5kIGVycm9ycyAqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaCIKLQotLyoqCi0gKiBWU1MgM0dQUCBBUEkgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqCi1CZWdpbiBvZiB4VlNTIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotCi0vKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19Jbml0KE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgeFZTUwotICogQG5vdGUgICAgICAgIEluaXRpYWxpemVzIHRoZSB4VlNTIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcGFyYW1zICAgICAgICAgICAgICAgIChJTikgUGFyYW1ldGVycyBtYW5kYXRvcnkgZm9yIHhWU1MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX0luaXQoIE00T1NBX0NvbnRleHQgKnBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyAqcFBhcmFtcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMCwgaTsKLQotICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlBhcmFtZXRlciBzdHJ1Y3R1cmUgZm9yIE00eFZTU19Jbml0IGZ1bmN0aW9uIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cEZpbGVSZWFkUHRyID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcFBhcmFtcy0+cEZpbGVXcml0ZVB0ciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgInBGaWxlUmVhZFB0ciBvciBwRmlsZVdyaXRlUHRyIGluIE00eFZTU19Jbml0UGFyYW1zIHN0cnVjdHVyZSBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQ29udGV4dCksIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIHhWU1MgbGF5ZXIiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSBmaWxlIHJlYWQvd3JpdGUgZnVuY3Rpb25zIHBvaW50ZXJzICovCi0gICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIgPSBwUGFyYW1zLT5wRmlsZVJlYWRQdHI7Ci0gICAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyID0gcFBhcmFtcy0+cEZpbGVXcml0ZVB0cjsKLQotICAgIC8qVVRGIENvbnZlcnNpb24gc3VwcG9ydDogY29weSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBwb2ludGVycyBhbmQgYWxsb2NhdGUgdGhlIHRlbXBvcmFyeQotICAgICBidWZmZXIqLwotICAgIGlmKCBwUGFyYW1zLT5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3Q7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ID0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wQ29udlRvVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPQotICAgICAgICAgICAgICAgIFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDgpLAotICAgICAgICAgICAgICAgIE00VkEsIChNNE9TQV9DaGFyICopIk00eFZTU19Jbml0OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19Jbml0OiBvbmUgVVRGIGNvbnZlcnNpb24gcG9pbnRlciBpcyBudWxsIGFuZCB0aGUgb3RoZXJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgbnVsbCIpOwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9IDA7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyID0KLSAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBQYXJhbXMtPnBUZW1wUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qTm8gbmVlZCB0byBjb252ZXJ0IGludG8gVVRGOCBhcyBhbGwgaW5wdXQgb2YgeFZTUyBhcmUgaW4gVVRGOAotICAgICAgICAodGhlIGNvbnZlcnNpb24gY3VzdG9tZXIgZm9ybWF0IGludG8gVVRGOAotICAgICAgICBpcyBkb25lIGluIFZBL1ZBTCkqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4ocFBhcmFtcy0+cFRlbXBQYXRoKSArIDEsCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIFBhdGggZm9yIHRlbXBvcmFyeSBmaWxlcyIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgKHZvaWQgKilwUGFyYW1zLT5wVGVtcFBhdGgsCi0gICAgICAgICAgICBzdHJsZW4ocFBhcmFtcy0+cFRlbXBQYXRoKSArIDEpOwotICAgICAgICAvKiBUT0RPOiBDaGVjayB0aGF0IG5vIHByZXZpb3VzIHhWU1MgdGVtcG9yYXJ5IGZpbGVzIGFyZSBwcmVzZW50ID8gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlBhdGggZm9yIHRlbXBvcmFyeSBmaWxlcyBpcyBOVUxMIik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9Ci0gICAgICAgIChNNFZTUzNHUFBfRWRpdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfRWRpdFNldHRpbmdzKSwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGggPSBNNE9TQV9OVUxMOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHBvaW50ZXJzIGluIHBTZXR0aW5ncyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsgLyogUkMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogVGhpcyBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIHVzZXIgaGFzIGFkZGVkIG9yIHJlbW92ZWQgc29tZSBtZWRpYXMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciA9IDA7Ci0KLSAgICAvKiAiU3RhdGUgbWFjaGluZSIgKi8KLSAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogSW5pdGlhbGl6ZSBQdG8zR1BQIGFuZCBNQ1MgbGlzdHMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotCi0gICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4ID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMDsKLQotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qRkI6IGluaXRpYWxpemUgdG8gYXZvaWQgY3Jhc2ggd2hlbiBlcnJvciBkdXJpbmcgdGhlIGVkaXRpbmcqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogSW5pdGlhbGl6ZSBzdGF0ZSBpZiBhbGwgaW5pdGlhbGl6YXRpb25zIGFyZSBjb3JyZWN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsKLQotICAgIC8qIGluaXRpYWxpemUgTUNTIGNvbnRleHQqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU19DdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHhWU1NfY29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZ2l2ZW4gZWRpdGluZyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8KLSAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgaWYgbmVlZGVkLCBjaGFuZ2VzIHRoZQotICogICAgICAgICAgICAgICAgb3V0cHV0IHBhcmFtZXRlcnMgKFZpZGVvIGNvZGVjLCB2aWRlbyBzaXplLCBhdWRpbyBjb2RlYywKLSAqICAgICAgICAgICAgICAgIGF1ZGlvIG5iIG9mIGNoYW5uZWxzKSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9Cb29sIGJBdWRpb1RyYW5zaXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZDsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9Db25maWdbOV0gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBWaWRlbyBjb25maWcgKiovCi0gICAgLyogMDogICAgICAgIEgyNjMgIFNRQ0lGICAgICAgICAqLwotICAgIC8qIDE6ICAgICAgICBIMjYzICBRQ0lGICAgICAgICAqLwotICAgIC8qIDI6ICAgICAgICBIMjYzICBDSUYgICAgICAgICovCi0gICAgLyogMzogICAgICAgIE1QRUc0IFNRQ0lGICAgICAgICAqLwotICAgIC8qIDQ6ICAgICAgICBNUEVHNCBRUVZHQSAgICAgICAgKi8KLSAgICAvKiA1OiAgICAgICAgTVBFRzQgUUNJRiAgICAgICAgKi8KLSAgICAvKiA2OiAgICAgICAgTVBFRzQgUVZHQSAgICAgICAgKi8KLSAgICAvKiA3OiAgICAgICAgTVBFRzQgQ0lGICAgICAgICAqLwotICAgIC8qIDg6ICAgICAgICBNUEVHNCBWR0EgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgTTRPU0FfVUludDMyIGF1ZGlvQ29uZmlnWzNdID0KLSAgICB7Ci0gICAgICAgIDAsIDAsIDAKLSAgICB9OwotICAgIC8qKiBJbmRleCA8LT4gQXVkaW8gY29uZmlnICoqLwotICAgIC8qIDA6ICAgIEFNUiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAxOiAgICBBQUMgICAgMTZrSHogbW9ubyAgICAgICAgKi8KLSAgICAvKiAyOiAgICBBQUMgMTZrSHogc3RlcmVvICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkIFwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5tX3N0YXRlICE9IE00eFZTU19rU3RhdGVPcGVuZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiQmFkIHN0YXRlIHdoZW4gY2FsbGluZyBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgbnVtYmVyIG9mIGNsaXBzICovCi0gICAgaWYoIHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRoZSBudW1iZXIgb2YgaW5wdXQgY2xpcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIGJhY2tncm91bmQgbXVzaWMsIGFuZCBpZiBpdHMgYXVkaW8gd2lsbCByZXBsYWNlIGlucHV0IGNsaXAgYXVkaW8gKi8KLSAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiSXNCR01SZXBsYWNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFBhcnNlIGFsbCBjbGlwcywgYW5kIGdpdmUgb2NjdXJlbmNlcyBvZiBlYWNoIGNvbWJpbmF0aW9uICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIFdlIGlnbm9yZSBKUEcgaW5wdXQgZmlsZXMgYXMgdGhleSBhcmUgYWx3YXlzIHRyYW5zY29kZWQgKi8KLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIENvbnZlcnRlZFNpemUgPSAwOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJkNvbnZlcnRlZFNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUmVkdWNlVHJhbnNjb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSB1dGYgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgY29udmVydGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAvL2VyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAvLyAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ2hlY2sgYmVzdCB2aWRlbyBzZXR0aW5ncyAqLwotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxMjgKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDk2ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzBdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1szXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxNjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDEyMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s0XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAxNzYKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDE0NCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1sxXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbNV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gMzIwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSAyNDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbNl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gMzUyCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSAyODggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzddICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDY0MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gNDgwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzhdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIEJHTSB0aGF0IHJlcGxhY2VzIGV4aXN0aW5nIGF1ZGlvIHRyYWNrLCB3ZSBkbyBub3QgY2FyZSBhYm91dAotICAgICAgICAgICAgYXVkaW8gdHJhY2sgYXMgaXQgd2lsbCBiZSByZXBsYWNlZCAqLwotICAgICAgICAgICAgLyogSWYgbm90LCB3ZSB0cnkgdG8gbWluaW1pemUgYXVkaW8gcmVlbmNvZGluZyAqLwotICAgICAgICAgICAgaWYoIGJJc0JHTVJlcGxhY2UgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29uZmlnWzJdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIGJlc3Qgb3V0cHV0IHZpZGVvIGZvcm1hdCAodGhlIG1vc3Qgb2NjdXJpbmcgY29tYmluYXRpb24pICovCi0gICAgaiA9IDA7Ci0gICAgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IDk7IGkrKyApCi0gICAgewotICAgICAgICBpZiggdmlkZW9Db25maWdbaV0gPj0gdmlkZW9Db25maWdbal0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggYkZvdW5kICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1NRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0gyNjM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1NRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRUVZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUVZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tWR0E7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIGJlc3Qgb3V0cHV0IGF1ZGlvIGZvcm1hdCAodGhlIG1vc3Qgb2NjdXJpbmcgY29tYmluYXRpb24pICovCi0gICAgaiA9IDA7Ci0gICAgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IDM7IGkrKyApCi0gICAgewotICAgICAgICBpZiggYXVkaW9Db25maWdbaV0gPj0gYXVkaW9Db25maWdbal0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggYkZvdW5kICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggaiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2VuZENvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdG8gdGhlIHhWU1MgYW4gZWRpdGluZyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIHByZXBhcmUgZWRpdGlvbgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfSW5pdCwgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgIE00eFZTU19DbG9zZUNvbW1hbmQsIG9yIGFmdGVyIE00eFZTU19QcmV2aWV3U3RvcC4KLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcFNldHRpbmdzICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9VSW50OCBuYk9mU2FtZUNsaXAgPSAwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfQm9vbCBpc05ld0JHTSA9IE00T1NBX1RSVUU7Ci0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zICpwUHRvM0dQUF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcE1DU19sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIGhlaWdodCwgc2FtcGxpbmdGcmVxOwotICAgIE00T1NBX0Jvb2wgYklzVHJhbnNjb2RpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9JbnQzMiB0b3RhbER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgTTRPU0FfSW50OCBtYXN0ZXJDbGlwID0gLTE7Ci0KLSAgICBpID0gMDsKLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkIFwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5tX3N0YXRlICE9IE00eFZTU19rU3RhdGVPcGVuZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiQmFkIHN0YXRlIHdoZW4gY2FsbGluZyBNNHhWU1NfU2VuZENvbW1hbmQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBTdGF0ZSBpcyBiYWNrIHRvIGluaXRpYWxpemVkIHRvIGFsbG93IGNhbGwgb2YgY2xlYW51cCBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogQ2hlY2sgaWYgYSBwcmV2aW91cyBzZW5kQ29tbWFuZCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgIT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgLyogQ29tcGFyZSBCR00gaW5wdXQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICYmIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotCi0gICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBhdWRpbyBvdXRwdXQgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPT0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBCR00gaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCBzbywgbm8gbmVlZCB0byByZWRlY29kZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJCR00gaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCBub3RoaW5nIHRvIGRlY29kZSIpOwotICAgICAgICAgICAgICAgICAgICBpc05ld0JHTSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVuYWxsb2NhdGUgUENNIHByZXZpZXcgZmlsZSBwYXRoIGluIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVuYWxsb2NhdGUgUENNIHByZXZpZXcgZmlsZSBwYXRoIGluIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGlmIG91dHB1dCBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZQotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZQotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiBpdCBpcyB0aGUgY2FzZSwgd2UgY2FuJ3QgcmV1c2UgYWxyZWFkeSB0cmFuc2NvZGVkL2NvbnZlcnRlZCBmaWxlcyAqLwotICAgICAgICAgICAgLyogc28sIHdlIGRlbGV0ZSB0aGVzZSBmaWxlcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXNfc2F1djsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfc2F1dik7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXMgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3NhdXY7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfYmdtID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSwgd2UgZG8gbm90IGRlbGV0ZSBCR00gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPmlzQkdNICE9IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX2JnbSA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlBSIFA0TUUwMDAwMzE4MiBpbml0aWFsaXplIHRoaXMgcG9pbnRlciBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHdpbGwgYmUgZGVhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPmlzQkdNICE9IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtLT5wTmV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfYmdtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogTWF5YmUgbmVlZCB0byBpbXBsZW1lbnQgZnJhbWVyYXRlIGNoYW5naW5nICovCi0gICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFVuYWxsb2NhdGUgcHJldmlvdXMgeFZTU19jb250ZXh0LT5wU2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIE00eFZTU19mcmVlU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotCi0gICAgICAgIC8qVW5hbGxvY2F0ZSBvdXRwdXQgZmlsZSBwYXRoKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IDA7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgQ2xpcHMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogQ29weSBzZXR0aW5ncyBmcm9tIHVzZXIgZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIC8qeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcFNldHRpbmdzLT5wT3V0cHV0RmlsZTsqLwotICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICBUaGUgb3V0cHV0IHZpZGVvIGFuZCBhdWRpbyBiaXRyYXRlIGFyZSBnaXZlbiBieSB0aGUgdXNlciBpbiB0aGUgZWRpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+UFRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+UFRWb2xMZXZlbDsKLQotICAgIC8qRkI6IGJ1ZyBmaXggaWYgdGhlIG91dHB1dCBwYXRoIGlzIGdpdmVuIGluIE00eFZTU19zZW5kQ29tbWFuZCovCi0KLSAgICBpZiggcFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlCi0gICAgICAgIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJvdXRwdXQgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IHBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSA9IHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9Ci0gICAgICAgIDA7IC8qIFdpdGggVlNTIDIuMCwgdGhpcyBuZXcgcGFyYW0gaXMgbWFuZGF0b3J5ICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3Q7IC8qIENSIHRleHQgaGFuZGxpbmcgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZTsKLQotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCBcCi0gICAgICAgICYmIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCAhPSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfU2VuZENvbW1hbmQ6IEltcG9zc2libGUgdG8gbGltaXQgZmlsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSB3aXRoIG90aGVyIGF1ZGlvIG91dHB1dCB0aGFuIEFBQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwID0gMDsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCAhPSBNNFZJREVPRURJVElOR19rTVBFRzQKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0gyNjMKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQKLSAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0gyNjQgKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IHdpZHRoL2hlaWdodCAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgd2lkdGggPSAxMjg7Ci0gICAgICAgICAgICBoZWlnaHQgPSA5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgd2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgd2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgd2lkdGggPSAzMjA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAyNDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGhlaWdodCA9IDI4ODsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gNjQwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDgwMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICB3aWR0aCA9IDcyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogLVBSIExWNTgwNyAqLwotICAgICAgICAgICAgLyogK0NSIEdvb2dsZSAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSAzNjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4NTRfNDgwOgotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0KLSAgICAgICAgICAgIGhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgd2lkdGggPSAxMjgwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgICAgICB3aWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDk2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IE00RU5DT0RFUl8xOTIwXzEwODBfSGVpZ2h0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgZGVmYXVsdDogLyogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSAqLwotICAgICAgICAgICAgd2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBoZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogR2V0IG91dHB1dCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDE2MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMjIwNTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyNDAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDMyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gNDQxMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0ODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gODAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIGNsaXAvdHJhbnNpdGlvbnMgaWYgY2xpcCBudW1iZXIgaXMgbm90IG51bGwgLi4uICovCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopKnhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIsCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTLCBjb3B5IG9mIHBDbGlwTGlzdCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2V0IGNsaXAgbGlzdCB0byBOVUxMICovCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QsMCwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopCi0gICAgICAgICAgICAqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9Ci0gICAgICAgICAgICAgICAgKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKiogKSBcCi0gICAgICAgICAgICAgICAgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikgXAotICAgICAgICAgICAgICAgICJ4VlNTLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFNldCB0cmFuc2l0aW9uIGxpc3QgdG8gTlVMTCAqLwotICAgICAgICAgICAgbWVtc2V0KAotICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCwwLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAgICAgKih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogZWxzZSwgdGhlcmUgaXMgYSBwYiBpbiB0aGUgaW5wdXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIGNsaXAgaW4gdGhpcyBzZXR0aW5ncyBsaXN0ICEhIik7Ci0gICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAvKiovCi0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogUkMgQWxsb2NhdGUgZWZmZWN0cyBzZXR0aW5ncyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIGlmKCAwIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgICh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJlZmZlY3RzIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDg6IHRoZXNlIHBvaW50ZXJzIHdlcmUgbm90IGluaXRpYWxpemVkIC0+IGNyYXNoIHdoZW4gZnJlZSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKi8KLSAgICB9Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwVGFyZ2V0ZWRUaW1lU2NhbGUgPSAwOwotCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFRhcmdldGVkVGltZVNjYWxlKHhWU1NfY29udGV4dCwgcFNldHRpbmdzLAotICAgICAgICAgICAgJnBUYXJnZXRlZFRpbWVTY2FsZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyIHx8IHBUYXJnZXRlZFRpbWVTY2FsZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSBwVGFyZ2V0ZWRUaW1lU2NhbGU7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0b3RhbCBkdXJhdGlvbiB2YXJpYWJsZSAqLwotICAgIHRvdGFsRHVyYXRpb24gPSAwOwotCi0gICAgLyogUGFyc2luZyBsaXN0IG9mIGNsaXBzIGdpdmVuIGJ5IGFwcGxpY2F0aW9uLCBhbmQgcHJlcGFyZSBhbmFseXppbmcgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICAvKiBBbGxvY2F0ZSBjdXJyZW50IGNsaXAgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgY2xpcCBzZXR0aW5ncyBmcm9tIGdpdmVuIHN0cnVjdHVyZSB0byBvdXIgeFZTU19jb250ZXh0IHN0cnVjdHVyZSAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sIE00T1NBX1RSVUUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgcmV0dXJuIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICBpZiggaSA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9Ci0gICAgICAgICAgICAgICAgKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikidHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSk7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIGV4dGVybmFsIGVmZmVjdCBjb250ZXh0IHRvIE5VTEwsIHRvIGtub3cgaWYgaW5wdXQganBnIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgIGRlY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRyYW5zaXRpb24gdHlwZSBpcyBhbHBoYSBtYWdpYywgd2UgbmVlZCB0byBkZWNvZGUgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91ciBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gaGF2ZSBhIGNvcHkgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIG9uZSAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gICAgICBcCi0gICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncyksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJJbnB1dCBBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgYWxwaGEgbWFnaWMgc2V0dGluZ3Mgc3RydWN0dXJlIHRvdSBvdXIKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIGlucHV0IGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikiQWxwaGEgbWFnaWMgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IGRhdGEgZnJvbSB0aGUgcHJvdmlkZWQgYWxwaGEgbWFnaWMgZmlsZW5hbWUgdG8gb3VyICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock5Db3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgc3RybGVuKAotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCkgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBQYXJzZSBhbGwgdHJhbnNpdGlvbiB0byBrbm93IGlmIHRoZSBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbiBkZWNvZGVkICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgaTsgaisrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYVNldHRpbmdzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxwaGEgbWFnaWMgc2V0dGluZ3Mgc3RydWN0dXJlIDEiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+cFBsYW5lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLnRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPmJsZW5kaW5nUGVyY2VudCA+IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPmJsZW5kaW5nUGVyY2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+aXNyZXZlcnNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBqcGcgZmlsZSBmb3IgYWxwaGEgbWFnaWMgaGFzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gZGVjb2RlZCAtPiBubyBuZWRkIHRvIGRlY29kZSBpdCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IGFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBqcGcgaGFzIG5vdCBiZWVuIGRlY29kZWQgeWV0IC4uLiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpvdXRwdXRQbGFuZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MgKmFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGhfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+d2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0X0FSR0I4ODggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPmhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVHJhbnNpdGlvbkxpc3RNNHhWU1NfU2VuZENvbW1hbmQgd2lkdGggU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoX0FSR0I4ODgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCBoZWlnaHQhIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IHBsYW5lIGZvciBBbHBoYSBtYWdpYyB0cmFuc2l0aW9uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBvdXRwdXRQbGFuZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnVfc3RyaWRlID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoIHdpZHRoICogaGVpZ2h0ICogMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvYyBmb3IgdGhlIEFscGhhIG1hZ2ljIHBhY19kYXRhIG91dHB1dCBZVVYiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVswXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMF0udV93aWR0aCAqIG91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV93aWR0aCA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfc3RyaWRlID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnBhY19kYXRhID0gb3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggKiBvdXRwdXRQbGFuZVsxXS51X2hlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBwQ29udkZyb21VVEY4RmN0IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogY29udmVydCArIHJlc2l6aW5nIGZyb20gQVJHQjg4ODggdG8geXV2NDIwICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgb3V0cHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCwgaGVpZ2h0X0FSR0I4ODgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG91dHB1dFBsYW5lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gZGVjb2RpbmcgYWxwaGEgbWFnaWMgSlBFRzogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgYWxwaGEgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKSJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggYWxwaGFTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPSBvdXRwdXRQbGFuZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kaW5nUGVyY2VudCA+IDAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50IDw9IDEwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kaW5nUGVyY2VudCkgKiAyNTUgLyAyMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+aXNyZXZlcnNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3JldmVyc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gTTR4VlNTX0FscGhhTWFnaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IGFscGhhU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICpzbGlkZVNldHRpbmdzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkludGVybmFsIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gc2xpZGVTZXR0aW5ncyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBjb3B5IHRoZSBsb25lIHBhcmFtZXRlciBmcm9tIHRoZSBpbnB1dCBzZXR0aW5ncyB0byB0aGUgaW50ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzLT5kaXJlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLnRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MtPmRpcmVjdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbmVlZCB0byBrZWVwIG91ciBjb3B5IG9mIHRoZSBzZXR0aW5ncy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfU2xpZGVUcmFuc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBzbGlkZVNldHRpbmdzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRmFkZUJsYWNrOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSAmTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbDoKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+RXh0VmlkZW9UcmFuc2l0aW9uRmN0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvVHJhbnNpdGlvblR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoCi0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbF9kdXJhdGlvbiB3aXRoIHRyYW5zaXRpb24gZHVyYXRpb24gKi8KLSAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gLT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+dWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PQotICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuaXNQYW5ab29tKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgb3V0X2ltZ190bXBbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zICpwUGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBBUkdCRmlsZUluOwotICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICAgICAgLyogUGFyc2UgUHRvM0dQUCBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGtub3cgaWYgaW5wdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICAgICAgICAgICAgY29udmVydGVkICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAgICAgLyogV2UgcGFyc2UgYWxsIFB0bzNncHAgUGFyYW0gY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ21wUmVzdWx0ID0gc3RyY21wKChjb25zdCBjaGFyICopcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVJbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPmR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPmR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgSlBHIGZpbGVuYW1lIHdpdGggZXhpc3RpbmcgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlQVJHQl8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHZhcmlhYmxlLCBpbiBjYXNlIHNvbWUgcGljdHVyZXMgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgYmV0d2VlbiB0d28gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWcsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAoTTRPU0FfQ2hhciAqKSIlc2ltZyVkLjNncCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfY2hyU1ByaW50ZihvdXRfaW1nX3RtcCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsICIlc2ltZyVkLnRtcCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAjZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgbGFzdCBlbGVtZW50IFB0bzNHUFAgcGFyYW1zIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMgPSAoTTR4VlNTX1B0bzNHUFBfcGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUHRvM0dQUF9wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIFB0bzNHUFAgUGFyYW1zIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgUHRvM0dQUCBQYXJhbXMiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemVzIHBmaWxleHh4IG1lbWJlcnMgb2YgcFBhcmFtcyB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBjb3JyZWN0bHkgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wTmV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgPSBNNHhWU1Nfa1Jlc2l6aW5nOwotCi0gICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDpnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5oZWlnaHQgPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0tPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7IC8vQVJHQl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPndpZHRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbCi0gICAgICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY1dpZHRoOyAvL0FSR0JfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiQ0xJUCBNNHhWU1NfU2VuZENvbW1hbmQgQVJHQjg4ODggSCA9ICVkIiwgcFBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBXID0gJWQiLCBwUGFyYW1zLT53aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGVsZW1lbnQgaW4gY2FzZSBvZiBvdGhlciBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBwb2ludGVyIG9mIHRoZSBwcmV2aW91cyBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHNhdmUgb2YgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19QdG8zR1BQX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgZHVyYXRpb24gaXMgZmlsbGVkLCBsZXQncyB1c2UgaXQgaW5zdGVhZCBvZiBFbmRDdXRUaW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBpbnB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBKUEcgZmlsZSBpcyBwcmVzZW50IG9uIHRoZSBGUyAoUDRNRTAwMDAyOTc0KSBieSBqdXN0IG9wZW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgY2xvc2luZyBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCRmlsZUluLCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3Qgb3BlbiBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiQ2FuJ3QgY2xvc2UgaW5wdXQganBnIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGgsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfaW1nLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBwQ29udkZyb21VVEY4RmN0IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgb3V0cHV0IGZpbGUgcGF0aCAqLwotCi0gICAgI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X2ltZ190bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWdfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVUZW1wLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IHRlbXBvcmFyeSBmaWxlIHBhdGggKi8KLQotICAgICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWxsIFBhbkFuZFpvb20gc2V0dGluZ3MgaWYgbmVlZGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20gKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuaXNQYW5ab29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUGFuICYgWm9vbSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYSA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFlhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tWGIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tWGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRZYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tWGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRYYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5QYW5ab29tVG9wbGVmdFliID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKyBQUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qSW50aWFsaXppbmcgdGhlIFZpZGVvIEZyYW1lIFJhdGUgYXMgaXQgbWF5IG5vdCBiZSBpbnRpYWxpemVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0ludGVybmFsLmMgQCBsaW5lIDE1MTggaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCovCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAzMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDQwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gODA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rN181X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gMTMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAyMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNYWtpbmcgRGVmYXVsdCBGcmFtZSBSYXRlIEAgMTUgRlBTKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNjY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyotUFIgTm86IGJscm54cHN3IzIyMyovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa1Jlc2l6aW5nICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQ3JlYXRlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYlRyYW5zY29kaW5nUmVxdWlyZWQgdG8gVFJVRSB0byBpbmRpY2F0ZSB0aGUga2VuYnVybiB2aWRlbyBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICogYmVlbiBnZW5lcmF0ZWQgaW4gYW5hbHlzaXMgcGhhc2UsIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHRhbnNjb2RlZCBhZ2FpbgotICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiBzYXZpbmcgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0KLSAgICByZXBsYWNlQVJHQl8zR1A6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gcFBhcmFtcy0+ZHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBKUEcgZmlsZSBieSB0aGUgM2dwIGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gVVRGOCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ4VlNTIGZpbGUgcGF0aCBvZiBBUkdCIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURjE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAzR1AgaW5wdXQgZmlsZSB0eXBlIGNhc2UKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogTmVlZCB0byBjYWxsIE1DUyBpbiBjYXNlIDNHUCB2aWRlby9hdWRpbyB0eXBlcyBhcmUgbm90IGNvbXBhdGlibGUKLSAgICAgICAgICAgIChIMjYzL01QRUc0IG9yIEFNUk5CL0FBQykgKi8KLSAgICAgICAgICAgIC8qID0+IE5lZWQgdG8gZmlsbCBNQ1NfUGFyYW1zIHN0cnVjdHVyZSB3aXRoIHRoZSByaWdodCBwYXJhbWV0ZXJzICEgKi8KLSAgICAgICAgICAgIC8qIE5lZWQgYWxzbyB0byBwYXJzZSBNQ1MgcGFyYW1zIHN0cnVjdCB0byBjaGVjayBpZiBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNjb2RlZCAqLwotCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIHZpZGVvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgYkF1ZGlvTW9ubzsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZmlsZSBwcm9wZXJ0aWVzIHN0cnVjdHVyZSAqLwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKikgJmZpbGVQcm9wZXJ0aWVzLDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7Ci0KLSAgICAgICAgICAgIC8vZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLQotICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIGJhZCBpbml0aWFsaXppbmcgb2YgcGVyY2VudGFnZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSBjdXQgdGltZSBoYXZlIHByb2JhYmx5IG5vdCBiZWVuIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICAgICAgLyogTGV0J3Mgbm90IHVzZSB0aGVtIGJ5IHNldHRpbmcgdGhlbSB0byAwICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQgPQotICAgICAgICAgICAgICAgICAgICAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGtub3cgaWYgaW5wdXQgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBDbXBSZXN1bHQgPSAwOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgLyogV2UgcGFyc2UgYWxsIE1DUyBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSggcFBhcmFtcyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBQYXJhbXMtPnBGaWxlSW47Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCByZXR1cm5zIGVycjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgaW5wdXQgZmlsZW5hbWVzIGFyZSB0aGUgc2FtZSwgYW5kIGlmIHRoaXMgaXMgbm90IGEgQkdNLCB3ZSBjYW4gcmV1c2UKLSAgICAgICAgICAgICAgICAgICAgdGhlIHRyYW5zY29kZWQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcENtcFJlc3VsdCA9PSAwICYmIHBQYXJhbXMtPmlzQkdNID09IE00T1NBX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBQYXJhbXMtPkVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPkVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgID09IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSAzR1AgZmlsZW5hbWUgd2l0aCB0cmFuc2NvZGVkIDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2UzR1BfM0dQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSAzR1AgZmlsZW5hbWUgd2l0aCB0cmFuc2NvZGVkIDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIHZhcmlhYmxlLCBpbiBjYXNlIHNvbWUgM0dQIGZpbGVzIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAvKiBjYWxscyB0byBNNHhWU1Nfc2VuZENvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGxldCdzIHVzZSBpdC4uLiAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlFbmRDdXRQZXJjZW50ICE9IDAKLSAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpQmVnaW5DdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBhcmUgbm90IGNvcnJlY3QgYW5kIGlmIGR1cmF0aW9uIGZpZWxkIGlzIG5vdCBmaWxsZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgPD0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQpCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogQmFkIHBlcmNlbnRhZ2UgZm9yIGJlZ2luIGFuZCBlbmQgY3V0IHRpbWUgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSB0cmFuc2Zvcm0gdGhlIHBlcmNlbnRhZ2UgaW50byBhYnNvbHV0ZSB0aW1lICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgKiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAvIDEwMCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIC4uLk90aGVyd2lzZSwgd2UgdXNlIGFic29sdXRlIHRpbWUuICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSWYgZW5kQ3V0VGltZSA9PSAwLCBpdCBtZWFucyBhbGwgdGhlIGZpbGUgaXMgdGFrZW4uIExldCdzIGNoYW5nZSB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIGR1cmF0aW9uLCB0byBhY2N1cmF0ZSBwcmV2aWV3LiAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPT0gMAotICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBmaWVsZCBpcyBmaWxsZWQsIGl0IGhhcyBwcmlvcml0eSBvbiBvdGhlciBmaWVsZHMgb24gRW5kQ3V0VGltZSwKLSAgICAgICAgICAgICBzbyBsZXQncyB1c2UgaXQgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgK3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiBvdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHdlIHRha2UgdmlkZW8gZm9ybWF0IG9mIHRoZSBmaXJzdCAzR1AgdmlkZW8gKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lVmlkZW8gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGU7Ci0gICAgICAgICAgICAgICAgLy9NNE9TQV9UUkFDRTJfMSgiT3V0cHV0IHZpZGVvIGZvcm1hdCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gY3VycmVudCBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgLy8geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IHZpZGVvIGZvcm1hdCBpcyBub3Qgc2V0LCBhbiBlcnJvciBwYXJhbWV0ZXIgaXMgcmV0dXJuZWQuIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICAgICAgICAgIk91dHB1dCBhdWRpbyBmb3JtYXQgaXMgbm90IHNldCAtPiByZW1vdmUgYXVkaW8gdHJhY2sgb2YgY2xpcDogJWQiLAotICAgICAgICAgICAgICAgICAgICBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICAgICAgICAgICYmIChmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IHNhbXBsaW5nRnJlcQotICAgICAgICAgICAgICAgIHx8IGJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIC8qIElmIHdlIHdhbnQgdG8gcmVwbGFjZSBhdWRpbywgdGhlcmUgaXMgbm8gbmVlZCB0byB0cmFuc2NvZGUgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRlbXAgZml4IDpQVCB2b2x1bWUgbm90IGhlcmFkIGluIHRoZSBzZWNvbmQgY2xpcCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggLyoocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwqLwotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkgLyoxMS8xMi8yMDA4IENSIDMyODMgVkFMIGZvciB0aGUgTU1TCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2UgY2FzZSwgd2UgbmVlZCB0byB0cmFuc2NvZGUgZXhjZXB0IHRoZSBtZWRpYSB3aXRob3V0IGF1ZGlvKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBIZXJlIGNoZWNrIHRoZSBjbGlwIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsLCBpZiBpdCBleGNlZWRzCi0gICAgICAgICAgICAgKiB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgb2YgZXhwb3J0IGZpbGUsIHRoZW4gdGhlIGZpbGUgbmVlZHMKLSAgICAgICAgICAgICAqIHRvIGJlIHRyYW5zY29kZWQoZG8gbm90IGRvIGNvbXByZXNzIGRvbWFpbiB0cmltKS4KLSAgICAgICAgICAgICAqIEFsc28gZm9yIE1QRUc0IGZvbWFydCwgYWx3YXlzIGRvIHRyYW5zY29kaW5nIHNpbmNlIEhXIGVuY29kZXIKLSAgICAgICAgICAgICAqIG1heSB1c2UgZGlmZmVyZW50IHRpbWUgc2NhbGUgdmFsdWUgdGhhbiB0aGUgaW5wdXQgY2xpcCovCi0gICAgICAgICAgIGlmICgoZmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUgPgotICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPgotICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCkgfHwKLSAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkpIHsKLSAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSB2aWRlbyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgKiB0cmFuc2NvZGVkIGluIE1DUy4gKi8KLSAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmJUcmFuc2NvZGluZ1JlcXVpcmVkID0KLSAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSB8fCBhdWRpb0lzRGlmZmVyZW50ID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgb3V0XzNncF90bXBbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0KLSAgICAgICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF8zZ3AsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAoTTRPU0FfQ2hhciAqKSIlc3ZpZCVkLjNncCIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE9TQV9jaHJTUHJpbnRmOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF8zZ3BfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzdmlkJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX01DU19wYXJhbXMgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19NQ1NfcGFyYW1zKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgM0dQKSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+dmlkZW9jbGlwbnVtYmVyID0gaTsgLy8gSW5kaWNhdGVzIHZpZGVvIGNsaXAgaW5kZXgKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgcE1DU19sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogU2F2ZSB0aGlzIGVsZW1lbnQgaW4gY2FzZSBvZiBvdGhlciBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotCi0gICAgICAgICAgICAgICAgLyogRmlsbCB0aGUgbGFzdCBNNHhWU1NfTUNTX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3QgbmVlZCB0byByZWVuY29kZSB2aWRlbyBpZiBpdHMgcGFyYW1ldGVycyBkbyBub3QgZGlmZmVyICovCi0gICAgICAgICAgICAgICAgLyogZnJvbSBvdXRwdXQgc2V0dGluZ3MgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgIGlmKCB2aWRlb0lzRGlmZmVyZW50ID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdHJhdGUgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uCi0gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHN0cnVjdHVyZSBJZiB0aGUgYml0cmF0ZSBnaXZlbiBieSB0aGUgdXNlciBpcyBpcnJlbGV2YW50Ci0gICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gdmlkZW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBoYXJkY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBvdXRwdXQgdmlkZW8gc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2s4X01CUFMgKSAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzg0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIFNob3VsZCBub3QgaGFwcGVuICEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOdWxsVmlkZW87Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxNV9GUFM7IC8qIE11c3QgYmUgc2V0LCBvdGhlcndpc2UsIE1DUyByZXR1cm5zIGFuIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYml0cmF0ZSBnaXZlbiBieSB0aGUgdXNlciBpcyBpcnJlbGV2YW50IG9yIHVuZGVmaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIE1DUyBtaW5pbXVtIGFuZCBtYXhpbXVtIGF1ZGlvIGJpdHJhdGUgYXJlIHVzZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGF1ZGlvIGJpdHJhdGUgaXMgaGFyZCBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMTZfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDMya2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMzJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGF1ZGlvIGJpdHJhdGUgaXMgaGFyZCBjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcgZnJlcXVlbmN5Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBiaXRyYXRlIGhhdmUgdG8gYmUgZG91YmxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2s4MDAwX0FTRiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByZXZlbnQgZnJvbSB1bmFsbG93ZWQgc2FtcGxpbmcgZnJlcXVlbmNpZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgM0dQIFBhcmFtczogZmlsZSBpbiIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBpbnB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncDsKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgM0dQIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIHRlbXAiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IHRlbXBvcmFyeSBmaWxlIHBhdGggKi8KLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgLypGQiAyMDA4LzEwLzIwIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvLCBhZGQgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciovCi0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa0Nyb3BwaW5nCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+QmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+RW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5pc0JHTSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQ3JlYXRlZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwrKzsKLSAgICAgICAgICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0KLXJlcGxhY2UzR1BfM0dQOgotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgIC0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZXBsYWNpbmcgaW4gVlNTIHN0cnVjdHVyZSB0aGUgb3JpZ2luYWwgM0dQIGZpbGUgYnkgdGhlIHRyYW5zY29kZWQgM0dQIGZpbGUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBQYXJhbXMtPnBGaWxlT3V0OwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIDNncCB0byAzZ3AiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgKGxlbmd0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgZmlsZSBwYXRoIHNpemUgYmVjYXVzZSBvZiBVVEYgMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0KLSAgICAgICAgICAgICAgICAvKiBXZSBkZWZpbmUgbWFzdGVyIGNsaXAgYXMgZmlyc3QgM0dQIGlucHV0IGNsaXAgKi8KLSAgICAgICAgICAgICAgICAvKmlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU1hc3RlckNsaXAgPT0gMCAmJiBmaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgaWYoIG1hc3RlckNsaXAgPT0gLTEKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgT3RoZXIgaW5wdXQgZmlsZSB0eXBlIGNhc2UKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgZmlsZSB0eXBlIGFzIGlucHV0IGNsaXAiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogUGFyc2UgYWxsIGVmZmVjdHMgdG8gbWFrZSBzb21lIGFkanVzdG1lbnQgZm9yIGZyYW1pbmcsICoKLSAgICAqIHRleHQgYW5kIHRvIHRyYW5zZm9ybSByZWxhdGl2ZSB0aW1lIGludG8gYWJzb2x1dGUgdGltZSAqCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBmb3IgKCBqID0gMDsgaiA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7IGorKyApCi0gICAgewotICAgICAgICAvKiBDb3B5IGVmZmVjdCB0byAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICAodm9pZCAqKSAmKHBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgLyogUHJldmVudCBmcm9tIGJhZCBpbml0aWFsaXppbmcgb2YgZWZmZWN0IHBlcmNlbnRhZ2UgdGltZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA+IDEwMAotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudCA+IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZXNlIHBlcmNlbnRhZ2UgdGltZSBoYXZlIHByb2JhYmx5IG5vdCBiZWVuIGluaXRpYWxpemVkICovCi0gICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgPSAwOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uIE90aGVyd2lzZSwgd2UgdXNlIGFic29sdXRlIHRpbWUuICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgRWZmZWN0c1tqXS51aVN0YXJ0VGltZSA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlTdGFydFBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgICAgICAvKiBUaGUgcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24gaXMgYmFzZWQgb24gdGhlIGR1cmF0aW9uIG9mIHRoZSBjbGlwIC0KLSAgICAgICAgICAgIHN0YXJ0IHRpbWUgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKSh0b3RhbER1cmF0aW9uCi0gICAgICAgICAgICAgICAgKiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50Ci0gICAgICAgICAgICAgICAgLyAxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYSBmcmFtaW5nIGVmZmVjdCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBmcmFtaW5nIGVmZmVjdCBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZyApCi0gICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotI2Vsc2UKLQotICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKmZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgTTRPU0FfQ2hhciAqcEV4dDIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHJlc3VsdDEsIHJlc3VsdDI7Ci0KLSAgICAgICAgICAgIC8qIENvcHkgZnJhbWluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKQotICAgICAgICAgICAgICAgICAgICArIDEsIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIEZyYW1pbmcgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCwgc3RybGVuKAotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgcEV4dDIgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nQ29udGV4dAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIGZyYW1pbmcgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+YkVmZmVjdFJlc2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlV3JpdGVQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHI7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5lZmZlY3REdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfSXNGaWxlR2lmID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgLyogT3V0cHV0IHJhdGlvIGZvciB0aGUgZWZmZWN0IGlzIHN0b3JlZCBpbiB1aUZpZnRpZXNPdXRGcmFtZVJhdGUgcGFyYW1ldGVycyBvZiB0aGUKLSAgICAgICAgICAgIGV4dGVuZGVkIHhWU1MgZWZmZWN0cyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZQotICAgICAgICAgICAgICAgICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9GbG9hdCkoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUpIC8gMTAwMC4wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5mcmFtZUR1cmF0aW9uUmF0aW8gPSAxLjA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYWxwaGEgYmxlbmRpbmcgcGFyYW1ldGVycyBhcmUgY29ycmVjdHMqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID4gMAotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbGxvY2F0ZSB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZQotICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMCAtIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoOwotICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkxvY2FsIEZyYW1pbmcgZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgICAgICAvKiBTYXZlIGZyYW1pbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eDsKLQotI2Vsc2UKLQotICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAgICAgICAgIGlmKCBwRXh0MiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWNvZGUgdGhlIGltYWdlIGFzc29jaWF0ZWQgdG8gdGhlIGVmZmVjdCwgYW5kIGZpbGwgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBwRXh0MiArPSAoc3RybGVuKChjb25zdCBjaGFyICopcEV4dDIpIC0gNCk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQxID0gc3RyY21wKChjb25zdCBjaGFyICopcEV4dDIsKGNvbnN0IGNoYXIgKikiLnJnYiIpOwotICAgICAgICAgICAgICAgIHJlc3VsdDIgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIuUkdCIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggMCA9PSByZXN1bHQxIHx8IDAgPT0gcmVzdWx0MiApCi0gICAgICAgICAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbERlY29kZUdJRjogQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgU1BTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBDdXJyZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qIE9ubHkgdXNlZCBieSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLndpZHRoOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MuaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkZSQU1NSU5HIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgJih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCx4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiRlJBTUlORyBXSURUSCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiRlJBTUlORyBIRUlHSFQgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HIHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBOb3Qgc3VwcG9ydGVkIHN0aWxsIHBpY3R1cmUgZm9ybWF0IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwUGxhbmUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkNvbnRleHQgb2YgdGhlIGZyYW1pbmcgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgICAgICAvKiBGb3JjZSBpbnB1dCBSR0IgYnVmZmVyIHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4gWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlICAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICAgICAgICAgICAgICAvKiBGb3JjZSBpbnB1dCBSR0IgYnVmZmVyIHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4gWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi51X2hlaWdodCAmIH4xOwotICAgICAgICAgICAgICAgIC8qIElucHV0IFJHQiBwbGFuZSBpcyBwcm92aWRlZCwgbGV0J3MgY29udmVydCBpdCB0byBZVVY0MjAsIGFuZCB1cGRhdGUgZnJhbWluZwotICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBObyBpbnB1dCBpbWFnZS9wbGFuZSBwcm92aWRlZCBmb3IgZnJhbWluZyBlZmZlY3QuIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIENSOiBBZGQgdGV4dCBoYW5kbGluZyB3aXRoIGV4dGVybmFsIHRleHQgaW50ZXJmYWNlICovCi0gICAgICAgIC8qIElmIGVmZmVjdCB0eXBlIGlzIHRleHQsIHdlIGNhbGwgZXh0ZXJuYWwgdGV4dCBmdW5jdGlvbiB0byBnZXQgUkdCIDU2NSBidWZmZXIgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENhbGwgdGhlIGZvbnQgZW5naW5lIGZ1bmN0aW9uIHBvaW50ZXIgdG8gZ2V0IFJHQjU2NSBidWZmZXIgKi8KLSAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0ZXh0IGVmZmVjdCBpbnRvIGZyYW1pbmcgZWZmZWN0IGZyb20gYnVmZmVyICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypGQjogYWRkIFVURiBjb252ZXJ0aW9uIGZvciB0ZXh0IGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdDb250ZXh0ICpmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKmZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YkVmZmVjdFJlc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MuYlJlc2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVSZWFkUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHI7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5lZmZlY3REdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX2FuaW1hdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIGZyYW1pbmcgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nKi8KLSAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPSAxMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgID4gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKkZpbGwgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QgKGZvciB0ZXh0KSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSNlbmRpZgotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eDsKLQotICAgICAgICAgICAgICAgIC8qIEZCOiBjaGFuZ2VzIGZvciBWaWRlbyBBcnRpc3Q6IG1lbWNvcHkgcFRleHRCdWZmZXIgc28gdGhhdCBpdCBjYW4gYmUgY2hhbmdlZAotICAgICAgICAgICAgICAgIGFmdGVyIGEgY29tcGxldGUgYW5hbHlzaXMqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfU2VuZENvbW1hbmQ6IHBUZXh0QnVmZmVyIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypDb252ZXJ0IHRleHQgYnVmZmVyIGludG8gY3VzdG9tZXIgZm9ybWF0IGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgKyAxLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgLy8gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSwKLSAgICAgICAgICAgICAgICAvLyBNNFZTLCAiTG9jYWwgdGV4dCBidWZmZXIgZWZmZWN0Iik7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KChNNE9TQV9NZW1BZGRyOCl4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXQotICAgICAgICAgICAgICAgICAgICAvLy54VlNTLnBUZXh0QnVmZmVyLCAoTTRPU0FfTWVtQWRkcjgpcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0cmxlbihwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSB0ZXh0IFJHQiBidWZmZXIqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlJHQiBzdHJ1Y3R1cmUgZm9yIHRoZSB0ZXh0IGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJXaWR0aAotICAgICAgICAgICAgICAgICAgICA9PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlckhlaWdodCA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogdGV4dCBwbGFuZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBub3QgZGVmaW5lZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBpbnB1dCBSR0IgdGV4dCBidWZmZXIgYW5kIGZvcmNlIGl0IHRvIGV2ZW4gc2l6ZSB0byBhdm9pZCBlcnJvcnMgaW4KLSAgICAgICAgICAgICAgICAgWVVWIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgMiAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodAotICAgICAgICAgICAgICAgICAgICAqIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiVGV4dCBSR0IgcGxhbmUtPnBhY19kYXRhIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRleHQgcmVuZGVyaW5nIGV4dGVybmFsIGZ1bmN0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUkdCIGJ1ZmZlciBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJUZXh0IHJlbmRlcmluZyBmdW5jdGlvbiBkaWQgbm90IHNldCBSR0IgYnVmZmVyIGNvcnJlY3RseSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHBsYW5lIHRvIFlVVjQyMCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgLyogQ2FsbCB0ZXh0IHJlbmRlcmluZyBmdW5jdGlvbiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucFRleHRSZW5kZXJpbmdGY3QoCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFJlbmRlcmluZ0RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgJihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlRleHQgcmVuZGVyaW5nIGV4dGVybmFsIGZ1bmN0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgUkdCIGJ1ZmZlciBpcyBzZXQgKi8KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgUkdCIHRvIFlVVjogMHcleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgICAgIC8qIENoYW5nZSBpbnRlcm5hbGx5IGVmZmVjdCB0eXBlIGZyb20gInRleHQiIHRvIGZyYW1pbmcgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIHNldCAhISIpOwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgRmlmdGllcyBlZmZlY3QgKi8KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZpZnRpZXNTdHJ1Y3QgKmZpZnRpZXNDdHg7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBleHBlY3RlZCBmcmFtZSByYXRlIGZvciB0aGUgZmlmdGllcyBlZmZlY3QgKG11c3QgYmUgYWJvdmUgMCkgKi8KLSAgICAgICAgICAgIGlmKCAwID09IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBmcmFtZSByYXRlIGZvciB0aGUgZmlmdGllcyBlZmZlY3QgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCAhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eCA9IChNNHhWU1NfRmlmdGllc1N0cnVjdAotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRmlmdGllc1N0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZmlmdGllcyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZpZnRpZXNDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPmZpZnRpZXNFZmZlY3REdXJhdGlvbiA9IDEwMDAgLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZTsKLSAgICAgICAgICAgIGZpZnRpZXNDdHgtPnNoaWZ0UmFuZG9tVmFsdWUgPSAwOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c3RyaXBlUmFuZG9tVmFsdWUgPSAwOwotCi0gICAgICAgICAgICAvKiBTYXZlIHRoZSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmaWZ0aWVzQ3R4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgZGF0YSBuZWVkZWQgYnkgdGhlIENvbG9yIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZQotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0NvbG9yU3RydWN0ICpDb2xvckN0eDsKLQotICAgICAgICAgICAgQ29sb3JDdHggPQotICAgICAgICAgICAgICAgIChNNHhWU1NfQ29sb3JTdHJ1Y3QgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db2xvclN0cnVjdCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgY29sb3IgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCBDb2xvckN0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29sb3JDdHgtPmNvbG9yRWZmZWN0VHlwZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2xvckN0eC0+cmdiMTZDb2xvckRhdGEgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpUmdiMTZJbnB1dENvbG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIENvbG9yQ3R4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBCYWNrZ3JvdW5kIG11c2ljIHJlZ2lzdGVyaW5nCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICYmIGlzTmV3QkdNID09IE00T1NBX1RSVUUgKQotICAgIHsKLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtczsKLSAgICAgICAgTTRPU0FfQ2hhciAqb3V0X3BjbTsKLSAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmCi0KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8gbWl4ZWQKLSAgICAgICAgIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogSWYgYSBwcmV2aW91cyBCR00gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCBkZWxldGUgaXQgKi8KLSAgICAgICAgLyogSGVyZSBjYW4gYmUgaW1wbGVtZW50ZWQgdGVzdCB0byBrbm93IGlmIHRoZSBzYW1lIEJHTSBpcyByZWdpc3RlcmVkICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT4KLSAgICAgICAgICAgICAgICAgICAgcEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIEJHTSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGlucHV0IHN0cnVjdHVyZSB0byBvdXIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLSAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKHN0cmxlbihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgQkdNIGZpbGUgcGF0aCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKSArIDEpOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIERlY29kZSBCR00gdHJhY2sgdG8gcGNtIG91dHB1dCBmaWxlICovCi0KLSAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAoTTR4VlNTX01DU19wYXJhbXMgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19NQ1NfcGFyYW1zKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgTUNTIFBhcmFtcyAoZm9yIEJHTSkiKTsKLQotICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBNQ1MgUGFyYW1zIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyBpbiBjYXNlIG9mIHByb2JsZW0gKFBSIDIyNzMpICovCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+QmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgcFBhcmFtcy0+RW5kQ3V0VGltZSA9IDA7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBNZWFucyBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3RlbXAgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXNfdGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW1vdmUgUENNIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ID0gcmVtb3ZlIEJHTSBjaGFpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyIG9mCi0gICAgICAgICAgICAgICAgICAgIHRoZSBjaGFpbmVkIGxpc3QgaXMgTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBpdCBtZWFucyB0aGF0IHRoZXJlIHdhcyBvbmx5IG9uZSBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qID0+IHdlIHB1dCB0aGUgY29udGV4dCB2YXJpYWJsZSB0byBOVUxMIHRvIHJlYWZmZWN0IHRoZSBmaXJzdCBjaGFpbmVkIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcCA9PSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3RlbXAtPnBOZXh0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIEJHTSBwb2ludGVyIGlzIHRoZSBmaXJzdCBvbmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICBhZnRlciBpdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTbywgd2UgbmVlZCB0byBjaGFuZ2UgZmlyc3QgY2hhaW5lZCBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3ByZXYgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cE5leHQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc19wcmV2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3ByZXYgPSBwUGFyYW1zX3RlbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluZWQgbGlzdCB0byBiZSBhYmxlIHRvIGFkZCBuZXcKLSAgICAgICAgICAgICBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgcE1DU19sYXN0ID0gcFBhcmFtc19wcmV2OwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG5ldyBwYXJhbXMqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmlsbCB0aGUgbGFzdCBNNHhWU1NfTUNTX3BhcmFtcyBlbGVtZW50ICovCi0gICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZTsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazE1X0ZQUzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotCi0gICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIGJpdHJhdGUgaW4gdGhlIEFBQyBjYXNlIGlzIG5vdyBkaXJlY3RseSBnaXZlbiBieSB0aGUgdXNlciovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhdWRpbyBiaXRyYXRlIGlzIGNvcnJlY3RseSBkZWZpbmVkKi8KLSAgICAgICAgICAgIC8qTW9ubwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMTZrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMTZfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDMya2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA+PSBNNFZJREVPRURJVElOR19rMzJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgIDw9IE00VklERU9FRElUSU5HX2sxOTJfS0JQUwotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICBwUGFyYW1zLT5iQXVkaW9Nb25vID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsKLQotICAgICAgICAvKiBQcmVwYXJlIG91dHB1dCBmaWxlbmFtZSAqLwotICAgICAgICAvKiAyMSBpcyB0aGUgc2l6ZSBvZiAicHJldmlld18xNjAwMF8yLnBjbSIgKyBcMCAqLwotICAgICAgICBvdXRfcGNtID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbih4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCkKLSAgICAgICAgICAgICsgMjEsIE00VlMsIChNNE9TQV9DaGFyICopIlRlbXAgY2hhciogZm9yIHBjbVByZXZpZXdGaWxlIik7Ci0KLSAgICAgICAgaWYoIG91dF9wY20gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX0luaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgdGVtcG9yYXJ5IHBhdGggdG8gZmluYWwgcHJldmlldyBwYXRoIHN0cmluZyAqLwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfcGNtLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbih4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCkgKyAxKTsKLQotICAgICAgICAvKiBEZXBlbmRpbmcgb2YgdGhlIG91dHB1dCBzYW1wbGUgZnJlcXVlbmN5IGFuZCBuYiBvZiBjaGFubmVscywgd2UgY29uc3RydWN0IHByZXZpZXcKLSAgICAgICAgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IFBDTSBmaWxlbmFtZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF9wY20sIChjb25zdCBjaGFyICopInByZXZpZXdfMTYwMDBfMS5wY21cMCIsCi0gICAgICAgICAgICAgICAgICAgIDIwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8yLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18wODAwMF8xLnBjbVwwIiwgMjApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShvdXRfcGNtKTsKLSAgICAgICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBhdWRpbyBvdXRwdXQgZm9ybWF0IFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IG91dF9wY207Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9wY207Ci0gICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X3BjbSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBjbVByZXZpZXdGaWxlIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgZnJlZShvdXRfcGNtKTsKLSAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgLyogRnJlZSB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmKCBvdXRfcGNtICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNQ1MgQkdNIFBhcmFtczogZmlsZSBvdXQiKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwodm9pZCAqKSB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlLAotICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgIHBGaWxlLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVJbiwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwrKzsKLSAgICAgICAgYklzVHJhbnNjb2RpbmcgPSBNNE9TQV9UUlVFOwotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgfQotICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTAotICAgICAgICAmJiBpc05ld0JHTSA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAvKiBCR00gaXMgdGhlIHNhbWUgYXMgcHJldmlvdXNseSwgbm8gbmVlZCB0byByZWRlY29kZSBhdWRpbyAqLwotICAgICAgICAvKiBOZWVkIHRvIHVwZGF0ZSBNQ1MgcGFyYW1zIGNoYWluZWQgbGlzdCwgdG8gc2lnbmFsIE00eFZTU19zdGVwIGZ1bmN0aW9uIHRvIHNraXAKLSAgICAgICAgQkdNIGRlY29kaW5nICovCi0KLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3ByZXYgPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0gICAgICAgIC8qIFdlIHNhdmUgb3V0cHV0IGZpbGUgcG9pbnRlciwgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgdG8gdXNlIGl0IHdoZW4gc2F2aW5nIGF1ZGlvCi0gICAgICAgICBtaXhlZCBmaWxlIChsYXN0IHNhdmUgc3RlcCkgKi8KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgICAgIC8qIFJlLXdyaXRlIEJHTSBzZXR0aW5ncyBpbiBjYXNlIHRoZXkgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdHdvIHNlbmRDb21tYW5kICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHMgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3A7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wID0KLSAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLQotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAvKiBQYXJzZSBNQ1MgcGFyYW1zIGNoYWluZWQgbGlzdCB0byBmaW5kIGFuZCBkZWxldGUgQkdNIGVsZW1lbnQgKi8KLQotICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPmlzQ3JlYXRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3ByZXYgPSBwUGFyYW1zX3RlbXA7Ci0gICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTR4VlNTX1NlbmRDb21tYW5kIGhhcyBiZWVuIHJlY2FsbGVkLCBCR00gaXMgdGhlIHNhbWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIEJHTSBpbiB0aGlzIHhWU1MgY29tbWFuZCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgICAgIC8qIE5lZWQgdG8gcmVtb3ZlIE1DUyBwcmV2aW91cyBwYXJhbXMgY2hhaW5lZCBsaXN0ICovCi0KLSAgICAgICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zX3RlbXAgPSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0OwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXNfdGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5pc0JHTSA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hhaW4gcHJldmlvdXMgZWxlbWVudCB3aXRoIG5leHQgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc19wcmV2ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3ByZXYtPnBOZXh0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBjdXJyZW50IHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9mIHRoZSBjaGFpbmVkIGxpc3QgYW5kIG5leHQgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcCA9PSB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwUGFyYW1zX3RlbXAtPnBOZXh0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIEJHTSBwb2ludGVyIGlzIHRoZSBmaXJzdCBvbmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzCi0gICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBhZnRlciBpdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBTbywgd2UgbmVlZCB0byBjaGFuZ2UgZmlyc3QgY2hhaW5lZCBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIGFsbCBvdGhlciBjYXNlcywgbm90aGluZyBlbHNlIHRvIGRvIGV4Y2VwdCBmcmVlaW5nIHRoZSBjaGFpbmVkCi0gICAgICAgICAgICAgICAgICAgIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0gICAgICAgICAgICAvKiBIZXJlLCB3ZSB1bmFsbG9jYXRlIGFsbCBCR00gY29tcG9uZW50cyBhbmQgcHV0IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrIHRvIE5VTEwgKi8KLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoYW5nZWQgdG8gYmUgYWJsZSB0byBtaXggd2l0aCB2aWRlbyBvbmx5IGZpbGVzIC0+IGluIGNhc2Ugbm8gbWFzdGVyIGNsaXAgaXMgZm91bmQKLSAgICAoaS5lIG9ubHkgSlBHIGlucHV0IG9yIHZpZGVvIG9ubHkgaW5wdXQpICovCi0gICAgLyogYW5kIGlmIHRoZXJlIGlzIGEgQkdNLCB3ZSBmb3JjZSB0aGUgYWRkZWQgdm9sdW1lIHRvIDEwMCAoaS5lIHJlcGxhY2UgYXVkaW8pICovCi0KLSAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBJbiB0aGF0IGNhc2UsIGl0IG1lYW5zIHRoYXQgbm8gaW5wdXQgM0dQIGZpbGUgaGFzIGEgdmlkZW8gdHJhY2suCi0gICAgICAgIFRoZXJlZm9yZSwgaWYgYSBtaXhpbmcgaXMgYXNrZWQsIGl0IHdpbGwgZmFpbC4gVGh1cywgd2UgZm9yY2UgcmVwbGFjZSBhdWRpby4gKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9IDEwMDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIGNsaXAgbnVtYmVyIHRvIGtub3cgaWYgYSBNNHhWU1Nfc2VuZENvbW1hbmQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgKi8KLSAgICB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOwotCi0gICAgLyogSW4gY2FzZSBvZiBNTVMgdXNlIGNhc2UsIHdlIGNvbXB1dGUgaGVyZSB0aGUgbWF4IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAvKiBJbiBjYXNlIG9mIHRvbyBsb3cgYml0cmF0ZSwgYSBzcGVjaWZpYyB3YXJuaW5nIGlzIHJldHVybmVkICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplICE9IDAgJiYgdG90YWxEdXJhdGlvbiA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICBNNE9TQV9Eb3VibGUgcmF0aW87Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUKLSAgICAgICAgICAgICAgICA9PSAxMDAgKSAvKiBXZSBhcmUgaW4gInJlcGxhY2UgYXVkaW8gbW9kZSwgbmVlZCB0byBjaGVjayB0aGUgZmlsZXR5cGUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TZW5kQ29tbWFuZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgQkdNIHRyYWNrICovCi0gICAgICAgICAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2stPnBGaWxlLCAmZmlsZVByb3BlcnRpZXMpOyovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMgcmV0dXJuZWQgYW4gZXJyb3I6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byB1c2UgTU1TIG1vZGUgd2l0aCBCR00gIT0gQU1SLU5CIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUgotICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19zZW5kQ29tbWFuZDogQmFkIGlucHV0IEJHTSBmaWxlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0YXJnZXRlZCBiaXRyYXRlLCB3aXRoIDglIG1hcmdpbiAobW9vdikgKi8KLSAgICAgICAgaWYoIHRvdGFsRHVyYXRpb24gPiAxMDAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgKiA4ICogMC44NCkgLyAodG90YWxEdXJhdGlvbiAvIDEwMDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZW1vdmUgYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlID49IDEyMjAwICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IDEyMjAwOyAvKiBPbmx5IEFNUiBpcyBzdXBwb3J0ZWQgaW4gTU1TIGNhc2UgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIGFuIGluZGljYXRvciBvZiAiY29tcGxleGl0eSIgZGVwZW5kaW5nIG9uIG5iIG9mIHNlcXVlbmNlcyBhbmQgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgLyogVGhlIGhpZ2hlc3QgaXMgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMsIHRoZSBtb3JlIHRoZXJlIGFyZSBzb21lIEkgZnJhbWVzICovCi0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlZHVjZSB0aGUgdGFyZ2V0IGJpdHJhdGUgKi8KLSAgICAgICAgcmF0aW8gPQotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpOwotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJSYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZFxuVG90YWwgZHVyYXRpb246ICVkIiwKLSAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICogMTAwMDAwKSAvIChNNE9TQV9Eb3VibGUpKHRvdGFsRHVyYXRpb24pKSwKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSwgdG90YWxEdXJhdGlvbik7Ci0KLSAgICAgICAgaWYoIHJhdGlvID4gNTAgJiYgcmF0aW8gPD0gNzUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcG90ZW50aWFsIHJpc2sgb2YgaGF2aW5nIGEgaGlnaGVyIGZpbGUgc2l6ZQotICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQgKi8KLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjEpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICAgICAgICAgIk5ldyBiaXRyYXRlMSAhIVxuUmF0aW8gY2xpcF9uYi9kdXJhdGlvbiA9ICVmXG5UYXJnZXRlZCBiaXRyYXRlID0gJWQiLAotICAgICAgICAgICAgICAgIHJhdGlvLCB0YXJnZXRlZEJpdHJhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHJhdGlvID4gNzUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gKE00T1NBX1VJbnQzMikodGFyZ2V0ZWRCaXRyYXRlICogMC4xNSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUyICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWQUw6Ci0gICAgICAgIERlY3JlYXNlIHRoZSBvdXRwdXQgZmlsZSBzaXplIHRvIGtlZXAgYSBtYXJnaW4gb2YgNSUKLSAgICAgICAgVGhlIHdyaXRlciB3aWxsIHN0b3Agd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUgc2l6ZSB3aWxsIGJlIHJlYWNoZWQqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAtPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgKiAwLjA1KTsKLQotICAgICAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMzIwMDAgKSAgICAgICAgICAgICAgLyo0ODAwMCkqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAzMjAwMDsgLyo0ODAwMDsqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCA0ODAwMCApICAgICAgICAgICAgICAvKjY0MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDQ4MDAwOyAvKjY0MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDY0MDAwICkgICAgICAgICAgICAgIC8qMTI4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDY0MDAwOyAvKjEyODAwMDsqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDEyODAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDEyODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAxOTIwMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAxOTIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogQ2Fubm90IGhhcHBlbiAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBFcnJvciBpbiBvdXRwdXQgZmlsZVNpemUgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKXRhcmdldGVkQml0cmF0ZTsKLSAgICB9Ci0KLSAgICBpZiggYklzVHJhbnNjb2RpbmcgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfVFJBTlNDT0RJTkdfTkVDRVNTQVJZOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqIHBGaWxlUGF0aCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBzYXZlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBlZGl0ZWQgZmluYWwgZmlsZQotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZVBhdGggICAgICAgICAgICAoSU4pIElmIHRoZSB1c2VyIHdhbnRzIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZW5hbWUsIGVsc2UgY2FuIGJlIE5VTEwgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdGFydCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCAqcEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKkFkZCBmb3IgVVRGIGNvbnZlcnNpb246IGNvcHkgdGhlIHBTZXR0aW5ncyBzdHJ1Y3R1cmUgaW50byBhIG5ldyBwQ3VycmVudEVkaXRTZXR0aW5ncyovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqcEVkaXRTYXZpbmdTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDggaSwgajsKLSAgICBNNE9TQV9VSW50MzIgb2Zmc2V0ID0gMDsKLSAgICBNNE9TQV9VSW50OCBuYkVmZmVjdHMgPSAwOwotICAgIC8qb25seSBmb3IgVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgTTRPU0FfVm9pZCAqcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICAvKiovCi0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TYXZlU3RhcnQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBSQzogdG8gdGVtcG9yYXJ5IGhhbmRsZSBjaGFuZ2luZyBvZiBvdXRwdXQgZmlsZXBhdGggKi8KLSAgICAvKiBUTyBCRSBDSEFOR0VEIENMRUFOTFkgV0lUSCBBIE1BTExPQy9NRU1DUFkgISEhISAqLwotICAgIGlmKCBwRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKml0IG1lYW5zIHRoYXQgcE91dHB1dEZpbGUgaGFzIGJlZW4gYWxsb2NhdGVkIGluIE00eFZTU19zZW5kQ29tbWFuZCgpKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSBwRmlsZVBhdGg7Ci0gICAgICAgIC8qQXMgYWxsIGlucHV0cyBvZiB0aGUgeFZTUyBhcmUgaW4gVVRGOCwgY29udmVydCB0aGUgb3V0cHV0IGZpbGUgcGF0aCBpbnRvIHRoZSBjdXN0b21lcgotICAgICAgICAgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRmlsZVBhdGgsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIGZpbGVQYXRoU2l6ZSA9IGxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZmlsZVBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IG91dHB1dCBmaWxlIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGVbZmlsZVBhdGhTaXplXSA9ICdcMCc7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gZmlsZVBhdGhTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKi8KLQotICAgIC8qRkI6IEFkZCBmb3IgVVRGIGNvbnZlcnNpb246IGNvcHkgdGhlIHBTZXR0aW5ncyBzdHJ1Y3R1cmUgaW50byBhIG5ldyBwQ3VycmVudEVkaXRTZXR0aW5ncyovCi0gICAgLypJdCBpcyB0aGUgc2FtZSBwcmluY2lwbGUgYXMgaW4gdGhlIFByZXZpZXdTdGFydCgpKi8KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJTYXZpbmcsIGNvcHkgb2YgVlNTIHN0cnVjdHVyZSIpOwotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogQ29weSBzZXR0aW5ncyBmcm9tIGlucHV0IHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKSAmKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICAodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTKSwKLSAgICAgICAgc2l6ZW9mKE00eFZTU19FZGl0U2V0dGluZ3MpKTsKLQotICAgIC8qIEluaXRpYWxpemUgcEVkaXRTYXZpbmdTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU1hc3RlckNsaXA7IC8qIFZTUzIuMCBtYW5kYXRvcnkgcGFyYW1ldGVyICovCi0KLSAgICAvKiBBbGxvY2F0ZSBzYXZpbmdTZXR0aW5ncy5wQ2xpcExpc3QvcFRyYW5zaXRpb25zIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdCA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoKLSAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopCi0gICAgICAgICpwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIsCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIHNhdmluZyAsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICoKLSAgICAgICAgICAgICogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKQotICAgICAgICAgICAgKihwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIHNhdmluZywgY29weSBvZiBwVHJhbnNpdGlvbkxpc3QiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksCi0gICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgY2xpcCBzZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8vIEFkZCBNUDQgZmlsZSBzdXBwb3J0Ci0KLSAgICAgICAgaWYoICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQKQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0KQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWKQotICAgICAgICAgICAgfHwgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpKQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIGdpdmVuIHN0cnVjdHVyZSB0byBvdXIgc2F2aW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyhwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSAvKiByZW1vdmUgZWZmZWN0cyAqLyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICBmcmVlKAotICAgICAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID0gKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJzYXZpbmcgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+ZmlsZVBhdGhTaXplID0gbGVuZ3RoKzE7Ci0KLSAgICAgICAgICAgIGlmKCBpCi0gICAgICAgICAgICAgICAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAgICAgLSAxICkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBFcnJvciB3aGVuIHBhcnNpbmcgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXTpcCi0gICAgICAgICAgICAgICAgIEJhZCBmaWxlIHR5cGUiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHZpZGVvIGVmZmVjdHMsIHVzZWQgdG8ga25vdyBob3cgbXVjaCBtZW1vcnkgaXMgbmVlZGVkIHRvIGFsbG9jYXRlKi8KLSAgICAvKiBGQiAyMDA4LzEwLzE1OiByZW1vdmVkIDogbm90IGNvbXBhdGlibGUgd2l0aCBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lCi0gICAgZm9yKGo9MDtqPHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7aisrKQotICAgIHsKLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUgIT0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSkKLSAgICB7Ci0gICAgbmJFZmZlY3RzKys7Ci0gICAgfQotICAgIH0qLwotICAgIG5iRWZmZWN0cyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHM7Ci0KLSAgICAvKiBBbGxvY2F0ZSBlZmZlY3RzIHNhdmluZyBzdHJ1Y3R1cmUgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBlZmZlY3RzICovCi0gICAgaWYoIG5iRWZmZWN0cyAhPSAwICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuYkVmZmVjdHMKLSAgICAgICAgICAgICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEp1c3QgY29weSBlZmZlY3Qgc3RydWN0dXJlIHRvIHNhdmluZyBzdHJ1Y3R1cmUsIGFzIGVmZmVjdHMgdGltZSBhcmUgbm93ICovCi0gICAgICAgIC8qIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwIHRpbWUqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0cywKLSAgICAgICAgICAgIG5iRWZmZWN0cyAqIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPm5iRWZmZWN0cyA9IG5iRWZmZWN0czsKLQotICAgIGlmKCBwRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wT3V0cHV0RmlsZSA9IHBGaWxlUGF0aDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHBvaW50ZXIgb2Ygc2F2aW5nIHZpZGVvIGVkaXRvciB0byB1c2UgaW4gc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBwRWRpdFNhdmluZ1NldHRpbmdzOwotCi0gICAgLyogQ2hhbmdlIG91dHB1dCBmaWxlIG5hbWUgdG8gdGVtcG9yYXJ5IG91dHB1dCBmaWxlIG5hbWUsIGJlY2F1c2UgZmluYWwgZmlsZSB3aWxsIGJlCi0gICAgIGdlbmVyYXRlZCBieSBhdWRpbyBtaXhlciAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApCi0gICAgewotCi0gICAgICAgIE00T1NBX0NoYXIgb3V0XzNncFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAvKiovCi0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0KLSAgICAgICAgICAgIChNNHhWU1NfQkdNU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncyksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgKikiU2F2aW5nIHNldHRpbmdzLCBlZmZlY3RzIHRhYmxlIG9mIHN0cnVjdHVyZSBzZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICBzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSk7Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgZmlsZSBuYW1lLCBhbmQgY29weSBmaWxlIG5hbWUgYnVmZmVyIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKHN0cmxlbih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZyBzdHJ1Y3QgeFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpOwotCi0gICAgICAgIC8qQ29weSBCR00gdHJhY2sgZmlsZSBwYXRoKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICBmcmVlKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgKikiTTR4VlNTX1NhdmVTdGFydDogVGVtcCBmaWxlbmFtZSBpbiBjYXNlIG9mIEJHTSIpOwotCi0gICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiovCi0KLSAgICAgICAgTTRPU0FfY2hyTkNvcHkob3V0XzNncCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLSAgICAgICAgTTRPU0FfY2hyTkNvcHkob3V0XzNncF90bXAsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0KLSAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgM0dQIGZpbGVuYW1lICovCi0gICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfM2dwLCAoY29uc3QgY2hhciAqKSJzYXZldGVtcC4zZ3BcMCIsIDEzKTsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3BfdG1wLCAoY29uc3QgY2hhciAqKSJzYXZldGVtcC50bXBcMCIsIDEzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncDsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGggKyAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwX3RtcDsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfM2dwX3RtcCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogVGVtcG9yYXJ5IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBQdXQgbmIgb2Ygc3RlcCBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyB0byAyLCBiZWNhdXNlIGF1ZGlvIG1peGluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBQdXQgbmIgb2Ygc3RlcCBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyB0byAxLCBiZWNhdXNlIG5vIGF1ZGlvIG1peGluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgLyoqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBwVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXRpYWxpemUgY3VycmVudCBzdGVwIG51bWJlciBmb3IgcHJvZ3Jlc3Npb24gbW9uaXRvcmluZyAqLwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2aW5nOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHNhdmUgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdG9wKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZVNhdmluZyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TYXZlU3RvcCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEZyZWUgc2F2aW5nIHN0cnVjdHVyZXMgKi8KLSAgICBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZVNhdmVkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfU3RlcChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGRpZmZlcmVudHMgdGFza3MsIGRlcGVuZGluZyBvZiB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uOgotICogICAgICAgICAgICAgICAgICAgIC0gYW5hbHlzZXMgZWRpdGluZyBzdHJ1Y3R1cmUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TZW5kQ29tbWFuZAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIHByZXZpZXcgZmlsZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdGFydAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIGZpbmFsIGVkaXRlZCBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfU2F2ZVN0YXJ0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgIChJTi9PVVQpIFBvaW50ZXIgb24gYW4gaW50ZWdlciBnaXZpbmcgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzIGluZGljYXRpb24gKGJldHdlZW4gMC0xMDApCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IsIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCBhZ2FpbgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWTogICAgUHJldmlldyBmaWxlIGlzIGdlbmVyYXRlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOiAgICAgICAgRmluYWwgZWRpdGVkIGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU6ICAgIEFuYWx5c2UgaXMgZG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1N0ZXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQXVkaW9NaXhpbmdDdHh0ID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4IHVpUHJvZ3Jlc3MgPSAwOwotCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2aW5nOgotICAgICAgICAvL2Nhc2UgTTR4VlNTX2tTdGF0ZUdlbmVyYXRpbmdQcmV2aWV3OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgKSAvKiBWU1MgLT4gY3JlYXRpbmcgZWZmZWN0cywgdHJhbnNpdGlvbnMgLi4uICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwVlNTQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwVnNzQ3R4dDsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdFN0ZXAocFZzc0N0eHQsICZ1aVByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00VlNTM0dQUF9lZGl0U3RlcCByZXR1cm5lZCAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRDbGVhblVwKHBWc3NDdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBSQzogdG8gZGVsZXRlIHVuZWNlc3NhcnkgdGVtcCBmaWxlcyBvbiB0aGUgZmx5ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSNpZm5kZWYgRE9fTk9UX1JFTU9WRV9URU1QX0ZJTEVTCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB3ZSBjYW4gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlyc3Qgc3RlcCwgY2hlY2sgdGhlIHRlbXAgZmlsZSBpcyBub3QgdXNlIHNvbWV3aGVyZSBlbHNlIGFmdGVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgY21wUmVzdWx0ID0gLTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSBwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgcFZTU0NvbnRleHQtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLmZpbGVQYXRoU2l6ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBSZXN1bHQgPSBtZW1jbXAoKHZvaWQgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGUsICh2b2lkICopcFZTU0NvbnRleHQtPnBDbGlwTGlzdFtpXS5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5maWxlUGF0aFNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbXBSZXN1bHQgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGZvdW5kIGEgY29ycmVzcG9uZGluZyBmaWxlLCB3ZSBkbyBub3QgZGVsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCAhPSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAqdG90bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICpwVG1wU3RyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udmVydCByZXN1bHQgaW4gVVRGOCB0byBjaGVjayBpZiB3ZSBjYW4gZGVsZXRlIGl0IG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wU3RyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPSBwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0ucEZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRvdG8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBcyB0ZW1wb3JhcnkgZmlsZXMgY2FuIGJlIGltZ1hYWC4zZ3Agb3IgdmlkWFhYLjNncCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wU3RyICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKChjb25zdCBjaGFyICopcFRtcFN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTApOyAvKiBCZWNhdXNlIHRlbXBvcmFyeSBmaWxlcyBoYXZlIGEgbGVuZ3RoIGF0IG1vc3Qgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdG8gPSAoTTRPU0FfQ2hhciAqKXN0cnN0cigoY29uc3QgY2hhciAqKXBUbXBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSJpbWciKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSJ2aWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00Tk9fRVJST1IgKSAvKiBJdCBtZWFucyB0aGUgZmlsZSBpcyBhIHRlbXBvcmFyeSBmaWxlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGRlbGV0ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwVlNTQ29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgIGJscm54cHN3IzIzNC0tLT4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qPC0tLS0gRml4IGZvciAgYmxybnhwc3cjMjM0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBBdWRpbyBtaXhpbmcgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmcgKSAvKiBBdWRpbyBtaXhpbmc6IG1peC9yZXBsYWNlIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIHdpdGggZ2l2ZW4gQkdNICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKHBBdWRpb01peGluZ0N0eHQsICZ1aVByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdNYWluOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBzdGF0ZSBpbiBzdGVwIGZ1bmN0aW9uICEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZUFuYWx5emluZzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUCApIC8qIFB0bzNHUFAsIGFuYWx5c2luZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQVG8zR1BQcGFyYW1zTGlzdDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgZmlyc3QgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgUHRvM0dQUCBQYXJhbWV0ZXIgaXMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkgLyogSXQgbWVhbnMgdGhlcmUgaXMgbm8gbmV4dCBpbWFnZSB0byBjb252ZXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2Ugc3RlcCB0byBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1M7IC8qIENoYW5nZSBBbmFseXppbmcgbWljcm8gc3RhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHBoYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoaXMgZmlsZSBoYXMgdG8gYmUgY29udmVydGVkIG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QsIHdlIGp1c3QgcmV0dXJuIE00Tk9fRVJST1IsIGFuZCBnbyB0byBuZXh0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBQdG8zR1BQICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKSAvKiBQdG8zR1BQLCBjb252ZXJ0aW5nICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfU3RlcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBwcm9ncmVzcyBiYXIgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgPiAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgKiAxMDApIC8gKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dC0+bV9OYkltYWdlIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSAoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TdGVwOiBNNFBUTzNHUFBfU3RlcCByZXR1cm5lZCAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgID09ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQOyAvKiBXZSBnbyBiYWNrIHRvIGFuYWx5emUgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5leHQgZmlsZSB0byBjb252ZXJ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSQyAhISEhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogVG8gYXZvaWQgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PQotICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTICkgLyogTUNTOiBhbmFseXppbmcgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPT0gTTRPU0FfTlVMTCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUNTcGFyYW1zTGlzdDsgLyogQ3VycmVudCBNQ1MgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFJlaW5pdCBBbmFseXppbmcgbWljcm8gc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFJlaW5pdCBBbmFseXppbmcgbWljcm8gc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tTdGF0ZU9wZW5lZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBBbmFseXNpcyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSB0cmFuc2NvZGVkIG9yIG5vdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiBJZiBub3QsIHdlIGp1c3QgcmV0dXJuIE00Tk9fRVJST1IsIGFuZCBnbyB0byBuZXh0IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW5pbmcgTUNTICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZyh4VlNTX2NvbnRleHQsICZyb3RhdGlvbkRlZ3JlZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nIHJldHVybmVkXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+dmlkZW9jbGlwbnVtYmVyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3V0cyBhcmUgZG9uZSBpbiB0aGUgTUNTLCBzbyB3ZSBuZWVkIHRvIHJlcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiZWdpbkN1dFRpbWUgYW5kIGVuZEN1dFRpbWUgdG8ga2VlcCB0aGUgZW50aXJlIHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lID0gMDsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nIHJldHVybmVkIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczsgTUNTIGNvbnRleHQ6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRhaW4gcm90YXRpb24gaW5mbyBvZiB0cmltbWVkIC8gdHJhbnNjb2RlZCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2luZGV4XS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgICAgICAvKiBNQ1M6IHRyYW5zY29kaW5nIGZpbGUgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3N0ZXAoeFZTU19jb250ZXh0LT5wTUNTX0N0eHQsICZ1aVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgLypTUzpibHJueHBzdyMgIDIzNCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00TUNTX0VSUl9OT01PUkVfU1BBQ0UpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChlcnIgIT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE8gQkUgQ0hFQ0tFRCBOTyBMRUFLUyAgISEhISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTRNQ1Nfc3RlcCByZXR1cm5lZCAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZXJyID09IE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogV2UgZ28gYmFjayB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emUgcGFyYW1ldGVycyB0byBzZWUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBuZXh0IGZpbGUgdG8gdHJhbnNjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSQyAhISEhISEhISEqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29udmVydGluZyBpdCBpZiBhbm90aGVyIFNlbmRDb21tYW5kIGlzIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgTUNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIG1pY3JvIHN0YXRlIGluIGFuYWx5emluZyBzdGF0ZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLWVuZF9zdGVwOgotICAgIC8qIENvbXB1dGUgcHJvZ3Jlc3Npb24gKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCAhPSAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwICogMTAwKSBcCi0gICAgICAgICAgICAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkKLSAgICAgICAgICAgICsgKHVpUHJvZ3Jlc3MgLyAoeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCkpKTsKLQotICAgICAgICBpZiggKnBQcm9ncmVzcyA+IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0Nsb3NlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgY3VycmVudCBlZGl0aW5nIHByb2ZpbGUsIHVuYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIGNhbiBjYWxsIGEgbmV3IE00eFZTU19TZW5kQ29tbWFuZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIC8qIERlcGVuZGluZyBvZiB0aGUgc3RhdGUsIGRpZmZlcmVudHMgdGhpbmdzIGhhdmUgdG8gYmUgZG9uZSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5tX3N0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZU9wZW5lZDoKLSAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID09IE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQXVkaW9NaXhpbmcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgYmxybnhwc3cjMjM0LS0tLT4qLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ2xvc2VDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogPC0tLS1GaXggZm9yIGJscm54cHN3IzIzNCovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qIFdlIGZyZWUgdGhpcyBwb2ludGVyIG9ubHkgaWYgYSBCR00gdHJhY2sgaXMgcHJlc2VudCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UsCi0gICAgICAgICAgICAgICAgdGhpcyBwb2ludGVyIG93bnMgdG8gdXMgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tTdGF0ZVNhdmVkOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID09IE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgUHRvM0dQUCBtb2R1bGUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIDwtLS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0PiovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgTUNTIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19hYm9ydCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZpeCBmb3IgYmxybnhwc3cjMjM0LS0tLT4qLwotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19hYm9ydCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYXJlIHJldGFpbmluZyBlcnJvciBoZXJlIGFuZCByZXR1cm5pbmcgZXJyb3IgIGluIHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAgYXMgdG8gYXZpb2QgbWVtb3J5IGxlYWsqLwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIDwtLS1GaXggZm9yIGJscm54cHN3IzIzNCovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19DbG9zZUNvbW1hbmQgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFsbCB4VlNTIHJlc3NvdXJjZXMKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19DbG9zZUNvbW1hbmQuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbGVhblVwKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DbGVhblVwOmVudGVyaW5nIik7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKFwKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19DbGVhblVwIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsXAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVVRGIGNvbnZlcnNpb246IGZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzKTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6bGVhdmluZyAiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBWaWRlbyBTdHVkaW8gMi4xCi0gKgotICogQHBhcmFtICAgIHBWZXJzaW9uICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB2ZXJzaW9uIGluZm8gc3RydWN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19HZXRWZXJzaW9uKCBNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24gKQotewotICAgIC8qIEp1c3QgdXNlZCBmb3IgYSBncmVwIGluIGNvZGUgKi8KLSAgICAvKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0gICAgc3RhdGljIGNvbnN0IE00T1NBX0NoYXIgY1ZlcnNpb25bMjZdID0gIk5YUFNXX1ZpZGVvU3R1ZGlvMjFfMV8zXzAiOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFZlcnNpb24gKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00X3hWU1NfTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNF94VlNTX01JTk9SOwotICAgIHBWZXJzaW9uLT5tX3JldmlzaW9uID0gTTRfeFZTU19SRVZJU0lPTjsKLSAgICBwVmVyc2lvbi0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgdGhlIFVURjE2IGNvbnZlcnNpb24pCi0gKiBAcGFyYW0gICAgbmJFZmZlY3RzICAgICAgICAgICAoSU4pIE5iIG9mIGVmZmVjdCBzZXR0aW5ncyB0byBhbGxvY2F0ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBGaWxlLCBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBwQ2xpcFNldHRpbmdzPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIENyZWF0ZSBpbmhlcml0ZWQgVlNTM0dQUCBzdHVmZiAqLwotICAgIC8qZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsbmJFZmZlY3RzKTsqLwotICAgIC8qRkI6IGFkZCBjbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3MsIHBGaWxlLCBmaWxlUGF0aFNpemUsCi0gICAgICAgIG5iRWZmZWN0cyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MgOlwKLSAgICAgICAgICAgICAgICAgICAgICAgRVJST1IgaW4gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlFbmRDdXRQZXJjZW50ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLnVpRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuaXNQYW5ab29tID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRYYiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFliID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tWGIgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRHVwbGljYXRlcyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlLCBwZXJmb3JtaW5nIGFsbG9jYXRpb25zIGlmIHJlcXVpcmVkCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NEZXN0ICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc09yaWcgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIGJDb3B5RWZmZWN0cyAgICAgICAgKElOKSBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkdXBsaWNhdGUgZWZmZWN0cwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIGRlc3Q9MHglcCBzcmM9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NEZXN0LCBwQ2xpcFNldHRpbmdzT3JpZyk7Ci0KLSAgICAvKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc0Rlc3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzRGVzdCBpcyBOVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NPcmlnKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ2FsbCBpbmhlcml0ZWQgVlNTM0dQUCBkdXBsaWNhdGlvbiAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3NEZXN0LAotICAgICAgICBwQ2xpcFNldHRpbmdzT3JpZywgYkNvcHlFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzLCAuLi4pLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBGcmVlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgTTRWU1MzR1BQX2VkaXRGcmVlQ2xpcFNldHRpbmdzKHBDbGlwU2V0dGluZ3MpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIE1DUyBjb250ZXh0IHdpdGhpbiB0aGUgeFZTUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIFZTUyBzdGF0ZSBoYXMgbW92ZWQgdG8gYW5hbHl6aW5nIHN0YXRlIG9yCi0gKiBiZXlvbmQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgbWNzQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIG1jcyBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCAqbWNzQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0TUNTQ29udGV4dDogcENvbnRleHQgaXMgTlVMTCIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9PSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19nZXRNQ1NDb250ZXh0OiBCYWQgc3RhdGUhIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgKm1jc0NvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWU1MzR1BQIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBHZW5lcmF0aW5nIHByZXZpZXcKLSAqICAgICAgICAgICAgICBvciBiZXlvbmQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICB2c3MzZ3BwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIHZzczNncHAgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCAqdnNzM2dwcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlIDwgTTR4VlNTX2tTdGF0ZVNhdmluZyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0OiBCYWQgc3RhdGUhIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgKnZzczNncHBDb250ZXh0ID0geFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00eFZTU19nZXRWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKipkZWNvZGVycykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gQ2FsbCB0aGUgZGVjb2RlciBhcGkgZGlyZWN0bHkKLSAgICAvLyB0byBnZXQgYWxsIHRoZSB2aWRlbyBkZWNvZGVyIGNhcGFibGl0aWVzLgotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoZGVjb2RlcnMpOwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNHhWU1NfaW50ZXJuYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ5NTllYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX2ludGVybmFsLmMKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbnMgb2YgZXh0ZW5kZWQgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgKFZpZGVvIFN0dWRpbyAyLjEpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qZm9yIHJnYjE2IGNvbG9yIGVmZmVjdCovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqIGNvbXBvbmVudCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIgICAgICAgICAgICAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLyogSW50ZXJuYWwgaGVhZGVyIGZpbGUgb2YgVlNTIGlzIGluY2x1ZGVkIGJlY2F1c2Ugb2YgTU1TIHVzZSBjYXNlICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLQotLypFeGlmIGhlYWRlciBmaWxlcyB0byBhZGQgaW1hZ2UgcmVuZGVyaW5nIHN1cHBvcnQgKGNyb3BwaW5nLCBibGFjayBib3JkZXJzKSovCi0jaW5jbHVkZSAiTTRFWElGQ19Db21tb25BUEkuaCIKLS8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLSNkZWZpbmUgVFJBTlNQQVJFTlRfQ09MT1IgMHg3RTAKLQotLyogUHJvdG90eXBlIG9mIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwIGZ1bmN0aW9uIChhdm9pZCBncmVlbiBlZmZlY3Qgb2YgdHJhbnNwYXJlbmN5IGNvbG9yKSAqLwotTTRWSUZJX1VJbnQ4IE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0KLS8qc3BlY2lhbCBNQ1MgZnVuY3Rpb24gdXNlZCBvbmx5IGluIFZpZGVvQXJ0aXN0IGFuZCBWaWRlb1N0dWRpbyB0byBvcGVuIHRoZSBtZWRpYSBpbiB0aGUgbm9ybWFsCi0gbW9kZS4gVGhhdCB3YXkgdGhlIG1lZGlhIGR1cmF0aW9uIGlzIGFjY3VyYXRlKi8KLWV4dGVybiBNNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgTUNTICgzR1AgdHJhbnNjb2Rlcikgd2l0aCB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICAgICBUaGUgdHJhbnNjb2RpbmcgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gYnkgdGhlIGludGVybmFsIHhWU1MgY29udGV4dC4KLSAqICAgICAgICAgICAgICAgIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgIGNoYWluZWQgbGlzdCBvZiBNQ1MgcGFyYW1ldGVycy4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnJvdGF0aW9uRGVncmVlKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRNQ1NfQ29udGV4dCBtY3NfY29udGV4dDsKLSAgICBNNE1DU19PdXRwdXRQYXJhbXMgUGFyYW1zOwotICAgIE00TUNTX0VuY29kaW5nUGFyYW1zIFJhdGVzOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGNsaXBQcm9wczsKLQotICAgIGVyciA9IE00TUNTX2luaXQoJm1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19pbml0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19vcGVuKG1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+SW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5wRmlsZVRlbXApOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19vcGVuOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGNsaXAgcHJvcGVydGllcwotICAgICAqLwotICAgIGVyciA9IE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMobWNzX2NvbnRleHQsICZjbGlwUHJvcHMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgKnJvdGF0aW9uRGVncmVlID0gY2xpcFByb3BzLnZpZGVvUm90YXRpb25EZWdyZWVzOwotCi0gICAgLyoqCi0gICAgICogRmlsbCBNQ1MgcGFyYW1ldGVycyB3aXRoIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICAgICAgIE1DUyBwYXJhbWV0ZXJzIGNoYWluZWQgbGlzdCAqLwotICAgIFBhcmFtcy5PdXRwdXRGaWxlVHlwZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEZpbGVUeXBlOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb1Byb2ZpbGU9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBQYXJhbXMub3V0cHV0VmlkZW9MZXZlbCA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVSYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgUGFyYW1zLk91dHB1dEF1ZGlvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBQYXJhbXMuYkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPmJBdWRpb01vbm87Ci0gICAgUGFyYW1zLnBPdXRwdXRQQ01maWxlID0gTTRPU0FfTlVMTDsKLSAgICAvKkZCIDIwMDgvMTAvMjA6IGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIHRvIGtlZXAgYXNwZWN0IHJhdGlvKi8KLSAgICBzd2l0Y2goeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcpCi0gICAgewotICAgIGNhc2UgTTR4VlNTX2tSZXNpemluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa1Jlc2l6aW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQ3JvcHBpbmc6Ci0gICAgICAgIFBhcmFtcy5NZWRpYVJlbmRlcmluZyA9IE00TUNTX2tDcm9wcGluZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNHhWU1Nfa0JsYWNrQm9yZGVyczoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0JsYWNrQm9yZGVyczsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qKi8KLSAgICAvLyBuZXcgcGFyYW1zIGFmdGVyIGludGVncmF0aW5nIE1DUyAyLjAKLSAgICAvLyBTZXQgdGhlIG51bWJlciBvZiBhdWRpbyBlZmZlY3RzOyAwIGZvciBub3cuCi0gICAgUGFyYW1zLm5iRWZmZWN0cyA9IDA7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIGVmZmVjdDsgbnVsbCBmb3Igbm93LgotICAgIFBhcmFtcy5wRWZmZWN0cyA9IE5VTEw7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIGVmZmVjdDsgbnVsbCBmb3Igbm93LgotICAgIFBhcmFtcy5iRGlzY2FyZEV4aWYgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJBZGp1c3RPcmllbnRhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotCi0gICAgLyoqCi0gICAgICogU2V0IG91dHB1dCBwYXJhbWV0ZXJzICovCi0gICAgZXJyID0gTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKG1jc19jb250ZXh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIFJhdGVzLk91dHB1dFZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBSYXRlcy5PdXRwdXRBdWRpb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0gMDsKLSAgICBSYXRlcy5FbmRDdXRUaW1lID0gMDsKLSAgICBSYXRlcy5PdXRwdXRGaWxlU2l6ZSA9IDA7Ci0KLSAgICAvKkZCOiB0cmFuc2NvZGluZyBwZXIgcGFydHMqLwotICAgIFJhdGVzLkJlZ2luQ3V0VGltZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPkJlZ2luQ3V0VGltZTsKLSAgICBSYXRlcy5FbmRDdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+RW5kQ3V0VGltZTsKLSAgICBSYXRlcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMobWNzX2NvbnRleHQsICZSYXRlcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX3NldEVuY29kaW5nUGFyYW1zOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQobWNzX2NvbnRleHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgTUNTIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIE1DUyBzdGVwIGZ1bmN0aW9uIGluIE00eFZTU19zdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBtY3NfY29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIE1DUyAoM0dQIHRyYW5zY29kZXIpCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBlcnIgPSBNNE1DU19jbG9zZSh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xvc2U6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE1DUyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00TUNTX2NsZWFuVXAoeFZTU19jb250ZXh0LT5wTUNTX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2Rpbmc6IEVycm9yIGluIE00TUNTX2NsZWFuVXA6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cE1DU19DdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSAqQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICpAcGFyYW0gICAgaGVpZ2h0ICAgICAgICAgICAgKElOKSBoZWlnaHQgb2YgdGhlIEFSR0I4ODg4Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpCi17Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lMSAscmdiUGxhbmUyOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0od2lkdGggKiBoZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMyk7IC8vU2l6ZSBvZiBSR0I4ODggZGF0YS4KLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsaj0gMDsKLSAgICBNNE9TQV9FUlIgZXJyPU00Tk9fRVJST1I7Ci0KLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBFbnRlcmluZyA6Iik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOlwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6d2lkdGggYW5kIGhlaWdodCAlZCAlZCIsCi0gICAgICAgIHdpZHRoICxoZWlnaHQpOwotICAgIC8qIEdldCBmaWxlIHNpemUgKG1hbmRhdG9yeSBmb3IgY2h1bmsgZGVjb2RpbmcpICovCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JJbiwgcEZpbGVJbiwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgQ2FuJ3Qgb3BlbiBpbnB1dCBBUkdCODg4OCBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwVG1wRGF0YSwgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBDYW4ndCBjbG9zZSBBUkdCODg4OFwKLSAgICAgICAgICAgICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBwRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4IFwKLSAgICAgICAgICAgICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lMS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTEudV93aWR0aCA9IHdpZHRoOwotICAgICAgICByZ2JQbGFuZTEudV9zdHJpZGUgPSB3aWR0aCozOwotICAgICAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLQotICAgIC8qIFRvIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBSZXNpemluZyA6Iik7Ci0gICAgICAgIGZyYW1lU2l6ZSA9ICAoIHBJbWFnZVBsYW5lcy0+dV93aWR0aCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQgKiAzKTsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKLSAgICAgICAgaWYocmdiUGxhbmUyLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAgICAgcmdiUGxhbmUyLnVfaGVpZ2h0ID0gIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3N0cmlkZSA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCozOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgLyogUmVzaXppbmcgUkdCODg4IHRvIFJHQjg4OCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLCAmcmdiUGxhbmUxLCAmcmdiUGxhbmUyKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSZXNpemUgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUxLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypDb252ZXJ0aW5nIFJlc2l6ZWQgUkdCODg4IHRvIFlVVjQyMCAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMiwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0I4ODggdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUkdCIHRvIFlVViBkb25lIik7Ci0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgTk8gIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUkdCIHRvIFlVViBkb25lIik7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgbGVhdmluZyA6Iik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotICogQGJyaWVmICAgIEl0IENvdmVydHMgYSBBUkdCODg4OCBpbWFnZSB0byBZVVY0MjAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgICAgIChJTikgVGhlIEltYWdlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHIgICAgKElOKSBQb2ludGVyIG9uIGZpbGVzeXN0ZW0gZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkdCODg4OCBpbWFnZSAgd2lsbCBiZSBjb252ZXJ0ZWQgYW5kIHJlc2l6ZWQgIHRvIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIHBsYW5lIHNpemUKLSAqIEBwYXJhbSAgICB3aWR0aCAgICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSAqIEBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnl1dlBsYW5lID0gTTRPU0FfTlVMTDsKLQotICAgIHl1dlBsYW5lID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoeXV2UGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOlwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICB5dXZQbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgeXV2UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHl1dlBsYW5lWzBdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVswXS51X3dpZHRoICogMS41LCBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotCi0gICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMV0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsxXS51X3N0cmlkZSA9IHl1dlBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVswXS5wYWNfZGF0YSArIHl1dlBsYW5lWzBdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVswXS51X3dpZHRoKTsKLQotICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgIHl1dlBsYW5lWzJdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgeXV2UGxhbmVbMl0udV9zdHJpZGUgPSB5dXZQbGFuZVsyXS51X3dpZHRoOwotICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMV0ucGFjX2RhdGEgKyB5dXZQbGFuZVsxXS51X2hlaWdodCBcCi0gICAgICAgICogeXV2UGxhbmVbMV0udV93aWR0aCk7Ci0gICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoIHBGaWxlSW4scEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dlBsYW5lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCByZXR1cm4gZXJyb3I6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICAgICAqcEltYWdlUGxhbmVzID0geXV2UGxhbmU7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAgOkxlYXZpbmciKTsKLSAgICByZXR1cm4gZXJyOwotCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBQaWN0dXJlRHVyYXRpb24pOwotICogQGJyaWVmICAgIEl0IGZlZWRzIHRoZSBQVE8zR1BQIHdpdGggWVVWNDIwIHBpY3R1cmVzLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiB0byB0aGUgUFRPM0dQUCBpbiB0aGUgTTRQVE8zR1BQX1BhcmFtcyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMKLSAqIEBwYXJhbSAgICBwUGljdHVyZUR1cmF0aW9uKE9VVCkgRHVyYXRpb24gb2YgdGhlIHJldHVybmVkIHBpY3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOiBUaGUgcmV0dXJuZWQgaW1hZ2UgaXMgdGhlIGxhc3Qgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbikKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCAgICBsYXN0X2ZyYW1lX2ZsYWcgPSAwOwotICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiBwQyA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopIChwUGljdHVyZUN0eHQpOwotCi0gICAgLypVc2VkIGZvciBwYW4mem9vbSovCi0gICAgTTRPU0FfVUludDggdGVtcFBhbnpvb21YYSA9IDA7Ci0gICAgTTRPU0FfVUludDggdGVtcFBhbnpvb21YYiA9IDA7Ci0gICAgTTRBSVJfUGFyYW1zIFBhcmFtczsKLSAgICAvKiovCi0KLSAgICAvKlVzZWQgZm9yIGNyb3BwaW5nIGFuZCBibGFjayBib3JkZXJzKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgIHBQaWN0dXJlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgIHBpY3R1cmVTaXplID0gMCA7Ci0gICAgTTRPU0FfVUludDgqICAgIHBpY3R1cmVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIC8vTTRFWElGQ19Db250ZXh0IHBFeGlmQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRFWElGQ19CYXNpY1RhZ3MgcEJhc2ljVGFnczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMxID0gcEltYWdlUGxhbmVzWzBdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczIgPSBwSW1hZ2VQbGFuZXNbMV07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMyA9IHBJbWFnZVBsYW5lc1syXTsKLSAgICAvKiovCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wUGljdHVyZUN0eHQpLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBQaWN0dXJlQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wSW1hZ2VQbGFuZXMpLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBJbWFnZVBsYW5lcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wUGljdHVyZUR1cmF0aW9uKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHBQaWN0dXJlRHVyYXRpb24gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0IDpFbnRlcmluZyIpOwotICAgIC8qUFIgUDRNRTAwMDAzMTgxIEluIGNhc2UgdGhlIGltYWdlIG51bWJlciBpcyAwLCBwYW4mem9vbSBjYW4gbm90IGJlIHVzZWQqLwotICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSAmJiBwQy0+bV9OYkltYWdlID09IDApCi0gICAgewotICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLypJZiBubyBjcm9wcGluZy9ibGFjayBib3JkZXJzIG9yIHBhbiZ6b29tLCBqdXN0IGRlY29kZSBhbmQgcmVzaXplIHRoZSBwaWN0dXJlKi8KLSAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa1Jlc2l6aW5nICYmIE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBhbmQgcmVzaXplIGlucHV0IEFSR0I4ODg4IGZpbGUgdG8gWVVWNDIwICovCi0gICAgICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6ICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0IDE6IHdpZHRoIGFuZCBoZWdodCAlZCAlZCIsCi0gICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgscEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwKLSAgICAgICAgICAgICBwQy0+bV9wRmlsZVJlYWRQdHIsIHBJbWFnZVBsYW5lcyxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgsCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBkZWNvZGluZyBKUEVHOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKkluIGNhc2Ugb2YgY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGNhbGwgdGhlIEVYSUYgcmVhZGVyIGFuZCB0aGUgQUlSKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ29tcHV0ZXMgcmF0aW9zICovCi0gICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDb252ZXJ0IGlucHV0IEFSR0I4ODg4IGZpbGUgdG8gWVVWNDIwICovCi0gICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMjogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+d2lkdGgscEMtPm1fcFB0bzNHUFBwYXJhbXMtPmhlaWdodCk7Ci0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChwQy0+bV9GaWxlSW4sIHBDLT5tX3BGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAmKHBDLT5tX3BEZWNvZGVkUGxhbmUpLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogWVVWNDIwIHBsYW5hciBpcyByZXR1cm5lZCBidXQgYWxsb2NhdGlvbiBpcyBtYWRlIG9ubHkgb25jZQotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRpZ291cyBwbGFuZXMgaW4gbWVtb3J5KSAqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lLT5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qSW5pdGlhbGl6ZSBFeGlmIHBhcmFtcyBzdHJ1Y3R1cmUqLwotICAgICAgICBwQmFzaWNUYWdzLm9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjsKLQotICAgICAgICAvKioKLSAgICAgICAgUGFuJnpvb20gcGFyYW1zKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNhdmUgcmF0aW8gdmFsdWVzLCB0aGV5IGNhbiBiZSByZXVzZWQgaWYgdGhlIG5ldyByYXRpb3MgYXJlIDAqLwotICAgICAgICAgICAgdGVtcFBhbnpvb21YYSA9IChNNE9TQV9VSW50OClwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhOwotICAgICAgICAgICAgdGVtcFBhbnpvb21YYiA9IChNNE9TQV9VSW50OClwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiOwotICAgICAgICAgICAgLypDaGVjayB0aGF0IHRoZSByYXRpbyBpcyBub3QgMCovCi0gICAgICAgICAgICAvKkNoZWNrIChhKSBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBtYXhSYXRpbyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgKyB0ZW1wUGFuem9vbVhhID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYSkgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA+PSBtYXhSYXRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlcnMgY2FuIGJlIG1vdmVkIHRvIGtlZXAgdGhlIHNhbWUgYXJlYSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgLT0gbWF4UmF0aW87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTW92ZSB0aGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVyIHRvIDAgYnV0IHRoZSByYXRpbyB3aWxsIGJlIGFsc28gZnVydGhlcgotICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gdGVtcFBhbnpvb21YYTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkNoZWNrIChiKSBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBtYXhSYXRpbyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPj0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIHJhdGlvIGlzIDAsIHRoYXQgbWVhbnMgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKQotICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliICsgdGVtcFBhbnpvb21YYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKk1vZGlmeSB0aGUgKGIpIHBhcmFtZXRlcnM6Ki8KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PSBtYXhSYXRpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qVGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlcnMgY2FuIGJlIG1vdmVkIHRvIGtlZXAgdGhlIHNhbWUgYXJlYSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgLT0gbWF4UmF0aW87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTW92ZSB0aGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVyIHRvIDAgYnV0IHRoZSByYXRpbyB3aWxsIGJlIGFsc28gZnVydGhlcgotICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIHRvIG1hdGNoIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKlRoZSBuZXcgcmF0aW8gaXMgdGhlIG9yaWdpbmFsIG9uZSovCi0gICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IHRlbXBQYW56b29tWGI7Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGVzIEFJUiBwYXJhbWV0ZXJzICovCi0vKiAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiBcCi0gICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYlwKLSAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotCi0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAqCi0gICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotCi0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9ICAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAoTTRPU0FfSW50MTYpKChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZSkpIC8gMTAwOwotICovCi0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHVzaW5nIHBDLT5tX05iSW1hZ2Ugd2UgaGF2ZSB0byB1c2UgKHBDLT5tX05iSW1hZ2UtMSkgYXMgcEMtPm1fSW1hZ2VDb3VudGVyCi0gICAgICAgICAgICAvLyB3aWxsIGJlIHgtMSBtYXggZm9yIHggbm8uIG9mIGZyYW1lcwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYlwKLSAgICAgICAgICAgICAgICAgICAgIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYlwKLSAgICAgICAgICAgICAgICAgICAgIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiIFwKLSAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIGlmKChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV94KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgKyBQYXJhbXMubV9pbnB1dENvb3JkLm1feSlcCi0gICAgICAgICAgICAgICAgID4gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0Q29vcmQubV95OwotICAgICAgICAgICAgfQotCi0KLQotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgICAgUGljdHVyZSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotCi0gICAgICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rQmxhY2tCb3JkZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1sxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgRmlyc3Qgd2l0aG91dCBwYW4mem9vbSovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKSA8PSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X3dpZHRoKSAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KSA8IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypudW1iZXIgb2YgbGluZXMgYXQgdGhlIHRvcCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KSAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBTZWNvbmRseSB3aXRoIHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2gocEJhc2ljVGFncy5vcmllbnRhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblVua25vd246Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgICAgICAgICAgLypOTyBST1RBVElPTiovCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dEhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdXRwdXQgd2lkdGggaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZUhlaWdodCA9ICh0ZW1wT3V0cHV0U2l6ZUhlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCBoZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9IChwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9ICh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZUhlaWdodE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgYW5kIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgLT0gKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYWJvdmUgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYmVsb3cgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgYm90dG9tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplSGVpZ2h0KnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgb3V0cHV0IHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBvdXRwdXQgd2lkdGggaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgd2lkdGgpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfd2lkdGgqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9ICh0ZW1wSW5wdXRTaXplV2lkdGhNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGNvbnRhaW5lZCBpbnRvIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRlbXBJbnB1dFNpemVXaWR0aE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feCA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2UgYWJvdmUgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgcmlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVXaWR0aCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpPj4xKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0Qm90dG9tOgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgLypST1RBVElPTiovCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA+IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgb3V0cHV0IHZpZGVvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBvdXRwdXQgaGVpZ2h0IGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgaGVpZ2h0IGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dEhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdXRwdXQgd2lkdGggaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCBoZWlnaHQpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KlBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3RlbXBPdXRwdXRTaXplSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9ICh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGludG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZUhlaWdodE1heCA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB3aWR0aCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCh0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IGFuZCBsZWZ0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgbGVmdCBvZiB0aGUgaW5wdXQgcGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBsZWZ0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB3aWR0aCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IHdpZHRoIG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSk+PjEpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypCbGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVXaWR0aE1heCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcEZpbmFsSW5wdXRXaWR0aCA9IDAsIHRlbXBGaW5hbE91dHB1dFdpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVXaWR0aCA9ICh0ZW1wT3V0cHV0U2l6ZVdpZHRoPj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IHdpZHRoIGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXMtPnVfd2lkdGgqUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KS90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0IChyb3RhdGlvbiBpbmNsdWRlZCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1lYW5zIG5vIGJsYWNrIGJvcmRlcnMsIHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIHdpbGwgYmUgZXh0ZW5kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBpbnB1dCBBSVIgaGVpZ2h0IHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJpZ2h0IGFuZCBsZWZ0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVXaWR0aE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV95IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSB0b3Agb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIGJvdHRvbSBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWEgdG8gZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgYm90dG9tKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1lYW5zIGJsYWNrIGJvcmRlcnMgYXJlIG5lY2Vzc2FyeSB0byBrZWVwIGFzcGVjdCByYXRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogUmVzaXppbmcgYW5kIENyb3BwaW5nKi8KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgIT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgUGljdHVyZSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg8UGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICs9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgodGVtcEhlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBXaWR0aD0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gIChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICs9IChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKChNNE9TQV9JbnQzMikodGVtcFdpZHRoIC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2NvbmZpZ3VyZShwQy0+bV9haXJfY29udGV4dCwgJlBhcmFtcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCi0gICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNEFJUl9nZXQocEMtPm1fYWlyX2NvbnRleHQsIHBDLT5tX3BEZWNvZGVkUGxhbmUsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBJbWFnZVBsYW5lc1swXSA9IHBJbWFnZVBsYW5lczE7Ci0gICAgICAgIHBJbWFnZVBsYW5lc1sxXSA9IHBJbWFnZVBsYW5lczI7Ci0gICAgICAgIHBJbWFnZVBsYW5lc1syXSA9IHBJbWFnZVBsYW5lczM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgdGhlIGltYWdlIGNvdW50ZXIgKi8KLSAgICBwQy0+bV9JbWFnZUNvdW50ZXIrKzsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGVuZCBvZiBzZXF1ZW5jZSAqLwotICAgIGxhc3RfZnJhbWVfZmxhZyAgICA9IChwQy0+bV9JbWFnZUNvdW50ZXIgPj0gcEMtPm1fTmJJbWFnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHRoZSBwaWN0dXJlIGR1cmF0aW9uICovCi0gICAgKnBQaWN0dXJlRHVyYXRpb24gPSBwQy0+bV90aW1lRHVyYXRpb247Ci0KLSAgICBpZiAoMSA9PSBsYXN0X2ZyYW1lX2ZsYWcpCi0gICAgewotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BEZWNvZGVkUGxhbmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmUpOwotICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBMZWF2aW5nICIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIFB0bzNHUFAgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycwotICogQG5vdGUgICAgVGhlICJQaWN0dXJlcyB0byAzR1BQIiBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUwotICogICAgICAgICAgICBjb250ZXh0LiBUaGlzIGNvbnRleHQgY29udGFpbnMgYSBwb2ludGVyIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQKLSAqICAgICAgICAgICAgb2YgdGhlIGNoYWluZWQgbGlzdCBvZiBQdG8zR1BQIHBhcmFtZXRlcnMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBEZWZpbml0aW9ucyB0byBnZW5lcmF0ZSBkdW1teSBBTVIgZmlsZSB1c2VkIHRvIGFkZCBBTVIgc2lsZW5jZSBpbiBmaWxlcyBnZW5lcmF0ZWQKLSAgICAgYnkgUHRvM0dQUCAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotICAgIC8qIFRoaXMgY29uc3RhbnQgaXMgZGVmaW5lZCBpbiBNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCAqLwotICAgIGV4dGVybiBjb25zdCBNNE9TQV9VSW50OFwKLSAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXTsKLQotICAgIC8qIEFNUiBzaWxlbnQgZnJhbWUgdXNlZCB0byBjb21wdXRlIGR1bW15IEFNUiBzaWxlbmNlIGZpbGUgKi8KLSAgICAjZGVmaW5lIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUgNgotICAgIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfSEVBREVSW000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotICAgIHsgMHgyMywgMHgyMSwgMHg0MSwgMHg0ZCwgMHg1MiwgMHgwYSB9OwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00UFRPM0dQUF9Db250ZXh0IHBNNFBUTzNHUFBfQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRQVE8zR1BQX1BhcmFtcyBQYXJhbXM7Ci0gICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiAgICBwQ2FsbEJhY2tDdHh0OwotICAgIE00T1NBX0Jvb2wgY21wUmVzdWx0PU00T1NBX0ZBTFNFOwotICAgIE00T1NBX0NvbnRleHQgcER1bW15QU1SRmlsZTsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTTRQVE8zR1BQIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRQVE8zR1BQX0luaXQoICZwTTRQVE8zR1BQX0N0eHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIHJldHVybmVkICVsZFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDYWxsQmFja0N0eHQgPSAoTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQpLAotICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSAiUHRvM2dwcCBjYWxsYmFjayBzdHJ1Y3QiKTsKLSAgICBpZihwQ2FsbEJhY2tDdHh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICBQYXJhbXMudmlkZW9Qcm9maWxlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy52aWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlICJkdW1teSIgYW1yIGZpbGUgY29udGFpbmluZyBzaWxlbmNlIGluIHRlbXBvcmFyeSBmb2xkZXIgKi8KLSAgICBNNE9TQV9jaHJOQ29weShvdXRfYW1yLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfYW1yLCAoY29uc3QgY2hhciAqKSJkdW1teS5hbXJcMCIsIDEwKTsKLQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSB0ZW1wb3JhcnkgcGF0aCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgIHBEZWNvZGVkUGF0aCA9IG91dF9hbXI7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIG91dF9hbXIsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgY29udmVydGVkIHBhdGgqLwotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5vcGVuV3JpdGUoJnBEdW1teUFNUkZpbGUsIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uIHNlZSBhYm92ZSovCi0vKiAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgb3V0X2FtciwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0gKi8KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBDYW4ndCBvcGVuIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgKE00T1NBX0ludDgqKU00VlNTM0dQUF9BTVJfSEVBREVSLCBNNFZTUzNHUFBfQU1SX0hFQURFUl9TSVpFKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBDYW4ndCB3cml0ZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsXAotICAgICAgICAgICAgIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+d3JpdGVEYXRhKHBEdW1teUFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OCwgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBcCi0gICAgICAgICAgICBDYW4ndCB3cml0ZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+Y2xvc2VXcml0ZShwRHVtbXlBTVJGaWxlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UGljdHVyZVRvM2dwOiBcCi0gICAgICAgICAgICBDYW4ndCBjbG9zZSBvdXRwdXQgZHVtbXkgYW1yIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLG91dF9hbXIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBwYXJhbWV0ZXJzIGZvciBQdG8zR1BQIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICogUHRvM0dQUCBwYXJhbWV0ZXJzIGNoYWluZWQgbGlzdCBhbmQgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA9PSAwKSB7Ci0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUgICAgPSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY1RvM0dQOiB2aWRlbyBiaXRyYXRlID0gJWQiLAotICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIFBhcmFtcy5PdXRwdXRGaWxlTWF4U2l6ZSAgICA9IE00UFRPM0dQUF9rVU5MSU1JVEVEOwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0ICAgID0gTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDsKLSAgICBQYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQgICAgPSBwQ2FsbEJhY2tDdHh0OwotICAgIC8qRkI6IGNoYW5nZSB0byB1c2UgdGhlIGNvbnZlcnRlZCBwYXRoIChVVEYgY29udmVyc2lvbikgc2VlIHRoZSBjb252ZXJzaW9uIGFib3ZlKi8KLSAgICAvKkZpeCA6LSBBZGRpbmcgQXVkaW8gVHJhY2sgaW4gSW1hZ2UgYXMgaW5wdXQgOkF1ZGlvVGFyY2tGaWxlIFNldHRpbmcgdG8gTlVMTCAqLwotICAgIFBhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSAgICA9IE00T1NBX05VTEw7Ly8oTTRPU0FfVm9pZCopcERlY29kZWRQYXRoOy8vb3V0X2FtcjsKLSAgICBQYXJhbXMuQXVkaW9QYWRkaW5nTW9kZSAgICAgICAgPSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcDsKLSAgICBQYXJhbXMuQXVkaW9GaWxlRm9ybWF0ICAgICAgICA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI7Ci0gICAgUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVPdXQ7Ci0gICAgUGFyYW1zLnBUZW1wb3JhcnlGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZVRlbXA7Ci0gICAgLyorUFIgTm86ICBibHJueHBzdyMyMjMqLwotICAgIC8qSW5jcmVhc2luZyBmcmVxdWVuY3kgb2YgRnJhbWUsIGNhbGN1bGF0aW5nIE5vcyBvZiBGcmFtZSA9IGR1cmF0aW9uIC9GUFMgKi8KLSAgICAvKk90aGVyIGNoYW5nZXMgbWFkZSBpcyBAIE00eFZTU19BUEkuYyBAIGxpbmUgMzg0MSBpbiBNNHhWU1NfU2VuZENvbW1hbmQqLwotICAgIC8qSWYgY2FzZSBjaGVjayBmb3IgUGFuWm9vbSByZW1vdmVkICovCi0gICAgUGFyYW1zLk5iVmlkZW9GcmFtZXMgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpCi0gICAgICAgICh4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+ZHVyYXRpb24gXAotICAgICAgICAgICAgLyB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+ZnJhbWVyYXRlKTsgLyogKi8KLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3RpbWVEdXJhdGlvbiAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGU7Ci0gICAgLyotUFIgTm86ICBibHJueHBzdyMyMjMqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fSW1hZ2VDb3VudGVyICAgID0gMDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX0ZpbGVJbiAgICAgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlSW47Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9OYkltYWdlICAgICAgICA9IFBhcmFtcy5OYlZpZGVvRnJhbWVzOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcEZpbGVSZWFkUHRyICAgID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHI7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRGVjb2RlZFBsYW5lICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BQdG8zR1BQcGFyYW1zICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9haXJfY29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9tZWRpYVJlbmRlcmluZyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZzsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyAqLwotICAgIGVyciA9IE00UFRPM0dQUF9PcGVuKHBNNFBUTzNHUFBfQ3R4dCwgJlBhcmFtcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuIHJldHVybmVkOiAweCV4XG4iLGVycik7Ci0gICAgICAgIGlmKHBDYWxsQmFja0N0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgICAgIHBDYWxsQmFja0N0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIE00UFRPM0dQUF9DbGVhblVwKHBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBQdG8zR1BQIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCA9IHBNNFBUTzNHUFBfQ3R4dDsKLSAgICB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQgPSBwQ2FsbEJhY2tDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgUHRvM0dQUAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfQ2hhciBvdXRfYW1yW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgTTRPU0FfQ2hhciogcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgUFRPM0dQUCBjYWxsYmFjayBjb250ZXh0ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluYWxpemUgdGhlIG91dHB1dCBmaWxlICovCi0gICAgZXJyID0gTTRQVE8zR1BQX0Nsb3NlKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgZHVtbXkuYW1yIGZpbGUgKi8KLSAgICBNNE9TQV9jaHJOQ29weShvdXRfYW1yLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfYW1yLCAoY29uc3QgY2hhciAqKSJkdW1teS5hbXJcMCIsIDEwKTsKLQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSB0ZW1wb3JhcnkgcGF0aCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQqLwotICAgIHBEZWNvZGVkUGF0aCA9IG91dF9hbXI7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIG91dF9hbXIsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLSAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwRGVjb2RlZFBhdGgpOwotCi0gICAgLypDb21tZW50ZWQgYmVjYXVzZSBvZiB0aGUgdXNlIG9mIHRoZSBVVEYgY29udmVyc2lvbiovCi0vKiAgICByZW1vdmUob3V0X2Ftcik7Ci0gKi8KLQotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBSR0I1NjUgcGxhbmUgdG8gWVVWNDIwIHBsYW5hcgotICogQG5vdGUgICAgSXQgaXMgdXNlZCBvbmx5IGZvciBmcmFtaW5nIGVmZmVjdAotICogICAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgICBmcmFtaW5nQ3R4ICAgIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IFlVViBwbGFuZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPQotICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAqZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCozKT4+MSwgTTRWUywgKE00T1NBX0NoYXIgKilcCi0gICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgXAotICAgICAgICArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGlucHV0IFJHQiA1NjUgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcKLSAgICAgIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjpcCi0gICAgICAgICAgICAgZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSB3aXRoIFJHQiBidWZmZXIuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU2V0UGxhbmVUcmFuc3BhcmVudChNNE9TQV9VSW50OCogcGxhbmVJbiwgTTRPU0FfVUludDMyIHNpemUpCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRPU0FfVUludDgqIHBsYW5lID0gcGxhbmVJbjsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLQotICAgIGZvcihpPTA7IGk8KHNpemU+PjEpOyBpKyspCi0gICAgewotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgKnBsYW5lKysgPSB0cmFuc3BhcmVudDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkJHODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIEFSR0I4ODg4IGlucHV0IGZpbGUgIHRvIFlVVjQyMCB3aGVudXNlZCBmb3IgZnJhbW1pbmcgZWZmZWN0Ci0gKiBAbm90ZSAgICBUaGUgaW5wdXQgQVJHQjg4ODggZmlsZSBwYXRoIGlzIGNvbnRhaW5lZCBpbiB0aGUgcEVmZmVjdCBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgSWYgdGhlIEFSR0I4ODg4IG11c3QgYmUgcmVzaXplZCB0byBmaXQgb3V0cHV0IHZpZGVvIHNpemUsIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgd2lsbCBkbyBpdC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEVmZmVjdCAgICAgICAgKElOKSBUaGUgZWZmZWN0IHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbnMgb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgdG8gZGVjb2RlLCByZXNpemluZyAuLi4KLSAqIEBwYXJhbSAgICBmcmFtaW5nQ3R4ICAgIChJTi9PVVQpIFN0cnVjdHVyZSBpbiB3aGljaCB0aGUgb3V0cHV0IFJHQiB3aWxsIGJlIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiBGaWxlIG5vdCBmb3VuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNE9TQV9VSW50MzIgZmlsZV9zaXplOwotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCB3aWR0aF9vdXQsIGhlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVm9pZCogcEZpbGUgPSBwRWZmZWN0LT54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2I9KGZyYW1pbmdDdHgtPndpZHRoICogZnJhbWluZ0N0eC0+aGVpZ2h0ICogNCk7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgdGVtcEFscGhhUGVyY2VudCA9IDA7Ci0gICAgTTRWSUZJX1VJbnQ4KiBUZW1wUGFjRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDE2ICpwdHIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB6ID0gMDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiBFbnRlcmluZyAiKTsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0IHdpZHRoIGFuZCBoZWlnaHQgJWQgJWQgIiwKLSAgICAgICAgZnJhbWluZ0N0eC0+d2lkdGgsZnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKVwKLSAgICAgICAgIkltYWdlIGFyZ2IgZGF0YSIpOwotICAgIGlmKHBUbXBEYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCB0aGUgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gcEZpbGU7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LCAoTTRPU0FfVm9pZCopIHBGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbERlY29kZVBORzpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEVuZCBvZiB0aGUgY29udmVyc2lvbiwgbm93IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLQotICAgICAvKiBPcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgYW5kIHN0b3JlIGl0IGludG8gbWVtb3J5ICovCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRGVjb2RlZFBhdGgsIE00T1NBX2tGaWxlUmVhZCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlLCBlcnIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5yZWFkRGF0YShwQVJHQkluLChNNE9TQV9NZW1BZGRyOClwVG1wRGF0YSwgJmZyYW1lU2l6ZV9hcmdiKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBwbmcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICByZ2JQbGFuZS51X2hlaWdodCA9IGZyYW1pbmdDdHgtPmhlaWdodDsKLSAgICByZ2JQbGFuZS51X3dpZHRoID0gZnJhbWluZ0N0eC0+d2lkdGg7Ci0gICAgcmdiUGxhbmUudV9zdHJpZGUgPSByZ2JQbGFuZS51X3dpZHRoKjM7Ci0gICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgIGZyYW1lU2l6ZSA9IChyZ2JQbGFuZS51X3dpZHRoICogcmdiUGxhbmUudV9oZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhCi0gICAgcmdiUGxhbmUucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKChmcmFtZVNpemUpKyAoMiAqIGZyYW1pbmdDdHgtPndpZHRoKSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCODg4IGRhdGEiKTsKLSAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICAiKTsKLQotICAgIC8qIHByZW11bHRpcGxpZWQgYWxwaGEgJSBvbiBSR0IgKi8KLSAgICBmb3IgKGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSArPSA0KSB7Ci0gICAgICAgIC8qIHRoaXMgaXMgYWxwaGEgdmFsdWUgKi8KLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcEFscGhhUGVyY2VudCA9IHBUbXBEYXRhW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUiAqLwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMV07Ci0gICAgICAgIGorKzsKLQotICAgICAgICAvKiBHICovCi0gICAgICAgIGlmICh0ZW1wQWxwaGFQZXJjZW50ID4gMCkgewotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzJdOwotICAgICAgICAgICAgaisrOwotICAgICAgICB9IGVsc2Ugey8qIEluIGNhc2Ugb2YgYWxwaGEgdmFsdWUgMCwgbWFrZSBHUkVFTiB0byAyNTUgKi8KLSAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gMjU1OyAvL3BUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBCICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSszXTsKLSAgICAgICAgaisrOwotICAgIH0KLQotICAgIGZyZWUocFRtcERhdGEpOwotICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIGNvbnZlcnQgUkdCODg4IHRvIFJHQjU2NSAqLwotCi0gICAgLyogYWxsb2NhdGUgdGVtcCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgIFRlbXBQYWNEYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICg0ICogKGZyYW1pbmdDdHgtPndpZHRoICsgZnJhbWluZ0N0eC0+aGVpZ2h0ICsgMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjU2NSBkYXRhIik7Ci0gICAgaWYgKFRlbXBQYWNEYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICAgICAgZnJlZShyZ2JQbGFuZS5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwdHIgPSAoTTRPU0FfVUludDE2ICopVGVtcFBhY0RhdGE7Ci0gICAgeiA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaiA7IGkgKz0gMykKLSAgICB7Ci0gICAgICAgIHB0clt6KytdID0gUEFDS19SR0I1NjUoMCwgICByZ2JQbGFuZS5wYWNfZGF0YVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtpKzJdKTsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIHRoZSBSQkc4ODggYW5kIGFzc2lnbiBSR0I1NjUgKi8KLSAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IFRlbXBQYWNEYXRhOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgb3V0cHV0IHNpemVzIGFyZSBvZGQgKi8KLSAgICBpZihyZ2JQbGFuZS51X2hlaWdodCAlIDIgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VklGSV9VSW50OCogb3V0cHV0X3BhY19kYXRhID0gcmdiUGxhbmUucGFjX2RhdGE7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgICAgb3V0cHV0IGhlaWdodCBpcyBvZGQgICIpOwotICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz1yZ2JQbGFuZS51X3dpZHRoICogcmdiUGxhbmUudV9oZWlnaHQqMjsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV93aWR0aDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBqdXN0IGFkZCBhIHdoaXRlIGxpbmUgdG8gdGhlIFBORyB0aGF0IHdpbGwgYmUgdHJhbnNwYXJlbnQgKi8KLSAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQrKzsKLSAgICB9Ci0gICAgaWYocmdiUGxhbmUudV93aWR0aCAlIDIgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBhZGQgYSBuZXcgY29sdW1uIG9mIHdoaXRlICg9dHJhbnNwYXJlbnQpLCBidXQgd2UgbmVlZCB0byBwYXJzZSBhbGwgUkdCIGxpbmVzIC4uLiAqLwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEsICppbnB1dF9wYWNfZGF0YTsKLQotICAgICAgICByZ2JQbGFuZS51X3dpZHRoKys7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiBcCi0gICAgICAgICAgICAgb3V0cHV0IHdpZHRoIGlzIG9kZCAgIik7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IFJHQiBvdXRwdXQgYnVmZmVyIGluIHdoaWNoIGFsbCBkZWNvZGVkIGRhdGEKLSAgICAgICAgICArIHdoaXRlIGxpbmUgd2lsbCBiZSBjb3BpZWQgKi8KLSAgICAgICAgbmV3UkdCcGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocmdiUGxhbmUudV9oZWlnaHQqcmdiUGxhbmUudV93aWR0aCoyXAotICAgICAgICAgICAgKnNpemVvZihNNFZJRklfVUludDgpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJOZXcgRnJhbWluZyBHSUYgT3V0cHV0IHBhY19kYXRhIFJHQiIpOwotCi0gICAgICAgIGlmKG5ld1JHQnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIFwKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dHB1dF9wYWNfZGF0YT0gbmV3UkdCcGFjX2RhdGE7Ci0gICAgICAgIGlucHV0X3BhY19kYXRhID0gcmdiUGxhbmUucGFjX2RhdGE7Ci0KLSAgICAgICAgZm9yKGk9MDtpPHJnYlBsYW5lLnVfaGVpZ2h0O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopb3V0cHV0X3BhY19kYXRhLCAodm9pZCAqKWlucHV0X3BhY19kYXRhLAotICAgICAgICAgICAgICAgICAocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLQotICAgICAgICAgICAgb3V0cHV0X3BhY19kYXRhICs9ICgocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcGl4ZWwgdG8gdHJhbnNwYXJlbmN5IGNvbG9yICovCi0gICAgICAgICAgICAqb3V0cHV0X3BhY19kYXRhKysgPSB0cmFuc3BhcmVudDE7Ci0gICAgICAgICAgICAqb3V0cHV0X3BhY19kYXRhKysgPSB0cmFuc3BhcmVudDI7Ci0KLSAgICAgICAgICAgIGlucHV0X3BhY19kYXRhICs9ICgocmdiUGxhbmUudV93aWR0aC0xKSoyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBuZXdSR0JwYWNfZGF0YTsKLSAgICB9Ci0KLSAgICAvKiByZXNldCBzdHJpZGUgKi8KLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgY2hhaW5lZCBsaXN0IHBhcmFtZXRlcnMgKi8KLSAgICBmcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0IChubyBhbmltYXRlZCBpbWFnZSAuLi4pICovCi0gICAgZnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotICAgIC8qKgotICAgICAqIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgIHN3aXRjaChPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gICAgLy9zd2l0Y2goeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplKQotICAgIHsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTI4OwotICAgICAgICBoZWlnaHRfb3V0ID0gOTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAxNjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAxMjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgIHdpZHRoX291dCA9IDE3NjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDE0NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gMzIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjQwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgIHdpZHRoX291dCA9IDM1MjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDI4ODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSA2NDA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDgwMDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgd2lkdGhfb3V0ID0gNzIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICB3aWR0aF9vdXQgPSA2NDA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAzNjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgd2lkdGhfb3V0ID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjgwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfMTA4MF83MjBfV2lkdGg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDk2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICB3aWR0aF9vdXQgPSAxOTIwOwotICAgICAgICBoZWlnaHRfb3V0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgIC8qKgotICAgICAqIElmIG91dHB1dCB2aWRlbyBzaXplIGlzIG5vdCBnaXZlbiwgd2UgdGFrZSBRQ0lGIHNpemUsCi0gICAgICogc2hvdWxkIG5vdCBoYXBwZW4sIGJlY2F1c2UgYWxyZWFkeSBkb25lIGluIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHdpZHRoX291dCA9IDE3NjsKLSAgICAgICAgaGVpZ2h0X291dCA9IDE0NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgb3V0cHV0IHBsYW5lcyBzdHJ1Y3R1cmVzICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwbGFuZSBSR0IiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmVzaXplIFJHQiBpZiBuZWVkZWQgKi8KLSAgICBpZigocEVmZmVjdC0+eFZTUy5iUmVzaXplKSAmJgotICAgICAgICAgKHJnYlBsYW5lLnVfd2lkdGggIT0gd2lkdGhfb3V0IHx8IHJnYlBsYW5lLnVfaGVpZ2h0ICE9IGhlaWdodF9vdXQpKQotICAgIHsKLSAgICAgICAgd2lkdGggPSB3aWR0aF9vdXQ7Ci0gICAgICAgIGhlaWdodCA9IGhlaWdodF9vdXQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBOZXcgV2lkdGggYW5kIGhlaWdodCAlZCAlZCAgIix3aWR0aCxoZWlnaHQpOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0X291dDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKjI7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPQotICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCpmcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+dV93aWR0aCoyKnNpemVvZihNNFZJRklfVUludDgpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OiAgUmVzaXppbmcgTmVlZGVkICIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDpcCi0gICAgICAgICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ICYgcmdiUGxhbmUudV93aWR0aCAlZCAlZCIscmdiUGxhbmUudV9oZWlnaHQscmdiUGxhbmUudV93aWR0aCk7Ci0KLSAgICAgICAgLy9lcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLQotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QgOlwKLSAgICAgICAgICAgICAgICB3aGVuIHJlc2l6aW5nIFJHQiBwbGFuZTogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihyZ2JQbGFuZS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgUmVzaXppbmcgTm90IE5lZWRlZCAiKTsKLQotICAgICAgICB3aWR0aCA9IHJnYlBsYW5lLnVfd2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IHJnYlBsYW5lLnVfaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCA9IHdpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICB9Ci0KLQotICAgIGlmKHBFZmZlY3QtPnhWU1MuYlJlc2l6ZSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3JjZSB0b3BsZWZ0IHRvIDAgZm9yIHB1cmUgZnJhbWluZyBlZmZlY3QgKi8KLSAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gMDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgIFJHQiBvdXRwdXQgdG8gWVVWIDQyMCB0byBiZSBhYmxlIHRvIG1lcmdlIGl0IHdpdGggb3V0cHV0IHZpZGVvIGluIGZyYW1pbmcKLSAgICAgZWZmZWN0ICovCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFlVViIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvLyBBbGxvYyBmb3IgWSwgVSBhbmQgViBwbGFuZXMKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gKChoZWlnaHQrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlID0gKCh3aWR0aCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jIGZvciB0aGUgb3V0cHV0IFkiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0Iik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgVSIpOwotICAgIGlmIChmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoKChoZWlnaHQrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jIGZvciB0aGUgIG91dHB1dCBWIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgY29udmVydCBSR0IgdG8gWVVWICIpOwotCi0gICAgLy9lcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgIGVyciA9IE00VklGSV9SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0KLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiU1BTIHBuZzogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBMZWF2aW5nICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBWU1MgZm9yIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gc2V0IHNwZWNpYWwgeFZTUyBlZmZlY3QgYXMgZXh0ZXJuYWwgZWZmZWN0cyBmb3IgdGhlIFZTUwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBWc3NDdHh0OwotICAgIE00T1NBX1VJbnQzMiBpLGo7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGVkaXRpb24gaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdEluaXQoICZwVnNzQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZTogTTRWU1MzR1BQX2VkaXRJbml0IHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqKXBWc3NDdHh0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5iQXVkaW9Nb25vID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvTGV2ZWwgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgZmlsbCBkaXJlY3RseSBpbnRvIHRoZSBWU1MgY29udGV4dCB0aGUgdGFyZ2V0ZWQgYml0cmF0ZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlICE9IDApCi0gICAgewotICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCogcFZTU0NvbnRleHQgPSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqKXBWc3NDdHh0OwotCi0gICAgICAgIHBWU1NDb250ZXh0LT5iSXNNTVMgPSBNNE9TQV9UUlVFOwotICAgICAgICBwVlNTQ29udGV4dC0+dWlNTVNWaWRlb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPk1NU3ZpZGVvRnJhbWVyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIH0KLQotICAgIC8qV2FybmluZzogc2luY2UgdGhlIGFkZGluZyBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHBTZXR0aW5ncyBoYXMgYmVlbiBjaGFuZ2VkIGluIHRoZSBuZXh0Ci0gICAgcGFydCBpbiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgKHRoZXJlIGlzIGEgc3BlY2lmaWMgY3VycmVudCBlZGl0aW5nIHN0cnVjdHVyZSBmb3IgdGhlIHNhdmluZywKLSAgICAgYXMgZm9yIHRoZSBwcmV2aWV3KSovCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGV4dGVybmFsIHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMsIGZvciBzYXZpbmcgbW9kZSAodG8gYmUgbW92ZWQgdG8KLSAgICAgIE00eFZTU19zYXZlU3RhcnQoKSA/KSovCi0gICAgZm9yIChpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGo9MDsgajx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHM7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU7Ci0gICAgICAgICAgICAgICAgLypjb21tZW50ZWQgRkIqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQKLSAgICAgICAgICAgICAgICAgZHVyaW5nIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluayA9PQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms7IC8qKjwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4gPT0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEgPT0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE7Ci0gICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllczsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZTsKLSAgICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZyA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmc7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBmcmFtaW5nIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW47IC8qKjwgd2UgZG9uJ3QgdXNlIGFueQotICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQ7IC8qKjwgd2UgZG9uJ3QgdXNlIGFueQotICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY7Ci0gICAgICAgICAgICAgICAgLyoqPCB3ZSBkb24ndCB1c2UgYW55IGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW4gdGhlIFZTUyAzR1BQICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRPcGVuKHBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdE9wZW4gcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBWU1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNsb3NlIC8gZnJlZSBWU1MgbGF0ZXIgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBwVnNzQ3R4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIFZTUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENsb3NlIHRoZSBWU1MgM0dQUCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsb3NlKHBWc3NDdHh0KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2VkaXRDbG9zZSByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGVkaXRpb24gaW5zdGFuY2UgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbGVhblVwKHBWc3NDdHh0KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6IFwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUgICAgSXQgdGFrZXMgaXRzIHBhcmFtZXRlcnMgZnJvbSB0aGUgQkdNIHNldHRpbmdzIGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqKgotICogRkI6IHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBzYXZpbmcgaXMgbm93IHRoZQotICogIHBDdXJyZW50RWRpdFNldHRpbmdzIGFuZCBub3QgdGhlIHBTZXR0aW5ncwotICogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gYWRkZWQgZm9yIHRoZSBVVEYgc3VwcG9ydAotICogQWxsIHRoZSAieFZTU19jb250ZXh0LT5wU2V0dGluZ3MiIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICJ4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzIgotICoqKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlIGF1ZGlvIG1peGluZyBzZXR0aW5ncyBzdHJ1Y3R1cmUgYW5kIGZpbGwgaXQgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzID0gKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgKHNpemVvZihNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopInBBdWRpb01peFNldHRpbmdzIik7Ci0gICAgaWYocEF1ZGlvTWl4U2V0dGluZ3MgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUgPT0KLSAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQKQotICAgIHsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcygoTTRPU0FfQ29udGV4dCl4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZTpcCi0gICAgICAgICAgICAgICAgIGltcG9zc2libGUgdG8gcmV0cmlldmUgYXVkaW8gQkdNIHByb3BlcnRpZXMgLT5cCi0gICAgICAgICAgICAgICAgICAgICByZWVuY29kaW5nIGF1ZGlvIGJhY2tncm91bmQgbXVzaWMiLCBlcnIpOwotICAgICAgICAgICAgZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCsxOwotICAgICAgICAgICAgICAgICAgLyogVG8gZm9yY2UgQkdNIGVuY29kaW5nICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsID0gTTRPU0FfRkFMU0U7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkFkZGVkQXVkaW9GaWxlVHlwZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lOwotCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEFTRiA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpTnVtQ2hhbm5lbHMgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpTnVtQ2hhbm5lbHM7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+Yl9EdWNraW5nTmVlZGVlZCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5mQlRWb2xMZXZlbCA9Ci0gICAgIChNNE9TQV9GbG9hdCApeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfbG93Vm9sdW1lID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmxvd1ZvbHVtZS8xMDA7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZQVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+Ykxvb3AgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJMb29wOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubykKLSAgICB7Ci0gICAgICAgIHBBdWRpb01peFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgYXVkaW8gbWl4IHNldHRpbmdzIHdpdGggQkdNIHBhcmFtZXRlcnMgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlCZWdpbkxvb3AgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlCZWdpbkxvb3A7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpRW5kTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3A7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkQ3RzOwotCi0gICAgLyoqCi0gICAgICogT3V0cHV0IGZpbGUgb2YgdGhlIGF1ZGlvIG1peGVyIHdpbGwgYmUgZmluYWwgZmlsZSAoYXVkaW8gbWl4aW5nIGlzIHRoZSBsYXN0IHN0ZXApICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGU7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0geFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgIC8qKgotICAgICAqIElucHV0IGZpbGUgb2YgdGhlIGF1ZGlvIG1peGVyIGlzIGEgdGVtcG9yYXJ5IGZpbGUgY29udGFpbmluZyBhbGwgYXVkaW8vdmlkZW8gZWRpdGlvbnMgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGUgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLQotICAgIC8qKgotICAgICAqIFNhdmUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHBvaW50ZXIgdG8gYmUgYWJsZSB0byBmcmVlIGl0IGluCi0gICAgIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KCZwQXVkaW9NaXhpbmdDdHh0LCBwQXVkaW9NaXhTZXR0aW5ncywKLSAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgYXVkaW8gbWl4aW5nIHN0ZXAgZnVuY3Rpb24gaW4KLSAgICAgIE00eFZTU19zdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0ID0gcEF1ZGlvTWl4aW5nQ3R4dDsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZTpcCi0gICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIC8vTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChwQXVkaW9NaXhpbmdDdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTIGZvciBhdWRpbyBtaXhpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgVlNTM0dQUCBhdWRpbyBtaXhpbmcgaW5zdGFuY2UgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhDb250ZXh0KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZTpcCi0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgVlNTIGF1ZGlvIG1peGluZyBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgcHJldmlldyBlZGl0aW9uIHN0cnVjdHVyZSB1c2VkIHRvIGdlbmVyYXRlCi0gKiAgICAgICAgICAgIHByZXZpZXcuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUgICAgSXQgYWxzbyBmcmVlIHRoZSBwcmV2aWV3IHN0cnVjdHVyZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgIHsKLSAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKGkgIT0geFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcC90cmFuc2l0aW9uIGxpc3QgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgb3V0cHV0IHByZXZpZXcgZmlsZSBwYXRoICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0ZW1wb3JhcnkgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgImxvY2FsIiBCR00gc2V0dGluZ3MgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGN1cnJlbnQgZWRpdCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHByZXZpZXcgZWZmZWN0cyBnaXZlbiB0byBhcHBsaWNhdGlvbiAqLwotICAgIGlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wUHJldmlld1NldHRpbmdzLT5FZmZlY3RzKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPm5iRWZmZWN0cyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgc2F2aW5nIGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgb3V0cHV0LjNncCBmaWxlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgZm9yKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKFwKLSAgICAgICAgICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIG91dHB1dCBzYXZpbmcgZmlsZSBwYXRoICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgdGVtcG9yYXJ5IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBhbiBNNFZTUzNHUFBfRWRpdFNldHRpbmdzIHN0cnVjdHVyZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgKElOKSBQb2ludGVyIG9uIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlIHRvIGZyZWUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19mcmVlU2V0dGluZ3MoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLQotICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNsaXAgLi4uICovCi0gICAgZm9yKGk9MDsgaTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBmcmVlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBmcmVlIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICAgICAgaWYoaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTEpIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlZpZGVvVHJhbnNpdGlvblR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIGNhc2Ugb2YgQWxwaGEgTWFnaWMgdHJhbnNpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBleHRyYSBwYXJhbWV0ZXJzIG5lZWQgdG8gYmUgZnJlZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCgoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lLT5wYWNfZGF0YSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUtPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KS0+cFBsYW5lID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqPWkrMTtqPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyLTE7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0tPlZpZGVvVHJhbnNpdGlvblR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdD0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3Rbal0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwQ21wUmVzdWx0ID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIGV4dHJhIGludGVybmFsIGFscGhhIG1hZ2ljIHN0cnVjdHVyZSBhbmQgcHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIE5VTEwgdG8gYXZvaWQgcmVmcmVlaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBGcmVlIHRyYW5zaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0pKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAgbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cENsaXBMaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBDbGlwTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0cmFuc2l0aW9uIGxpc3QgKi8KLSAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QpKTsKLSAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJDOiBGcmVlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0cyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDsgaTxwU2V0dGluZ3MtPm5iRWZmZWN0czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEZvciBlYWNoIGNsaXAsIGZyZWUgZnJhbWluZyBzdHJ1Y3R1cmUgaWYgbmVlZGVkICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcKLSAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1RleHQpCi0gICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQqIGZyYW1pbmdDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nMzEwMlN0cnVjdCogZnJhbWluZ0N0eF9maXJzdCA9IGZyYW1pbmdDdHg7Ci0jZW5kaWYKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24gZXhpc3RhbnQKLSAgICAgICAgICAgICAgICAgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qSW4gY2FzZSB0aGVyZSBhcmUgc3RpbGwgYWxsb2NhdGVkKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAgICBNNFNQU19kZXN0cm95KGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHggIT0gTTRPU0FfTlVMTCkgLyogQnVnZml4IDEuMi4wOiBjcmFzaCwgdHJ5aW5nIHRvIGZyZWUgbm9uCi0gICAgICAgICAgICAgICAgICAgIGV4aXN0YW50IHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHhfc2F2ZSA9IGZyYW1pbmdDdHgtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IGZyYW1pbmdDdHhfc2F2ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IGJ1ZyBmaXggUDRNRTAwMDAzMDAyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZShmcmFtaW5nQ3R4X2ZpcnN0ICE9IGZyYW1pbmdDdHgpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRnJlZSBGaWZ0aWVzIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogRmlmdGllc0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotCi0gICAgICAgICAgICAgICAgaWYoRmlmdGllc0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShGaWZ0aWVzQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgRmlmdGllc0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50PT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIENvbG9yIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QqIENvbG9yQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihDb2xvckN0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShDb2xvckN0eCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbG9yQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEZyZWUgc2ltcGxlIGZpZWxkcyAqLwotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocFNldHRpbmdzLT5FZmZlY3RzKTsKLSAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00eFZTU19mcmVlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotLy8gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2spOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00eFZTU19mcmVlU2V0dGluZ3MoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyogcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zX3NhdXY7Ci0KLSAgICAgICAgd2hpbGUocFBhcmFtcyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVUZW1wKTsKLSNlbmRpZi8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IHBQYXJhbXM7Ci0gICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICBmcmVlKHBQYXJhbXNfc2F1dik7Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUmVpbml0IGFsbCBjb250ZXh0IHZhcmlhYmxlcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLSAgICB4VlNTX2NvbnRleHQtPmVkaXRpbmdTdGVwID0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZzsKLSAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0gTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRUaW1lc2NhbGUgPSAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBGaWxlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgYW4gaW5wdXQgM0dQIGZpbGUgdXNpbmcgTUNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEZpbGUgICAgICAgICAgICAoSU4pIDNHUCBmaWxlIHRvIGFuYWx5c2UKLSAqIEBwYXJhbSAgICBwRmlsZVByb3BlcnRpZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBhIHN0cnVjdHVyZSB0aGF0IHdpbGwgY29udGFpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDNHUCBmaWxlIHByb3BlcnRpZXMKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRNQ1NfQ29udGV4dCBtY3NfY29udGV4dDsKLQotICAgIGVyciA9IE00TUNTX2luaXQoJm1jc19jb250ZXh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzOiBFcnJvciBpbiBNNE1DU19pbml0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKm9wZW4gdGhlIE1DUyBpbiB0aGUgIm5vcm1hbCBvcGVuaW5nIiBtb2RlIHRvIHJldHJpZXZlIHRoZSBleGFjdCBkdXJhdGlvbiovCi0gICAgZXJyID0gTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKG1jc19jb250ZXh0LCBwRmlsZSwgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAsCi0gICAgICAgIE00T1NBX05VTEwsIE00T1NBX05VTEwpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzOiBFcnJvciBpbiBNNE1DU19vcGVuOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMobWNzX2NvbnRleHQsIHBGaWxlUHJvcGVydGllcyk7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2Fib3J0OiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgdGFyZ2V0ZWQgdGltZSBzY2FsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgICAgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwVGFyZ2V0ZWRUaW1lU2NhbGUgICAgKE9VVCkgICAgVGFyZ2V0ZWQgdGltZSBzY2FsZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFRhcmdldGVkVGltZVNjYWxlKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHRvdGFsRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wVGltZVNjYWxlID0gMCwgdGVtcER1cmF0aW9uID0gMDsKLQotICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspCi0gICAgewotICAgICAgICAvKnNlYXJjaCB0aW1lc2NhbGUgb25seSBpbiBtcGVnNCBjYXNlKi8KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQCi0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNAotICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICAgICAgTTRPU0FfQ2hhciogcERlY29kZWRQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19Jbml0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypFbmQgb2YgdGhlIGNvbnZlcnNpb246IHVzZSB0aGUgZGVjb2RlZCBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8qZ2V0IGlucHV0IGZpbGUgcHJvcGVydGllcyovCi0gICAgICAgICAgICAvKmVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICBwQ2xpcExpc3RbaV0tPnBGaWxlLCAmZmlsZVByb3BlcnRpZXMpOyovCi0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGU6XAotICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZDogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0ZW1wRHVyYXRpb24gPCAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih0ZW1wRHVyYXRpb24gPCAoZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb25cCi0gICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVGltZVNjYWxlID0gZmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEdXJhdGlvbiA9IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qdGhlIHRpbWVzY2FsZSBpcyAzMCBmb3IgUFRPM0dQKi8KLSAgICAgICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSAzMDsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih0ZW1wVGltZVNjYWxlID49IDMwKS8qRGVmaW5lIGEgbWluaW11bSB0aW1lIHNjYWxlLCBvdGhlcndpc2UgaWYgdGhlIHRpbWVzY2FsZSBpcyBub3QKLSAgICBlbm91Z2gsIHRoZXJlIHdpbGwgYmUgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgc2hlbGwgZW5jb2RlciovCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gdGVtcFRpbWVTY2FsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLXsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLSAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QqIENvbG9yQ29udGV4dCA9IChNNHhWU1NfQ29sb3JTdHJ1Y3QqKXBGdW5jdGlvbkNvbnRleHQ7Ci0KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcF9idWZfc3JjID0gJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICAgICAgICAgICAgICAvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDEzOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcF9idWZfc3JjICxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LCAoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgciA9IDAsZyA9IDAsYiA9IDAseSA9IDAsdSA9IDAsdiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZpcnN0IGdldCB0aGUgciwgZywgYiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDdlMCk+PjU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4ZjgwMCk+PjExOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKE00T1NBX1VJbnQxNikoIGIgLSAoKGIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IChNNE9TQV9VSW50MTYpKGcgLSAoKGcqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmtlZXAgeSwgYnV0IHJlcGxhY2UgdSBhbmQgdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTHVtaW5hbmNlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICAgICAgICAgICAgICAvLyBjb21tZW50ZWQgYmVjYXVzZSBhIHN0cnVjdHVyZSBmb3IgdGhlIGVmZmVjdHMgY29udGV4dCBleGlzdAotICAgICAgICAgICAgICAgIHN3aXRjaCAoQ29sb3JDb250ZXh0LT5jb2xvckVmZmVjdFR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZfZGVzdFtqXSA9IDI1NSAtIHBfYnVmX3NyY1tqXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfYnVmX3NyYyArPSBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLypGQiovCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotICAgIC8qZW5kIEZCKi8KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwX2luX1kgKz0gUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9VICs9IFBsYW5lSW5bMV0udV90b3BsZWZ0OwotICAgIHBfaW5fViArPSBQbGFuZUluWzJdLnVfdG9wbGVmdDsKLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgLyoqCi0gICAgICogRGVwZW5kaW5nIG9uIHRpbWUsIGluaXRpYWxpemUgRnJhbWluZyBmcmFtZSB0byB1c2UgKi8KLSAgICBpZihGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID09IC0xKQotICAgIHsKLSAgICAgICAgRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBjdXJyZW50IGNsaXAgdGltZSBoYXMgcmVhY2ggdGhlIGR1cmF0aW9uIG9mIG9uZSBmcmFtZSBvZiB0aGUgZnJhbWluZyBwaWN0dXJlCi0gICAgICogd2UgbmVlZCB0byBzdGVwIHRvIG5leHQgZnJhbWluZyBwaWN0dXJlICovCi0KLSAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgRnJhbWluZ1JHQiA9IGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICB0b3BsZWZ0WzBdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeDsKLSAgICB0b3BsZWZ0WzFdID0gY3VycmVudEZyYW1pbmctPnRvcGxlZnRfeTsKLQotICAgIGZvciggeD0wIDt4IDwgUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIGZvciggeT0wIDt5IDwgUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRvIGhhbmRsZSBmcmFtaW5nIHdpdGggaW5wdXQgc2l6ZSAhPSBvdXRwdXQgc2l6ZQotICAgICAgICAgICAgICogRnJhbWluZyBpcyBhcHBseWVkIGlmIGNvb3JkaW5hdGVzIG1hdGNoZXMgYmV0d2VlbiBmcmFtaW5nL3RvcGxlZnQgYW5kIGlucHV0IHBsYW5lICovCi0gICAgICAgICAgICBpZiggeSA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgICYmCi0gICAgICAgICAgICAgICAgeSA+PSB0b3BsZWZ0WzBdICYmCi0gICAgICAgICAgICAgICAgeCA8ICh0b3BsZWZ0WzFdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpICYmCi0gICAgICAgICAgICAgICAgeCA+PSB0b3BsZWZ0WzFdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmxvYXQgYWxwaGFCbGVuZGluZyA9IDE7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqICBhbHBoYUJsZW5kaW5nU3RydWN0ID1cCi0gICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyopXAotICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hbHBoYUJsZW5kaW5nU3RydWN0OwotCi0gICAgICAgICAgICAgICAgaWYoYWxwaGFCbGVuZGluZ1N0cnVjdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocFByb2dyZXNzLT51aVByb2dyZXNzIFwKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0IC8gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5cCi0gICAgICAgICAgICAgICAgICAgIG1fZmFkZUluVGltZSoxMCkgJiYgcFByb2dyZXNzLT51aVByb2dyZXNzIDwgMTAwMFwKLSAgICAgICAgICAgICAgICAgICAgIC0gKE00T1NBX1VJbnQzMikoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoTTRPU0FfRmxvYXQpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChNNE9TQV9GbG9hdClhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZS8xMDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IDEwMDAgLSAoTTRPU0FfVUludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgKz0gYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqLwotCi0gICAgICAgICAgICAgICAgaWYoKCooRnJhbWluZ1JHQik9PXRyYW5zcGFyZW50MSkgJiYgKCooRnJhbWluZ1JHQisxKT09dHJhbnNwYXJlbnQyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSsoeS10b3BsZWZ0WzBdKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKHgtdG9wbGVmdFsxXSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKSs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSkpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKCh4LXRvcGxlZnRbMV0pPj4xKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSkpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQbGFuZUluWzBdLnVfd2lkdGggKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSnVzdCBjb3B5IGlucHV0IHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBtYWtlIGEgdmlkZW8gbG9vayBhcyBpZiBpdCB3YXMgdGFrZW4gaW4gdGhlIGZpZnRpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgIHBQbGFuZUluICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwRmlmdGllc0RhdGEsIHBQbGFuZU91dCBvciBwUHJvZ3Jlc3MgYXJlIE5VTEwgKERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIENoZWNrIHRoZSBpbnB1dHMgKGRlYnVnIG9ubHkpICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwX0ZpZnRpZXNEYXRhID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJ4VlNTOiBwX0ZpZnRpZXNEYXRhIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwUGxhbmVPdXQgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfUGxhbmVPdXQgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQcm9ncmVzcyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJ4VlNTOiBwX1Byb2dyZXNzIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzIik7Ci0KLSAgICAvKiBJbml0aWFsaXplIGlucHV0IC8gb3V0cHV0IHBsYW5lIHBvaW50ZXJzICovCi0gICAgcEluWSArPSBwUGxhbmVJblswXS51X3RvcGxlZnQ7Ci0gICAgcE91dFkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcEluWWJlZ2luICA9IHBJblk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSByYW5kb20gKi8KLSAgICBpZihwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lIDwgMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmRJbml0KCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfaGVpZ2h0KSA+PiA0KTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKVwKLSAgICAgICAgID4gcF9GaWZ0aWVzRGF0YS0+ZmlmdGllc0VmZmVjdER1cmF0aW9uKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIFB1dCBpbiBTZXBpYSB0aGUgY2hyb21pbmFuY2UgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDE7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKQotICAgIHsKLSAgICAgICAgcEluQ3IgID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSAgKyBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLSAgICAgICAgcE91dENyID0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgxID09IHBsYW5lX251bWJlcikKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDExNyxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBVIHZhbHVlICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dENyLCAxMzkscFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsgLyogViB2YWx1ZSAqLwotCi0gICAgICAgICAgICBwSW5DciAgKz0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBPdXRDciArPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdGhlIG5ldyBwaXhlbHMgdmFsdWVzICovCi0gICAgZm9yKCB4ID0gMCA7IHggPCBwUGxhbmVJblswXS51X2hlaWdodCA7IHgrKykKLSAgICB7Ci0gICAgICAgIE00VklGSV9VSW50OCAqcF9vdXRZdG1wLCAqcF9pbll0bXA7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0aGUgeFNoaWZ0IChyYW5kb20gdmFsdWUpICovCi0gICAgICAgIGlmICgwID09IChwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICUgNSApKQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgeFNoaWZ0ID0gKHggKyAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSBwX0ZpZnRpZXNEYXRhLT5zaGlmdFJhbmRvbVZhbHVlKSApIFwKLSAgICAgICAgICAgICAgICAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzICovCi0gICAgICAgIHBfb3V0WXRtcCA9IHBPdXRZICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB5U2hpZnQgb2YgMSBwaXhlbCAqLwotICAgICAgICBwX2luWXRtcCAgPSBwSW5ZYmVnaW4gKyAoeFNoaWZ0ICogcFBsYW5lSW5bMF0udV9zdHJpZGUpOyAgLyogQXBwbHkgdGhlIHhTaGlmdCAqLwotCi0gICAgICAgIGZvciggeSA9IDAgOyB5IDwgcFBsYW5lSW5bMF0udV93aWR0aCA7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2V0IFkgdmFsdWUgKi8KLSAgICAgICAgICAgIGlmICh4U2hpZnQgPiAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSA0KSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gNDA7ICAgICAgICAvKiBBZGQgc29tZSBob3Jpem9udGFsIGJsYWNrIGxpbmVzIGJldHdlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvIHBhcnRzIG9mIHRoZSBpbWFnZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIHkgPT0gcF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDkwOyAgICAgICAgLyogQWRkIGEgcmFuZG9tIHZlcnRpY2FsIGxpbmUgZm9yIHRoZSBidWxrICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9ICpwX2luWXRtcDsKLQotCi0gICAgICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgcF9vdXRZdG1wKys7Ci0gICAgICAgICAgICBwX2luWXRtcCsrOwotCi0gICAgICAgICAgICAvKiBSZXN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgZm9yIHRoZSBsYXN0IHBpeGVsKi8KLSAgICAgICAgICAgIGlmICh5ID09IChwUGxhbmVJblswXS51X3dpZHRoIC0gMikpCi0gICAgICAgICAgICAgICAgcF9vdXRZdG1wID0gcE91dFk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBHbyB0byB0aGUgbmV4dCBsaW5lICovCi0gICAgICAgIHBPdXRZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb20oICkKLSAqIEBicmllZiAgICBab29tIGluL291dCB2aWRlbyBlZmZlY3QgZnVuY3Rpb25zLgotICogQG5vdGUgICAgVGhlIGV4dGVybmFsIHZpZGVvIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgaXMgc2V0IHRvCi0gKiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gb3IgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZSB2YWxpZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lcyAgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIHRyYW5zaXRpb24gcHJvZ3Jlc3MuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pCi17Ci0gICAgTTRPU0FfVUludDMyIGJveFdpZHRoOwotICAgIE00T1NBX1VJbnQzMiBib3hIZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGJveFBvc1g7Ci0gICAgTTRPU0FfVUludDMyIGJveFBvc1k7Ci0gICAgTTRPU0FfVUludDMyIHJhdGlvID0gMDsKLSAgICAvKiAgKiAxLjE4OTIwNyBiZXR3ZWVuIHJhdGlvICovCi0gICAgLyogem9vbSBiZXR3ZWVuIHgxIGFuZCB4MTYgKi8KLSAgICBNNE9TQV9VSW50MzIgcmF0aW90YWJbMTddID17MTAyNCwxMjE4LDE0NDgsMTcyMiwyMDQ4LDI0MzUsMjg5NiwzNDQ0LDQwOTYsNDg3MSw1NzkzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg4OSw4MTkyLDk3NDIsMTE1ODUsMTM3NzcsMTYzODR9OwotICAgIE00T1NBX1VJbnQzMiBpazsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lIGJveFBsYW5lWzNdOwotCi0gICAgaWYoKE00T1NBX1ZvaWQgKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09IHBGdW5jdGlvbkNvbnRleHQpCi0gICAgewotICAgICAgICAvL3JhdGlvID0gMTYgLSAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMTYgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgLyA2NiA7Ci0gICAgfQotICAgIGVsc2UgaWYoKE00T1NBX1ZvaWQgKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gPT0gcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxICsgKDE1ICogcFByb2dyZXNzLT51aVByb2dyZXNzKS8xMDAwOwotICAgICAgICByYXRpbyA9IDEgKyBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgLyA2NiA7Ci0gICAgfQotCi0gICAgZm9yKGlrPTA7aWs8MztpaysrKXsKLQotICAgICAgICBib3hQbGFuZVtpa10udV9zdHJpZGUgPSBwSW5wdXRQbGFuZXNbaWtdLnVfc3RyaWRlOwotICAgICAgICBib3hQbGFuZVtpa10ucGFjX2RhdGEgPSBwSW5wdXRQbGFuZXNbaWtdLnBhY19kYXRhOwotCi0gICAgICAgIGJveEhlaWdodCA9ICggcElucHV0UGxhbmVzW2lrXS51X2hlaWdodCA8PCAxMCApIC8gcmF0aW90YWJbcmF0aW9dOwotICAgICAgICBib3hXaWR0aCA9ICggcElucHV0UGxhbmVzW2lrXS51X3dpZHRoIDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X2hlaWdodCA9IChib3hIZWlnaHQpJih+MSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3dpZHRoID0gKGJveFdpZHRoKSYofjEpOwotCi0gICAgICAgIGJveFBvc1kgPSAocElucHV0UGxhbmVzW2lrXS51X2hlaWdodCA+PiAxKSAtIChib3hQbGFuZVtpa10udV9oZWlnaHQgPj4gMSk7Ci0gICAgICAgIGJveFBvc1ggPSAocElucHV0UGxhbmVzW2lrXS51X3dpZHRoID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X3dpZHRoID4+IDEpOwotICAgICAgICBib3hQbGFuZVtpa10udV90b3BsZWZ0ID0gYm94UG9zWSAqIGJveFBsYW5lW2lrXS51X3N0cmlkZSArIGJveFBvc1g7Ci0gICAgfQotCi0gICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgKE00VklGSV9JbWFnZVBsYW5lKikmYm94UGxhbmUsIHBPdXRwdXRQbGFuZXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuICovCi0gICAgcmV0dXJuKE00Tk9fRVJST1IpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWMoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi17Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotCi0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDA7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX291dDI7Ci0gICAgTTRWSUZJX1VJbnQ4ICphbHBoYU1hc2s7Ci0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4xX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVjsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9WOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgICAvKioKLSAgICAgKiBGb3IgZWFjaCBjb2x1bW4gLi4uICovCi0gICAgZm9yKCB5PTA7IHk8UGxhbmVPdXQtPnVfaGVpZ2h0OyB5KysgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIC4uLiBhbmQgZWFjaCByb3cgb2YgdGhlIGFscGhhIG1hc2sgKi8KLSAgICAgICAgZm9yKCB4PTA7IHg8UGxhbmVPdXQtPnVfd2lkdGg7IHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSWYgdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBpeGVsIG9mIHRoZSBhbHBoYSBtYXNrIGlzID4gdG8gdGhlIGN1cnJlbnQgdGltZQotICAgICAgICAgICAgICogKCBjdXJyZW50IHRpbWUgaXMgbm9ybWFsaXplZCBvbiBbMC0yNTVdICkgKi8KLSAgICAgICAgICAgIGlmKCBhbHBoYVByb2dyZXNzTGV2ZWwgPCBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSB0YWtlICJuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjJfWSt4K3kqUGxhbmVJbjJbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYXBwbHkgYSBjb2xvciBlZmZlY3Qgb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICB1c2VyRGF0YSAgICAgICAgKElOKSBDb250YWlucyBhIHBvaW50ZXIgb24gYSBzZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBQbGFuZUluMSAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMQotICogQHBhcmFtICAgIFBsYW5lSW4yICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aVRyYW5zaXRpb25LaW5kKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19BbHBoYU1hZ2ljQmxlbmRpbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqIGFscGhhQ29udGV4dDsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFQcm9ncmVzc0xldmVsOwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kTGV2ZWxNaW47Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1heDsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZFJhbmdlOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBsYW5lc3dhcDsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFNYXNrVmFsdWU7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBhbHBoYUNvbnRleHQgPSAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopdXNlckRhdGE7Ci0KLSAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAocFByb2dyZXNzLT51aVByb2dyZXNzICogMTI4KS8xMDAwOwotCi0gICAgaWYoIGFscGhhQ29udGV4dC0+aXNyZXZlcnNlICE9IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgYWxwaGFQcm9ncmVzc0xldmVsID0gMTI4IC0gYWxwaGFQcm9ncmVzc0xldmVsOwotICAgICAgICBwbGFuZXN3YXAgPSBQbGFuZUluMTsKLSAgICAgICAgUGxhbmVJbjEgPSBQbGFuZUluMjsKLSAgICAgICAgUGxhbmVJbjIgPSBwbGFuZXN3YXA7Ci0gICAgfQotCi0gICAgYWxwaGFCbGVuZExldmVsTWluID0gYWxwaGFQcm9ncmVzc0xldmVsLWFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQ7Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNYXggPSBhbHBoYVByb2dyZXNzTGV2ZWwrYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRSYW5nZSA9IChhbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkKSoyOwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICBhbHBoYU1hc2sgPSBhbHBoYUNvbnRleHQtPnBQbGFuZS0+cGFjX2RhdGE7Ci0KLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIHBfaW4xX1kgPSBQbGFuZUluMVswXS5wYWNfZGF0YTsKLSAgICBwX2luMV9VID0gUGxhbmVJbjFbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfViA9IFBsYW5lSW4xWzJdLnBhY19kYXRhOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgcF9pbjJfWSA9IFBsYW5lSW4yWzBdLnBhY19kYXRhOwotICAgIHBfaW4yX1UgPSBQbGFuZUluMlsxXS5wYWNfZGF0YTsKLSAgICBwX2luMl9WID0gUGxhbmVJbjJbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKiBhcHBseSBBbHBoYSBNYWdpYyBvbiBlYWNoIHBpeGVsICovCi0gICAgICAgZm9yKCB5PTA7IHk8UGxhbmVPdXQtPnVfaGVpZ2h0OyB5KysgKQotICAgIHsKLSAgICAgICAgZm9yKCB4PTA7IHg8UGxhbmVPdXQtPnVfd2lkdGg7IHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFscGhhTWFza1ZhbHVlID0gYWxwaGFNYXNrW3greSpQbGFuZU91dC0+dV93aWR0aF07Ci0gICAgICAgICAgICBpZiggYWxwaGFCbGVuZExldmVsTWF4IDwgYWxwaGFNYXNrVmFsdWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGtlZXAgIm9sZCBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMV9ZK3greSpQbGFuZUluMVswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoYWxwaGFCbGVuZExldmVsTWluIDwgYWxwaGFNYXNrVmFsdWUpJiYKLSAgICAgICAgICAgICAgICAgICAgKGFscGhhTWFza1ZhbHVlIDw9IGFscGhhQmxlbmRMZXZlbE1heCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBibGVuZCAib2xkIGFuZCBuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPShNNFZJRklfVUludDgpCi0gICAgICAgICAgICAgICAgICAgICgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pKiggKihwX2luMV9ZK3greSpQbGFuZUluMVswXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICArKGFscGhhQmxlbmRMZXZlbE1heC1hbHBoYU1hc2tWYWx1ZSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiggKihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KE00VklGSV9VSW50OClcCi0gICAgICAgICAgICAgICAgICAgICgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pKiggKihwX2luMV9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAqUGxhbmVJbjFbMV0udV9zdHJpZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVSsoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGxhbmVJbjJbMV0udV9zdHJpZGUpKSApL2FscGhhQmxlbmRSYW5nZSApOwotCi0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoIChhbHBoYU1hc2tWYWx1ZS1hbHBoYUJsZW5kTGV2ZWxNaW4pXAotICAgICAgICAgICAgICAgICAgICAgICAgKiggKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKGFscGhhQmxlbmRMZXZlbE1heC1hbHBoYU1hc2tWYWx1ZSkqKCAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsyXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSB0YWtlICJuZXcgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjJfWSt4K3kqUGxhbmVJbjJbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMl9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjJbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLSNkZWZpbmUgTTRYWFhfU2FtcGxlQWRkcmVzcyhwbGFuZSwgeCwgeSkgICggKHBsYW5lKS5wYWNfZGF0YSArIChwbGFuZSkudV90b3BsZWZ0ICsgKHkpXAotICAgICAqIChwbGFuZSkudV9zdHJpZGUgKyAoeCkgKQotCi1zdGF0aWMgdm9pZCBNNFhYWF9Db3B5UGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUqIGRlc3QsIE00VklGSV9JbWFnZVBsYW5lKiBzb3VyY2UpCi17Ci0gICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgd2lkdGgsIHNvdXJjZVN0cmlkZSwgZGVzdFN0cmlkZSwgeTsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQgYW5kCi0gICAgIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgaGVpZ2h0ID0gZGVzdC0+dV9oZWlnaHQ7Ci0gICAgd2lkdGggPSBkZXN0LT51X3dpZHRoOwotCi0gICAgc291cmNlV2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKCpzb3VyY2UsIDAsIDApOwotICAgIHNvdXJjZVN0cmlkZSA9IHNvdXJjZS0+dV9zdHJpZGU7Ci0KLSAgICBkZXN0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKCpkZXN0LCAwLCAwKTsKLSAgICBkZXN0U3RyaWRlID0gZGVzdC0+dV9zdHJpZGU7Ci0KLSAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgZGVzdFdhbGsgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgfQotfQotCi1zdGF0aWMgTTRPU0FfRVJSIE00eFZTU19WZXJ0aWNhbFNsaWRlVHJhbnNpdGlvbihNNFZJRklfSW1hZ2VQbGFuZSogdG9wUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogYm90dG9tUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgICAgc2hpZnRVVikKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qIERvIHRocmVlIGxvb3BzLCBvbmUgZm9yIGVhY2ggcGxhbmUgdHlwZSwgaW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvbyBtYW55IGJ1ZmZlcnMKLSAgICAiaG90IiBhdCB0aGUgc2FtZSB0aW1lIChiZXR0ZXIgZm9yIGNhY2hlKS4gKi8KLSAgICBmb3IgKGk9MDsgaTwzOyBpKyspCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgICAgdG9wUGFydEhlaWdodCwgYm90dG9tUGFydEhlaWdodCwgd2lkdGgsIHNvdXJjZVN0cmlkZSwgZGVzdFN0cmlkZSwgeTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgc291cmNlV2FsaywgZGVzdFdhbGs7Ci0KLSAgICAgICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgICAgIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IDIqc2hpZnRVVjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvdHRvbVBhcnRIZWlnaHQgPSBzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIHRvcFBhcnRIZWlnaHQgPSBQbGFuZU91dFtpXS51X2hlaWdodCAtIGJvdHRvbVBhcnRIZWlnaHQ7Ci0gICAgICAgIHdpZHRoID0gUGxhbmVPdXRbaV0udV93aWR0aDsKLQotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3ModG9wUGxhbmVbaV0sIDAsIGJvdHRvbVBhcnRIZWlnaHQpOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSB0b3BQbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICBkZXN0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCAwKTsKLSAgICAgICAgZGVzdFN0cmlkZSA9IFBsYW5lT3V0W2ldLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIEZpcnN0IHRoZSBwYXJ0IGZyb20gdGhlIHRvcCBzb3VyY2UgY2xpcCBmcmFtZS4gKi8KLSAgICAgICAgZm9yICh5PTA7IHk8dG9wUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhbmQgbm93IGNoYW5nZSB0aGUgdmFycyB0byBjb3B5IHRoZSBwYXJ0IGZyb20gdGhlIGJvdHRvbSBzb3VyY2UgY2xpcCBmcmFtZS4gKi8KLSAgICAgICAgc291cmNlV2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGJvdHRvbVBsYW5lW2ldLCAwLCAwKTsKLSAgICAgICAgc291cmNlU3RyaWRlID0gYm90dG9tUGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogZGVzdFdhbGsgaXMgYWxyZWFkeSBhdCBNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCB0b3BQYXJ0SGVpZ2h0KSAqLwotCi0gICAgICAgIGZvciAoeT0wOyB5PGJvdHRvbVBhcnRIZWlnaHQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICAgICAgZGVzdFdhbGsgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIHNvdXJjZVdhbGsgKz0gc291cmNlU3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1zdGF0aWMgTTRPU0FfRVJSIE00eFZTU19Ib3Jpem9udGFsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiBsZWZ0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiByaWdodFBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpLCB5OwotICAgIC8qIElmIHdlIHNoaWZ0ZWQgYnkgZXhhY3RseSAwLCBvciBieSB0aGUgd2lkdGggb2YgdGhlIHRhcmdldCBpbWFnZSwgdGhlbiB3ZSB3b3VsZCBnZXQgdGhlIGxlZnQKLSAgICBmcmFtZSBvciB0aGUgcmlnaHQgZnJhbWUsIHJlc3BlY3RpdmVseS4gVGhlc2UgY2FzZXMgYXJlbid0IGhhbmRsZWQgdG9vIHdlbGwgYnkgdGhlIGdlbmVyYWwKLSAgICBoYW5kbGluZywgc2luY2UgdGhleSByZXN1bHQgaW4gMC1zaXplIG1lbWNvcGllcywgc28gbWlnaHQgYXMgd2VsbCBwYXJ0aWN1bGFyaXplIHRoZW0uICovCi0KLSAgICBpZiAoMCA9PSBzaGlmdFVWKSAgICAvKiBvdXRwdXQgbGVmdCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYobGVmdFBsYW5lW2ldKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoUGxhbmVPdXRbMV0udV93aWR0aCA9PSBzaGlmdFVWKSAvKiBvdXRwdXQgcmlnaHQgZnJhbWUgKi8KLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGk8MzsgaSsrKSAvKiBmb3IgZWFjaCBZVVYgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRYWFhfQ29weVBsYW5lKCYoUGxhbmVPdXRbaV0pLCAmKHJpZ2h0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBoZWlnaHQsIGxlZnRQYXJ0V2lkdGgsIHJpZ2h0UGFydFdpZHRoOwotICAgICAgICBNNE9TQV9VSW50MzIgICAgbGVmdFN0cmlkZSwgICAgcmlnaHRTdHJpZGUsICAgIGRlc3RTdHJpZGU7Ci0gICAgICAgIE00T1NBX01lbUFkZHI4ICAgIGxlZnRXYWxrLCAgICByaWdodFdhbGssICAgIGRlc3RXYWxrTGVmdCwgZGVzdFdhbGtSaWdodDsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkCi0gICAgICAgIGFuZCByZWNvbXB1dGVkIGZyb20gbWVtb3J5LiAqLwotICAgICAgICBoZWlnaHQgPSBQbGFuZU91dFtpXS51X2hlaWdodDsKLQotICAgICAgICBpZiAoMCA9PSBpKSAvKiBZIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZ2h0UGFydFdpZHRoID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSBzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGxlZnRQYXJ0V2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoIC0gcmlnaHRQYXJ0V2lkdGg7Ci0KLSAgICAgICAgbGVmdFdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyhsZWZ0UGxhbmVbaV0sIHJpZ2h0UGFydFdpZHRoLCAwKTsKLSAgICAgICAgbGVmdFN0cmlkZSA9IGxlZnRQbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICByaWdodFdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyhyaWdodFBsYW5lW2ldLCAwLCAwKTsKLSAgICAgICAgcmlnaHRTdHJpZGUgPSByaWdodFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrTGVmdCA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCAwLCAwKTsKLSAgICAgICAgZGVzdFdhbGtSaWdodCA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKFBsYW5lT3V0W2ldLCBsZWZ0UGFydFdpZHRoLCAwKTsKLSAgICAgICAgZGVzdFN0cmlkZSA9IFBsYW5lT3V0W2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa0xlZnQsICh2b2lkICopbGVmdFdhbGssIGxlZnRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgbGVmdFdhbGsgKz0gbGVmdFN0cmlkZTsKLQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGtSaWdodCwgKHZvaWQgKilyaWdodFdhbGssIHJpZ2h0UGFydFdpZHRoKTsKLSAgICAgICAgICAgIHJpZ2h0V2FsayArPSByaWdodFN0cmlkZTsKLQotICAgICAgICAgICAgZGVzdFdhbGtMZWZ0ICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBkZXN0V2Fsa1JpZ2h0ICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi1NNE9TQV9FUlIgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbiggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MqIHNldHRpbmdzID0KLSAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MqKXVzZXJEYXRhOwotICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoImluc2lkZSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIik7Ci0gICAgaWYgKChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHx8IChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0xlZnRPdXRSaWdodEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pICkKLSAgICB7Ci0gICAgICAgIC8qIGhvcml6b250YWwgc2xpZGUgKi8KLSAgICAgICAgc2hpZnRVViA9ICgoUGxhbmVPdXRbMV0pLnVfd2lkdGggKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIHVwcGVyOiBzaGlmdFVWID0gJWQscHJvZ3Jlc3MgPSAlZCIsCi0gICAgICAgICAgICBzaGlmdFVWLHBQcm9ncmVzcy0+dWlQcm9ncmVzcyApOwotICAgICAgICBpZiAoTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9SaWdodE91dExlZnRJbiA9PSBzZXR0aW5ncy0+ZGlyZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQdXQgdGhlIHByZXZpb3VzIGNsaXAgZnJhbWUgcmlnaHQsIHRoZSBuZXh0IGNsaXAgZnJhbWUgbGVmdCwgYW5kIHJldmVyc2Ugc2hpZnRVVgotICAgICAgICAgICAgKHNpbmNlIGl0J3MgYSBzaGlmdCBmcm9tIHRoZSBsZWZ0IGZyYW1lKSBzbyB0aGF0IHdlIHN0YXJ0IG91dCBvbiB0aGUgcmlnaHQKLSAgICAgICAgICAgIChpLmUuIG5vdCBsZWZ0KSBmcmFtZSwgaXQKLSAgICAgICAgICAgIGJlaW5nIGZyb20gdGhlIHByZXZpb3VzIGNsaXAuICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgKFBsYW5lT3V0WzFdKS51X3dpZHRoIC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBMZWZ0IG91dCwgcmlnaHQgaW4qLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjEsIFBsYW5lSW4yLCBQbGFuZU91dCwgc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdmVydGljYWwgc2xpZGUgKi8KLSAgICAgICAgc2hpZnRVViA9ICgoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0ICogcFByb2dyZXNzLT51aVByb2dyZXNzKS8xMDAwOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1NsaWRlVHJhbnNpdGlvbiBib3R0b206IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIixzaGlmdFVWLAotICAgICAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1RvcE91dEJvdHRvbUluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSB0b3AsIHRoZSBuZXh0IGNsaXAgZnJhbWUgYm90dG9tLiAqLwotICAgICAgICAgICAgcmV0dXJuIE00eFZTU19WZXJ0aWNhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIEJvdHRvbSBvdXQsIHRvcCBpbiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4yLCBQbGFuZUluMSwgUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgKFBsYW5lT3V0WzFdKS51X2hlaWdodCAtIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTm90ZTogaXQgbWlnaHQgYmUgd29ydGh3aGlsZSB0byBkbyBzb21lIHBhcmFtZXRlciBjaGVja2luZywgc2VlIGlmIGRpbWVuc2lvbnMgbWF0Y2gsIGV0Yy4sCi0gICAgYXQgbGVhc3QgaW4gZGVidWcgbW9kZS4gKi8KLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGZhZGUgdG8gYmxhY2sgYW5kIHRoZW4gYSBmYWRlIGZyb20gYmxhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9JbnQzMiB0bXAgPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0KLSAgICBpZigocFByb2dyZXNzLT51aVByb2dyZXNzKSA8IDUwMCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCgxLjAgLSAoKE00T1NBX0Zsb2F0KShwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MqMikvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKCAoTTRWaUNvbUltYWdlUGxhbmUqKVBsYW5lSW4xLAotICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVPdXQsIHRtcCwgTTRPU0FfTlVMTCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uOiBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnNcCi0gICAgICAgICAgICAgICAgIGVycm9yIDB4JXgsIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KS4gKi8KLSAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSggKCgoTTRPU0FfRmxvYXQpKCgocFByb2dyZXNzLT51aVByb2dyZXNzLTUwMCkqMikpLzEwMDApKSAqIDEwMjQgKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QgKi8KLSAgICAgICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgoTTRWaUNvbUltYWdlUGxhbmUqKVBsYW5lSW4yLAotICAgICAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVPdXQsIHRtcCwgTTRPU0FfTlVMTCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSByZXR1cm5zIGVycm9yIDB4JXgsXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIHRoZSBjdXN0b21lciBmb3JtYXQgdG8gVVRGOAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgKElOKSAgICBCdWZmZXIgdG8gY29udmVydAotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIChPVVQpICAgIENvbnZlcnRlZCBidWZmZXIKLSAqIEBwYXJhbSAgICBjb252ZXJ0ZWRTaXplICAgIChPVVQpICAgIFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQnVmZmVyT3V0ID0gcEJ1ZmZlckluOwotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIENvbnZlcnRlZFNpemUgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplOwotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAKLSAgICAgICAgICAgICwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgaWYoZXJyID09IE00eFZTU1dBUl9CVUZGRVJfT1VUX1RPT19TTUFMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjg6IHBDb252VG9VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotCi0gICAgICAgICAgICAvKmZyZWUgdG9vIHNtYWxsIGJ1ZmZlciovCi0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIC8qcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlciovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAgICA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoQ29udmVydGVkU2l6ZSpzaXplb2YoTTRPU0FfVUludDgpLCBNNFZBLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gQ29udmVydGVkU2l6ZTsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252VG9VVEY4RmN0KChNNE9TQV9Wb2lkKilwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKXhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qZGVjb2RlZCBwYXRoKi8KLSAgICAgICAgcEJ1ZmZlck91dCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAoKmNvbnZlcnRlZFNpemUpID0gQ29udmVydGVkU2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnQgZnJvbSBVVEY4IHRvIHRoZSBjdXN0b21lciBmb3JtYXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgKElOKSAgICBCdWZmZXIgdG8gY29udmVydAotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIChPVVQpICAgIENvbnZlcnRlZCBidWZmZXIKLSAqIEBwYXJhbSAgICBjb252ZXJ0ZWRTaXplICAgIChPVVQpICAgIFNpemUgb2YgdGhlIGNvbnZlcnRlZCBidWZmZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQnVmZmVyT3V0ID0gcEJ1ZmZlckluOwotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplKTsKLQotICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3RcCi0gICAgICAgICAgICAoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwoTTRPU0FfVUludDgqKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotCi0gICAgICAgICAgICAvKmZyZWUgdG9vIHNtYWxsIGJ1ZmZlciovCi0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIC8qcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlciovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAgICA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gQ29udmVydGVkU2l6ZTsKLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLDAsKE00T1NBX1VJbnQzMil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogcENvbnZGcm9tVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNTM3ZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JSZXNhbXBsZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0KLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgIGVudW0geyAvL1NhbXBsaW5nIGZyZXEKLSAgICAga0ZyZXE4MDAwSHogPSA4MDAwLAotICAgICBrRnJlcTExMDI1SHogPSAxMTAyNSwKLSAgICAga0ZyZXExMjAwMEh6ID0gMTIwMDAsCi0gICAgIGtGcmVxMTYwMDBIeiA9IDE2MDAwLAotICAgICBrRnJlcTIyMDUwSHogPSAyMjA1MCwKLSAgICAga0ZyZXEyNDAwMEh6ID0gMjQwMDAsCi0gICAgIGtGcmVxMzIwMDBIeiA9IDMyMDAwLAotICAgICBrRnJlcTQ0MTAwID0gNDQxMDAsCi0gICAgIGtGcmVxNDgwMDAgPSA0ODAwMCwKLSAgICB9OwotCi0gICAgQXVkaW9SZXNhbXBsZXIgKm1SZXNhbXBsZXI7Ci0gICAgaW50MTZfdCogbUlucHV0OwotICAgIGludCBuYkNoYW5uZWxzOwotICAgIGludCBuYlNhbXBsZXM7Ci0gICAgTTRPU0FfSW50MzIgb3V0U2FtcGxpbmdSYXRlOwotICAgIE00T1NBX0ludDMyIGluU2FtcGxpbmdSYXRlOwotCi0gICAgaW50MTZfdCAqbVRtcEluQnVmZmVyOwotfTsKLQotI2RlZmluZSBNQVhfU0FNUExFRFVSQVRJT05fRk9SX0NPTlZFUlRJT04gNDAgLy9tcwotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclJlc2FtcGxlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKSB7Ci0KLSAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IHBCdWZmZXItPmZyYW1lQ291bnQgKiB0aGlzLT5uYkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwotICAgIG1UbXBJbkJ1ZmZlciA9IChpbnQxNl90KiltYWxsb2MoZGF0YVNpemUpOwotICAgIG1lbWNweShtVG1wSW5CdWZmZXIsIHRoaXMtPm1JbnB1dCwgZGF0YVNpemUpOwotICAgIHBCdWZmZXItPnJhdyA9ICh2b2lkKiltVG1wSW5CdWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JSZXNhbXBsZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKSB7Ci0KLSAgICBpZihwQnVmZmVyLT5yYXcgIT0gTlVMTCkgewotICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgICAgIG1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfQ29udGV4dCAgTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZShNNE9TQV9JbnQzMiBiaXREZXB0aCwgTTRPU0FfSW50MzIgaW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc2FtcGxlUmF0ZSwgTTRPU0FfSW50MzIgcXVhbGl0eSkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPSBuZXcgVmlkZW9FZGl0b3JSZXNhbXBsZXIoKTsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKLSAgICAgICAgYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKLSAgICBpZiAoY29udGV4dC0+bVJlc2FtcGxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGFuZHJvaWQ6OlZpZGVvRWRpdG9yUmVzYW1wbGVyOjprRnJlcTMyMDAwSHopOwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7Ci0gICAgY29udGV4dC0+bmJDaGFubmVscyA9IGluQ2hhbm5lbENvdW50OwotICAgIGNvbnRleHQtPm91dFNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgY29udGV4dC0+bUlucHV0ID0gTlVMTDsKLSAgICBjb250ZXh0LT5tVG1wSW5CdWZmZXIgPSBOVUxMOwotCi0gICAgcmV0dXJuICgoTTRPU0FfQ29udGV4dCApY29udGV4dCk7Ci19Ci0KLQotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDMyIGluU2FtcGxlUmF0ZSkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGluU2FtcGxlUmF0ZSk7Ci0gICAgLyoKLSAgICAgKiBuYlNhbXBsZXMgaXMgY2FsY3VsYXRlZCBmb3IgNDBtcyB3b3J0aCBvZiBkYXRhO2hlbmNlIHNhbXBsZSByYXRlCi0gICAgICogaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5iU2FtcGxlcwotICAgICAqLwotICAgIGNvbnRleHQtPmluU2FtcGxpbmdSYXRlID0gaW5TYW1wbGVSYXRlOwotICAgIC8vIEFsbG9jYXRlIGJ1ZmZlciBmb3IgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBzYW1wbGVzLgotICAgIGNvbnRleHQtPm1JbnB1dCA9IChpbnQxNl90KiltYWxsb2MoIChpblNhbXBsZVJhdGUgKiBNQVhfU0FNUExFRFVSQVRJT05fRk9SX0NPTlZFUlRJT04gKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5uYkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSAvIDEwMDApOwotfQotCi12b2lkIExWQXVkaW9zZXRWb2x1bWUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQxNiBsZWZ0LCBNNE9TQV9JbnQxNiByaWdodCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0Vm9sdW1lKGxlZnQscmlnaHQpOwotfQotCi12b2lkIExWRGVzdHJveShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotCi0gICAgaWYgKGNvbnRleHQtPm1UbXBJbkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUoY29udGV4dC0+bVRtcEluQnVmZmVyKTsKLSAgICAgICAgY29udGV4dC0+bVRtcEluQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dC0+bUlucHV0ICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShjb250ZXh0LT5tSW5wdXQpOwotICAgICAgICBjb250ZXh0LT5tSW5wdXQgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChjb250ZXh0LT5tUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIGNvbnRleHQtPm1SZXNhbXBsZXI7Ci0gICAgICAgIGNvbnRleHQtPm1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChjb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIGNvbnRleHQ7Ci0gICAgICAgIGNvbnRleHQgPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eShNNE9TQV9JbnQxNiogb3V0LCBNNE9TQV9JbnQxNiogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgb3V0RnJhbWVDb3VudCwgTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSBOVUxMOwotCi0gICAgY29udGV4dC0+bmJTYW1wbGVzID0gKGNvbnRleHQtPmluU2FtcGxpbmdSYXRlICogb3V0RnJhbWVDb3VudCkgLyBjb250ZXh0LT5vdXRTYW1wbGluZ1JhdGU7Ci0gICAgbWVtY3B5KGNvbnRleHQtPm1JbnB1dCxpbnB1dCwoY29udGV4dC0+bmJTYW1wbGVzICogY29udGV4dC0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpOwotCi0gICAgLyoKLSAgICAgU1JDIG1vZHVsZSBhbHdheXMgZ2l2ZXMgc3RlcmVvIG91dHB1dCwgaGVuY2UgMiBmb3Igc3RlcmVvIGF1ZGlvCi0gICAgKi8KLSAgICBwVG1wQnVmZmVyID0gKGludDMyX3QqKW1hbGxvYyhvdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgbWVtc2V0KHBUbXBCdWZmZXIsIDB4MDAsIG91dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDMyX3QpKTsKLQotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90ICopcFRtcEJ1ZmZlciwKLSAgICAgICAoc2l6ZV90KW91dEZyYW1lQ291bnQsIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQpOwotICAgIC8vIENvbnZlcnQgYmFjayB0byAxNiBiaXRzCi0gICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKW91dCwgcFRtcEJ1ZmZlciwgb3V0RnJhbWVDb3VudCk7Ci0gICAgZnJlZShwVG1wQnVmZmVyKTsKLSAgICBwVG1wQnVmZmVyID0gTlVMTDsKLX0KLQotfQotCi19IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2E5YTAxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIDNHUCBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SXzNHUFJFQURFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SXzNHUFJFQURFUl9ICi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfM0dQUkVBREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDNiODAxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQXVkaW8gRGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfQVVESU9ERUNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9ERUNPREVSX0gKLQotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQihNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1SV0IoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl9BVURJT0RFQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNGY2YjA0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQXVkaW8gRW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfQVVESU9FTkNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9FTkNPREVSX0gKLQotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FBQygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl9BVURJT0VOQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckJ1ZmZlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWZmNmE3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQnVmZmVyLmMKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBCdWZmZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmICAgVklERU9FRElUT1JfQlVGRkVSX0gKLSNkZWZpbmUgICBWSURFT0VESVRPUl9CVUZGRVJfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotI2luY2x1ZGUgIkxWX01hY3Jvcy5oIgotCi0vKi0tLSBDb3JlIGlkIGZvciBWSURFT0VESVRPUiBCdWZmZXIgYWxsb2NhdGlvbnMgIC0tLSovCi0jZGVmaW5lIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCAweDAxMkYKLQotLyogLS0tLS0gZXJyb3JzICAtLS0tLSovCi0jZGVmaW5lIE00RVJSX05PX0JVRkZFUl9BVkFJTEFCTEUgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfTk9fQlVGRkVSX01BVENIIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsMHgwMDAwMDIpCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eSA9IDAsCi0gICAgVklERU9FRElUT1JfQlVGRkVSX2tGaWxsZWQsCi19IFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgICAgTFZPTVhfQlVGRkVSX0J1ZmZlcgotICogQGJyaWVmICAgICAgIE9uZSBPTVggQnVmZmVyIGFuZCBkYXRhIHJlbGF0ZWQgdG8gaXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogcERhdGE7ICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGRhdGEqLwotICAgIE00T1NBX1VJbnQzMiBzaXplOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBzdGF0ZTsgLyoqPCBCdWZmZXIgc3RhdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgaWR4OyAgICAgICAgICAgICAgIC8qKjwgSW5kZXggb2YgdGhlIGJ1ZmZlciBpbnNpZGUgdGhlIHBvb2wgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgYnVmZkNUUzsgICAgICAgIC8qKjwgVGltZSBzdGFtcCBvZiB0aGUgYnVmZmVyICovCi19IFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlICAgIExWT01YX0JVRkZFUl9Qb29sCi0gKiBAYnJpZWYgICAgICAgU3RydWN0dXJlIHRvIG1hbmFnZSBidWZmZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHBOWFBCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyIE5COwotICAgIE00T1NBX0NoYXIqIHBvb2xOYW1lOwotfSBWSURFT0VESVRPUl9CVUZGRVJfUG9vbDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYgLy9fX2NwbHVzcGx1cwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCoqIHBwb29sLAotICogICAgICAgICBNNE9TQV9VSW50MzIgbmJCdWZmZXJzKQotICogQGJyaWVmICAgQWxsb2NhdGUgYSBwb29sIG9mIG5iQnVmZmVycyBidWZmZXJzCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgIG5iQnVmZmVycyAgOiBJTiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHBvb2wKLSAqIEBwYXJhbSAgIHBvb2xOYW1lICAgOiBJTiBhIG5hbWUgZ2l2ZW4gdG8gdGhlIHBvb2wKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCoqIHBwb29sLAotICAgICAgICBNNE9TQV9VSW50MzIgbmJCdWZmZXJzLCBNNE9TQV9DaGFyKiBwb29sTmFtZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woTFZPTVhfQlVGRkVSX1Bvb2wqIHBwb29sKQotICogQGJyaWVmICAgRGVhbGxvY2F0ZSBhIGJ1ZmZlciBwb29sCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbCB0byBmcmVlCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gKiAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotICogQGJyaWVmICAgUmV0dXJucyBhIGJ1ZmZlciBpbiBhIGdpdmVuIHN0YXRlCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbAotICogQHBhcmFtICAgZGVzaXJlZFN0YXRlIDogSU4gVGhlIGJ1ZmZlciBzdGF0ZQotICogQHBhcmFtICAgcE5YUEJ1ZmZlciA6IElOIFRoZSBzZWxlY3RlZCBidWZmZXIKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKTsKLQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2luaXRQb29sQnVmZmVycyhWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIE00T1NBX1VJbnQzMiBsU2l6ZSk7Ci0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sICpwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8vX19jcGx1c3BsdXMKLSNlbmRpZiAvKlZJREVPRURJVE9SX0JVRkZFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1haW4uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjM2I1MTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fVklERU9fRURJVE9SX0FQSV9IX18KLSNkZWZpbmUgX19WSURFT19FRElUT1JfQVBJX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTVNHX1RZUEVfUFJPR1JFU1NfSU5ESUNBVElPTiwgICAgIC8vIFBsYXliYWNrIHByb2dyZXNzIGluZGljYXRpb24gZXZlbnQKLSAgICBNU0dfVFlQRV9QTEFZRVJfRVJST1IsICAgICAgICAgICAgLy8gUGxheWJhY2sgZXJyb3IKLSAgICBNU0dfVFlQRV9QUkVWSUVXX0VORCwgICAgICAgICAgICAgLy8gUHJldmlldyBvZiBjbGlwcyBpcyBjb21wbGV0ZQotICAgIE1TR19UWVBFX09WRVJMQVlfVVBEQVRFLCAgICAgICAgICAvLyB1cGRhdGUgb3ZlcmxheSBkdXJpbmcgcHJldmlldwotICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsICAgICAgICAgICAvLyBjbGVhciB0aGUgb3ZlcmxheQotfSBwcm9ncmVzc19jYWxsYmFja19tc2dfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBvdmVybGF5U2V0dGluZ3NJbmRleDsKLSAgICBpbnQgY2xpcEluZGV4OwotfSBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICpwRmlsZTsgICAgICAgICAgICAgICAgICAgLyoqIFBDTSBmaWxlIHBhdGggKi8KLSAgICBNNE9TQV9Cb29sICAgICBiUmVtb3ZlT3JpZ2luYWw7ICAgICAgICAgIC8qKiBJZiB0cnVlLCB0aGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgdGFrZW4gaW50byBhY2NvdW50ICovCi0gICAgTTRPU0FfVUludDMyICAgdWlOYkNoYW5uZWxzOyAgICAgICAgICAgIC8qKiBOdW1iZXIgb2YgY2hhbm5lbHMgKDE9bW9ubywgMj1zdGVyZW8pIG9mIEJHTSBjbGlwKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAgICAgLyoqIFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeSAoODAwMCBmb3IgYW1yLCAxNjAwMCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBmb3IgYWFjKSBvZiBCR00gY2xpcCovCi0gICAgTTRPU0FfVUludDMyICAgdWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5OyAvKiogRXh0ZW5kZWQgZnJlcXVlbmN5IGZvciBBQUMrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUFBQysgc3RyZWFtcyBvZiBCR00gY2xpcCovCi0gICAgTTRPU0FfVUludDMyICAgdWlBZGRDdHM7ICAgICAgICAgICAgICAgIC8qKiBUaW1lLCBpbiBtaWxsaXNlY29uZHMsIGF0IHdoaWNoIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUFkZFZvbHVtZTsgICAgICAgICAgICAgLyoqIFZvbHVtZSwgaW4gcGVyY2VudGFnZSwgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgYmVnaW5DdXRNczsKLSAgICBNNE9TQV9VSW50MzIgICBlbmRDdXRNczsKLSAgICBNNE9TQV9JbnQzMiAgICBmaWxlVHlwZTsKLSAgICBNNE9TQV9Cb29sICAgICBiTG9vcDsgICAgICAgICAgICAgICAgICAgLyoqIExvb3Bpbmcgb24vb2ZmICoqLwotICAgIC8qIEF1ZGlvIGR1Y2tpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUluRHVja2luZ190aHJlc2hvbGQ7ICAgLyoqIFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCBtdXNpYyBzaGFsbCBkdWNrICovCi0gICAgTTRPU0FfVUludDMyICAgdWlJbkR1Y2tpbmdfbG93Vm9sdW1lOyAgIC8qKiBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmYWN0b3Igb2YgY3VycmVudCBsZXZlbCAqLwotICAgIE00T1NBX0Jvb2wgICAgIGJJbkR1Y2tpbmdfZW5hYmxlOyAgICAgICAvKiogZW5hYmxlIGR1Y2tpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUJUQ2hhbm5lbENvdW50OyAgICAgICAgLyoqIGNoYW5uZWwgY291bnQgZm9yIEJUICovCi0gICAgTTRPU0FfVm9pZCAgICAgKnBQQ01GaWxlUGF0aDsKLX0gTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3M7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICpwQnVmZmVyOyAgICAgICAgICAgIC8qIFlVVjQyMCBidWZmZXIgb2YgZnJhbWUgdG8gYmUgcmVuZGVyZWQqLwotICAgIE00T1NBX1VJbnQzMiAgICB0aW1lTXM7ICAgICAgICAgICAgLyogdGltZSBzdGFtcCBvZiB0aGUgZnJhbWUgdG8gYmUgcmVuZGVyZWQqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVN1cmZhY2VXaWR0aDsgICAgLyogU3VyZmFjZSBkaXNwbGF5IHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlTdXJmYWNlSGVpZ2h0OyAgICAvKiBTdXJmYWNlIGRpc3BsYXkgaGVpZ2h0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlGcmFtZVdpZHRoOyAgICAgICAgLyogRnJhbWUgd2lkdGgqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUZyYW1lSGVpZ2h0OyAgICAgICAgLyogRnJhbWUgaGVpZ2h0Ki8KLSAgICBNNE9TQV9Cb29sICAgICAgYkFwcGx5RWZmZWN0OyAgICAgICAgLyogQXBwbHkgdmlkZW8gZWZmZWN0cyBiZWZvcmUgcmVuZGVyKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY2xpcEJlZ2luQ3V0VGltZTsgIC8qIENsaXAgYmVnaW4gY3V0IHRpbWUgcmVsYXRpdmUgdG8gc3Rvcnlib2FyZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBjbGlwRW5kQ3V0VGltZTsgICAgLyogQ2xpcCBlbmQgY3V0IHRpbWUgcmVsYXRpdmUgdG8gc3Rvcnlib2FyZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICB2aWRlb1JvdGF0aW9uRGVncmVlOyAvKiBWaWRlbyByb3RhdGlvbiBkZWdyZWUgKi8KLQotfSBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHI7Ci0jZW5kaWYgLypfX1ZJREVPX0VESVRPUl9BUElfSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWIzYmU0MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIE1QMyBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX01QM1JFQURFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX01QM1JFQURFUl9ICi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfTVAzUkVBREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyMWIyMWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclV0aWxzLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIFV0aWxpdGllcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgQU5EUk9JRF9VVElMU19IXwotI2RlZmluZSBBTkRST0lEX1VUSUxTX0hfCi0KLS8qKioqKioqKioqKioqKioqKioqCi0gKiAgICAgSEVBREVSUyAgICAgKgotICoqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZJREVPRURJVE9SX0NIRUNLKHRlc3QsIGVyckNvZGUpCi0gKiBAbm90ZSBUaGlzIG1hY3JvIGRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGdvZXMgdG8gZnVuY3Rpb24gY2xlYW5VcCBsYWJlbAotICogICAgICAgaWYgdGhlIHRlc3QgZmFpbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFZJREVPRURJVE9SX0NIRUNLKHRlc3QsIGVyckNvZGUpIFwKLXsgXAotICAgIGlmKCAhKHRlc3QpICkgeyBcCi0gICAgICAgIEFMT0dWKCIhISEgJXMgKEwlZCkgY2hlY2sgZmFpbGVkIDogIiAjdGVzdCAiLCB5aWVsZHMgZXJyb3IgMHglLjh4IiwgXAotICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBlcnJDb2RlKTsgXAotICAgICAgICBlcnIgPSAoZXJyQ29kZSk7IFwKLSAgICAgICAgZ290byBjbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNBRkVfRlJFRShwKQotICogQG5vdGUgVGhpcyBtYWNybyBjYWxscyBmcmVlIGFuZCBtYWtlcyBzdXJlIHRoZSBwb2ludGVyIGlzIHNldCB0byBOVUxMLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBTQUZFX0ZSRUUocCkgXAoteyBcCi0gICAgaWYoTTRPU0FfTlVMTCAhPSAocCkpIHsgXAotICAgICAgICBmcmVlKChwKSkgOyBcCi0gICAgICAgIChwKSA9IE00T1NBX05VTEwgOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNBRkVfTUFMTE9DKHAsIHR5cGUsIGNvdW50LCBjb21tZW50KQotICogQG5vdGUgVGhpcyBtYWNybyBhbGxvY2F0ZXMgYSBidWZmZXIsIGNoZWNrcyBmb3Igc3VjY2VzcyBhbmQgZmlsbHMgdGhlIGJ1ZmZlcgotICogICAgICAgd2l0aCAwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBTQUZFX01BTExPQyhwLCB0eXBlLCBjb3VudCwgY29tbWVudCkgXAoteyBcCi0gICAgKHApID0gKHR5cGUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YodHlwZSkqKGNvdW50KSwgMHhGRiwoTTRPU0FfQ2hhciopY29tbWVudCk7XAotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gKHApLCBNNEVSUl9BTExPQyk7IFwKLSAgICBtZW1zZXQoKHZvaWQgKikocCksIDAsc2l6ZW9mKHR5cGUpKihjb3VudCkpOyBcCi19Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKgotICAgICAqICAgIFVUSUxJVElFUyAgICAgKgotICAgICAqKioqKioqKioqKioqKioqKioqKi8KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRElTUExBWSBNRVRBREFUQSBDT05URU5UICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgZGlzcGxheU1ldGFEYXRhKGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhKTsKLQotLy8gQnVpbGQgdGhlIEFWQyBjb2RlYyBzcGNpZmljIGluZm8gZnJvbSB0aGUgU3RhZ2VGcmlnaHQgZW5jb2RlcnMgb3V0cHV0Ci1zdGF0dXNfdCBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKHVpbnQ4X3QgKipvdXRwdXREYXRhLCBzaXplX3QgKm91dHB1dFNpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBNZXRhRGF0YSAqcGFyYW0pOwotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvL0FORFJPSURfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWVlYTNhNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGRlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX1ZJREVPREVDT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVPREVDT0RFUl9ICi0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCAqcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCAqcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfTVBFRzQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcygKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKTsKLQotI2VuZGlmIC8vIFZJREVPRURJVE9SX1ZJREVPREVDT0RFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NjI2NDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9JbnRlcm5hbC5oCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZGVjb2RlciBpbnRlcm5hbCBoZWFkZXIgZmlsZSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JCdWZmZXIuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0jaW5jbHVkZSAiSTQyMENvbG9yQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9yZWN0Lmg+Ci0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0KLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01BSk9SICAgICAwCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NSU5PUiAgICAgMAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfUkVWSVNJT04gIDEKLQotLyogRVJST1JTICovCi0jZGVmaW5lIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCAweEZGLCAweDAwMDEpCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYywKLSAgICBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjLAotICAgIFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWMKLX0gVklERU9FRElUT1JfQ29kZWNUeXBlOwotCi0KLS8qdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9ieXRlOwotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1faW5kZXg7Ci0gICAgTTRPU0FfTWVtQWRkcjggaW47Ci0KLX0gVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQ7Ki8KLQotdHlwZWRlZiBNNFZTX0JpdHN0cmVhbV9jdHh0IFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKiogU3RhZ2VmcmlndGggcGFyYW1zICovCi0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgbUNsaWVudDsgLyoqPCBPTVggQ2xpZW50IHNlc3Npb24gaW5zdGFuY2UuICovCi0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgbVZpZGVvRGVjb2RlcjsgLyoqPCBTdGFnZWZyaWdodCBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgbVJlYWRlclNvdXJjZTsgLyoqPCBSZWFkZXIgYWNjZXNzID4gKi8KLQotICAgIC8qIFJFQURFUiAqLwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqbV9wUmVhZGVyR2xvYmFsOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgICptX3BSZWFkZXI7Ci0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgKm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0KLSAgICAvKiBTVFJFQU0gUEFSQU1TICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgbV9wVmlkZW9TdHJlYW1oYW5kbGVyOwotCi0gICAgLyogVXNlciBmaWx0ZXIgcGFyYW1zLiAqLwotICAgIE00VklGSV9QbGFuQ29udmVydGVyRnVuY3Rpb25UeXBlICptX3BGaWx0ZXI7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgKm1fcEZpbHRlclVzZXJEYXRhOwotCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgbV9sYXN0RGVjb2RlZENUUzsKLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICBtX2xhc3RSZW5kZXJDdHM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbVJlYWNoZWRFT1M7Ci0gICAgVklERU9FRElUT1JfQ29kZWNUeXBlICAgbURlY29kZXJUeXBlOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgICAgIG1fVmlkZW9TaXplOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBtX0RjaTsgLyoqPCBEZWNvZGVyIENvbmZpZyBpbmZvICovCi0gICAgVklERU9FRElUT1JfQlVGRkVSX1Bvb2wgKm1fcERlY0J1ZmZlclBvb2w7IC8qKjwgRGVjb2RlZCBidWZmZXIgcG9vbCAqLwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFICAgIGRlY091cHV0Q29sb3JGb3JtYXQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RJbnB1dEN0czsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtTGFzdElucHV0Q3RzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYlJlbmRlcmVkRnJhbWVzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1GaXJzdFJlbmRlcmVkQ3RzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1MYXN0UmVuZGVyZWRDdHM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtTGFzdE91dHB1dEN0czsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBtR2l2ZW5XaWR0aCwgbUdpdmVuSGVpZ2h0OyAvL1VzZWQgaW4gY2FzZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSU5GT19GT1JNQVRfQ0hBTkdFRAotICAgIEFSZWN0ICAgICAgICAgICAgICAgICAgIG1Dcm9wUmVjdDsgIC8vIFRoZXNlIGFyZSBvYnRhaW5lZCBmcm9tIGtLZXlDcm9wUmVjdC4KLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIqICAgICBtSTQyMENvbG9yQ29udmVydGVyOwotCi0gICAgLy8gVGltZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBjb25zZXF1dGl2ZS9uZWlnaGJvcmluZyB2aWRlbyBmcmFtZXMuCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgbUZyYW1lSW50ZXJ2YWxNczsKLQotfSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0OwotCi19IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ1MTU0Zi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX1ZJREVPRU5DT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVPRU5DT0RFUl9ICi0KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2MyhNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpOwotCi0jZW5kaWYgLy9WSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMzBiODVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBNZWRpYUJ1ZmZlclB1bGxlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JVdGlscy5jcHAgXAotICAgIFZpZGVvRWRpdG9yQnVmZmVyLmMgXAotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBjb3JlY2cgZ3JhcGhpY3MpIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9sdnBwIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9lZGl0b3IgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9ycGxheWVyICAgICAgXAotCi1MT0NBTF9DRkxBR1MgKz0gXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCi0KLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3Jfc3RhZ2VmcmlnaHRzaGVsbHMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4MjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyUHVsbGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgIk1lZGlhQnVmZmVyUHVsbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi1NZWRpYUJ1ZmZlclB1bGxlcjo6TWVkaWFCdWZmZXJQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtQXNrVG9TdGFydChmYWxzZSksCi0gICAgICBtQXNrVG9TdG9wKGZhbHNlKSwKLSAgICAgIG1BY3F1aXJlU3RvcHBlZChmYWxzZSksCi0gICAgICBtUmVsZWFzZVN0b3BwZWQoZmFsc2UpLAotICAgICAgbVNvdXJjZUVycm9yKE9LKSB7Ci0KLSAgICBhbmRyb2lkQ3JlYXRlVGhyZWFkKGFjcXVpcmVUaHJlYWRTdGFydCwgdGhpcyk7Ci0gICAgYW5kcm9pZENyZWF0ZVRocmVhZChyZWxlYXNlVGhyZWFkU3RhcnQsIHRoaXMpOwotfQotCi1NZWRpYUJ1ZmZlclB1bGxlcjo6fk1lZGlhQnVmZmVyUHVsbGVyKCkgewotICAgIHN0b3AoKTsKLX0KLQotYm9vbCBNZWRpYUJ1ZmZlclB1bGxlcjo6aGFzTWVkaWFTb3VyY2VSZXR1cm5lZEVycm9yKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuICgobVNvdXJjZUVycm9yICE9IE9LKSA/IHRydWUgOiBmYWxzZSk7Ci19Ci12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpzdGFydCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1Bc2tUb1N0YXJ0ID0gdHJ1ZTsKLSAgICBtQWNxdWlyZUNvbmQuc2lnbmFsKCk7Ci0gICAgbVJlbGVhc2VDb25kLnNpZ25hbCgpOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpzdG9wKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbUFza1RvU3RvcCA9IHRydWU7Ci0gICAgbUFjcXVpcmVDb25kLnNpZ25hbCgpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLSAgICB3aGlsZSAoIW1BY3F1aXJlU3RvcHBlZCB8fCAhbVJlbGVhc2VTdG9wcGVkKSB7Ci0gICAgICAgIG1Vc2VyQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBSZWxlYXNlIHJlbWFpbmluZyBidWZmZXJzCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7IGkrKykgewotICAgICAgICBtQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWxlYXNlQnVmZmVycy5zaXplKCk7IGkrKykgewotICAgICAgICBtUmVsZWFzZUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICBtUmVsZWFzZUJ1ZmZlcnMuY2xlYXIoKTsKLX0KLQotTWVkaWFCdWZmZXIqIE1lZGlhQnVmZmVyUHVsbGVyOjpnZXRCdWZmZXJOb25CbG9ja2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBiID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlciogTWVkaWFCdWZmZXJQdWxsZXI6OmdldEJ1ZmZlckJsb2NraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgd2hpbGUgKG1CdWZmZXJzLmVtcHR5KCkgJiYgIW1BY3F1aXJlU3RvcHBlZCkgewotICAgICAgICBtVXNlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIGIgPSBtQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1CdWZmZXJzLnJlbW92ZUF0KDApOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJQdWxsZXI6OnB1dEJ1ZmZlcihNZWRpYUJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtUmVsZWFzZUJ1ZmZlcnMucHVzaChidWZmZXIpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLX0KLQotaW50IE1lZGlhQnVmZmVyUHVsbGVyOjphY3F1aXJlVGhyZWFkU3RhcnQodm9pZCogYXJnKSB7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqIHNlbGYgPSAoTWVkaWFCdWZmZXJQdWxsZXIqKWFyZzsKLSAgICBzZWxmLT5hY3F1aXJlVGhyZWFkRnVuYygpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgTWVkaWFCdWZmZXJQdWxsZXI6OnJlbGVhc2VUaHJlYWRTdGFydCh2b2lkKiBhcmcpIHsKLSAgICBNZWRpYUJ1ZmZlclB1bGxlciogc2VsZiA9IChNZWRpYUJ1ZmZlclB1bGxlciopYXJnOwotICAgIHNlbGYtPnJlbGVhc2VUaHJlYWRGdW5jKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJQdWxsZXI6OmFjcXVpcmVUaHJlYWRGdW5jKCkgewotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIC8vIFdhaXQgZm9yIHRoZSBzdGFydCBzaWduYWwKLSAgICB3aGlsZSAoIW1Bc2tUb1N0YXJ0ICYmICFtQXNrVG9TdG9wKSB7Ci0gICAgICAgIG1BY3F1aXJlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBMb29wIHVudGlsIHdlIGFyZSBhc2tlZCB0byBzdG9wLCBvciB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gcmVhZAotICAgIHdoaWxlICghbUFza1RvU3RvcCkgewotICAgICAgICBNZWRpYUJ1ZmZlciogcEJ1ZmZlcjsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJnBCdWZmZXIsIE5VTEwpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIG1Tb3VyY2VFcnJvciA9IHJlc3VsdDsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlcnMucHVzaChwQnVmZmVyKTsKLSAgICAgICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIH0KLQotICAgIG1BY3F1aXJlU3RvcHBlZCA9IHRydWU7Ci0gICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpyZWxlYXNlVGhyZWFkRnVuYygpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgc3RhcnQgc2lnbmFsCi0gICAgd2hpbGUgKCFtQXNrVG9TdGFydCAmJiAhbUFza1RvU3RvcCkgewotICAgICAgICBtUmVsZWFzZUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB1bnRpbCB3ZSBhcmUgYXNrZWQgdG8gc3RvcAotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChtUmVsZWFzZUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1Bc2tUb1N0b3ApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlbGVhc2VDb25kLndhaXQobUxvY2spOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBwQnVmZmVyID0gbVJlbGVhc2VCdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbVJlbGVhc2VCdWZmZXJzLnJlbW92ZUF0KDApOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgcEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotCi0gICAgbVJlbGVhc2VTdG9wcGVkID0gdHJ1ZTsKLSAgICBtVXNlckNvbmQuc2lnbmFsKCk7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci19Ci0KLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDcyYTUzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKLSNkZWZpbmUgX01FRElBX0JVRkZFUl9QVUxMRVJfSAotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IE1lZGlhQnVmZmVyOwotCi0vKgotICogQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgY2FuIHB1bGwgYSBsaXN0IG9mIG1lZGlhIGJ1ZmZlcnMKLSAqIGZyb20gYSBNZWRpYVNvdXJjZSByZXBlYXRlZGx5LiBUaGUgdXNlciBjYW4gdGhlbiBnZXQgdGhlCi0gKiBidWZmZXJzIGZyb20gdGhhdCBsaXN0LgotICovCi1zdHJ1Y3QgTWVkaWFCdWZmZXJQdWxsZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKLSAgICB+TWVkaWFCdWZmZXJQdWxsZXIoKTsKLQotICAgIC8vIFN0YXJ0IHRvIGJ1aWxkIHVwIHRoZSBsaXN0IG9mIHRoZSBidWZmZXJzLgotICAgIHZvaWQgc3RhcnQoKTsKLQotICAgIC8vIFJlbGVhc2UgdGhlIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBidWZmZXJzLCBhbmQgc3RvcAotICAgIC8vIHB1bGxpbmcgYnVmZmVycyBmcm9tIHRoZSBNZWRpYVNvdXJjZS4KLSAgICB2b2lkIHN0b3AoKTsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlCi0gICAgLy8gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBOVUxMIGlzIHJldHVybmVkLgotICAgIE1lZGlhQnVmZmVyKiBnZXRCdWZmZXJCbG9ja2luZygpOwotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIGxpc3QuIElmIHRoZXJlIGlzIG5vIGJ1ZmZlciBhdmFpbGFibGUKLSAgICAvLyBhdCB0aGUgdGltZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGl0IGJsb2NrcyB3YWl0aW5nIGZvcgotICAgIC8vIGEgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUgb3IgdW50aWwgc3RvcCgpIGlzIGNhbGxlZC4KLSAgICBNZWRpYUJ1ZmZlciogZ2V0QnVmZmVyTm9uQmxvY2tpbmcoKTsKLQotICAgIC8vIEFkZCBhIGJ1ZmZlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGF2YWlsYWJsZSBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBwdXRCdWZmZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzb3VyY2UgcmV0dXJuZWQgYW4gZXJyb3Igb3Igbm90LgotICAgIGJvb2wgaGFzTWVkaWFTb3VyY2VSZXR1cm5lZEVycm9yKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGludCBhY3F1aXJlVGhyZWFkU3RhcnQodm9pZCogYXJnKTsKLSAgICB2b2lkIGFjcXVpcmVUaHJlYWRGdW5jKCk7Ci0KLSAgICBzdGF0aWMgaW50IHJlbGVhc2VUaHJlYWRTdGFydCh2b2lkKiBhcmcpOwotICAgIHZvaWQgcmVsZWFzZVRocmVhZEZ1bmMoKTsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIFZlY3RvcjxNZWRpYUJ1ZmZlcio+IG1CdWZmZXJzOwotICAgIFZlY3RvcjxNZWRpYUJ1ZmZlcio+IG1SZWxlYXNlQnVmZmVyczsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Vc2VyQ29uZDsgICAgIC8vIGZvciB0aGUgdXNlciBvZiB0aGlzIGNsYXNzCi0gICAgQ29uZGl0aW9uIG1BY3F1aXJlQ29uZDsgIC8vIGZvciB0aGUgYWNxdWlyZSB0aHJlYWQKLSAgICBDb25kaXRpb24gbVJlbGVhc2VDb25kOyAgLy8gZm9yIHRoZSByZWxlYXNlIHRocmVhZAotCi0gICAgYm9vbCBtQXNrVG9TdGFydDsgICAgICAvLyBBc2tzIHRoZSB0aHJlYWRzIHRvIHN0YXJ0Ci0gICAgYm9vbCBtQXNrVG9TdG9wOyAgICAgICAvLyBBc2tzIHRoZSB0aHJlYWRzIHRvIHN0b3AKLSAgICBib29sIG1BY3F1aXJlU3RvcHBlZDsgIC8vIFRoZSBhY3F1aXJlIHRocmVhZCBoYXMgc3RvcHBlZAotICAgIGJvb2wgbVJlbGVhc2VTdG9wcGVkOyAgLy8gVGhlIHJlbGVhc2UgdGhyZWFkIGhhcyBzdG9wcGVkCi0gICAgc3RhdHVzX3QgbVNvdXJjZUVycm9yOyAvLyBFcnJvciByZXR1cm5lZCBieSBNZWRpYVNvdXJjZSByZWFkCi0KLSAgICAvLyBEb24ndCBjYWxsIG1lIQotICAgIE1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IE1lZGlhQnVmZmVyUHVsbGVyJik7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXImIG9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlclB1bGxlciYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBfTUVESUFfQlVGRkVSX1BVTExFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWNmOWVjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIDNHUCBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SXzNHUFJFQURFUiIKLQotLyoqCi0gKiBIRUFERVJTCi0gKgotICovCi0jZGVmaW5lIFZJREVPRURJVE9SX0JJVFNUUkVBTV9QQVJTRVIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIgotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotI2lmZGVmIFZJREVPRURJVE9SX0JJVFNUUkVBTV9QQVJTRVIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgIkVTRFMuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLS8qKgotICogU09VUkNFIENMQVNTCi0gKi8KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogRU5HSU5FIElOVEVSRkFDRQotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXJyYXkgb2YgQU1SIE5CL1dCIGJpdHJhdGVzCi0gKiBAbm90ZSAgICBBcnJheSB0byBtYXRjaCB0aGUgbW9kZSBhbmQgdGhlIGJpdCByYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotY29uc3QgTTRPU0FfVUludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FtckJpdFJhdGUgWzIgLyogOGtIeiAvIDE2a0h6ICAgICAqL10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5IC8qIHRoZSBiaXRyYXRlIG1vZGUgKi9dID0KLXsKLSAgICB7NDc1MCwgNTE1MCwgNTkwMCwgIDY3MDAsICA3NDAwLCAgNzk1MCwgIDEwMjAwLCAxMjIwMCwgMH0sCi0gICAgezY2MDAsIDg4NTAsIDEyNjUwLCAxNDI1MCwgMTU4NTAsIDE4MjUwLCAxOTg1MCwgMjMwNTAsIDIzODUwfQotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQKLSAqIEBicmllZjpUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCAzR1Agc2hlbGwgUmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzcDxEYXRhU291cmNlPiAgICAgICAgICAgICAgbURhdGFTb3VyY2U7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+ICAgICAgICAgIG1FeHRyYWN0b3I7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1BdWRpb1NvdXJjZTsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbVZpZGVvU291cmNlOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICBtVmlkZW9TdHJlYW1IYW5kbGVyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtQXVkaW9BdTsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbVZpZGVvQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1NYXhEdXJhdGlvbjsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbUZpbGVTaXplOwotICAgIE00X1N0cmVhbVR5cGUgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbVN0cmVhbUlkOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQ3VyclRyYWNrOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtQXVkaW9TZWVraW5nOwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtQXVkaW9TZWVrVGltZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbVZpZGVvU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbVZpZGVvU2Vla1RpbWU7Ci0KLX0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dDsKLQotI2lmZGVmIFZJREVPRURJVE9SX0JJVFNUUkVBTV9QQVJTRVIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBCaXRTdHJlYW1QYXJzZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIqICAgbVBiaXRTdHJlYW07ICAgLyoqPCBiaXRzdHJlYW0gcG9pbnRlciAoMzJiaXRzIGFsaWduZWQpICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1TaXplOyAgICAgICAgIC8qKjwgYml0c3RyZWFtIHNpemUgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgbUluZGV4OyAgICAgICAgLyoqPCBieXRlIGluZGV4ICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1CaXRJbmRleDsgICAgIC8qKjwgYml0IGluZGV4ICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1TdHJ1Y3RTaXplOyAgIC8qKjwgc2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KLX0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0IGFuZCBpbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKE9VVCkgIFBvaW50ZXIgdG8gdGhlIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0IHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgIGJpdFN0cmVhbSAgIEEgcG9pbnRlciB0byB0aGUgYml0c3RyZWFtCi0gKiBAcGFyYW0gICBzaXplICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyB2b2lkIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckluaXQodm9pZCoqIHBDb250ZXh0LAotICAgICAgICB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQ7Ci0KLSAgICAqcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBwU3RyZWFtQ29udGV4dCA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KSwgTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSIzR1AgQml0U3RyZWFtUGFyc2VyIENvbnRleHQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbT0oTTRPU0FfVUludDMyKilwQml0U3RyZWFtOwotICAgIHBTdHJlYW1Db250ZXh0LT5tU2l6ZT1zaXplOwotICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXg9MDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1TdHJ1Y3RTaXplID0KLSAgICAgICAgc2l6ZW9mKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQpOwotCi0gICAgKnBDb250ZXh0PXBTdHJlYW1Db250ZXh0OwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQ2xlYW4gdXAgY29udGV4dAotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgZnJlZSgoTTRPU0FfSW50MzIqKXBDb250ZXh0KTsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZWFkIHRoZSBuZXh0IDxsZW5ndGg+IGJpdHMgaW4gdGhlIGJpdHN0cmVhbS4KLSAqIEBub3RlICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBsZW5ndGggICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0cyB0byBleHRyYWN0IGZyb20gdGhlIGJpdHN0cmVhbQotICogQHJldHVybiAgdGhlIHJlYWQgYml0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cyh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfSW50MzIgbGVuZ3RoKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgdV9tYXNrOwotICAgIE00T1NBX1VJbnQzMiByZXR2YWw7Ci0gICAgTTRPU0FfSW50MzIgaV9vdmY7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzOmludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICByZXR2YWw9KE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIocFN0cmVhbUNvbnRleHQtPlwKLSAgICAgICAgbVBiaXRTdHJlYW1bIHBTdHJlYW1Db250ZXh0LT5tSW5kZXggXSk7Ci0gICAgaV9vdmYgPSBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4ICsgbGVuZ3RoIC0gMzI7Ci0gICAgdV9tYXNrID0gKGxlbmd0aCA+PSAzMikgPyAweGZmZmZmZmZmOiAoMSA8PCBsZW5ndGgpIC0gMTsKLQotICAgIC8qIGRvIHdlIGhhdmUgZW5vdWdoIGJpdHMgYXZhaWxibGUgaW4gdGhlIGN1cnJlbnQgd29yZCgzMmJpdHMpKi8KLSAgICBpZiAoaV9vdmYgPD0gMCkgewotICAgICAgICByZXR2YWw9KHJldHZhbCA+PiAoLSBpX292ZikpICYgdV9tYXNrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1X25leHR3b3JkID0gKE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIHBTdHJlYW1Db250ZXh0LT5tSW5kZXggKyAxIF0pOwotICAgICAgICBNNE9TQV9VSW50MzIgdV9tc2JfbWFzaywgdV9tc2JfdmFsdWUsIHVfbHNiX21hc2ssIHVfbHNiX3ZhbHVlOwotCi0gICAgICAgIHVfbXNiX21hc2sgPSAoKDEgPDwgKDMyIC0gcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCkpIC0gMSkgPDwgaV9vdmY7Ci0gICAgICAgIHVfbXNiX3ZhbHVlID0gcmV0dmFsIDw8IGlfb3ZmOwotICAgICAgICB1X2xzYl9tYXNrID0gKDEgPDwgaV9vdmYpIC0gMTsKLSAgICAgICAgdV9sc2JfdmFsdWUgPSB1X25leHR3b3JkID4+ICgzMiAtIGlfb3ZmKTsKLSAgICAgICAgcmV0dmFsPSAodV9tc2JfdmFsdWUgJiB1X21zYl9tYXNrICkgfCAodV9sc2JfdmFsdWUgJiB1X2xzYl9tYXNrKTsKLSAgICB9Ci0gICAgLyogcmV0dXJuIHRoZSBiaXRzLi4uKi8KLSAgICByZXR1cm4gcmV0dmFsOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBJbmNyZW1lbnQgdGhlIGJpdHN0cmVhbSBwb2ludGVyIG9mIDxsZW5ndGg+IGJpdHMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4vT1VUKSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIGxlbmd0aCAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXQgdG8gc2hpZnQgdGhlIGJpdHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyB2b2lkIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfSW50MzIgbGVuZ3RoKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KAotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiB2YWw7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhbD1wU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4ICsgbGVuZ3RoOwotICAgIC8qIHVwZGF0ZSB0aGUgYml0cy4uLiovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArPSBsZW5ndGg7Ci0KLSAgICBpZiAodmFsIC0gMzIgPj0gMCkgewotICAgICAgICAvKiB1cGRhdGUgdGhlIGJpdHMuLi4qLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUJpdEluZGV4IC09IDMyOwotICAgICAgICAvKiB1cGRhdGUgdGhlIHdvcmRzKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleCsrOwotICAgIH0KLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJHZXRCaXRzKAotICAgICAgICB2b2lkKiBwQ29udGV4dCxNNE9TQV9JbnQzMiBiaXRQb3MsIE00T1NBX0ludDMyIGJpdExlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfSW50MzIgYml0TG9jYXRpb24sIGJpdEluZGV4OwotICAgIE00T1NBX1VJbnQzMiByZXR2YWw9MDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0Qml0czogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIGNvbXB1dGVzIHRoZSB3b3JkIGxvY2F0aW9uKi8KLSAgICBiaXRMb2NhdGlvbj1iaXRQb3MvMzI7Ci0gICAgYml0SW5kZXg9KGJpdFBvcykgJSAzMjsKLQotICAgIGlmIChiaXRMb2NhdGlvbiA8IHBTdHJlYW1Db250ZXh0LT5tU2l6ZSkgewotICAgICAgICBNNE9TQV9VSW50MzIgdV9tYXNrOwotICAgICAgICBNNE9TQV9JbnQzMiBpX292ZiA9IGJpdEluZGV4ICsgYml0TGVuZ3RoIC0gMzI7Ci0gICAgICAgIHJldHZhbD0oTTRPU0FfVUludDMyKUdFVF9NRU1PUlkzMigKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgYml0TG9jYXRpb24gXSk7Ci0KLSAgICAgICAgdV9tYXNrID0gKGJpdExlbmd0aCA+PSAzMikgPyAweGZmZmZmZmZmOiAoMSA8PCBiaXRMZW5ndGgpIC0gMTsKLQotICAgICAgICBpZiAoaV9vdmYgPD0gMCkgewotICAgICAgICAgICAgcmV0dmFsPShyZXR2YWwgPj4gKC0gaV9vdmYpKSAmIHVfbWFzazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1X25leHR3b3JkID0gKE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBiaXRMb2NhdGlvbiArIDEgXSk7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdV9tc2JfbWFzaywgdV9tc2JfdmFsdWUsIHVfbHNiX21hc2ssIHVfbHNiX3ZhbHVlOwotCi0gICAgICAgICAgICB1X21zYl9tYXNrID0gKCgxIDw8ICgzMiAtIGJpdEluZGV4KSkgLSAxKSA8PCBpX292ZjsKLSAgICAgICAgICAgIHVfbXNiX3ZhbHVlID0gcmV0dmFsIDw8IGlfb3ZmOwotICAgICAgICAgICAgdV9sc2JfbWFzayA9ICgxIDw8IGlfb3ZmKSAtIDE7Ci0gICAgICAgICAgICB1X2xzYl92YWx1ZSA9IHVfbmV4dHdvcmQgPj4gKDMyIC0gaV9vdmYpOwotICAgICAgICAgICAgcmV0dmFsPSAodV9tc2JfdmFsdWUgJiB1X21zYl9tYXNrICkgfCAodV9sc2JfdmFsdWUgJiB1X2xzYl9tYXNrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJSZXN0YXJ0KHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIHJlc2V0cyB0aGUgYml0c3RyZWFtIHBvaW50ZXJzKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleD0wOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAbm90ZSAgIEl0IHNob3VsZCBiZSB1c2VkIGNhcmVmdWxseSBhcyB0aGUgcG9pbnRlciBpcyBpbiB0aGUgYml0c3RyZWFtIGl0c2VsZgotICogICAgICAgICBhbmQgbm8gY29weSBpcyBtYWRlLgotICogQHBhcmFtICBwQ29udGV4dCAgICAoSU4vT1VUKSAgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJpdHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfVUludDgqICBWaWRlb0VkaXRvcjNncFJlYWRlcl9HZXRDdXJyZW50Yml0U3RyZWFtUG9pbnRlcigKLSAgICAgICAgdm9pZCogcENvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICByZXR1cm4gKE00T1NBX1VJbnQ4KikoKE00T1NBX1VJbnQ4KilwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW0gKyBcCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXggKiBzaXplb2YoTTRPU0FfVUludDMyKSArIFwKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleC84KSA7Ci19Ci0KLXN0YXRpYyBNNE9TQV9JbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJHZXRTaXplKHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dXJuIHBTdHJlYW1Db250ZXh0LT5tU2l6ZTsKLX0KLQotCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQodm9pZCoqIHBDb250ZXh0LAotICAgICAgICB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VySW5pdChwQ29udGV4dCwgcEJpdFN0cmVhbSwgc2l6ZSk7Ci19Ci1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyKHZvaWQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgdmFsKSB7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aD0wOwotICAgIE00T1NBX1VJbnQzMiBudW1CeXRlcz0wOwotICAgIE00T1NBX1VJbnQzMiBiPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgMCwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiB0aGUgbGVuZ3RoIGlzIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIGhpZ2hlc3QgYml0IGlzIHVzZWQKLSAgICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsZW5ndGggY29udGludWVzIG9uIHRoZSBuZXh0IGJ5dGUuCi0KLSAgICBUaGUgbGVuZ3RoIGNhbiBiZTogMHg4MCAweDgwIDB4ODAgMHgyMgotICAgIG9mIGp1c3QgICAgICAgICAgICAweDIyIChoaWdoZXN0IGJpdCBub3Qgc2V0KQotCi0gICAgKi8KLQotICAgIGRvIHsKLSAgICAgICAgYj0odmFsICYgKCgweGZmKTw8ICg4ICogbnVtQnl0ZXMpKSk+PiAoOCAqIG51bUJ5dGVzKTsKLSAgICAgICAgbGVuZ3RoPShsZW5ndGggPDwgNykgfCAoYiAmIDB4N2YpOwotICAgICAgICBudW1CeXRlcysrOwotICAgIH0gd2hpbGUgKChiICYgMHg4MCkgJiYgbnVtQnl0ZXMgPCA0KTsKLQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgRGVjb2RlIGFuIE1QRUc0IFN5c3RlbXMgZGVzY3JpcHRvciBzaXplIGZyb20gYW4gZW5jb2RlZCBTREwgc2l6ZSBkYXRhCi0gKiBAbm90ZSAgIFRoZSB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIGN1cnJlbnQgYml0c3RyZWFtIGxvY2F0aW9uLgotICogQHBhcmFtICBwQ29udGV4dCAgICAoSU4vT1VUKSAgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcmV0dXJuIFNpemUgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9JbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9HZXRNcGVnTGVuZ3RoRnJvbVN0cmVhbSh2b2lkKiBwQ29udGV4dCl7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aD0wOwotICAgIE00T1NBX1VJbnQzMiBudW1CeXRlcz0wOwotICAgIE00T1NBX1VJbnQzMiBiPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgMCwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiB0aGUgbGVuZ3RoIGlzIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIGhpZ2hlc3QgYml0IGlzIHVzZWQKLSAgICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsZW5ndGggY29udGludWVzIG9uIHRoZSBuZXh0IGJ5dGUuCi0KLSAgICBUaGUgbGVuZ3RoIGNhbiBiZTogMHg4MCAweDgwIDB4ODAgMHgyMgotICAgIG9mIGp1c3QgICAgICAgICAgICAweDIyIChoaWdoZXN0IGJpdCBub3Qgc2V0KQotICAgICovCi0KLSAgICBkbyB7Ci0gICAgICAgIGI9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocENvbnRleHQsIDgpOwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocENvbnRleHQsIDgpOwotICAgICAgICBsZW5ndGg9KGxlbmd0aCA8PCA3KSB8IChiICYgMHg3Zik7Ci0gICAgICAgIG51bUJ5dGVzKys7Ci0gICAgfSB3aGlsZSAoKGIgJiAweDgwKSAmJiBudW1CeXRlcyA8IDQpOwotCi0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSAzZ3AgcmVhZGVyCi0gKiBAbm90ZSAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgKE9VVCkgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSBOVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQgLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZSBiZWdpbiIpOwotCi0gICAgLyogQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBTQUZFX01BTExPQyhwQywgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCwgMSwgIlZpZGVvRWRpdG9yM2dwUmVhZGVyIik7Ci0KLSAgICBtZW1zZXQocEMsIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KSwgMCk7Ci0KLSAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlciAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tQXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bUF1ZGlvU2Vla1RpbWUgPSAwOwotCi0gICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bVZpZGVvU2Vla1RpbWUgPSAwOwotCi0gICAgcEMtPm1NYXhEdXJhdGlvbiA9IDA7Ci0KLSAgICAqcENvbnRleHQ9cEM7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSAzZ3AgcmVhZGVyCi0qIEBub3RlIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBwQ29udGV4dCBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIFNBRkVfRlJFRShwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MpOwotICAgIHBDLT5tQXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgU0FGRV9GUkVFKHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgcEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBTQUZFX0ZSRUUocEMpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95IGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotKiBAbm90ZSAgICAgdGhpcyBmdW5jdGlvbiBvcGVuIHRoZSBtZWRpYSBmaWxlCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIHRvIG9wZW4KLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSogQHJldHVybiAgIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgaXMgRFJNIHByb3RlY3RlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIHN0YXJ0ICIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuOiBpbnZhbGlkIHBvaW50ZXIgcEZpbGVEZXNjcmlwdG9yIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBEYXRhc291cmNlIHN0YXJ0ICVzIiwKLSAgICAgICAgKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0gICAgLy9wQy0+bURhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIHBDLT5tRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlICgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgIGlmIChwQy0+bURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKHBDLT5tRGF0YVNvdXJjZSwKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKLQotICAgIGlmIChwQy0+bUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIGV4dHJhY3RvciBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGludDMyX3QgaXNEUk1Qcm90ZWN0ZWQgPSAwOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gcEMtPm1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7Ci0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmlzRFJNUHJvdGVjdGVkKTsKLSAgICBpZiAoaXNEUk1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXJyb3IgLSBEUk0gUHJvdGVjdGVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9vcGVuIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotKiBAbm90ZSAgICAgY2xvc2UgdGhlIDNHUCBmaWxlCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQgKnBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSAqcEF1ZGlvU2JyVXNlckRhdGE7Ci0gICAgTTRfQWNjZXNzVW5pdCAqcEFVOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIGJlZ2luIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGlmIChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgQXVkaW8iKTsKLQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKSkgewotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlckRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopKFwKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEpOwotCi0gICAgICAgICAgICBwQVUgPSAoTTRfQWNjZXNzVW5pdCopcEF1ZGlvU2JyVXNlckRhdGEtPm1fcEZpcnN0QVU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQVUpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBBVSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBBdWRpb1NiclVzZXJEYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZykgewotICAgICAgICAgICAgICAgIGZyZWUocEF1ZGlvU2JyVXNlckRhdGEtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQWFjRGVjb2RlclVzZXJDb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwQXVkaW9TYnJVc2VyRGF0YSk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICBwQy0+bUF1ZGlvU291cmNlLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgVmlkZW8gIik7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBwQy0+bVZpZGVvU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHBDLT5tVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci0gICAgcEMtPm1FeHRyYWN0b3IuY2xlYXIoKTsKLSAgICBwQy0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiBmcm9tIHRoZSAzZ3AgcmVhZGVyCi0qIEBub3RlICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotKgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoT1VUKSAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSoKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICBNNEVSUl9WSURFT19OT1RfSDI2MyAgICBObyB2aWRlbyBzdHJlYW0gSDI2MyBpbiBmaWxlLgotKiBAcmV0dXJuICAgTTRFUlJfTk9fVklERU9fU1RSRUFNX1JFVFJJRVZFRF9ZRVQKLSogICAgICAgICAgIEZ1bmN0aW9uIDNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBiZWdpbiAlZCIsIG9wdGlvbklkKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogaW52YWxpZCBwb2ludGVyIG9uIHZhbHVlIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKSB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gZHVyYXRpb24gJWQiLHBDLT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwQy0+bU1heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiPj4+Pj4+PiAgIE00UkVBREVSX2tPcHRpb25JRF9Db3B5cmlnaHQiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWU6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0NyZWF0aW9uVGltZSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLQotICAgICAgICAgICAgaWYgKHBDLT5tTWF4RHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aTMyVG1wID0gKE00T1NBX1VJbnQzMilwQy0+bU1heER1cmF0aW9uOwotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBDLT5tRmlsZVNpemUgKiA4MDAwLjAgLyBwQy0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gYml0cmF0ZSAlbGQiLCAqcEJpdHJhdGUpOwotICAgICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0gyNjNQcm9wZXJ0aWVzOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBubyB2aWRlb1N0cmVhbSByZXRyaWV2ZWQiKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyAhPSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fc3RyZWFtVHlwZSkgfHwgKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA8IDcpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBEU0kgU2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1ZJREVPX05PVF9IMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBNQUdJQ0FMIGluIHRoZSBkZWNvZGVyIGNvbmZpIEgyNjM6IHRoZSA3dGggYnl0ZSBpcyB0aGUgcHJvZmlsZQotICAgICAgICAgICAgICogbnVtYmVyLCA2dGggYnl0ZSBpcyB0aGUgbGV2ZWwgbnVtYmVyICovCi0gICAgICAgICAgICAoKE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyAqKXBWYWx1ZSktPnVpUHJvZmlsZSA9Ci0gICAgICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm9bNl07Ci0gICAgICAgICAgICAoKE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyAqKXBWYWx1ZSktPnVpTGV2ZWwgPQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzVdOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1wKLSAgICAgICAgICAgIEgyNjNQcm9wZXJ0aWVzIGVuZCIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9QdXJwbGVMYWJzRHJtOgotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJPcHRpb24gTTRSRUFERVJfM0dQX2tPcHRpb25JRF9QdXJwbGVMYWJzRHJtIik7Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZBdWRpb0F1OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZU9wdGlvbiBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZBdWRpb0F1Iik7Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZlZpZGVvQXU6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gOkdldE51bWJlck9mVmlkZW9BdSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TWV0YWRhdGE6Ci0gICAgICAgIC8qIG5vdCB1c2VkICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhIik7Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF8zZ3BGdHlwQm94OgotICAgICAgICAvKiB1c2VkIG9ubHkgZm9yIFNFTUMgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCIpOwotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOyAvL2NoZWNrIHRoaXMKLSAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPUFRJT05JRF9HRVRfTkVYVF9WSURFT19DVFMKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfZ2V0TmV4dFZpZGVvQ1RTOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBnZXROZXh0VmlkZW9DVFMiKTsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbiBNNEVSUl9CQURfT1BUSU9OX0lEIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gZW5kOiBvcHRpb25JRDogeCV4Iiwgb3B0aW9uSWQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgc2V0IGFuIG9wdGlvbiBvbiB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSBObyBvcHRpb24gY2FuIGJlIHNldCB5ZXQuCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSogQHJldHVybiAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbiBiZWdpbiAlZCIsb3B0aW9uSWQpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX0F1ZGlvT25seSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfVmlkZW9Pbmx5KToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl9rT3B0aW9uSURfTWF4TWV0YWRhdGFTaXplKToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbjogcmV0dXJucyBNNEVSUl9CQURfT1BUSU9OX0lEIik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGNhbGxlcikgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWMgaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0IGJlZ2luIik7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBBY2Nlc3NVbml0IHN0cnVjdHVyZSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsKLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdCBlbmQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0qIEBub3RlCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAoSS9PKUlOICB0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVCB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOiBpbnZhbGlkIHRpbWUgcG9pbnRlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgYmVnaW4iKTsKLQotICAgIGlmICgqcFRpbWUgPT0gKHBTdHJlYW1IYW5kbGVyLT5tX2R1cmF0aW9uKSkgewotICAgICAgICAqcFRpbWUgLT0gMTsKLSAgICB9Ci0gICAgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLQotICAgIGlmICgocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgIChwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCA9PSBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgICAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgICAgICB0aW1lNjQgPSB0aW1lNjQgKiAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWljcm8gc2VjICovCi0gICAgICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcEMtPm1BdWRpb1NlZWtUaW1lID0gdGltZTY0OwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBBVURJTyB0aW1lIHVzICVsZCAiLCB0aW1lNjQpOwotICAgIH0gZWxzZSBpZiAoKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpKQotICAgICAgICAgICAgewotICAgICAgICBwQXUgPSAmcEMtPm1WaWRlb0F1OwotICAgICAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICAgICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICAgICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDLT5tVmlkZW9TZWVrVGltZSA9IHRpbWU2NDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgVklERU8gdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICB0aW1lNjQgPSB0aW1lNjQgLyAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWlsbGkgc2VjICovCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgdGltZSBtcyBiZWZvcmUgc2Vla3NldCAlbGQgIiwgdGltZTY0KTsKLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcCBlbmQiKTsKLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzIHNlZWsgaXQgdG8gYmVnaW5uaW5nIGFuZCBtYWtlIGl0IHJlYWR5Ci0qIEBub3RlCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NCA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgYmVnaW4iKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcEMtPm1WaWRlb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICBHZXRzIGFuIGFjY2VzcyB1bml0IChBVSkgZnJvbSB0aGUgc3RyZWFtIGhhbmRsZXIgc291cmNlLgotKiBAbm90ZSAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGRlY29kZXIKLSoKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0qIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgKElPKSBQb2ludGVyIHRvIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSogQHJldHVybnMgIE00RVJSX0FMTE9DICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgTTRXQVJfTk9fTU9SRV9BVSAgICAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEM9KFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIGludDY0X3QgdGVtcFRpbWU2NCA9IDA7Ci0gICAgTWVkaWFCdWZmZXIgKm1NZWRpYUJ1ZmZlciA9IE5VTEw7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgTTRPU0FfQm9vbCBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgc3RhdHVzX3QgZXJyb3I7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKCggcEM9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBiZWdpbiIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGF1ZGlvIHN0cmVhbSIpOwotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgICAgICBpZiAocEMtPm1BdWRpb1NlZWtpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBzZWVrIHRpbWU6ICVsZCIsCi0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBDLT5tQXVkaW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLQotICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGF1ZGlvIG5vIHNlZWs6Iik7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgdmlkZW8gc3RlcmFtICIpOwotICAgICAgICBwQXUgPSAmcEMtPm1WaWRlb0F1OwotICAgICAgICBpZihwQy0+bVZpZGVvU2Vla2luZyA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgc2VlazogJWxkIixwQy0+bVZpZGVvU2Vla1RpbWUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocEMtPm1WaWRlb1NlZWtUaW1lLAotICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgZnJlZSB0aGUgTWVkaWFCdWZmZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVycm9yID0gcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdSBNZWRpYUJ1ZmZlciAleCAsIGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaTMyVG1wKSAmJiBpMzJUbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiU1lOQyBGUkFNRSBGT1VORC0tJWQiLCBpMzJUbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgICAgICAgICAgfSB3aGlsZSh0ZW1wVGltZTY0IDwgcEMtPm1WaWRlb1NlZWtUaW1lKTsKLQotICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTogdmlkZW8gIHRpbWUgd2l0aCBzZWVrICA9ICVsbGQ6IiwKLSAgICAgICAgICAgICAgICB0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHZpZGVvIG5vIHNlZWs6Iik7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLQotICAgICAgICAgICAgaWYobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgJmkzMlRtcCkgJiYgaTMyVG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTWU5DIEZSQU1FIEZPVU5ELS0lZCIsIGkzMlRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTogdmlkZW8gbm8gc2VlayB0aW1lID0gJWxsZDoiLAotICAgICAgICAgICAgICAgICAgICB0ZW1wVGltZTY0KTsKLSAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVkUzZ3BSZWFkZXJfZ2V0TmV4dEF1OnZpZGVvIG5vIHNlZWsgdGltZSBidWZmZXIgaXMgTlVMTCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYoIChwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHx8ICAocEF1LT5zaXplIDwgXAotICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKLSAgICAgICAgICAgIGlmKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUoKE00T1NBX0ludDMyKilwQXUtPmRhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJCdWZmZXIgbGVuZ2h0ID0gJWQgLCVkIiwobU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArXAotICAgICAgICAgICAgICAgIDMpICYgfjB4MywobU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpOwotCi0gICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gKE00T1NBX0ludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAzKSAmIH4weDMsTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopInBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzIiApOwotICAgICAgICAgICAgaWYocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBBdS0+c2l6ZSA9IG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEF1LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICh2b2lkICopKChjb25zdCBjaGFyICopbU1lZGlhQnVmZmVyLT5kYXRhKCkgKyBtTWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgIGlmKCAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyKSAgJiYKLSAgICAgICAgICAgIChwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMpICkgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemUgPSBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgTTRPU0FfVUludDggKmxidWZmZXI7Ci0KLSAgICAgICAgICAgIGxidWZmZXIgPSAoTTRPU0FfVUludDggKikgcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIEFMT0dWKCJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyBzaXplID0gJXgiLHNpemUpOwotCi0gICAgICAgICAgICBsYnVmZmVyWzBdID0gKHNpemUgPj4gMjQpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbMV0gPSAoc2l6ZSA+PiAxNikgJiAweEZGOwotICAgICAgICAgICAgbGJ1ZmZlclsyXSA9IChzaXplID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbM10gPSAoc2l6ZSkgJiAweEZGOwotICAgICAgICB9Ci0KLSAgICAgICAgcEF1LT5DVFMgPSB0ZW1wVGltZTY0OwotCi0gICAgICAgIHBBdS0+Q1RTID0gcEF1LT5DVFMgLyAxMDAwOyAvL2NvbnZlcnRpbmcgdGhlIG1pY3Jvc2VjIHRvIG1pbGxpc2VjCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgQ1RTID0gJWxkIixwQXUtPkNUUyk7Ci0KLSAgICAgICAgcEF1LT5EVFMgID0gcEF1LT5DVFM7Ci0gICAgICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50OCopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyA9IHBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgPSBwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBNNFdBUl9OT19NT1JFX0FVIChFT1MpIHJlYWNoZWQiKTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IDA7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBtTWVkaWFCdWZmZXIgPSBOVUxMOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgZW5kICIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNwbGl0IHRoZSBBVkMgRFNJIGluIGl0cyBkaWZmZXJlbnQgY29tcG9uZW50cyBhbmQgd3JpdGUgaXQgaW4KLSAqICAgICAgICAgIE9ORSBtZW1vcnkgYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6ICAgICAgICAgKElOL09VVCkgVGhlIE1QRUc0LUFWQyBzdHJlYW0KLSAqIEBwYXJhbSAgIHBEZWNvZGVyQ29uZmlnTG9jYWw6ICAgIChJTikgVGhlIERTSSBidWZmZXIKLSAqIEBwYXJhbSAgIGRlY29kZXJDb25maWdTaXplTG9jYWw6IChJTikgVGhlIERTSSBidWZmZXIgc2l6ZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIEVSUl9GSUxFX1NZTlRBWF9FUlJPUiAgIHBEZWNvZGVyQ29uZmlnTG9jYWwgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FuYWx5c2VBdmNEc2koCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcERlY29kZXJDb25maWdMb2NhbCwKLSAgICAgICAgTTRPU0FfSW50MzIgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCkgewotICAgIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvICpwQXZjU3BlY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB1aVNwZWNJbmZvU2l6ZTsKLSAgICBNNE9TQV9Db250ZXh0IHBCaXRQYXJzZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwUG9zOwotCi0gICAgLyoqCi0gICAgICogRmlyc3QgcGFyc2luZyB0byBnZXQgdGhlIHRvdGFsIGFsbG9jYXRpb24gc2l6ZSAod2UgbXVzdCBub3QgZG8KLSAgICAgKiBtdWx0aXBsZSBtYWxsb2MsIGJ1dCBvbmx5IG9uZSBpbnN0ZWFkKSAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfSW50MzIgdmFsOwotICAgICAgICBNNE9TQV9VSW50MzIgaSxqOwotICAgICAgICBNNE9TQV9VSW50OCBuYWxVbml0TGVuZ3RoOwotICAgICAgICBNNE9TQV9VSW50OCAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHM7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVRvdGFsU2l6ZU9mU1BTID0gMDsKLSAgICAgICAgTTRPU0FfVUludDggIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVRvdGFsU2l6ZU9mUFBTID0gMDsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpU2l6ZTsKLSAgICAgICAgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8gYXZjU3BJZjsKLQotICAgICAgICBhdmNTcElmLm1fbmFsVW5pdExlbmd0aCA9IDA7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcERlY29kZXJDb25maWdMb2NhbCkgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUjNHUF9ERUNPREVSX0NPTkZJR19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX01QRUc0Qml0U3RyZWFtUGFyc2VySW5pdCgmcEJpdFBhcnNlckNvbnRleHQsCi0gICAgICAgICAgICBwRGVjb2RlckNvbmZpZ0xvY2FsLCBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsKTsKLQotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQml0UGFyc2VyQ29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggYml0cyAtLSBjb25maWd1cmF0aW9uIHZlcnNpb24gKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggYml0cyAtLSBhdmMgcHJvZmlsZSBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggYml0cyAtLSBwcm9maWxlIGNvbXBhdGliaWxpdHkgKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDggYml0cyAtLSBhdmMgbGV2ZWwgaW5kaWNhdGlvbiovCi0gICAgICAgIHZhbD1WaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIDYgYml0cyByZXNlcnZlZCAxMTExMTFiIDIgYml0cyBsZW5ndGggU2l6ZSBtaW51cyBvbmUqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9uYWxVbml0TGVuZ3RoICovCi0KLSAgICAgICAgbmFsVW5pdExlbmd0aCA9IChNNE9TQV9VSW50OCkoKHZhbCAmIDB4MDMpICsgMSk7LyowYjExMTExMTAwKi8KLSAgICAgICAgaWYgKG5hbFVuaXRMZW5ndGggPiA0KSB7Ci0gICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU1BTIHRhYmxlICovCi0gICAgICAgICAgICB2YWw9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsCi0gICAgICAgICAgICA4KTsvKiAzIGJpdHMtcmVzZXJ2ZWQgMTExYi01IGJpdHMgbnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQqLwotICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgPSB2YWwgJiAweDFGOwotICAgICAgICAgICAgLyoxRiBpbnN0ZWFkIG9mIEUwKi8gLyowYjExMTAwMDAwKi8gLypOdW1iZXIgb2Ygc2VxIHBhcmFtZXRlciBzZXRzKi8KLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgdWlTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mU1BTICs9IHVpU2l6ZTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICpSZWFkIHRoZSBlbGVtZW50KGRvbnQga2VlcCBpdCwgd2Ugb25seSB3YW50IHNpemUgcmlnaHQgbm93KSAqLwotICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHVpU2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU1BTIHRhYmxlICovCi0gICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzPShNNE9TQV9VSW50OClcCi0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIHVpU2l6ZSA9IChNNE9TQV9VSW50MzIpCi0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZQUFMgKz0gdWlTaXplOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKlJlYWQgdGhlIGVsZW1lbnQoZG9udCBrZWVwIGl0LHdlIG9ubHkgd2FudCBzaXplIHJpZ2h0IG5vdykqLwotICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHVpU2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgZnVsbCBidWZmZXIgKi8KLSAgICAgICAgICAgIHVpU3BlY0luZm9TaXplID0gc2l6ZW9mKHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvKSArCi0gICAgICAgICAgICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0cyAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkKLSAgICAgICAgICAgICAgICAgICAgICsgLyoqPCBzaXplIG9mIHRoZSB0YWJsZSBvZiBTUFMgZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIG51bU9mUGljdHVyZVBhcmFtZXRlclNldHMgICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KQotICAgICAgICAgICAgICAgICAgICAgKyAvKio8IHNpemUgb2YgdGhlIHRhYmxlIG9mIFBQUyBlbGVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlNQUyArCi0gICAgICAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8gPShzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHVpU3BlY0luZm9TaXplLAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJNUEVHLTQgQVZDIERlY29kZXJTcGVjaWZpYyIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF2Y1NwZWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3QgcGFydCBvZiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fbmFsVW5pdExlbmd0aCA9IG5hbFVuaXRMZW5ndGg7Ci0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgPQotICAgICAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX251bU9mUGljdHVyZVBhcmFtZXRlclNldHMgID0KLSAgICAgICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOwotCi0gICAgICAgICAgICAvKiBXZSBwbGFjZSB0aGUgU1BTIHBhcmFtIHNldHMgdGFibGUgYWZ0ZXIgbV9wUGljdHVyZVBhcmFtZXRlclNldCAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldD0gKHN0cnVjdCBfcGFyYW1ldGVyU2V0KikoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSgmcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0KSArCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCkpOwotICAgICAgICAgICAgLypXZSBwbGFjZSB0aGUgUFBTIHBhcmFtIHNldHMgdGFibGUgYWZ0ZXIgdGhlIFNQUyBwYXJhbSBzZXRzIHRhYmxlKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCA9IChzdHJ1Y3QgX3BhcmFtZXRlclNldCopKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkocEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldCkgKwotICAgICAgICAgICAgICAgIChudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0cyAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkpKTsKLSAgICAgICAgICAgIC8qKjwgVGhlIGRhdGEgd2lsbCBiZSBwbGFjZWQgYWZ0ZXIgdGhlIFBQUyBwYXJhbSBzZXRzIHRhYmxlICovCi0gICAgICAgICAgICBwUG9zID0gKE00T1NBX01lbUFkZHI4KXBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCArCi0gICAgICAgICAgICAgICAgKG51bU9mUGljdHVyZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiByZXNldCB0aGUgYml0IHBhcnNlciAqLwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWNvbmQgcGFyc2luZyB0byBjb3B5IHRoZSBkYXRhICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEF2Y1NwZWNJbmZvKSB7Ci0gICAgICAgIE00T1NBX0ludDMyIGksajsKLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQoJnBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgcERlY29kZXJDb25maWdMb2NhbCwgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCk7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEJpdFBhcnNlckNvbnRleHQpIHsKLSAgICAgICAgICAgIGZyZWUocEF2Y1NwZWNJbmZvKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiA4IGJpdHMgLS0gY29uZmlndXJhdGlvbiB2ZXJzaW9uICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIHByb2ZpbGUgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiA4IGJpdHMgLS0gcHJvZmlsZSBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIGxldmVsIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogbV9uYWxVbml0TGVuZ3RoICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgIC8qIDMgYml0cyAtLSByZXNlcnZlZCAxMTFiIC0tIDUgYml0cyBudW1iZXIgb2Ygc2VxdWVuY2UgcGFyYW1ldGVyIHNldCovCi0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBwQXZjU3BlY0luZm8tPm1fbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LDE2KTsKLQotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX3BQYXJhbWV0ZXJTZXRVbml0ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBQb3M7ICAvKio8IGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcFBvcyArPSBwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOwotICAgICAgICAgICAgICAgIC8qKjwgaW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBmb3IgKGo9MDsgajxwQXZjU3BlY0luZm8tPm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoO2orKyl7Ci0gICAgICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX3BQYXJhbWV0ZXJTZXRVbml0W2pdPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAvKiBudW1iZXIgb2YgcMOuY3R1cmUgcGFyYW1ldGVyIHNldCovCi0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBwQXZjU3BlY0luZm8tPm1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGggPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwxNik7Ci0KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX3BQYXJhbWV0ZXJTZXRVbml0ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBQb3M7ICAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBQb3MgKz0gcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOwotICAgICAgICAgICAgICAgIC8qKjwgaW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBmb3IgKGo9MDsgajxwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX3BQYXJhbWV0ZXJTZXRVbml0W2pdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gdWlTcGVjSW5mb1NpemU7Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX1VJbnQ4KilwQXZjU3BlY0luZm87Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAgPSAgZGVjb2RlckNvbmZpZ1NpemVMb2NhbDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIGRlY29kZXJDb25maWdTaXplTG9jYWwsIE00UkVBREVSXzNHUCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSJNUEVHLTQgQVZDIERlY29kZXJTcGVjaWZpYyIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICogKSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICh2b2lkICogKXBEZWNvZGVyQ29uZmlnTG9jYWwsCi0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci1jbGVhbnVwOgotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgIHJldHVybiBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1I7Ci19Ci0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSAzZ3AgZmlsZQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6IE9VVCkgICBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbCBiZSBmaWxsZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjooT1VUKSBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDPShWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiBwVmlkZW9TdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDggKkRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0wLCBtYXhBVVNpemUgPSAwOwotCi0gICAgTTRfU3RyZWFtVHlwZSBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlVW5rbm93bjsKLSAgICBNNE9TQV9VSW50OCB0ZW1wLCBpLCB0cmFja0NvdW50OwotICAgIE00T1NBX0Jvb2wgaGF2ZUF1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBoYXZlVmlkZW8gPSBNNE9TQV9GQUxTRTsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSAgPSBOVUxMOwotICAgIGludDY0X3QgRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQ4KiBEZWNvZGVyU3BlY2lmaWMgPSBNNE9TQV9OVUxMIDsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgY29uc3Qgdm9pZCAqY29kZWNfc3BlY2lmaWNfZGF0YTsKLSAgICBzaXplX3QgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgIE00T1NBX0ludDMyICBwdGVtcFRpbWU7Ci0gICAgTTRPU0FfSW50MzIgIGF2Z0ZQUz0wOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGJlZ2luIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFGYW1pbHkgICA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImdldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgdHJhY2tDb3VudCA9IHBDLT5tRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIHRlbXAgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgIGlmKHRlbXAgPj0gdHJhY2tDb3VudCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZXJyb3IgPSAlZCIsCi0gICAgICAgICAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybiAoTTRXQVJfTk9fTU9SRV9TVFJFQU0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIG1ldGEgPSBwQy0+bUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0ZW1wKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZVZpZGVvICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9Tb3VyY2UgPSBwQy0+bUV4dHJhY3Rvci0+Z2V0VHJhY2sodGVtcCk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgICAgICAqcE1lZGlhRmFtaWx5ID0gTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW87Ci0gICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGdldFRyYWNrIGNhbGxlZCIpOwotICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyR2V0TmV4dFN0cmVhbUhhbmRsZXIgc3RyZWFtVHlwZU5PTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlcjogc3RyZWFtIHR5cGU6ICVkICIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmKHN0cmVhbVR5cGUgIT0gTTREQV9TdHJlYW1UeXBlVW5rbm93bikgewotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1JZCA9IHBDLT5tQ3VyclRyYWNrOwotCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X1ZpZGVvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9WaWRlb1N0cmVhbUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwVmlkZW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSYocFZpZGVvU3RyZWFtSGFuZGxlci0+bV92aWRlb1dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fdmlkZW9IZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpICA9IChNNF9TdHJlYW1IYW5kbGVyKikocFZpZGVvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgKGludDY0X3QqKSYoRHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAoKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pID0gKGludDMyX3QpKChEdXJhdGlvbikvMTAwMCk7IC8vIGNvbnZlcnNpb24gdG8gbVMKLSAgICAgICAgICAgICAgICBwQy0+bU1heER1cmF0aW9uID0gKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAocEMtPm1NYXhEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyB0b28gc2hvcnQ6ICVsbGQgVXMiLCBEdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwVmlkZW9TdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fZHVyYXRpb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBvZmY2NF90IGZpbGVTaXplID0gMDsKLSAgICAgICAgICAgICAgICBwQy0+bURhdGFTb3VyY2UtPmdldFNpemUoJmZpbGVTaXplKTsKLSAgICAgICAgICAgICAgICBwQy0+bUZpbGVTaXplICA9IGZpbGVTaXplOwotCi0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fZmlsZVNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+bUZpbGVTaXplKTsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAoaW50MzJfdCopJihtYXhBVVNpemUpKTsKLSAgICAgICAgICAgICAgICBpZihtYXhBVVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXhBVVNpemUgPSA3MDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplID0gbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IG1NYXhBVVNpemUgZnJvbSBNUDQgZXh0cmFjdG9yOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBWaWRlb1N0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bUZpbGVTaXplICogODAwMCkvcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbV9hdmVyYWdlQml0cmF0ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcFZpZGVvU3RyZWFtSGFuZGxlciktPm1fYXZlcmFnZUJpdFJhdGUpOwotCi0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSYoYXZnRlBTKSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIjw8PDw8PDw8PDwgICB2aWRlbzogQXZlcmFnZSBGUFMgZnJvbSBNUDQgZXh0cmFjdG9yOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGF2Z0ZQUyk7Ci0KLSAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGUgPShNNE9TQV9GbG9hdCkgYXZnRlBTOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IEF2ZXJhZ2UgRlBTIGZyb20gTVA0IGV4dHJhY3RvciBpbiBGTE9BVDogJWYiLAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGUpOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2aWRlbyByb3RhdGlvbiBkZWdyZWUKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlOwotICAgICAgICAgICAgICAgIGlmKCFtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKShwVmlkZW9TdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgRFNJIGluZm8gKi8KLSAgICAgICAgICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLChNNE9TQV9DaGFyKikiSDI2MyBEU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRV9nZXROZXh0U3RyZWFtSGFuZGxlcjogSDI2MyBkc2kgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkgyNjQgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwX2dldE5leHRTdHJlYW0gaXMgTlVMTCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkRTSSBTaXplICVkIiwgZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQW5hbHlzZUF2Y0RzaSgqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMiopRGVjb2RlclNwZWNpZmljSW5mbywgZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGVjc2l6ZSAlZCwgaDI2NGRlY3NpemUgJWQ6ICVkIiwgKCpwU3RyZWFtSGFuZGxlciktPlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsICgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0ID09IHN0cmVhbVR5cGUpICkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKGVzZHMuSW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSAoTTRPU0FfVUludDgqKVwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTTRWIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRVNEU0luZm8sICh2b2lkICopZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkUgTVA0IGRzaXNpemU6ICVkLCAleCIsIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBOTyB2aWRlbyBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIE5PIHZpZGVvIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gYXVkaW8gZ2V0VHJhY2sgY2FsbGVkIik7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHBDLT5tQ3VyclRyYWNrKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICAqcE1lZGlhRmFtaWx5ID0gTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW87Ci0KLSAgICAgICAgICAgIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOwotICAgICAgICAgICAgfSBlbHNlIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQikpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYSBzdHJlYW10eXBlIFVua25vd24gIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihzdHJlYW1UeXBlICE9IE00REFfU3RyZWFtVHlwZVVua25vd24pIHsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtSWQgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBzdHJlYW10eXBlICVkICxpZCAlZCIsICBzdHJlYW1UeXBlLCBwQy0+bUN1cnJUcmFjayk7Ci0KLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICAgICAgICAgICAgIChzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwgTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgID0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgICAgICAgPSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3k9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggID0gMDsKLQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpID0gKE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fYXZlcmFnZUJpdFJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXI9KE00X1N0cmVhbUhhbmRsZXIqKXBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsIChpbnQzMl90KikmKG1heEFVU2l6ZSkpOwotICAgICAgICAgICAgICAgIGlmKG1heEFVU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEFVU2l6ZSA9IDcwMDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUgPSBtYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFIEF1ZGlvIG1NYXhBVVNpemUgZnJvbSBNUDQgZXh0cmFjdG9yOiAlZCIsIG1heEFVU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IHN0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQgPT0gc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZnJlcUluZGV4ID0gMDsgLyoqPCBBTVIgTkIgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbW9kZVNldDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBCaXRQYXJzZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgICAgICAgICBmcmVxSW5kZXggPSAxOyAvKio8IEFNUiBXQiAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKGVzZHMuSW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwgKE00T1NBX0NoYXIqKSJBTVIgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1VDaGFyIEFtckRzaVtdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsnUCcsJ0gnLCdMJywnUCcsMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMSx9OwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDk7Ci0gICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiUEhMUCBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyZXFJbmRleCA9PTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFtckRzaVs4XSA9IDB4MDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbXJEc2lbOF0gPSAweDAyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaTwgOTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNbaV0gPSBBbXJEc2lbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQW1yQml0UmF0ZVtmcmVxSW5kZXhdWzddOwotICAgICAgICAgICAgfSBlbHNlIGlmKChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSBzdHJlYW1UeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKGVzZHMuSW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUsIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiQUFDIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFZHNpICVkLCV4Iixjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhKTsKLQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiQUFDIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIG1TdHJlYW1UeXBlOiBub25lICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJWRSBub2F1ZGlvLXZpZGVvIHN0cmVhbTpwQy0+bUN1cnJUcmFjayA9ICVkICIscEMtPm1DdXJyVHJhY2spOwotICAgICAgICAgICAgcEMtPm1DdXJyVHJhY2srKzsgLy9JbmNyZW1lbnQgY3VycmVudCB0cmFjayB0byBnZXQgdGhlIG5leHQgdHJhY2sKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVkUgU3RyZWFtVHlwZTogJWQsIHN0cmVtaGFuZGxlciAleCIsc3RyZWFtVHlwZSwgKnBTdHJlYW1IYW5kbGVyICk7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1JZCAgID0gcEMtPm1TdHJlYW1JZDsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcFVzZXJEYXRhICA9IE00T1NBX05VTEw7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICBtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLAotICAgICAgICAgICAgKGludDY0X3QqKSYoRHVyYXRpb24pKTsKLQotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbiA9IChpbnQzMl90KShEdXJhdGlvbiAvIDEwMDApOwotCi0gICAgICAgIHBDLT5tTWF4RHVyYXRpb24gPSAoKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotICAgICAgICBBTE9HVigiVkUgc3RyIGR1cmF0aW9uIGR1cmF0aW9uOiAlZCAiLCAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0KLSAgICAgICAgLyogSW4gQUFDIGNhc2U6IFB1dCB0aGUgZmlyc3QgQVUgaW4gcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEKLSAgICAgICAgICpzaW5jZSBkZWNvZGVyIGhhcyB0byBrbm93IGlmIHN0cmVhbSBjb250YWlucyBTQlIgZGF0YShJbXBsaWNpdCBzaWcpICovCi0gICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqICBwQXVkaW9TYnJVc2VyZGF0YTsKLQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHNpemVvZihNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKSxNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YSkgewotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wVXNlckRhdGEgPSBwQXVkaW9TYnJVc2VyZGF0YTsKLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX2JJc1NickVuYWJsZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEZpcnN0QVUgPSAoTTRfQWNjZXNzVW5pdCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHNpemVvZihNNF9BY2Nlc3NVbml0KSxNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiMXN0IEFBQyBBVSIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEZpcnN0QVUpIHsKLSAgICAgICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcgPSAoTTRfQWFjRGVjb2RlckNvbmZpZyopXAotICAgICAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQWFjRGVjb2RlckNvbmZpZyksTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikibV9wQWFjRGVjb2RlclVzZXJDb25maWciKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BBYWNEZWNvZGVyVXNlckNvbmZpZykgewotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyID0KLSAgICAgICAgICAgICAgICAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKikoKnBTdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqIHBVc2VyRGF0YSA9IChNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKilcCi0gICAgICAgICAgICAgICAgKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCopcFVzZXJEYXRhLT5tX3BGaXJzdEFVKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUocEMsICgqcFN0cmVhbUhhbmRsZXIpLAotICAgICAgICAgICAgICAgIChNNF9BY2Nlc3NVbml0KilwVXNlckRhdGEtPm1fcEZpcnN0QVUpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogMS4gIk00V0FSX05PX01PUkVfQVUgPT0gZXJyIiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubyBtb3JlCi0gICAgICAgICAgICAgKiBhY2Nlc3MgdW5pdCBmcm9tIHRoZSBjdXJyZW50IHRyYWNrLiBJbiBvdGhlciB3b3JkcywgdGhlcmUKLSAgICAgICAgICAgICAqIGlzIG9ubHkgYSBzaW5nbGUgYWNjZXNzIHVuaXQgZnJvbSB0aGUgY3VycmVudCB0cmFjaywgYW5kCi0gICAgICAgICAgICAgKiB0aGUgcGFyc2luZyBvZiB0aGlzIHRyYWNrIGhhcyByZWFjaGVkIEVPUy4gVGhlIHJlYXNvbiB3aHkKLSAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhY2Nlc3MgdW5pdCBuZWVkcyB0byBiZSBwYXJzZWQgaGVyZSBpcyBiZWNhdXNlIGZvcgotICAgICAgICAgICAgICogc29tZSBhdWRpbyBjb2RlYyAobGlrZSBBQUMpLCB0aGUgdmVyeSBmaXJzdCBhY2Nlc3MgdW5pdAotICAgICAgICAgICAgICogbXVzdCBiZSBkZWNvZGVkIGJlZm9yZSBpdHMgY29uZmlndXJhdGlvbi9lbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgKiAoc3VjaCBhcyAjIG9mIGNoYW5uZWxzIGFuZCBzYW1wbGUgcmF0ZSkgY2FuIGJlIGNvcnJlY3RseQotICAgICAgICAgICAgICogZGV0ZXJtaW5lZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAyLiAidHJhY2tDb3VudCA+IHBDLT5tQ3VyclRyYWNrIiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgb3RoZXIKLSAgICAgICAgICAgICAqIHRyYWNrcyB0byBiZSBwYXJzZWQsIGluIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50IHRyYWNrLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFdoZW4gYm90aCBjb25kaXRpb25zIDEgJiAyIGhvbGQsIG90aGVyIHRyYWNrcyBzaG91bGQgYmUKLSAgICAgICAgICAgICAqIHBhcnNlZC4gVGh1cywgd2Ugc2hvdWxkIG5vdCBiYWlsIG91dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyICYmIHRyYWNrQ291bnQgPiBwQy0+bUN1cnJUcmFjaykgewotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldChwQywgKCpwU3RyZWFtSGFuZGxlcikpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwQy0+bUN1cnJUcmFjaysrOyAvL0luY3JlbWVudCB0aGUgY3VycmVudCB0cmFjayB0byBnZXQgbmV4dCB0cmFjawotICAgIEFMT0dWKCJwQy0+bUN1cnJUcmFjayA9ICVkIixwQy0+bUN1cnJUcmFjayk7Ci0KLSAgICBpZiAoIWhhdmVBdWRpbyAmJiAhaGF2ZVZpZGVvKSB7Ci0gICAgICAgICpwTWVkaWFGYW1pbHk9TTRSRUFERVJfa01lZGlhRmFtaWx5VW5rbm93bjsKLSAgICAgICAgcmV0dXJuIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFOwotICAgIH0KLUVycm9yOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBlbmQgZXJyb3IgPSAlZCIsZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCAqcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNZWRpYUJ1ZmZlciAqbU1lZGlhQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLSAgICBpbnQ2NF90IHRlbXBUaW1lNjQgPSAwOwotICAgIHN0YXR1c190IGVycm9yOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGJlZ2luIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZTogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLSAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKLSAgICAgICAgKnBUaW1lIC09IDE7Ci0gICAgfQotCi0gICAgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lICogMTAwMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBzZWVrIHRpbWU6ICVsZCIsdGltZTY0KTsKLSAgICBvcHRpb25zLnNldFNlZWtUbyh0aW1lNjQsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICBlcnJvciA9IHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgIGlmIChlcnJvciAhPSBPSykgewotICAgICAgICAvL0NhbiBub3QgZ2V0IHRoZSBwcmV2aW91cyBTeW5jLgotICAgICAgICAvL011c3QgYmUgZW5kIG9mIHN0cmVhbS4KLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSByZWFkIHRpbWUgJWxkLCAleCIsIHRlbXBUaW1lNjQsCi0gICAgICAgIG1NZWRpYUJ1ZmZlcik7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpKHRlbXBUaW1lNjQgLyAxMDAwKTsKLQotICAgIGlmKG1NZWRpYUJ1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dWKCIgbU1lZGlhQnVmZmVyIHNpemUgPSAlZCBsZW5ndGggJWQiLCBtTWVkaWFCdWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBtTWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbU1lZGlhQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgaWYoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGVuZCBcCi0gICAgICAgICAgICBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgZW5kOiBlcnIgJXgiLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLX0KLQotZXh0ZXJuICJDIiB7Ci1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE1lZGlhVHlwZSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckdsb2JhbEludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBiZWdpbiIpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgJWQgMHgleCAweCV4IiwgKnBNZWRpYVR5cGUsCi0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlLCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICBTQUZFX01BTExPQygqcFJkckdsb2JhbEludGVyZmFjZSwgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIik7Ci0gICAgU0FGRV9NQUxMT0MoKnBSZHJEYXRhSW50ZXJmYWNlLCBNNFJFQURFUl9EYXRhSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIik7Ci0KLSAgICAqcE1lZGlhVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gPQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlcjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgPQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgPQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZTsKLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0gIC8qIGV4dGVybiAiQyIgKi8KLQotfSAgLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM3ZWExLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQXVkaW8gRGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfQVVESU9ERUNPREVSIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgREVGSU5JVElPTlMgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotLy8gVmVyc2lvbgotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fUkVWICAgMAotCi0vLyBGb3JjZSB1c2luZyBzb2Z0d2FyZSBkZWNvZGVyIGFzIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHByZWZldGNoCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga1NvZnR3YXJlQ29kZWNzT25seQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3A8VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgICAgICBDUkVBVEVELAotICAgICAgICAgICAgU1RBUlRFRCwKLSAgICAgICAgICAgIEVSUk9SCi0gICAgICAgIH07Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiYgZm9ybWF0LAotICAgICAgICAgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwotICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtQnVmZmVyczsKLSAgICAgICAgTXV0ZXggbUxvY2s7ICAvLyBwcm90ZWN0cyBtQnVmZmVycwotICAgICAgICBib29sIG1Jc0VPUzsKLSAgICAgICAgU3RhdGUgbVN0YXRlOwotICAgICAgICB2b2lkKiBtRGVjU2hlbGxDb250ZXh0OwotICAgICAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSYpOwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UgJik7Ci19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgYXVkaW8gZGVjb2RlcgotICogICAgICAgICAgIHNoZWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RlclR5cGU7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiAgbURlY29kZXJTb3VyY2U7Ci0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50OwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICAgICAgICAgbURlY29kZXI7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRDaGFubmVsczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgICptX3BSZWFkZXI7Ci0gICAgTTRfQWNjZXNzVW5pdCogbV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLSAgICBNNE9TQV9FUlIgcmVhZGVyRXJyQ29kZTsKLSAgICBpbnQzMl90IHRpbWVTdGFtcE1zOwotCi19IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQ7Ci0KLXNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCkgewotCi0gICAgc3A8VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U+IGFTb3VyY2UgPQotICAgICAgICBuZXcgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoZm9ybWF0LCBkZWNvZGVyU2hlbGxDb250ZXh0KTsKLQotICAgIHJldHVybiBhU291cmNlOwotfQotCi1WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgZm9ybWF0LCB2b2lkKiBkZWNvZGVyU2hlbGxDb250ZXh0KToKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtSXNFT1MoZmFsc2UpLAotICAgICAgICBtU3RhdGUoQ1JFQVRFRCksCi0gICAgICAgIG1EZWNTaGVsbENvbnRleHQoZGVjb2RlclNoZWxsQ29udGV4dCkgewotfQotCi1WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKCkgewotCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdGFydDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IFNUQVJURUQ7Ci0KLWNsZWFuVXA6Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdGFydCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIGJlZ2luIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBpbnQgbiA9IG1CdWZmZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIG1CdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dXKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCA6ICVkIGJ1ZmZlciByZW1haW5lZCIsIG4pOwotICAgICAgICBtQnVmZmVycy5jbGVhcigpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IENSRUFURUQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zdGF0aWMgTWVkaWFCdWZmZXIqIHJlYWRCdWZmZXJGcm9tUmVhZGVyKAotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9BY2Nlc3NVbml0KiBwQWNjZXNzVW5pdCA9IHBEZWNDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotCi0gICAgLy8gR2V0IG5leHQgQVUgZnJvbSByZWFkZXIuCi0gICAgbGVyciA9IHBEZWNDb250ZXh0LT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgIHBEZWNDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwRGVjQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgIHBBY2Nlc3NVbml0KTsKLQotICAgIGlmIChsZXJyID09IE00V0FSX05PX01PUkVfQVUpIHsKLSAgICAgICAgQUxPR1YoInJlYWRCdWZmZXJGcm9tUmVhZGVyIDogRU9TIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHBEZWNDb250ZXh0LT50aW1lU3RhbXBNcyA9IHBBY2Nlc3NVbml0LT5tX0NUUzsKLQotICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwQWNjZXNzVW5pdC0+bV9zaXplKTsKLSAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX0ludDgqKW5ld0J1ZmZlci0+ZGF0YSgpICsgbmV3QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICh2b2lkICopcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MsIHBBY2Nlc3NVbml0LT5tX3NpemUpOwotICAgIG5ld0J1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAocEFjY2Vzc1VuaXQtPm1fQ1RTICogMTAwMExMKSk7Ci0gICAgcmV0dXJuIG5ld0J1ZmZlcjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0KLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjQ29udGV4dCA9Ci0gICAgIChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0ICopbURlY1NoZWxsQ29udGV4dDsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6cmVhZCBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIHJlYWRlciBpZiB3ZSBkb24ndCBoYXZlIGFueQotICAgIGlmKG1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIG5ld0J1ZmZlciA9IHJlYWRCdWZmZXJGcm9tUmVhZGVyKHBEZWNDb250ZXh0KTsKLSAgICAgICAgaWYgKCFuZXdCdWZmZXIpIHsKLSAgICAgICAgICAgICpidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcERlY0NvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlcnMucHVzaChuZXdCdWZmZXIpOwotICAgIH0KLSAgICAqYnVmZmVyID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgIG1CdWZmZXJzLnJlbW92ZUF0KDApOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjQ29udGV4dCA9Ci0gICAgIChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0ICopbURlY1NoZWxsQ29udGV4dDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIgYmVnaW4iKTsKLQotICAgIC8vIElmIHRoZSB1c2VyIGRpZG4ndCBnaXZlIHVzIGEgYnVmZmVyLCBnZXQgaXQgZnJvbSB0aGUgcmVhZGVyLgotICAgIGlmKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSByZWFkQnVmZmVyRnJvbVJlYWRlcihwRGVjQ29udGV4dCk7Ci0gICAgICAgIGlmICghbmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICBwRGVjQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIG1CdWZmZXJzLnB1c2goYnVmZmVyKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIEVORCIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgVE9PTFMgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhNNE9TQV9JbnQ4KiBwRGF0YSwKLSAgICAgICAgTTRPU0FfVUludDMyIGRhdGFTaXplLCBNNE9TQV9VSW50OCBuYkJpdHMsIE00T1NBX0ludDMyKiBwUmVzdWx0LAotICAgICAgICBNNE9TQV9VSW50MzIqIHBPZmZzZXQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzdGFydEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzdGFydEJpdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGVuZEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBlbmRCaXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBjdXJyZW50Qnl0ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHJlc3VsdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHVpMzJUbXAgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1aTMyTWFzayA9IDA7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRGF0YSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPZmZzZXQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMzIgPj0gbmJCaXRzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKCgqcE9mZnNldCArIG5iQml0cykgPD0gOCpkYXRhU2l6ZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIGJlZ2luIik7Ci0KLSAgICBzdGFydEJ5dGUgICA9ICgqcE9mZnNldCkgPj4gMzsKLSAgICBlbmRCeXRlICAgICA9ICgqcE9mZnNldCArIG5iQml0cykgPj4gMzsKLSAgICBzdGFydEJpdCAgICA9ICgqcE9mZnNldCkgJSA4OwotICAgIGVuZEJpdCAgICAgID0gKCpwT2Zmc2V0ICsgbmJCaXRzKSAlIDg7Ci0gICAgY3VycmVudEJ5dGUgPSBzdGFydEJ5dGU7Ci0KLSAgICAvLyBFeHRyYWN0IHRoZSByZXF1ZXN0ZWQgbnVuYmVyIG9mIGJpdHMgZnJvbSBtZW1vcnkKLSAgICB3aGlsZSggY3VycmVudEJ5dGUgPD0gZW5kQnl0ZSkgewotICAgICAgICB1aTMyTWFzayA9IDB4MDAwMDAwRkY7Ci0gICAgICAgIGlmKCBjdXJyZW50Qnl0ZSA9PSBzdGFydEJ5dGUgKSB7Ci0gICAgICAgICAgICB1aTMyTWFzayA+Pj0gc3RhcnRCaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgdWkzMlRtcCA9IHVpMzJNYXNrICYgKChNNE9TQV9VSW50MzIpcERhdGFbY3VycmVudEJ5dGVdKTsKLSAgICAgICAgaWYoIGN1cnJlbnRCeXRlID09IGVuZEJ5dGUgKSB7Ci0gICAgICAgICAgICB1aTMyVG1wID4+PSAoOC1lbmRCaXQpOwotICAgICAgICAgICAgcmVzdWx0IDw8PSBlbmRCaXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPDw9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0IHw9IHVpMzJUbXA7Ci0gICAgICAgIGN1cnJlbnRCeXRlKys7Ci0gICAgfQotCi0gICAgKnBSZXN1bHQgPSByZXN1bHQ7Ci0gICAgKnBPZmZzZXQgKz0gbmJCaXRzOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0jZGVmaW5lIEZSRVFfVEFCTEVfU0laRSAxNgotY29uc3QgTTRPU0FfVUludDMyIEFEX0FBQ19GUkVRX1RBQkxFW0ZSRVFfVEFCTEVfU0laRV0gPQotICAgIHs5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsCi0gICAgMzIwMDAsIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MCwgMCwgMCwgMH07Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0koTTRPU0FfSW50OCogcERTSSwKLSAgICAgICAgTTRPU0FfVUludDMyIGRzaVNpemUsIEFBQ19ERUNfU1RSRUFNX1BST1BTKiBwUHJvcGVydGllcykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIG9mZnNldCA9IDA7Ci0gICAgTTRPU0FfSW50MzIgcmVzdWx0ID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJIGJlZ2luIik7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRFNJLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFByb3BlcnRpZXMsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBHZXQgdGhlIG9iamVjdCB0eXBlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA1LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBzd2l0Y2goIHJlc3VsdCApIHsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgMiAoQUFDIExvdyBDb21wbGV4aXR5KSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMDsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgNSAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbikgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDA7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAvKiBBdWRpbyBPYmplY3QgVHlwZSBpcyAyOSAoUGFyYW1ldHJpYyBTdGVyZW8pICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAxOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoInBhcnNlX0FBQ19EU0kgRVJST1IgOiBvYmplY3QgdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJpbnZhbGlkIEFBQyBvYmplY3QgdHlwZSIsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBQcm9wZXJ0aWVzLT5hQXVkaW9PYmplY3RUeXBlID0gKE00T1NBX0ludDMyKXJlc3VsdDsKLQotICAgIC8vIEdldCB0aGUgZnJlcXVlbmN5IGluZGV4Ci0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA0LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoMCA8PSByZXN1bHQpICYmIChGUkVRX1RBQkxFX1NJWkUgPiByZXN1bHQpLAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBQcm9wZXJ0aWVzLT5hU2FtcEZyZXEgPSBBRF9BQUNfRlJFUV9UQUJMRVtyZXN1bHRdOwotICAgIHBQcm9wZXJ0aWVzLT5hRXh0ZW5zaW9uU2FtcEZyZXEgPSAwOwotCi0gICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzKHBEU0ksIGRzaVNpemUsIDQsICZyZXN1bHQsICZvZmZzZXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIHBQcm9wZXJ0aWVzLT5hTnVtQ2hhbiA9IChNNE9TQV9VSW50MzIpcmVzdWx0OwotCi0gICAgLy8gU2V0IHRoZSBtYXggUENNIHNhbXBsZXMgcGVyIGNoYW5uZWwKLSAgICBwUHJvcGVydGllcy0+YU1heFBDTVNhbXBsZXNQZXJDaCA9IChwUHJvcGVydGllcy0+YVNCUlByZXNlbnQpID8gMjA0OCA6IDEwMjQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveShNNEFEX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFN0b3AgdGhlIGdyYXBoCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci5nZXQoKSApIHsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+c3RvcCgpOwotICAgIH0KLQotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclNvdXJjZS5jbGVhcigpOwotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuY2xlYXIoKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotCi0gICAgU0FGRV9GUkVFKHBEZWNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IDogRE9ORSIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgOiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9Db250ZXh0KiBwQ29udGV4dCwgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgdm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBBQUNfREVDX1NUUkVBTV9QUk9QUyBhYWNQcm9wZXJ0aWVzOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBkZWNvZGVyTWV0YURhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSBiZWdpbjogZGVjb2RlclR5cGUgJWQiLCBkZWNvZGVyVHlwZSk7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRGVjb2RlckNvbnRleHQsIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJBdWRpb0RlY29kZXIiKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IHBTdHJlYW1IYW5kbGVyOwotCi0gICAgcERlY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzID0gMDsKLSAgICBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNE5PX0VSUk9SOwotICAgIHBEZWNvZGVyQ29udGV4dC0+dGltZVN0YW1wTXMgPSAtMTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgOiBtYXhBVVNpemUgJWQiLAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZGVjb2RlcgotICAgIGRlY29kZXJNZXRhRGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJOQjoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0gICAgICAgICAgICAvLyBFbmdpbmUgcGFyYW1ldGVycwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDE2MDsKLSAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlCi0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPSAyOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFNUldCOgotICAgICAgICAgICAgLy8gU3RhZ2VGcmlnaHQgcGFyYW1ldGVycwotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKLQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDE2MDsKLSAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlCi0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPSAyOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gMTYwMDA7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVBQUM6Ci0gICAgICAgICAgICAvLyBSZWplY3QgQURUUyAmIEFESUYgKG9yIGFueSBpbmNvcnJlY3QgdHlwZSkKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09Ci0gICAgICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlLE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0KLSAgICAgICAgICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9FU0RTSW5mb1NpemUpOwotCi0gICAgICAgICAgICAvLyBFbmdpbmUgcGFyYW1ldGVycwotICAgICAgICAgICAgLy8gUmV0cmlldmUgc2FtcGxpbmcgZnJlcXVlbmN5IGFuZCBudW1iZXIgb2YgY2hhbm5lbHMgZnJvbSB0aGUgRFNJCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJKAotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQ4KilwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMuXAotICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICZhYWNQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoID0gMTAyNDsKLSAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlCi0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPSAyOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBhYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBhYWNQcm9wZXJ0aWVzLmFOdW1DaGFuOwotCi0gICAgICAgICAgICAvLyBDb3B5IHRoZSBzdHJlYW0gcHJvcGVydGllcyBpbnRvIHVzZXJkYXRhCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwVXNlckRhdGEgKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZhYWNQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoQUFDX0RFQ19TVFJFQU1fUFJPUFMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rVHlwZU1QMzoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiQXVkaW9EZWNvZGVyX29wZW4gOiBpbmNvcnJlY3QgaW5wdXQgZm9ybWF0IiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwKLSAgICAgICAgKGludDMyX3QpcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICBkZWNvZGVyTWV0YURhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsCi0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzKTsKLSAgICBkZWNvZGVyTWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgKGludDY0X3QpcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBkZWNvZGVyTWV0YURhdGEsICh2b2lkICopcERlY29kZXJDb250ZXh0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UuZ2V0KCksCi0gICAgICAgIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBwRGVjb2RlckNvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSNpZmRlZiBWSURFT0VESVRPUl9GT1JDRUNPREVDCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSNlbmRpZiAvKiBWSURFT0VESVRPUl9GT1JDRUNPREVDICovCi0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZShwRGVjb2RlckNvbnRleHQtPlwKLSAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgZGVjb2Rlck1ldGFEYXRhLCBmYWxzZSwgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclNvdXJjZSwgTlVMTCwKLSAgICAgICAgICAgIGNvZGVjRmxhZ3MpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci5nZXQoKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gR2V0IHRoZSBvdXRwdXQgY2hhbm5lbHMsIHRoZSBkZWNvZGVyIG1pZ2h0IG92ZXJ3cml0ZSB0aGUgaW5wdXQgbWV0YWRhdGEKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsCi0gICAgICAgICZwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogb3V0cHV0IGNoYW4gJWQiLAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBkZWNvZGVyCi0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgICpwQ29udGV4dCA9IHBEZWNvZGVyQ29udGV4dDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kocERlY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BQUMoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQUFDLCBwQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIscFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUk5CKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFNUk5CLCBwQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsIHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJXQihNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBTVJXQiwgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfTVAzKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZU1QMywgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKAotICAgICAgICBNNEFEX0NvbnRleHQgcENvbnRleHQsIE00QURfQnVmZmVyKiBwSW5wdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwSW5wdXRCdWZmZXIgKSB7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigoc2l6ZV90KXBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9JbnQ4KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgKHZvaWQgKilwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsIHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHBJbnB1dEJ1ZmZlci0+bV90aW1lU3RhbXBVcyk7Ci0gICAgfQotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIsIE00QURfQnVmZmVyKiBwT3VwdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLSAgICBpbnQ2NF90IGk2NFRtcCA9IDA7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE91cHV0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gUHJvY2VzcyB0aGUgcmV0dXJuZWQgZGF0YQotICAgIGlmKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIERlY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0KLSAgICBpZiggcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPT0KLSAgICAgICAgKE00T1NBX1VJbnQzMilwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzICkgewotICAgICAgICAvLyBKdXN0IGNvcHkgdGhlIFBDTXMKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICh2b2lkICopKCgoTTRPU0FfTWVtQWRkcjgpYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgfSBlbHNlIGlmKCBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA8Ci0gICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKLSAgICAgICAgLy8gVGhlIGRlY29kZXIgZm9yY2VzIHN0ZXJlbyBvdXRwdXQsIGRvd25zYW1wbGUKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAoTTRPU0FfVUludDMyKShidWZmZXItPnJhbmdlX2xlbmd0aCgpLzIpOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFJbiAgPSAoKE00T1NBX0ludDE2KilidWZmZXItPmRhdGEoKSkgKwotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhT3V0ID0gKE00T1NBX0ludDE2KilwT3VwdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YUVuZCA9IHBEYXRhSW4gKyBcCi0gICAgICAgICAgICAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKS9zaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICAgICAgd2hpbGUoIHBEYXRhSW4gPCBwRGF0YUVuZCApIHsKLSAgICAgICAgICAgICpwRGF0YU91dCA9ICpwRGF0YUluOwotICAgICAgICAgICAgcERhdGFJbis9MjsKLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgZGVjb2RlciBmb3JjZXMgbW9ubyBvdXRwdXQsIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlcgotICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwT3VwdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcChNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00QURfQnVmZmVyKiBwSW5wdXRCdWZmZXIsIE00QURfQnVmZmVyKiBwT3V0cHV0QnVmZmVyLAotICAgICAgICBNNE9TQV9Cb29sIGJKdW1wKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcysrOwotCi0gICAgLy8gUHVzaCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRGVjb2RlckNvbnRleHQsCi0gICAgICAgIHBJbnB1dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBSZWFkCi0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+cmVhZCgmb3V0cHV0QnVmZmVyLCBOVUxMKTsKLSAgICBpZiAoSU5GT19GT1JNQVRfQ0hBTkdFRCA9PSByZXN1bHQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXA6IEF1ZGlvIGRlY29kZXIgXAotICAgICAgICAgcmV0dXJuZWQgSU5GT19GT1JNQVRfQ0hBTkdFRCIpOwotICAgICAgICBDSEVDSyhvdXRwdXRCdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50OwotCi0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZjaGFubmVsQ291bnQpKTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXA6IHNhbXBsaW5nRnJlcSA9ICVkIiwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBjaGFubmVsQ250ID0gJWQiLCBjaGFubmVsQ291bnQpOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgKHVpbnQzMl90KXNhbXBsZVJhdGU7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID0KLSAgICAgICAgICh1aW50MzJfdCljaGFubmVsQ291bnQ7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgPSBjaGFubmVsQ291bnQ7Ci0KLSAgICAgICAgcmV0dXJuIE00V0FSX0lORk9fRk9STUFUX0NIQU5HRTsKLSAgICB9IGVsc2UgaWYgKEVSUk9SX0VORF9PRl9TVFJFQU0gPT0gcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBBdWRpbyBkZWNvZGVyIFwKLSAgICAgICAgIHJldHVybmVkIEVSUk9SX0VORF9PRl9TVFJFQU0iKTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfSBlbHNlIGlmIChPSyAhPSByZXN1bHQpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgdGhlIFBDTSBidWZmZXIKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKHBEZWNvZGVyQ29udGV4dCwKLSAgICAgICAgb3V0cHV0QnVmZmVyLCBwT3V0cHV0QnVmZmVyKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFZlcnNpb25JbmZvLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgPSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgPSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgPSBWSURFT0VESVRPUl9BVURJT19ERUNPREVSX1ZFUlNJT05fUkVWOwotICAgIHBWZXJzaW9uSW5mby0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldFZlcnNpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24oTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGJlZ2luIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX1VJbnQzMj4oTTRBRF9rT3B0aW9uSURfVXNlclBhcmFtKToKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlcnNldE9wdGlvbiBVc2VyUGFyYW0gaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2U6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gM2dwUmVhZGVySW50ZXJmYWNlIik7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1fcFJlYWRlciA9Ci0gICAgICAgICAgICAgKE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfQXVkaW9BVToKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlcnNldE9wdGlvbiBBdWRpb0FVIik7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPQotICAgICAgICAgICAgIChNNF9BY2Nlc3NVbml0ICopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiAgdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNE5PX0VSUk9SID09IGVycikgfHwgKChNNE9TQV9VSW50MzIpTTRFUlJfTk9UX0lNUExFTUVOVEVEID09IGVycikgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gZXJyb3IgMHglWCIsIGVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBiZWdpbjogb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZToKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9IHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKW9wdGlvblZhbHVlID0KLSAgICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVsczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5OgotICAgICAgICAgICAgKih1aW50MzJfdCAqKW9wdGlvblZhbHVlID0KLSAgICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1Q1RTOgotICAgICAgICAgICAgKih1aW50MzJfdCAqKW9wdGlvblZhbHVlID0gcERlY29kZXJDb250ZXh0LT50aW1lU3RhbXBNczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRGVjb2RlclR5cGUsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRGVjb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgYmVnaW4gJWQgMHgleCAweCV4IiwKLSAgICAgICAgZGVjb2RlclR5cGUsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBEZWNvZGVySW50ZXJmYWNlLCBNNEFEX0ludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyIik7Ci0KLSAgICAqcERlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0KLSAgICBzd2l0Y2goIGRlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJOQjoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFNUldCOgotICAgICAgICAgICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZUF1ZGlvRGVjID0KLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1SV0I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZUF1ZGlvRGVjID0KLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZU1QMzoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX01QMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZFQURfZ2V0SW50ZXJmYWNlIEVSUk9SOiB1bnN1cHBvcnRlZCB0eXBlICVkIiwgZGVjb2RlclR5cGUpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjICAgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95OwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZXNldEF1ZGlvRGVjICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0YXJ0QXVkaW9EZWMgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U3RlcEF1ZGlvRGVjICAgICAgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyA9Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb247Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FBQyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJURVNUOiBBQUMgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZUFBQywgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVEVTVDogQU1SIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBTVJOQiwgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1SV0IoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBTVJXQiwgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlTVAzLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTkxZjNlZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIEVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX0FVRElPRU5DT0RFUiIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotCi0vKioqIERFRklOSVRJT05TICoqKi8KLS8vIEZvcmNlIHVzaW5nIHNvZnR3YXJlIGVuY29kZXIgYXMgZW5naW5lIGRvZXMgbm90IHN1cHBvcnQgcHJlZmV0Y2gKLSNkZWZpbmUgVklERU9FRElUT1JfRk9SQ0VDT0RFQyBrU29mdHdhcmVDb2RlY3NPbmx5Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLXN0cnVjdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3A8VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3Qgc3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdHJ1Y3QgTWVkaWFCdWZmZXJDaGFpbiB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOwotICAgICAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbmV4dExpbms7Ci0gICAgICAgIH07Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotCi0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1MYXN0QnVmZmVyTGluazsKLSAgICAgICAgaW50MzJfdCBtTmJCdWZmZXI7Ci0gICAgICAgIFN0YXRlIG1TdGF0ZTsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1FbmNGb3JtYXQ7Ci0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUuCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlJiBvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYpOwotfTsKLQotc3A8VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlIik7Ci0gICAgc3A8VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U+IGFTb3VyY2UgPQotICAgICAgICBuZXcgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoZm9ybWF0KTsKLQotICAgIHJldHVybiBhU291cmNlOwotfQotCi1WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UoCi0gICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOgotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsoTlVMTCksCi0gICAgICAgIG1OYkJ1ZmZlcigwKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRW5jRm9ybWF0KGZvcm1hdCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UiKTsKLX0KLQotCi1WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIik7Ci0KLSAgICBpZiggU1RBUlRFRCA9PSBtU3RhdGUgKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCIpOwotCi0gICAgaWYoIENSRUFURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0IEVSUk9SIDogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AiKTsKLQotICAgIGlmKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIEVSUk9SOiBpbnZhbGlkIHN0YXRlICVkIiwKLSAgICAgICAgICAgIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0gICAgd2hpbGUoIG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICAgICAgZGVsZXRlIHRtcExpbms7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCA6ICVkIGJ1ZmZlciByZW1haW5lZCIsIGkpOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0Iik7Ci0gICAgcmV0dXJuIG1FbmNGb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyByZWFkT3B0aW9uczsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCIpOwotCi0gICAgaWYgKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpyZWFkIEVSUk9SIDogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpyZWFkIDogRU9TIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLSAgICAqYnVmZmVyID0gbUZpcnN0QnVmZmVyTGluay0+YnVmZmVyOwotCi0gICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwotICAgIGlmKCBOVUxMID09IG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIG1OYkJ1ZmZlci0tOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpyZWFkIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludDMyX3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIiKTsKLQotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5ld0xpbmsgPSBuZXcgTWVkaWFCdWZmZXJDaGFpbjsKLSAgICBuZXdMaW5rLT5idWZmZXIgPSBidWZmZXI7Ci0gICAgbmV3TGluay0+bmV4dExpbmsgPSBOVUxMOwotICAgIGlmKCBOVUxMICE9IG1MYXN0QnVmZmVyTGluayApIHsKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rLT5uZXh0TGluayA9IG5ld0xpbms7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgfQotICAgIG1MYXN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgbU5iQnVmZmVyKys7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIEVORCIpOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgYXVkaW8KLSAqICAgICAgICAgICBlbmNvZGVyIHNoZWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICAgICAgICBtRm9ybWF0OwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyogICAgICAgICAgICBtQ29kZWNQYXJhbXM7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICAgIG1EU0k7Ci0gICAgc3A8VmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U+IG1FbmNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50OwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICAgICAgICBtRW5jb2RlcjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0T3V0cHV0Q3RzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE91dHB1dEN0czsKLX0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dDsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvKTsKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IGJlZ2luOiBmb3JtYXQgJWQiLCBmb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQsIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlciIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCA9IGZvcm1hdDsKLQotICAgICpwQ29udGV4dCA9IHBFbmNvZGVyQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cChwRW5jb2RlckNvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQUFDKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0FBQywgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FNUk5CKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0FNUk5CLCBwQ29udGV4dCwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfTVAzKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa01QMywgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIGJlZ2luIik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcyk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdG9wKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci5jbGVhcigpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5kaXNjb25uZWN0KCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIkF1ZGlvRW5jb2Rlcl9jbG9zZTpJTiAlZCBmcmFtZXMsT1VUICVkIGZyYW1lcyBmcm9tICVsbGQgdG8gJWxsZCIsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzLCBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cywKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyk7Ci0KLSAgICBpZiggcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAhPSBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2U6c29tZSBmcmFtZXMgd2VyZSBub3QgZW5jb2RlZCAlZCAlZCIsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLCBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBiZWdpbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgKnBQYXJhbXMsIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAqcERTSSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCBwR3JhYmJlckNvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgc3A8TWV0YURhdGE+IGVuY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogbWltZSA9IE5VTEw7Ci0gICAgaW50MzJfdCBpTmJDaGFubmVsID0gMDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIGJlZ2luIik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFBhcmFtcywgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRFNJLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwRFNJLT5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcERTSS0+aW5mb1NpemUgPSAwOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9IC0xOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgID0gLTE7Ci0KLSAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiA6IHBhcmFtcyBGPSVkIENOPSVkIEJSPSVkIEY9JWQiLAotICAgICAgICBwUGFyYW1zLT5GcmVxdWVuY3ksIHBQYXJhbXMtPkNoYW5uZWxOdW0sIHBQYXJhbXMtPkJpdHJhdGUsCi0gICAgICAgIHBQYXJhbXMtPkZvcm1hdCk7Ci0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMsIE00RU5DT0RFUl9BdWRpb1BhcmFtcywgMSwKLSAgICAgICAgIlZJREVPRURJVE9SIENvZGVjUGFyYW1zIik7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyZXF1ZW5jeSAgPSBwUGFyYW1zLT5GcmVxdWVuY3k7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkNoYW5uZWxOdW0gPSBwUGFyYW1zLT5DaGFubmVsTnVtOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlICAgID0gcFBhcmFtcy0+Qml0cmF0ZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICAgICA9IHBQYXJhbXMtPkZvcm1hdDsKLQotICAgIC8vIENoZWNrIG91dHB1dCBmb3JtYXQgY29uc2lzdGVuY3kKLSAgICBWSURFT0VESVRPUl9DSEVDSyhwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ID09Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgLy8gQ3JlYXRlIHRoZSBtZXRhIGRhdGEgZm9yIHRoZSBlbmNvZGVyCi0gICAgZW5jb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FBQzoKLSAgICAgICAgewotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgewotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiQXVkaW9FbmNvZGVyX29wZW4gOiBpbmNvcnJlY3QgaW5wdXQgZm9ybWF0IiwKLSAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJlcXVlbmN5KTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlCaXRSYXRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSk7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTW9ubzoKLSAgICAgICAgewotICAgICAgICAgICAgaU5iQ2hhbm5lbCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rU3RlcmVvOgotICAgICAgICB7Ci0gICAgICAgICAgICBpTmJDaGFubmVsID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiQXVkaW9FbmNvZGVyX29wZW4gOiBpbmNvcnJlY3QgY2hhbm5lbCBudW1iZXIiLAotICAgICAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgaU5iQ2hhbm5lbCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGVuY29kZXIgc291cmNlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGVuY29kZXJNZXRhZGF0YSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotICAgIC8vIEZJWE1FOgotICAgIC8vIFdlIGFyZSBtb3ZpbmcgYXdheSB0byB1c2Ugc29mdHdhcmUgQUFDRW5jb2RlciBhbmQgaW5zdGVhZCB1c2UgT01YLWJhc2VkCi0gICAgLy8gc29mdHdhcmUgQUFDIGF1ZGlvIGVuY29kZXIuIFdlIHdhbnQgdG8gdXNlIEFBQ0VuY29kZXIgZm9yIG5vdy4gQWZ0ZXIgd2UKLSAgICAvLyBmaXggdGhlIGludGVyZmFjZSBpc3N1ZSB3aXRoIHRoZSBPTVgtYmFzZWQgQUFDIGF1ZGlvIGVuY29kZXIsIHdlIHNob3VsZAotICAgIC8vIHRoZW4gc2V0IHRoZSBjb21wb25lbnQgbmFtZSBiYWNrIHRvIE5VTEwgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byBwaWNrIHVwCi0gICAgLy8gdGhlIHJpZ2h0IEFBQyBhdWRpbyBlbmNvZGVyLgotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmludGVyZmFjZSgpLCBlbmNvZGVyTWV0YWRhdGEsIHRydWUsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLCAiQUFDRW5jb2RlciIgLyogY29tcG9uZW50IG5hbWUgKi8sCi0gICAgICAgICAgICBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFN0YXJ0IHRoZSBncmFwaAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBHZXQgQUFDIERTSSwgdGhpcyBjb2RlIGNhbiBvbmx5IHdvcmsgd2l0aCBzb2Z0d2FyZSBlbmNvZGVyCi0gICAgaWYoIE00RU5DT0RFUl9rQUFDID09IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGludDMyX3QgICAgICBpc0NvZGVjQ29uZmlnID0gMDsKLSAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciAgICAgICAgPSBOVUxMOwotCi0gICAgICAgIC8vIFJlYWQgb25jZSB0byBnZXQgdGhlIERTSQotICAgICAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5yZWFkKCZidWZmZXIsIE5VTEwpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLAotICAgICAgICAgICAgJmlzQ29kZWNDb25maWcpICYmIGlzQ29kZWNDb25maWcsIE00RVJSX1NUQVRFKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBEU0kKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sIE00T1NBX0ludDgsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1EU0kuaW5mb1NpemUsICJFbmNvZGVyIGhlYWRlciIpOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbywKLSAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplKTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgKnBEU0kgPSBwRW5jb2RlckNvbnRleHQtPm1EU0k7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIDogRE9ORSIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZShwRW5jb2RlckNvbnRleHQpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBJbkJ1ZmZlcikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQ4KiBwRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkNoYW5uZWxOdW0gKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNb25vOgotICAgICAgICBjYXNlIE00RU5DT0RFUl9rU3RlcmVvOgotICAgICAgICAgICAgLy8gTGV0IHRoZSBNZWRpYUJ1ZmZlciBvd24gdGhlIGRhdGEgc28gd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIGl0Ci0gICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwSW5CdWZmZXItPnBUYWJsZUJ1ZmZlclNpemVbMF0pOwotICAgICAgICAgICAgcERhdGEgPSAoTTRPU0FfSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcERhdGEsICh2b2lkICopcEluQnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAgICAgcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZFQUVfcHJvY2Vzc0lucHV0QnVmZmVyIHVuc3VwcG9ydGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbiAlZCIsCi0gICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkNoYW5uZWxOdW0pOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIDogc3RvcmUgJWQgYnl0ZXMiLAotICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAvLyBQdXNoIHRoZSBidWZmZXIgdG8gdGhlIHNvdXJjZQotICAgIG5iQnVmZmVyID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoYnVmZmVyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTlVMTCAhPSBidWZmZXIgKSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIsIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcE91dEJ1ZmZlcikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgQ3RzID0gMDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBidWZmZXIsICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE91dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIEFVCi0gICAgaWYoIDAgPT0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSApIHsKLSAgICAgICAgLy8gRW5jb2RlciBoYXMgbm8gZGF0YSB5ZXQsIG5vdGhpbmcgdW51c3VhbAotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciA6IGJ1ZmZlciBpcyBlbXB0eSIpOwotICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBpZiggYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaTMyVG1wKSAmJiBpMzJUbXAgKSB7Ci0gICAgICAgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2l0aCBzb2Z0d2FyZSBlbmNvZGVyLAotICAgICAgICAgKiBEU0kgd2FzIHJldHJpZXZlZCBiZWZvcmVoYW5kICovCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9TVEFURSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIENUUwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZpNjRUbXApLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICBDdHMgPSAoTTRPU0FfSW50MzIpKGk2NFRtcC8xMDAwKTsKLQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotICAgICAgICBpZiggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKLQotICAgICAgICAvLyBGb3JtYXQgdGhlIEFVCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRCdWZmZXItPnBUYWJsZUJ1ZmZlclswXSwKLSAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgIHBPdXRCdWZmZXItPnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlcgotICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwSW5CdWZmZXIsIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcE91dEJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEluQnVmZmVyLCAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcysrOwotCi0gICAgLy8gUHVzaCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQscEluQnVmZmVyKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIFJlYWQKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5yZWFkKCZidWZmZXIsIE5VTEwpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUHJvdmlkZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgd3JpdGVyCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsIGJ1ZmZlciwKLSAgICAgICAgcE91dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uKiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uIGJlZ2luIG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uOiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZm9ybWF0LCBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRm9ybWF0LCAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBFbmNvZGVySW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSAweCV4IDB4JXgiLHBGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlKTsKLSAgICBTQUZFX01BTExPQygqcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIkF1ZGlvRW5jb2RlciIpOwotCi0gICAgKnBGb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBzd2l0Y2goIGZvcm1hdCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FBQzoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQU1STkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVAzOgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X01QMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2U6IHVuc3VwcG9ydGVkIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICAgICAgZm9ybWF0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsZWFuVXAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXA7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RPcGVuICAgICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2U7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdGVwICAgICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRW5jb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa0FBQywgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa0FNUk5CLCBwRm9ybWF0LCBwRW5jb2RlckludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMgbm8gZXJyb3IiKTsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00RU5DT0RFUl9rTVAzLCBwRm9ybWF0LCBwRW5jb2RlckludGVyZmFjZSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JCdWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWE3YjI4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckJ1ZmZlci5jCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQnVmZmVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI3VuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMIDEKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jZGVmaW5lIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFIDQwCi0KLSNkZWZpbmUgVklERU9FRElUT1JfU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gcCkgXAotICAgIHsgXAotICAgICAgICBmcmVlKHApOyBcCi0gICAgICAgIHAgPSBNNE9TQV9OVUxMOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpCi17Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sOwotICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogcHBvb2wgPSAlcCBuYkJ1ZmZlcnMgPSAlIiBQUkl1MzIsCi0gICAgICAgIHBwb29sLCBuYkJ1ZmZlcnMpOwotCi0gICAgcG9vbCA9IE00T1NBX05VTEw7Ci0gICAgcG9vbCA9IChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbCIpKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwb29sKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBidWZmZXJzIik7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIpKm5iQnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2FsbG9jYXRlUG9vbDogcE5YUEJ1ZmZlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXIpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iQnVmZmVyczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotICAgIHBvb2wtPnBvb2xOYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwb29sLT5wb29sTmFtZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbG5hbWUiKSk7Ci0gICAgaWYocG9vbC0+cG9vbE5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBc3NpZ25pbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotCi0gICAgbWVtc2V0KCh2b2lkICopcG9vbC0+cG9vbE5hbWUsIDAsVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUpOwotICAgIG1lbWNweSgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAodm9pZCAqKXBvb2xOYW1lLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRS0xKTsKLQotICAgIHBvb2wtPk5CID0gbmJCdWZmZXJzOwotCi1WSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA6Ci0gICAgaWYoTTROT19FUlJPUiAhPSBsZXJyKQotICAgIHsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbCk7Ci0gICAgfQotICAgICpwcG9vbCA9IHBvb2w7Ci0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgRU5EIik7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiAgaiA9IDA7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sIDogcHBvb2wgPSAlcCIsIHBwb29sKTsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgcHBvb2wtPk5COyBqKyspCi0gICAgewotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKTsKLSAgICAgICAgICAgIHBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBwb29sICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUocHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wtPnBvb2xOYW1lKTsKLSAgICAgICAgU0FGRV9GUkVFKHBwb29sKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICogICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLSAqIEBicmllZiAgIFJldHVybnMgYSBidWZmZXIgaW4gYSBnaXZlbiBzdGF0ZQotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wKLSAqIEBwYXJhbSAgIGRlc2lyZWRTdGF0ZSA6IElOIFRoZSBidWZmZXIgc3RhdGUKLSAqIEBwYXJhbSAgIHBOWFBCdWZmZXIgOiBJTiBUaGUgc2VsZWN0ZWQgYnVmZmVyCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX1VJbnQzMiBpLCBpYnVmOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgZnJvbSAlcyBpbiBzdGF0ZT0lZCIsCi0gICAgICAgIHBwb29sLT5wb29sTmFtZSwgZGVzaXJlZFN0YXRlKTsKLQotICAgIGlidWYgPSAwOwotCi0gICAgZm9yIChpPTA7IGkgPCBwcG9vbC0+TkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGJGb3VuZCA9IChwcG9vbC0+cE5YUEJ1ZmZlcltpXS5zdGF0ZSA9PSBkZXNpcmVkU3RhdGUpOwotICAgICAgICBpZiAoYkZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpYnVmID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIWJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyIE5vIGJ1ZmZlciBhdmFpbGFibGUgaW4gc3RhdGUgJWQiLAotICAgICAgICAgICAgZGVzaXJlZFN0YXRlKTsKLSAgICAgICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRTsKLSAgICB9Ci0KLSAgICAvKiBjYXNlIHdoZXJlIGEgYnVmZmVyIGhhcyBiZWVuIGZvdW5kICovCi0gICAgKnBOWFBCdWZmZXIgPSAmKHBwb29sLT5wTlhQQnVmZmVyW2lidWZdKTsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyOiBpZHggPSAlIiBQUkl1MzIsIGlidWYpOwotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfaW5pdFBvb2xCdWZmZXJzKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sLAotICAgIE00T1NBX1VJbnQzMiBsU2l6ZSkKLXsKLSAgICBNNE9TQV9FUlIgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyICBpbmRleCwgajsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwb29sICovCi0gICAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgbFNpemUsIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIkJVRkZFUl9pbml0UG9vbEJ1ZmZlcnM6IEJ1ZmZlciBkYXRhIikpOwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc2l6ZSA9IDA7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uaWR4ID0gaW5kZXg7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmJ1ZmZDVFMgPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wgKnBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotICAgIE00X01lZGlhVGltZSAgY2FuZGlkYXRlVGltZVN0YW1wID0gKE00X01lZGlhVGltZSkweDdmZmZmZmY7Ci0gICAgTTRPU0FfQm9vbCAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICpwTlhQQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleDwgcG9vbC0+TkI7IGluZGV4KyspCi0gICAgewotICAgICAgICBpZihwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zdGF0ZSA9PSBkZXNpcmVkU3RhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmJ1ZmZDVFMgPD0gY2FuZGlkYXRlVGltZVN0YW1wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wID0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUzsKLSAgICAgICAgICAgICAgICAgICAgKnBOWFBCdWZmZXIgPSAmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZihNNE9TQV9GQUxTRSA9PSBiRm91bmQpCi0gICAgewotICAgICAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlciBXQVJOSU5HIG5vIGJ1ZmZlciBhdmFpbGFibGUiKTsKLSAgICAgICAgZXJyID0gTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJlMGQwNWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBNUDMgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfTVAzUkVBREVSIgotCi0vKioKLSAqIEhFQURFUlMKLSAqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1wM1JlYWRlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotLyoqCi0gKiBTT1VSQ0UgQ0xBU1MKLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTRiBNUDMgcmVhZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzcDxEYXRhU291cmNlPiAgICAgICAgICAgICAgbURhdGFTb3VyY2U7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+ICAgICAgICAgIG1FeHRyYWN0b3I7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1NZWRpYVNvdXJjZTsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1NYXhEdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbVN0cmVhbU51bWJlcjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbVNlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1TZWVrVGltZTsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUV4dHJhY3RvckZsYWdzOwotfSBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIGJlZ2luIik7Ci0KLSAgICAvKiBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbiAqLwotICAgIFNBRkVfTUFMTE9DKHBSZWFkZXJDb250ZXh0LCBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uID0gMDsKLSAgICAqcENvbnRleHQgPSBwUmVhZGVyQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgTVAzIHJlYWRlcgotICogQG5vdGUgICAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgVGhlIGlucHV0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFNBRkVfRlJFRShwUmVhZGVyQ29udGV4dCk7Ci1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgTVAzIGZpbGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdG8gb3BlbgotCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSAgIHRoZSBtZWRpYSBpcyBEUk0gcHJvdGVjdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGJlZ2luIik7Ci0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2Ugc3RhcnQgJXMiLAotICAgICAgICAoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlbmQiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBzdGFydCIpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBlbmQiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvciA9PSBOVUxMKSAgICB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGV4dHJhY3RvciBlcnJvciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPSAwOwotCi0gICAgaW50MzJfdCBpc0RSTVByb3RlY3RlZCA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUlzRFJNLCAmaXNEUk1Qcm90ZWN0ZWQpOwotICAgIGlmIChpc0RSTVByb3RlY3RlZCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlcnJvciAtIERSTSBQcm90ZWN0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBjbG9zZXMgdGhlIE1QMyByZWFkZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGJlZ2luIik7Ci0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMuXAotICAgICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLmNsZWFyKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChPVVQpICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklkPSAlZCAiLChpbnQpb3B0aW9uSWQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJNcDNSZWFkZXIgZHVyYXRpb249JWxkIixwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICpwQml0cmF0ZSA9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZzoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZzoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbjogIE00RVJSX0JBRF9PUFRJT05fSUQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgYmVnaW46IG9wdGlvbklkOiAldSBWYWx1ZTogJXAgIiwKLSAgICAgICAgICBvcHRpb25JZCwgcFZhbHVlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyOgotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcihJTikgICBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgIChJL08pSU46dGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKXsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgdGltZSBtcyAlbGQgIiwgdGltZTY0KTsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICB0aW1lNjQgPSB0aW1lNjQgLyAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWlsbGkgc2VjICovCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhIGZpbGUKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhbmQgZmlsbGVkIHdpdGggc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX1VJbnQ4IHR5cGUsIHRlbXA7Ci0gICAgTTRPU0FfQm9vbCBoYXZlQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IE5VTEw7Ci0gICAgaW50NjRfdCBEdXJhdGlvbjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIGJlZ2luIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIHN0cmVhbSBudW1iZXIgPSAlZCIsCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPj0gMSkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYXggbnVtYmVyIG9mIHN0cmVhbSByZWFjaGVkIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPSBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciArIDE7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbnVtYmVyIG9mIFRyYWNrcyVkIiwKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCkpOwotICAgIGZvciAodGVtcCA9IDA7IHRlbXAgPCBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgdGVtcCsrKSB7Ci0gICAgICAgIG1ldGEgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0ZW1wKTsKLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UgPQotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRUcmFjayh0ZW1wKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVBdWRpbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWhhdmVBdWRpbykgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBubyBtb3JlIHN0cmVhbSAiKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvckZsYWdzID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZEdXJhdGlvbik7Ci0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKUR1cmF0aW9uLzEwMDA7Ci0KLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90Kikmc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSk7Ci0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAoaW50MzJfdCopJnN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBBTE9HVigiQml0cmF0ZSA9ICVkLCBTYW1wbGVSYXRlID0gJWQgZHVyYXRpb24gPSAlbGxkIiwKLSAgICAgICAgc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSxzdHJlYW1EZXNjLnRpbWVTY2FsZSxEdXJhdGlvbi8xMDAwKTsKLQotICAgIHN0cmVhbURlc2Muc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgc3RyZWFtRGVzYy5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBzdHJlYW1EZXNjLnN0cmVhbUlEID0gcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXI7Ci0gICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICBzdHJlYW1EZXNjLm1heEJpdHJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgLyogICAgQWxsb2NhdGUgdGhlIGF1ZGlvIHN0cmVhbSBoYW5kbGVyIGFuZCBzZXQgaXRzIHBhcmFtZXRlcnMgICAgKi8KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwgTTRSRUFERVJfTVAzLAotICAgICAgICAoTTRPU0FfQ2hhciopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS5jbGVhcigpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG1ldGEgaXMgTlVMTCIpOwotICAgIH0KLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBzdHJlYW1EZXNjLnRpbWVTY2FsZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsCi0gICAgICAgIChpbnQzMl90KikmcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzKTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDExNTI7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEgPSBOVUxMOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUJpdFJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplID0gMDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBzdGFydCAiKTsKLSAgICBpZihwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcil7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcEF1IHN0cnVjdHVyZSAqLwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCBpLmUgc2VlayBpdCB0byB0aGUgYmVnaW5uaW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBzdGFydCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyIChJTikgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAoSS9PKVBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgTTRFUlJfQUxMT0MgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgIE00V0FSX05PX01PUkVfQVUgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE1lZGlhQnVmZmVyICptQXVkaW9CdWZmZXI7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IHN0YXJ0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSk7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+cmVhZCgmbUF1ZGlvQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICBpZiAobUF1ZGlvQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICAocEF1LT5zaXplIDwgbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKLSAgICAgICAgICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gKE00T1NBX0ludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgKG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAzKSAmIH4weDMsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfTVAzLCAoTTRPU0FfQ2hhciopInBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzIiApOwotCi0gICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKW1BdWRpb0J1ZmZlci0+ZGF0YSgpICsgbUF1ZGlvQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgIG1BdWRpb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZwQXUtPkNUUyk7Ci0KLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLypjb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYyAqLwotICAgICAgICBwQXUtPkRUUyAgPSBwQXUtPkNUUzsKLSAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBNNFNZU19rRnJhZ0F0dHJPazsKLSAgICAgICAgbUF1ZGlvQnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBBVSBDVFMgPSAlbGQiLHBBdS0+Q1RTKTsKLQotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQ4KikgcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0RUUyA9IHBBdS0+RFRTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IEVPUyByZWFjaGVkLiIpOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotICAgIHBBdS0+bmJGcmFnID0gMDsKLQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBtQXVkaW9CdWZmZXIgPSBOVUxMOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgZW5kIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2U6IGJlZ2luIik7Ci0gICAgLyogSW5wdXQgcGFyYW1ldGVycyBjaGVjayAqLwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE1lZGlhVHlwZSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckdsb2JhbEludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gPQotICAgICAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCA9Ci0gICAgICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSA9IE00T1NBX05VTEw7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotfSAgLyogZXh0ZXJuICJDIiAqLwotfSAgLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjY0YTJlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU0ZfdXRpbHMiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyogQW5kcm9pZCBpbmNsdWRlcyovCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBERUJVRyBMRVZFTCBTRVRVUCAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTE9HMSBBTE9HRSAgICAvKkVSUk9SUyBMb2dnaW5nKi8KLSNkZWZpbmUgTE9HMiBBTE9HSSAgICAvKldBUk5JTkcgTG9nZ2luZyovCi0jZGVmaW5lIExPRzMgLy9BTE9HViAgLypDT01NRU5UUyBMb2dnaW5nKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSkgewotCi0gICAgY29uc3QgY2hhciogY2hhckRhdGE7Ci0gICAgaW50MzJfdCBpbnQzMkRhdGE7Ci0gICAgaW50NjRfdCBpbnQ2NERhdGE7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkKiBkYXRhOwotICAgIHZvaWQqIHB0cjsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNSU1FVHlwZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V2lkdGggJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SGVpZ2h0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlGcmFtZXNJbnRlcnZhbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTdHJpZGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTbGljZUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDaGFubmVsQ291bnQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVNhbXBsZVJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJpdFJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RVNEUyB0eXBlPSVkIHNpemU9JXp1IiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBVkNDIGRhdGE9MHglWCB0eXBlPSVkIHNpemU9JXp1IiwKLSAgICAgICAgICAgICooKHVuc2lnbmVkIGludCopZGF0YSksIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Vm9yYmlzSW5mbyB0eXBlPSVkIHNpemU9JXp1IiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Vm9yYmlzQm9va3MgdHlwZT0lZCBzaXplPSV6dSIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlXYW50c05BTEZyYWdtZW50cyAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzU3luY0ZyYW1lICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlJc0NvZGVjQ29uZmlnICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaW1lICVsbGQiLCBpbnQ2NERhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEdXJhdGlvbiwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEdXJhdGlvbiAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNvbG9yRm9ybWF0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRQb2ludGVyKGtLZXlQbGF0Zm9ybVByaXZhdGUsICZwdHIpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5UGxhdGZvcm1Qcml2YXRlIHBvaW50ZXI9JXAiLCBwdHIpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlEZWNvZGVyQ29tcG9uZW50ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCdWZmZXJJRCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlCdWZmZXJJRCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNYXhJbnB1dFNpemUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRodW1ibmFpbFRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QWxidW0sICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBcnRpc3QsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBcnRpc3QgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QWxidW1BcnRpc3QsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlDb21wb3NlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNvbXBvc2VyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUdlbnJlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5R2VucmUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5VGl0bGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaXRsZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlZZWFyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5WWVhciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBbGJ1bUFydCB0eXBlPSVkIHNpemU9JXp1IiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QWxidW1BcnRNSU1FICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUF1dGhvciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUF1dGhvciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q0RUcmFja051bWJlciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RGlzY051bWJlciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEYXRlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RGF0ZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlXcml0ZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlXcml0ZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaW1lU2NhbGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VmlkZW9Qcm9maWxlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9MZXZlbCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlWaWRlb0xldmVsICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleTY0Qml0RmlsZU9mZnNldCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUZpbGVUeXBlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRyYWNrVGltZVN0YXR1cyAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5UmVhbFRpbWVSZWNvcmRpbmcsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5UmVhbFRpbWVSZWNvcmRpbmcgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNvZGUgd2FzIGV4dHJhY3RlZCBmcm9tIFN0YWdlRnJpZ2h0IE1QRUc0IHdyaXRlcgotICogSXMgaXMgdXNlZCB0byBwYXJzZSBhbmQgZm9ybWF0IHRoZSBBVkMgY29kZWMgc3BlY2lmaWMgaW5mbyByZWNlaXZlZAotICogZnJvbSBTdGFnZUZyaWdodCBlbmNvZGVycwotICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCA9IDB4MDc7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCA9IDB4MDg7Ci1zdHJ1Y3QgQVZDUGFyYW1TZXQgewotICAgIEFWQ1BhcmFtU2V0KHVpbnQxNl90IGxlbmd0aCwgY29uc3QgdWludDhfdCAqZGF0YSkKLSAgICAgICAgOiBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHt9Ci0KLSAgICB1aW50MTZfdCBtTGVuZ3RoOwotICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOwotfTsKLXN0cnVjdCBBVkNDb2RlY1NwZWNpZmljQ29udGV4dCB7Ci0gICAgTGlzdDxBVkNQYXJhbVNldD4gbVNlcVBhcmFtU2V0czsKLSAgICBMaXN0PEFWQ1BhcmFtU2V0PiBtUGljUGFyYW1TZXRzOwotICAgIHVpbnQ4X3QgbVByb2ZpbGVJZGM7Ci0gICAgdWludDhfdCBtUHJvZmlsZUNvbXBhdGlibGU7Ci0gICAgdWludDhfdCBtTGV2ZWxJZGM7Ci19OwotCi1jb25zdCB1aW50OF90ICpwYXJzZVBhcmFtU2V0KEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0KiBwQywKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgaW50IHR5cGUsIHNpemVfdCAqcGFyYW1TZXRMZW4pIHsKLSAgICBDSEVDSyh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0IHx8Ci0gICAgICAgICAgdHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCk7Ci0KLSAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gbGVuZ3RoOwotICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICAmJgotICAgICAgICAgICAgbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgJmRhdGFbbGVuZ3RoIC0gYnl0ZXNMZWZ0XSwgNCkpIHsKLSAgICAgICAgLS1ieXRlc0xlZnQ7Ci0gICAgfQotICAgIGlmIChieXRlc0xlZnQgPD0gNCkgewotICAgICAgICBieXRlc0xlZnQgPSAwOyAvLyBMYXN0IHBhcmFtZXRlciBzZXQKLSAgICB9Ci0gICAgY29uc3QgdWludDhfdCAqbmV4dFN0YXJ0Q29kZSA9ICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF07Ci0gICAgKnBhcmFtU2V0TGVuID0gbmV4dFN0YXJ0Q29kZSAtIGRhdGE7Ci0gICAgaWYgKCpwYXJhbVNldExlbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJQYXJhbSBzZXQgaXMgbWFsZm9ybWVkLCBzaW5jZSBpdHMgbGVuZ3RoIGlzIDAiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQVZDUGFyYW1TZXQgcGFyYW1TZXQoKnBhcmFtU2V0TGVuLCBkYXRhKTsKLSAgICBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCkgewotICAgICAgICBpZiAoKnBhcmFtU2V0TGVuIDwgNCkgewotICAgICAgICAgICAgQUxPR0UoIlNlcSBwYXJhbWV0ZXIgc2V0IG1hbGZvcm1lZCIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDLT5tU2VxUGFyYW1TZXRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHBDLT5tUHJvZmlsZUlkYyA9IGRhdGFbMV07Ci0gICAgICAgICAgICBwQy0+bVByb2ZpbGVDb21wYXRpYmxlID0gZGF0YVsyXTsKLSAgICAgICAgICAgIHBDLT5tTGV2ZWxJZGMgPSBkYXRhWzNdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDLT5tUHJvZmlsZUlkYyAhPSBkYXRhWzFdIHx8Ci0gICAgICAgICAgICAgICAgcEMtPm1Qcm9maWxlQ29tcGF0aWJsZSAhPSBkYXRhWzJdIHx8Ci0gICAgICAgICAgICAgICAgcEMtPm1MZXZlbElkYyAhPSBkYXRhWzNdKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBwcm9maWxlL2xldmVsIGZvdW5kIGluIHNlcSBwYXJhbWV0ZXIgc2V0cyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5tU2VxUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEMtPm1QaWNQYXJhbVNldHMucHVzaF9iYWNrKHBhcmFtU2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5leHRTdGFydENvZGU7Ci19Ci0KLXN0YXR1c190IGJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEodWludDhfdCAqKnBPdXRwdXREYXRhLCBzaXplX3QgKnBPdXRwdXRTaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgTWV0YURhdGEgKnBhcmFtKQotewotICAgIC8vQUxPR1YoImJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEiKTsKLQotICAgIGlmICggKHBPdXRwdXREYXRhID09IE5VTEwpIHx8IChwT3V0cHV0U2l6ZSA9PSBOVUxMKSApIHsKLSAgICAgICAgQUxPR0UoIm91dHB1dCBpcyBpbnZhbGlkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKCpwT3V0cHV0RGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJBbHJlYWR5IGhhdmUgY29kZWMgc3BlY2lmaWMgZGF0YSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBEYXRhIGlzIGluIHRoZSBmb3JtIG9mIEFWQ0NvZGVjU3BlY2lmaWNEYXRhCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7Ci0gICAgICAgIC8vIDIgYnl0ZXMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGZpZWxkCi0gICAgICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKLSAgICAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgKnBPdXRwdXRTaXplID0gc2l6ZTsKLSAgICAgICAgKnBPdXRwdXREYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhzaXplKTsKLSAgICAgICAgbWVtY3B5KCpwT3V0cHV0RGF0YSwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBBVkNDb2RlY1NwZWNpZmljQ29udGV4dCBjdHg7Ci0gICAgdWludDhfdCAqb3V0cHV0RGF0YSA9IE5VTEw7Ci0gICAgc2l6ZV90IG91dHB1dFNpemUgPSAwOwotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGEgaXMgdmFsaWQKLSAgICB1aW50OF90IHR5cGUgPSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldDsKLSAgICBib29sIGdvdFNwcyA9IGZhbHNlOwotICAgIGJvb2wgZ290UHBzID0gZmFsc2U7Ci0gICAgY29uc3QgdWludDhfdCAqdG1wID0gZGF0YTsKLSAgICBjb25zdCB1aW50OF90ICpuZXh0U3RhcnRDb2RlID0gZGF0YTsKLSAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gc2l6ZTsKLSAgICBzaXplX3QgcGFyYW1TZXRMZW4gPSAwOwotICAgIG91dHB1dFNpemUgPSAwOwotICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICYmICFtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCB0bXAsIDQpKSB7Ci0gICAgICAgIHR5cGUgPSAoKih0bXAgKyA0KSkgJiAweDFGOwotICAgICAgICBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKGdvdFBwcykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJTUFMgbXVzdCBjb21lIGJlZm9yZSBQUFMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBnb3RTcHMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dFN0YXJ0Q29kZSA9IHBhcnNlUGFyYW1TZXQoJmN0eCwgdG1wICsgNCwgYnl0ZXNMZWZ0IC0gNCwgdHlwZSwKLSAgICAgICAgICAgICAgICAmcGFyYW1TZXRMZW4pOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpIHsKLSAgICAgICAgICAgIGlmICghZ290U3BzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFBwcykgewotICAgICAgICAgICAgICAgIGdvdFBwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiT25seSBTUFMgYW5kIFBQUyBOYWwgdW5pdHMgYXJlIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5leHRTdGFydENvZGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1vdmUgb24gdG8gZmluZCB0aGUgbmV4dCBwYXJhbWV0ZXIgc2V0Ci0gICAgICAgIGJ5dGVzTGVmdCAtPSBuZXh0U3RhcnRDb2RlIC0gdG1wOwotICAgICAgICB0bXAgPSBuZXh0U3RhcnRDb2RlOwotICAgICAgICBvdXRwdXRTaXplICs9ICgyICsgcGFyYW1TZXRMZW4pOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBzZXEgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5TZXFQYXJhbVNldHMgPSBjdHgubVNlcVBhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPiAweDFGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgc2VxIHBhcmFtZXRlciBzZXRzICglenUpIGZvdW5kIiwgblNlcVBhcmFtU2V0cyk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHBpYyBwYXJhbWV0ZXIgc2V0cwotICAgICAgICBzaXplX3QgblBpY1BhcmFtU2V0cyA9IGN0eC5tUGljUGFyYW1TZXRzLnNpemUoKTsKLSAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdW5kIG5vdCBmaW5kIHBpY3R1cmUgcGFyYW1ldGVyIHNldCIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoblBpY1BhcmFtU2V0cyA+IDB4RkYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBwaWMgcGFyYW1ldGVyIHNldHMgKCV6dSkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJU08gMTQ0OTYtMTU6IEFWQyBmaWxlIGZvcm1hdAotICAgIG91dHB1dFNpemUgKz0gNzsgIC8vIDcgbW9yZSBieXRlcyBpbiB0aGUgaGVhZGVyCi0gICAgb3V0cHV0RGF0YSA9ICh1aW50OF90ICopbWFsbG9jKG91dHB1dFNpemUpOwotICAgIHVpbnQ4X3QgKmhlYWRlciA9IG91dHB1dERhdGE7Ci0gICAgaGVhZGVyWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCi0gICAgaGVhZGVyWzFdID0gY3R4Lm1Qcm9maWxlSWRjOyAgICAgICAgICAgLy8gcHJvZmlsZSBpbmRpY2F0aW9uCi0gICAgaGVhZGVyWzJdID0gY3R4Lm1Qcm9maWxlQ29tcGF0aWJsZTsgICAgLy8gcHJvZmlsZSBjb21wYXRpYmlsaXR5Ci0gICAgaGVhZGVyWzNdID0gY3R4Lm1MZXZlbElkYzsKLQotICAgIC8vIDYtYml0ICcxMTExMTEnIGZvbGxvd2VkIGJ5IDItYml0IHRvIGxlbmd0aFNpemVNaW51dXNPbmUKLSAgICBpbnQzMl90IHVzZTJCeXRlTmFsTGVuZ3RoID0gMDsKLSAgICBpZiAocGFyYW0gJiYKLSAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5MkJ5dGVOYWxMZW5ndGgsICZ1c2UyQnl0ZU5hbExlbmd0aCkgJiYKLSAgICAgICAgdXNlMkJ5dGVOYWxMZW5ndGgpIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDE7ICAvLyBsZW5ndGggc2l6ZSA9PSAyIGJ5dGVzCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDM7ICAvLyBsZW5ndGggc2l6ZSA9PSA0IGJ5dGVzCi0gICAgfQotCi0gICAgLy8gMy1iaXQgJzExMScgZm9sbG93ZWQgYnkgNS1iaXQgbnVtU2VxdWVuY2VQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5TZXF1ZW5jZVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbNV0gPSAweGUwIHwgblNlcXVlbmNlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSA2OwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1TZXFQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tU2VxUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBzZXFQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBzZXFQYXJhbVNldExlbmd0aCA+PiA4OwotICAgICAgICBoZWFkZXJbMV0gPSBzZXFQYXJhbVNldExlbmd0aCAmIDB4ZmY7Ci0gICAgICAgIC8vQUxPR0UoIiMjIyBTUFMgJWQgJWQgJWQiLCBzZXFQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFNQUyBOQUwgdW5pdCAoc2VxdWVuY2UgcGFyYW1ldGVyIGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgc2VxUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBzZXFQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gOC1iaXQgblBpY3R1cmVQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5QaWN0dXJlUGFyYW1TZXRzID0gY3R4Lm1QaWNQYXJhbVNldHMuc2l6ZSgpOwotICAgIGhlYWRlclswXSA9IG5QaWN0dXJlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSAxOwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1QaWNQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tUGljUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCi0gICAgICAgIHVpbnQxNl90IHBpY1BhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7Ci0gICAgICAgIGhlYWRlclswXSA9IHBpY1BhcmFtU2V0TGVuZ3RoID4+IDg7Ci0gICAgICAgIGhlYWRlclsxXSA9IHBpY1BhcmFtU2V0TGVuZ3RoICYgMHhmZjsKLS8vQUxPR0UoIiMjIyBQUFMgJWQgJWQgJWQiLCBwaWNQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFBQUyBOYWwgdW5pdCAocGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgcGljUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBwaWNQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgKnBPdXRwdXRTaXplID0gb3V0cHV0U2l6ZTsKLSAgICAqcE91dHB1dERhdGEgPSBvdXRwdXREYXRhOwotICAgIHJldHVybiBPSzsKLX0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU5MTczMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9ERUNPREVSIgotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1BWF9ERUNfQlVGRkVSUyAxMAotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVkQnVmZmVyKTsKLQotY2xhc3MgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAotICAgICAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgcHJvdGVjdGVkIDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwotICAgICAgICBNZWRpYUJ1ZmZlciogbUJ1ZmZlcjsKLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cCogbUdyb3VwOwotICAgICAgICBNdXRleCBtTG9jazsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogbXBEZWNTaGVsbENvbnRleHQ7Ci0gICAgICAgIGludDMyX3QgbU1heEFVU2l6ZTsKLSAgICAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIG1Db2RlY1R5cGU7Ci0KLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCkgOgotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1CdWZmZXIoTlVMTCksCi0gICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgICBtQ29kZWNUeXBlKGNvZGVjVHlwZSkgewotICAgIG1wRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBkZWNvZGVyU2hlbGxDb250ZXh0OwotfQotCi1WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCA9PSB0cnVlKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdGFydCgKLSAgICAgICAgTWV0YURhdGEgKnBhcmFtcykgewotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBpZiAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtTWF4QVVTaXplKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGtLZXlNYXhJbnB1dFNpemUiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICAgICAgaWYgKG1Hcm91cCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkFUQUw6IG1lbW9yeSBsaW1pdGF0aW9uICEgIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtTWF4QVVTaXplKSk7Ci0KLSAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOgotICAgICAgICAgICAgLy8gV2h5IGRvIHdlIG5lZWQgdG8gY2hlY2sgb24gdGhlIHJlZiBjb3VudD8KLSAgICAgICAgICAgIGludCByZWZfY291bnQgPSBtQnVmZmVyLT5yZWZjb3VudCgpOwotICAgICAgICAgICAgQUxPR1YoIk1lZGlhQnVmZmVyIHJlZmNvdW50IGlzICVkIixyZWZfY291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZfY291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyKiogYnVmZmVyX291dCwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IHRpbWVfdXM7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICAgICAgb3B0aW9ucy0+Z2V0U2Vla1RvKCZ0aW1lX3VzLCAmbW9kZSk7Ci0gICAgICAgIGlmIChtb2RlICE9IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCByZWFkIG9wdGlvbnMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9FUlIgZXJyOwotICAgICAgICBNNE9TQV9JbnQzMiByYXBUaW1lID0gdGltZV91cyAvIDEwMDA7Ci0KLSAgICAgICAgLyotLS0gUmV0cmlldmUgdGhlIHByZXZpb3VzIFJBUCB0aW1lIC0tLSovCi0gICAgICAgIGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwtPm1fcEZjdEdldFByZXZSYXBUaW1lKAotICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgICAgICByYXBUaW1lIC09IDQwMDAwOwotICAgICAgICAgICAgaWYocmFwVGltZSA8IDApIHJhcFRpbWUgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImdldCByYXAgdGltZSBlcnJvciA9IDB4JXhcbiIsICh1aW50MzJfdCllcnIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopbXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImp1bXAgZXJyID0gMHgleFxuIiwgKHVpbnQzMl90KWVycik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKLSAgICBpZiAobGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gbGVycjsKLSAgICB9Ci0gICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7ICAvLyBjbGVhciBhbGwgdGhlIG1ldGEgZGF0YQotCi0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIC8vZ2V0TmV4dCBBVSBmcm9tIHJlYWRlci4KLSAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLSAgICAgICAgbGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgcEFjY2Vzc1VuaXQpOwotICAgICAgICBpZiAobGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCB8fCBsZXJyID09IE00V0FSX05PX01PUkVfQVUpIHsKLSAgICAgICAgICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jb3B5IHRoZSByZWFkZXIgQVUgYnVmZmVyIHRvIG1CdWZmZXIKLSAgICAgICAgTTRPU0FfVUludDMyIGxTaXplICA9IChwQWNjZXNzVW5pdC0+bV9zaXplID4gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplKVwKLSAgICAgICAgICAgID8gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplIDogcEFjY2Vzc1VuaXQtPm1fc2l6ZTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopbUJ1ZmZlci0+ZGF0YSgpLCh2b2lkICopcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBsU2l6ZSk7Ci0KLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGxTaXplKTsKLSAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IChpbnQ2NF90KSAocEFjY2Vzc1VuaXQtPm1fQ1RTICogMTAwMCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lVXMpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIEFVIHN0YXJ0IGNvZGUgZm9yIEgyNjQKLSAgICAgICAgaWYgKFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWMgPT0gbUNvZGVjVHlwZSkgewotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9KHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIGRhdGFbMF09MDsKLSAgICAgICAgICAgIGRhdGFbMV09MDsKLSAgICAgICAgICAgIGRhdGFbMl09MDsKLSAgICAgICAgICAgIGRhdGFbM109MTsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgKHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9PSAweDA0KT8gMSA6IDApOwotICAgICAgICAqYnVmZmVyX291dCA9IG1CdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LCBNNE9TQV9VSW50MzIgbmJfYml0cykgewotICAgIHJldHVybiAoTTRWRF9Ub29sc19HZXRCaXRzRnJvbU1lbW9yeSgoTTRWU19CaXRzdHJlYW1fY3R4dCopIHBhcnNpbmdDdHh0LAotICAgICAgICAgICAgbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLAotICAgICAgICBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplKSB7Ci0KLSAgICBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgPSAwOwotICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgICAgID0gMDsKLQotICAgIHBEY2ktPnVpVGltZVNjYWxlICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVByb2ZpbGUgICAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAwOwotICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcERjaS0+YlVzZU9mUlZMQyAgICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIFJlc2V0IHRoZSBiaXRzdHJlYW0gY29udGV4dCAqLwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gKE00T1NBX01lbUFkZHI4KSBwVm9sOwotCi0gICAgc3RhcnQgPSAoTTRPU0FfTWVtQWRkcjgpIHBWb2w7Ci0KLSAgICAvKiBTdGFydCBwYXJzaW5nICovCi0gICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPCBhVm9sU2l6ZSkgewotICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCw4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGUgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweDIwLi4weDJGIDogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAvKiBvbmx5IHJlY3Rhbmd1bGFyIGNhc2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlUaW1lU2NhbGUgPSBjb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlcyB0aW1lIGluY3JlbWVudCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGogICAgPSBjb2RlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgMzIpICYmIChqICE9IDApOyBqID4+PTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgdGltZV9pbmNyX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSB7IC8qIDEgPSBCaW5hcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7LyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBPQk1DIGRpc2FibGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9sX3ZlcmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNwcml0ZV9lbmFibGUgPT0gMSkgfHwgKHNwcml0ZV9lbmFibGUgPT0gMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2xfdmVyaWQgIT0gMSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2FkY3QgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcXVhbnQgcHJlY2lzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcHJlY2lzaW9uID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBsb2FkIG5vbiBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcmV2ZXJzaWJsZSBWTEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbmV3cHJlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmlsaXR5ID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBoaWVyYXJjaHkgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcmVmIGxheWVyIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZW5oYW5jZW1lbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiB1c2UgcmVmIHRleHR1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjAgOiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7LyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlQcm9maWxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEI1IDogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOyAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNyk7IC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSBlbmQgLS0tLS0gKi8KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVZVNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfVUludDggKmlueXV2LCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKSB7Ci0gICAgTTRWSUZJX1VJbnQ4IHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotICAgIE00VklGSV9VSW50OCAqb3V0eXV2ID0KLSAgICAgICAgKChNNFZJRklfVUludDgqKSYoUGxhbmVPdXRbMF0ucGFjX2RhdGFbUGxhbmVPdXRbMF0udV90b3BsZWZ0XSkpOwotICAgIGludDMyX3Qgd2lkdGggPSBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0ID0gUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsxXS5wYWNfZGF0YVtQbGFuZU91dFsxXS51X3RvcGxlZnRdKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsyXS5wYWNfZGF0YVtQbGFuZU91dFsyXS51X3RvcGxlZnRdKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweSgodm9pZCAqKW91dHksICh2b2lkICopaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci12b2lkIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyogZGVjb2RlcnMpIHsKLSAgICBWaWRlb0RlY29kZXIgKnBEZWNvZGVyOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpwT214Q29tcG9uZW50cyA9IE5VTEw7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOwotICAgIHBEZWNvZGVyID0gZGVjb2RlcnMtPmRlY29kZXI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IGRlY29kZXJzLT5kZWNvZGVyTnVtYmVyOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCBDb2RlY1slZF0gOiVkIiwgaSwgcERlY29kZXItPmNvZGVjKTsKLSAgICAgICAgcE9teENvbXBvbmVudHMgPSBwRGVjb2Rlci0+Y29tcG9uZW50OwotICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgIHBEZWNvZGVyLT5jb21wb25lbnROdW1iZXI7IGorKykgewotICAgICAgICAgICBwUHJvZmlsZUxldmVsID0gcE9teENvbXBvbmVudHMtPnByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgQUxPR1YoIi0tPmNvbXBvbmVudCAlZCIsIGopOwotICAgICAgICAgICBmb3Ioc2l6ZV90IGsgPSAwOyBrIDwgcE9teENvbXBvbmVudHMtPnByb2ZpbGVOdW1iZXI7IGsrKykgewotICAgICAgICAgICAgICAgQUxPR1YoIi0tPnByb2ZpbGU6JWxkIG1heExldmVsOiVsZCIsIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsKys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLX0KLQotTTRPU0FfRVJSIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzCi0gICAgKE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKLSAgICB9OwotCi0gICAgaW50MzJfdCBzdXBwb3J0Rm9ybWF0cyA9IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqcERlY29kZXJzOwotICAgIFZpZGVvRGVjb2RlciAqcERlY29kZXI7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKnBPbXhDb21wb25lbnRzID0gTlVMTDsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7Ci0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBTQUZFX01BTExPQyhwRGVjb2RlcnMsIE00REVDT0RFUl9WaWRlb0RlY29kZXJzLCAxLCAiVmlkZW9EZWNvZGVycyIpOwotICAgIFNBRkVfTUFMTE9DKHBEZWNvZGVyLCBWaWRlb0RlY29kZXIsIHN1cHBvcnRGb3JtYXRzLAotICAgICAgICAiVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJzLT5kZWNvZGVyID0gcERlY29kZXI7Ci0KLSAgICBwRGVjb2RlcnMtPmRlY29kZXJOdW1iZXI9IHN1cHBvcnRGb3JtYXRzOwotICAgIHN0YXR1cyA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgQ0hFQ0soc3RhdHVzID09IE9LKTsKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICAgICAgICAgICArK2spIHsKLSAgICAgICAgICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gcmVzdWx0czsKLSAgICAgICAgICAgIENIRUNLX0VRKFF1ZXJ5Q29kZWNzKGNsaWVudC5pbnRlcmZhY2UoKSwga01pbWVUeXBlc1trXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIHF1ZXJ5RGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgU0FGRV9NQUxMT0MocE9teENvbXBvbmVudHMsIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNpemUoKSwgIlZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIks9JWQiLGspOwotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb21wb25lbnQgPSBwT214Q29tcG9uZW50czsKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29tcG9uZW50TnVtYmVyID0gcmVzdWx0cy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgIGRlY29kZXIgJyVzJyBzdXBwb3J0cyAiLAotICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICAvLyBGSVhNRToKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgaWdub3JlIHRoZSBzb2Z0d2FyZSBjb2RlY3MgYW5kIG1ha2UgSXNTb2Z0d2FyZUNvZGVjKCkKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHB1YmljIEFQSSBmcm9tIE9NWENvZGVjLmNwcAotICAgICAgICAgICAgICAgIGlmIChJc1NvZnR3YXJlQ29kZWMocmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBzb2Z0d2FyZSBjb2RlYyAlcyIsIHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBzdXBwb3J0ZWQgcHJvZmlsZXMKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHNbal07Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCB0aGUgcHJvZmlsZXMgYXJlIG9yZGVyZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNBRkVfTUFMTE9DKHBQcm9maWxlTGV2ZWwsIFZpZGVvUHJvZmlsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyLCAiVmlkZW9Qcm9maWxlTGV2ZWwiKTsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZUxldmVsID0gcFByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZU51bWJlciA9IHByb2ZpbGVOdW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG1heCBMZXZlbCBmb3IgZWFjaCBwcm9maWxlLgotICAgICAgICAgICAgICAgIGludDMyX3QgbWF4TGV2ZWwgPSAtMTsKLSAgICAgICAgICAgICAgICBwcm9maWxlID0gLTE7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVsc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gLTEgJiYgbWF4TGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBwcm9maWxlTGV2ZWwubVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IHByb2ZpbGVMZXZlbC5tTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSA9IHByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwgPSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBwcm9maWxlOiAlbGQsIG1heCBsZXZlbDogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbC5tTGV2ZWwgPiBtYXhMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzsKLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBrTWltZVR5cGVzW2tdKSkKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29kZWMgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Mywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOwotCi0gICAgICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLQotICAgIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhwRGVjb2RlcnMpOwotICAgICpkZWNvZGVycyA9IHBEZWNvZGVyczsKLWNsZWFuVXA6Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE1ldGFEYXRhKiBtZXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgYm9vbCBzdWNjZXNzID0gT0s7Ci0gICAgaW50MzJfdCB3aWR0aCA9IDA7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSAwOwotICAgIGludDMyX3QgZnJhbWVTaXplID0gMDsKLSAgICBpbnQzMl90IHZXaWR0aCwgdkhlaWdodDsKLSAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIGJlZ2luIik7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2V2lkdGgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2SGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigidldpZHRoID0gJWQsIHZIZWlnaHQgPSAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA9IHZXaWR0aDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgPSB2SGVpZ2h0OwotCi0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSkgewotCi0gICAgICAgIGNyb3BMZWZ0ID0gY3JvcFRvcCA9IDA7Ci0gICAgICAgIGNyb3BSaWdodCA9IHZXaWR0aCAtIDE7Ci0gICAgICAgIGNyb3BCb3R0b20gPSB2SGVpZ2h0IC0gMTsKLQotICAgICAgICBBTE9HVigiZ290IGRpbWVuc2lvbnMgb25seSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgd2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgOiBXPSVkIEg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoMCAhPSB3aWR0aCkgJiYgKDAgIT0gaGVpZ2h0KSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKSAmJgotICAgICAgICAocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID09IFwKLSAgICAgICAgICAgICh1aW50MzJfdCl3aWR0aCkgJiYKLSAgICAgICAgKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCA9PSBcCi0gICAgICAgICAgICAodWludDMyX3QpaGVpZ2h0KSApIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byByZWNvbmZpZ3VyZQotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhICByZXNldDogVz0lZCBIPSVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgLy8gVXBkYXRlIHRoZSBzdHJlYW0gaGFuZGxlciBwYXJhbWV0ZXJzCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID0gd2lkdGg7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGZyYW1lU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wKLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSA6IHJlc2V0IHRoZSBidWZmZXIgcG9vbCIpOwotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBlcnIgPSAgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCgmcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgTUFYX0RFQ19CVUZGRVJTLCAoTTRPU0FfQ2hhciopIlZJREVPRURJVE9SX0RlY29kZWRCdWZmZXJQb29sIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2luaXRQb29sQnVmZmVycyhwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSArIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogMik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBjb2xvciBjb252ZXJ0ZXIKLSAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgIT0gTlVMTCApIHsKLSAgICAgICAgQUxPR1YoIiMjIyBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IDogcmVsZWFzaW5nIGRlY29kZXIiKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RvcCgpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmNsZWFyKCk7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgU0FGRV9GUkVFKHBEZWNTaGVsbENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwgTTRPU0FfVm9pZCAqcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgYm9vbCBzdWNjZXNzID0gVFJVRTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0gICAgaW50IGRlY29kZXJPdXRwdXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFN0cmVhbUhhbmRsZXIsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY1NoZWxsQ29udGV4dCwgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyID0KLSAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IHBBY2Nlc3NVbml0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbCA9IHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyID0gcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIHN3aXRjaCggcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOwotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFZPTCBoZWFkZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICZwRGVjU2hlbGxDb250ZXh0LT5tX0RjaSwgJnBEZWNTaGVsbENvbnRleHQtPm1fVmlkZW9TaXplKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzICAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYlJlbmRlcmVkRnJhbWVzICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdFJlbmRlcmVkQ3RzICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYk91dHB1dEZyYW1lcyAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCAgID0gTTRPU0FfTlVMTDsKLQotICAgIC8vIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gdmlkZW8gZnJhbWVzLgotICAgIENIRUNLKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID4gMCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBmYWxzZSwgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNvbG9yIGZvcm1hdAotICAgIHN1Y2Nlc3MgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICBrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBHZXQgdGhlIGNvbG9yIGNvbnZlcnRlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBuZXcgSTQyMENvbG9yQ29udmVydGVyOwotICAgIGlmIChwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGRlY29kZXJPdXRwdXQgPSBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5nZXREZWNvZGVyT3V0cHV0Rm9ybWF0KCk7Ci0gICAgfQotCi0gICAgaWYgKGRlY29kZXJPdXRwdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR0koImRlY29kZXIgb3V0cHV0IGZvcm1hdCA9IDB4JVhcbiIsIGRlY29kZXJPdXRwdXQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvU29mdHdhcmVEZWNvZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJlYWRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0LCBNNE9TQV9Wb2lkICpwVXNlckRhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBib29sIHN1Y2Nlc3MgPSBUUlVFOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFkYXRhID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNTaGVsbENvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9Ci0gICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwgPSBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICBzd2l0Y2goIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBWT0wgaGVhZGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmcERlY1NoZWxsQ29udGV4dC0+bV9EY2ksICZwRGVjU2hlbGxDb250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcyAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHZpZGVvIGZyYW1lcy4KLSAgICBpZihwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA+IDApewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRnJhbWVJbnRlcnZhbE1zID0KLSAgICAgICAgICAgIDEwMDAuMCAvIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAgQUxPR0koIlVzaW5nIHNvZnR3YXJlIGNvZGVjcyBvbmx5Iik7Ci0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgZmFsc2UsIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UsTlVMTCxPTVhDb2RlYzo6a1NvZnR3YXJlQ29kZWNzT25seSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBzdWNjZXNzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIqIHBOZXh0RnJhbWVDdHM7Ci0gICAgTTRPU0FfVUludDMyICpwbGFzdERlY29kZWRGcmFtZUN0czsKLSAgICBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsKiBwcm9maWxlOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERlY0NvbmZJbmZvOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbiBiZWdpbiIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUzoKLSAgICAgICAgICAgICBwbGFzdERlY29kZWRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKikgcFZhbHVlOwotICAgICAgICAgICAgICpwbGFzdERlY29kZWRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8gPSAoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZTsKLQotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21ham9yID0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01BSk9SOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21pbm9yPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1I7Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfUkVWSVNJT047Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmVyc2lvbkluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZToKLSAgICAgICAgICAgIC8qKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcFZpZGVvU2l6ZSA9IChNNERFQ09ERVJfVmlkZW9TaXplKilwVmFsdWU7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpV2lkdGgpKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpSGVpZ2h0KSk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uIDogVz0lZCBIPSVkIiwKLSAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGgsIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX05leHRSZW5kZXJlZEZyYW1lQ1RTOgotICAgICAgICAgICAgLyoqIEhvdyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbi4gU0YgZGVjb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoaXMuICoKLSAgICAgICAgICAgICoqIExldCB1cyBwcm92aWRlIGxhc3QgZGVjb2RlZCBmcmFtZSBDVFMgYXMgb2Ygbm93LiAqCi0gICAgICAgICAgICAqKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcE5leHRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKilwVmFsdWU7Ci0gICAgICAgICAgICAqcE5leHRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfTVBFRzRfa09wdGlvbklEX0RlY29kZXJDb25maWdJbmZvOgotICAgICAgICAgICAgaWYocERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID09IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjKSB7Ci0gICAgICAgICAgICAgICAgKCooTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKilwVmFsdWUpID0KLSAgICAgICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9EY2k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOiBlbmQgd2l0aCBlcnIgPSAweCV4IiwgbGVycik7Ci0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCAqcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24gYmVnaW4iKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcjogewotICAgICAgICAgICAgICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIHBPdXRwdXRGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRERUNPREVSX091dHB1dEZpbHRlciopIHBWYWx1ZTsKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUqKXBPdXRwdXRGaWx0ZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsdGVyRnVuY3Rpb247Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyVXNlckRhdGEgPQotICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsdGVyLT5tX3BGaWx0ZXJVc2VyRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjogZW5kIHdpdGggZXJyID0gMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRPU0FfQm9vbCBiSnVtcCwgTTRPU0FfVUludDMyIHRvbGVyYW5jZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIGludDY0X3QgbEZyYW1lVGltZTsKLSAgICBNZWRpYUJ1ZmZlciogcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhQnVmZmVyKiBwTmV4dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyU3RhdHVzOwotICAgIGJvb2wgbmVlZFNlZWsgPSBiSnVtcDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgYmVnaW4iKTsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TICkgewotICAgICAgICAvLyBEbyBub3QgY2FsbCByZWFkKCksIGl0IGNvdWxkIGxlYWQgdG8gYSBmcmVlemUKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSA6IEVPUyBhbHJlYWR5IHJlYWNoZWQiKTsKLSAgICAgICAgbGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICB9Ci0gICAgaWYocERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA+PSAqcFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9kZWNvZGU6IEFscmVhZHkgZGVjb2RlZCB1cCB0byB0aGlzIHRpbWUgQ1RTID0gJWxmLiIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTKTsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgIH0KLSAgICBpZihNNE9TQV9UUlVFID09IGJKdW1wKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU6IEp1bXAgY2FsbGVkIik7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzKXsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0KLSAgICB3aGlsZSAocERlY29kZXJCdWZmZXIgPT0gTlVMTCB8fCBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTICsgdG9sZXJhbmNlIDwgKnBUaW1lKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsIGZyYW1lQ1RTID0gJWxmLCBEZWNvZGVVcFRvID0gJWxmIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMsICpwVGltZSk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YWdlZnJpZ2h0IGRlY29kZXIKLSAgICAgICAgaWYgKG5lZWRTZWVrKSB7Ci0gICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGludDY0X3QgdGltZV91cyA9ICpwVGltZSAqIDEwMDA7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyh0aW1lX3VzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBlcnJTdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5yZWFkKCZwTmV4dEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgbmVlZFNlZWsgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyclN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnJlYWQoJnBOZXh0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBFT1MgYW5kIGZvcm1hdCBjaGFuZ2UKLSAgICAgICAgaWYgKGVyclN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBBTE9HVigiRW5kIG9mIHN0cmVhbSByZWFjaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAiKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGxlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgLy8gSWYgd2UgZGVjb2RlZCBhIGJ1ZmZlciBiZWZvcmUgRU9TLCB3ZSBzdGlsbCBuZWVkIHRvIHB1dCBpdAotICAgICAgICAgICAgLy8gaW50byB0aGUgcXVldWUuCi0gICAgICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgJiYgYkp1bXApIHsKLSAgICAgICAgICAgICAgICBjb3B5QnVmZmVyVG9RdWV1ZShwRGVjU2hlbGxDb250ZXh0LCBwRGVjb2RlckJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0gZWxzZSBpZiAoSU5GT19GT1JNQVRfQ0hBTkdFRCA9PSBlcnJTdGF0dXMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlIDogc291cmNlIHJldHVybnMgSU5GT19GT1JNQVRfQ0hBTkdFRCIpOwotICAgICAgICAgICAgbGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSgKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGxlcnIgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiEhISBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgRVJST1IgOiAiCi0gICAgICAgICAgICAgICAgICAgICJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIHJldHVybnMgMHglWCIsIGxlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIEVSUk9SOjB4JXgoJWQpIiwKLSAgICAgICAgICAgICAgICBlcnJTdGF0dXMsZXJyU3RhdHVzKTsKLSAgICAgICAgICAgIGxlcnIgPSBlcnJTdGF0dXM7Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgT01YQ29kZWMgY2xpZW50IHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSAwLWxlbmd0aCBidWZmZXJzCi0gICAgICAgIC8vIGFuZCBkcm9wIHRoZSAwLWxlbmd0aCBidWZmZXJzLgotICAgICAgICBpZiAocE5leHRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHBOZXh0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB3ZSBoYXZlIGEgZ29vZCBuZXh0IGJ1ZmZlciwgcmVsZWFzZSB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcERlY29kZXJCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IHBOZXh0QnVmZmVyOwotCi0gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZGVjb2RlZCBidWZmZXIKLSAgICAgICAgcERlY29kZXJCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZsRnJhbWVUaW1lKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IChNNF9NZWRpYVRpbWUpKGxGcmFtZVRpbWUvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsZGVjb2RlZCBmcmFtZXRpbWUgPSAlbGYsc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgIChNNF9NZWRpYVRpbWUpbEZyYW1lVGltZSwgcERlY29kZXJCdWZmZXItPnNpemUoKSApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSBhIGJ1ZmZlciBpZiBiSnVtcCA9PSBmYWxzZSB0byBhIHF1ZXVlLiBUaGVzZQotICAgICAgICAgKiBidWZmZXJzIGhhdmUgYSB0aW1lc3RhbXAgPj0gdGhlIHRhcmdldCB0aW1lLCAqcFRpbWUgKGZvciBpbnN0YW5jZSwKLSAgICAgICAgICogdGhlIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gdmlkZW9zLCBvciBhIHRyaW1taW5nIHBvc3Rpb24gaW5zaWRlCi0gICAgICAgICAqIG9uZSB2aWRlbyksIHNpbmNlIHRoZXkgYXJlIHBhcnQgb2YgdGhlIHRyYW5zaXRpb24gY2xpcCBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlby4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgKnBUaW1lIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYW55IG9mIHRoZSBleGlzdGluZwotICAgICAgICAgKiB2aWRlbyBmcmFtZXMsIHdlIHdvdWxkIGxpa2UgdG8gZ2V0IHRoZSBidWZmZXIgcmlnaHQgYmVmb3JlICpwVGltZQotICAgICAgICAgKiBhbmQgaW4gdGhlIHRyYW5zY29kaW5nIHBocmFzZSwgdGhpcyB2aWRlbyBmcmFtZSB3aWxsIGJlIGVuY29kZWQKLSAgICAgICAgICogYXMgYSBrZXkgZnJhbWUgYW5kIGJlY29tZXMgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIGZvciB0aGUgdHJhbnNpdGlvbiBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlbyB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgYnVmZmVyIG11c3QgYWxzbyBiZSBxdWV1ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqLwotICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVNcyA9Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyArCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyArCi0gICAgICAgICAgICAgICAgdG9sZXJhbmNlOwotICAgICAgICBpZiAoIWJKdW1wIHx8IHRhcmdldFRpbWVNcyA+ICpwVGltZSkgewotICAgICAgICAgICAgbGVyciA9IGNvcHlCdWZmZXJUb1F1ZXVlKHBEZWNTaGVsbENvbnRleHQsIHBEZWNvZGVyQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSAqcFRpbWU7Ci0KLVZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA6Ci0gICAgKnBUaW1lID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBwRGVjb2RlckJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTogZW5kIHdpdGggMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVyQnVmZmVyKSB7Ci0KLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogdG1wRGVjQnVmZmVyOwotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIHF1ZXVlCi0gICAgbGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eSwgJnRtcERlY0J1ZmZlcik7Ci0gICAgaWYgKGxlcnIgPT0gKE00T1NBX1VJbnQzMilNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFKSB7Ci0gICAgICAgIGxlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyKAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLCAmdG1wRGVjQnVmZmVyKTsKLSAgICAgICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHJldHVybiBsZXJyOwotCi0gICAgLy8gQ29sb3IgY29udmVydCBvciBjb3B5IGZyb20gdGhlIGdpdmVuIE1lZGlhQnVmZmVyIHRvIG91ciBidWZmZXIKLSAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Y29udmVydERlY29kZXJPdXRwdXRUb0k0MjAoCi0gICAgICAgICAgICAodWludDhfdCAqKXBEZWNvZGVyQnVmZmVyLT5kYXRhKCksLy8gPz8gKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksICAgLy8gZGVjb2RlckJpdHMKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoLCAgLy8gZGVjb2RlcldpZHRoCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQsICAvLyBkZWNvZGVySGVpZ2h0Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QsICAvLyBkZWNvZGVyUmVjdAotICAgICAgICAgICAgdG1wRGVjQnVmZmVyLT5wRGF0YSAvKiBkc3RCaXRzICovKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0RGVjb2Rlck91dHB1dFRvSTQyMCBmYWlsZWQiKTsKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBpbnQzMl90IHdpZHRoID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIGludDMyX3QgaGVpZ2h0ID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBpbnQzMl90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaW50MzJfdCB1dlBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0IC8gNDsKLSAgICAgICAgaW50MzJfdCBvZmZzZXRTcmMgPSAwOwotCi0gICAgICAgIGlmICgoIHdpZHRoID09IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICkgICYmCi0gICAgICAgICAgICAoIGhlaWdodCA9PSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmYgPSAoTTRPU0FfTWVtQWRkcjgpcERlY29kZXJCdWZmZXItPmRhdGEoKSArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopdG1wRGVjQnVmZmVyLT5wRGF0YSwgKHZvaWQgKilwVG1wQnVmZiwgeVBsYW5lU2l6ZSk7Ci0KLSAgICAgICAgICAgIG9mZnNldFNyYyArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodDsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUpLAotICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwotCi0gICAgICAgICAgICBvZmZzZXRTcmMgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDEpICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCA+PiAxKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUgKyB1dlBsYW5lU2l6ZSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikocFRtcEJ1ZmYgKyBvZmZzZXRTcmMpLCB1dlBsYW5lU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZiA9IChNNE9TQV9NZW1BZGRyOClwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmZEc3QgPSAoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgICAgIGludDMyX3QgaW5kZXg7Ci0KLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQ7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKCBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgLSBoZWlnaHQpKTsKLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQgPj4gMTsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wQnVmZkRzdCwgKHZvaWQgKilwVG1wQnVmZiwgd2lkdGggPj4gMSk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwVG1wQnVmZiArPSAoKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCAtIGhlaWdodCkpIC8gNCk7Ci0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0RlY29kZXJfZGVjb2RlOiB1bmV4cGVjdGVkIGNvbG9yIGZvcm1hdCAweCVYIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQpOwotICAgICAgICBsZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHRtcERlY0J1ZmZlci0+YnVmZkNUUyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkOwotICAgIHRtcERlY0J1ZmZlci0+c2l6ZSA9IHBEZWNvZGVyQnVmZmVyLT5zaXplKCk7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgbGluZGV4LCBpOwotICAgIE00T1NBX1VJbnQ4KiBwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lSW4sIHRtcFBsYW5lT3V0OwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHBUbXBWSURFT0VESVRPUkJ1ZmZlciwgKnBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIE00X01lZGlhVGltZSBjYW5kaWRhdGVUaW1lU3RhbXAgPSAtMTsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVGltZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRwdXRQbGFuZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIFRoZSBvdXRwdXQgYnVmZmVyIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICBpZiAoICgqcFRpbWUgPD0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09IGJGb3JjZVJlbmRlcikgKSB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9WSURFT19yZW5kZXIgRnJhbWUgaW4gdGhlIHBhc3QiKTsKLSAgICAgICAgZXJyID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9yZW5kZXI6IGxhc3RSZW5kZXJlZCB0aW1lID0gJWxmLHJlcXVlc3RlZCByZW5kZXIgdGltZSA9ICIKLSAgICAgICAgIiVsZiIsIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cywgKnBUaW1lKTsKLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGJ1ZmZlciBhcHByb3ByaWF0ZSBmb3IgcmVuZGVyaW5nLiAgKi8KLSAgICBmb3IgKGk9MDsgaSA8IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wtPk5COyBpKyspIHsKLSAgICAgICAgcFRtcFZJREVPRURJVE9SQnVmZmVyID0gJnBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2xcCi0gICAgICAgICAgICAtPnBOWFBCdWZmZXJbaV07Ci0gICAgICAgIGlmIChwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID09IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkKSB7Ci0gICAgICAgICAgICAvKiogRnJlZSBhbGwgdGhvc2UgYnVmZmVycyBvbGRlciB0aGFuIGxhc3QgcmVuZGVyZWQgZnJhbWUuICovCi0gICAgICAgICAgICBpZiAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTIDwgcERlY1NoZWxsQ29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBtX2xhc3RSZW5kZXJDdHMpIHsKLSAgICAgICAgICAgICAgICBwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqIEdldCB0aGUgYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgdGltZXN0YW1wICAqLwotICAgICAgICAgICAgaWYgKCAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTID49IHBEZWNTaGVsbENvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPD0gKnBUaW1lKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPiBjYW5kaWRhdGVUaW1lU3RhbXApKSB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwUmVuZGVyVklERU9FRElUT1JCdWZmZXIgPSBwVG1wVklERU9FRElUT1JCdWZmZXI7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wID0gcFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfcmVuZGVyOiBmb3VuZCBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCA9ICVsZiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKE00T1NBX0ZBTFNFID09IGJGb3VuZCkgewotICAgICAgICBlcnIgPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgMyBvdXB1dCAlZCAlZCAlZCAlZCIsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoLCBwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3RvcGxlZnQsIHBPdXRwdXRQbGFuZVswXS51X3N0cmlkZSk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSBjYW5kaWRhdGVUaW1lU3RhbXA7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgKSB7Ci0gICAgICAgIC8vIEZpbHRlcmluZyB3YXMgcmVxdWVzdGVkCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lWzNdOwotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIGNvbnZlcnNpb24KLSAgICAgICAgdG1wUGxhbmVbMF0udV93aWR0aCAgID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS51X2hlaWdodCAgPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICB0bXBQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVswXS51X3N0cmlkZSAgPSB0bXBQbGFuZVswXS51X3dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS5wYWNfZGF0YSAgPSAoTTRWSUZJX1VJbnQ4KilwUmVuZGVyVklERU9FRElUT1JCdWZmZXItPnBEYXRhOwotICAgICAgICB0bXBQbGFuZVsxXS51X3dpZHRoICAgPSB0bXBQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfaGVpZ2h0ICA9IHRtcFBsYW5lWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzBdLnVfc3RyaWRlLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnBhY19kYXRhICA9IHRtcFBsYW5lWzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICh0bXBQbGFuZVswXS51X3N0cmlkZSAqIHRtcFBsYW5lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgdG1wUGxhbmVbMl0udV93aWR0aCAgID0gdG1wUGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMl0udV9oZWlnaHQgID0gdG1wUGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzFdLnVfc3RyaWRlOwotICAgICAgICB0bXBQbGFuZVsyXS5wYWNfZGF0YSAgPSB0bXBQbGFuZVsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAodG1wUGxhbmVbMV0udV9zdHJpZGUgKiB0bXBQbGFuZVsxXS51X2hlaWdodCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciB3ID0gJWQgSCA9ICVkIiwKLSAgICAgICAgICAgIHRtcFBsYW5lWzBdLnVfd2lkdGgsdG1wUGxhbmVbMF0udV9oZWlnaHQpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIoTTRPU0FfTlVMTCwgJnRtcFBsYW5lWzBdLCBwT3V0cHV0UGxhbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEp1c3QgY29weSB0aGUgWVVWNDIwUCBidWZmZXIKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcEJ1ZmZQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlci0+cERhdGE7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wV2lkdGggPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgdGVtcFdpZHRoICogdGVtcEhlaWdodCk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICh0ZW1wV2lkdGggKiB0ZW1wSGVpZ2h0KTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICgodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcysrOwotICAgIGlmICggMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICkgewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgICpwVGltZSA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0czsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdENyZWF0ZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVzdHJveSAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0R2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RTZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlY29kZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0UmVuZGVyICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyOwotCi0gICAgKnBEZWNJbnRlcmZhY2UgPSAoTTRPU0FfQ29udGV4dClwRGVjb2RlckludGVyZmFjZTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLCBNNERFQ09ERVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0Q3JlYXRlICAgID0gVmlkZW9FZGl0b3JWaWRlb1NvZnR3YXJlRGVjb2Rlcl9jcmVhdGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlc3Ryb3kgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0LAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLQotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcygKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgcmV0dXJuIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzKGRlY29kZXJzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E3ZGI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9FTkNPREVSIgotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk1lZGlhQnVmZmVyUHVsbGVyLmgiCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRm9yY2UgdXNpbmcgaGFyZHdhcmUgZW5jb2RlcgotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtIYXJkd2FyZUNvZGVjc09ubHkKLQotI2lmICFkZWZpbmVkKFZJREVPRURJVE9SX0ZPUkNFQ09ERUMpCi0gICAgI2Vycm9yICJDYW5ub3QgZm9yY2UgRFNJIHJldHJpZXZhbCBpZiBjb2RlYyB0eXBlIGlzIG5vdCBmaXhlZCIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICZvcGVyYXRvcj0oCi0gICAgICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUxhc3RCdWZmZXJMaW5rOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtTmJCdWZmZXI7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Jc0VPUzsKLSAgICAgICAgU3RhdGUgICAgICAgICAgICAgbVN0YXRlOwotICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtRW5jRm9ybWF0OwotICAgICAgICBNdXRleCAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgbUJ1ZmZlckNvbmQ7Ci19OwotCi1zcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCkgewotCi0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGFTb3VyY2UgPQotICAgICAgICBuZXcgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoZm9ybWF0KTsKLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1Jc0VPUyhmYWxzZSksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoKSB7Ci0KLSAgICAvLyBTYWZldHkgY2xlYW4gdXAKLSAgICBpZiggU1RBUlRFRCA9PSBtU3RhdGUgKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydCgpIGJlZ2luIik7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIGJlZ2luIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBjaGFpbgotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0gICAgd2hpbGUoIG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICAgICAgZGVsZXRlIHRtcExpbms7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCA6ICVkIGJ1ZmZlciByZW1haW5lZCIsIGkpOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wKCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyByZWFkT3B0aW9uczsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZCgpIGJlZ2luIik7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMICYmICFtSXNFT1MpIHsKLSAgICAgICAgbUJ1ZmZlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gRW5kIG9mIHN0cmVhbT8KLSAgICBpZiAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMKSB7Ci0gICAgICAgICpidWZmZXIgPSBOVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQgOiBFT1MiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIGNoYWluCi0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLSAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0KLSAgICBpZiAoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIHRtcExpbms7Ci0gICAgbU5iQnVmZmVyLS07Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoKSBiZWdpbiIpOwotCi0gICAgaWYoIE5VTEwgPT0gYnVmZmVyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIDogcmVhY2hlZCBFT1MiKTsKLSAgICAgICAgbUlzRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgICAgIG5ld0xpbmstPmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgbmV3TGluay0+bmV4dExpbmsgPSBOVUxMOwotICAgICAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgICAgICBtTGFzdEJ1ZmZlckxpbmstPm5leHRMaW5rID0gbmV3TGluazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgICAgIG1OYkJ1ZmZlcisrOwotICAgIH0KLSAgICBtQnVmZmVyQ29uZC5zaWduYWwoKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgZW5kIik7Ci0gICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCB2aWRlbyBlbmNvZGVyCi0gKiAgICAgICAgICAgc2hlbGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIENSRUFURUQgICA9IDB4MSwKLSAgICBPUEVORUQgICAgPSAweDIsCi0gICAgU1RBUlRFRCAgID0gMHg0LAotICAgIEJVRkZFUklORyA9IDB4OCwKLSAgICBSRUFESU5HICAgPSAweDEwCi19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfU3RhdGUgICAgIG1TdGF0ZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgbVdyaXRlckRhdGFJbnRlcmZhY2U7Ci0gICAgTTRWUFBfYXBwbHlfZmN0KiAgICAgICAgICAgICAgICAgIG1QcmVQcm9jRnVuY3Rpb247Ci0gICAgTTRWUFBfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1QcmVQcm9jQ29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICAgbUFjY2Vzc1VuaXQ7Ci0gICAgTTRFTkNPREVSX1BhcmFtcyogICAgICAgICAgICAgICAgIG1Db2RlY1BhcmFtczsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICAgICAgICAgICAgICAgICAgbUhlYWRlcjsKLSAgICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QqICAgbUgyNjROQUxVUG9zdFByb2Nlc3NGY3Q7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICBtTGFzdENUUzsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gbUVuY29kZXJTb3VyY2U7Ci0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyOwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFICAgICAgICAgICAgICBtRW5jb2RlckNvbG9yRm9ybWF0OwotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiAgICAgICAgICAgICAgICBtUHVsbGVyOwotICAgIEk0MjBDb2xvckNvbnZlcnRlciogICAgICAgICAgICAgICBtSTQyMENvbG9yQ29udmVydGVyOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RJbnB1dEN0czsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotCi0gICAgTWVkaWFQcm9maWxlcyAqbVZpZGVvRWRpdG9yUHJvZmlsZTsKLSAgICBpbnQzMl90IG1NYXhQcmVmZXRjaEZyYW1lczsKLX0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0gICAgaW50MzJfdCBzdHJpZGUgPSAwOwotICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKLSAgICBpbnQzMl90IGZyYW1lcmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBpc0NvZGVjQ29uZmlnID0gMDsKLSAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0gICAgTWVkaWFCdWZmZXIqIGlucHV0QnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gZW5jb2RlclNvdXJjZSA9IE5VTEw7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBOVUxMOzsKLSAgICBPTVhDbGllbnQgY2xpZW50OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YURhdGEuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKG1ldGFEYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSAgICAvLyBWSURFT0VESVRPUl9GT1JDRUNPREVDIE1VU1QgYmUgZGVmaW5lZCBoZXJlCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSAgICBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIG1ldGFEYXRhLCB0cnVlLAotICAgICAgICBlbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8qKgotICAgICAqIFNlbmQgZmFrZSBmcmFtZXMgYW5kIHJldHJpZXZlIHRoZSBEU0kKLSAgICAgKi8KLSAgICAvLyBTZW5kIGEgZmFrZSBmcmFtZSB0byB0aGUgc291cmNlCi0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAgICAgJnN0cmlkZSk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAgICAgJmhlaWdodCk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lcmF0ZSk7Ci0gICAgc2l6ZSA9IChzaXplX3QpKHN0cmlkZSpoZWlnaHQqMykvMjsKLSAgICBpbnB1dEJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplKTsKLSAgICBpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAwKTsKLSAgICBuYkJ1ZmZlciA9IGVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGlucHV0QnVmZmVyKTsKLSAgICBlbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihOVUxMKTsgLy8gU2lnbmFsIEVPUwotCi0gICAgLy8gQ2FsbCByZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdGFydCgpOzsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5yZWFkKCZvdXRwdXRCdWZmZXIsIE5VTEwpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMID09IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAvLyBGb3IgSDI2NCwgZm9ybWF0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICh1aW50OF90KiopKCYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpKSwKLSAgICAgICAgICAgIChzaXplX3QqKSgmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKSksCi0gICAgICAgICAgICAoY29uc3QgdWludDhfdCopb3V0cHV0QnVmZmVyLT5kYXRhKCkgKyBvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgZW5jb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRm9yIE1QRUc0LCBqdXN0IGNvcHkgdGhlIERTSQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUsICJFbmNvZGVyIGhlYWRlciIpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwKLSAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkob3V0cHV0QnVmZmVyLT5kYXRhKCkpK291dHB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdG9wKCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLWNsZWFuVXA6Ci0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBpZiAoIGVuY29kZXIgIT0gTlVMTCApIHsgZW5jb2Rlci5jbGVhcigpOyB9Ci0gICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBpZiAoIGVuY29kZXJTb3VyY2UgIT0gTlVMTCApIHsgZW5jb2RlclNvdXJjZS5jbGVhcigpOyB9Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LCBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQgZW5jb2RlcklucHV0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IGJlZ2luOiBmb3JtYXQgICVkIiwgZm9ybWF0KTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFZQUGZjdCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWUFBjdHh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQ1JFQVRFRDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZSA9IHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbiA9IHBWUFBmY3Q7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0NvbnRleHQgPSBwVlBQY3R4dDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBOVUxMOwotCi0gICAgLy8gR2V0IGNvbG9yIGNvbnZlcnRlciBhbmQgZGV0ZXJtaW5lIGVuY29kZXIgaW5wdXQgZm9ybWF0Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gbmV3IEk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGVuY29kZXJJbnB1dCA9IHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0Rm9ybWF0KCk7Ci0gICAgfQotICAgIGlmIChlbmNvZGVySW5wdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZW5jb2RlcklucHV0OwotICAgIEFMT0dJKCJlbmNvZGVyIGlucHV0IGZvcm1hdCA9IDB4JVhcbiIsIGVuY29kZXJJbnB1dCk7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzKE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2MywgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rTVBFRzQsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2NCwgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT1BFTkVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcyk7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBDUkVBVEVEOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVLCBNNE9TQV9Wb2lkKiBwUGFyYW1zKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVOQ09ERVJfUGFyYW1zKiBwQ29kZWNQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaVByb2ZpbGUgPSAwOwotICAgIGludDMyX3QgaUxldmVsID0gMDsKLQotICAgIGludDMyX3QgaUZyYW1lUmF0ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiPj4+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBBVSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFBhcmFtcywgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcENvZGVjUGFyYW1zID0gKE00RU5DT0RFUl9QYXJhbXMqKXBQYXJhbXM7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29udGV4dCBpbml0aWFsaXphdGlvbgotICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQgPSBwQVU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tVmlkZW9FZGl0b3JQcm9maWxlID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1NYXhQcmVmZXRjaEZyYW1lcyA9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVZpZGVvRWRpdG9yUHJvZmlsZS0+Z2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZSgKLSAgICAgICAgIm1heFByZWZldGNoWVVWRnJhbWVzIik7Ci0KLSAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcywgTTRFTkNPREVSX1BhcmFtcywgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZvcm1hdCA9IHBDb2RlY1BhcmFtcy0+SW5wdXRGb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPklucHV0RnJhbWVXaWR0aCA9Ci0gICAgICAgIHBDb2RlY1BhcmFtcy0+SW5wdXRGcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0ID0KLSAgICAgICAgcENvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoID0gcENvZGVjUGFyYW1zLT5GcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCA9IHBDb2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUgPSBwQ29kZWNQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSA9IHBDb2RlY1BhcmFtcy0+RnJhbWVSYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPSBwQ29kZWNQYXJhbXMtPkZvcm1hdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlID0gcENvZGVjUGFyYW1zLT52aWRlb1Byb2ZpbGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw9IHBDb2RlY1BhcmFtcy0+dmlkZW9MZXZlbDsKLQotICAgIC8vIENoZWNrIG91dHB1dCBmb3JtYXQgY29uc2lzdGVuY3kgYW5kIHJlc29sdXRpb24KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCAgJSAxNiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCAlIDE2LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLQotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjYzOgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbiA6IGluY29ycmVjdCBpbnB1dCBmb3JtYXQiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaVByb2ZpbGUgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlOwotICAgIGlMZXZlbCA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb0xldmVsOwotICAgIEFMT0dWKCJFbmNvZGVyIG1pbWUgJXMgcHJvZmlsZSAlZCwgbGV2ZWwgJWQiLAotICAgICAgICBtaW1lLGlQcm9maWxlLCBpTGV2ZWwpOwotICAgIEFMT0dWKCJFbmNvZGVyIHcgJWQsIGggJWQsIGJpdHJhdGUgJWQsIGZwcyAlZCIsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlKTsKLSAgICBDSEVDSyhpUHJvZmlsZSAhPSAweDdmZmZmZmZmKTsKLSAgICBDSEVDSyhpTGV2ZWwgIT0gMHg3ZmZmZmZmZik7Ci0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGlQcm9maWxlKTsKLSAgICAvL0ZJWE1FOgotICAgIC8vIFRlbXA6IERvIG5vdCBzZXQgdGhlIGxldmVsIGZvciBNcGVnNCAvIEguMjYzIEVuYwotICAgIC8vIGFzIE9NWC5OdmlkaWEubXA0LmVuY29kZXIgYW5kIE9NWC5OdmlkaWEuaDI2My5lbmNvZGVyCi0gICAgLy8gcmV0dXJuIDB4ODAwMDEwMTkKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBNNEVOQ09ERVJfa0gyNjQpIHsKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgaUxldmVsKTsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlTdHJpZGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzogICAgaUZyYW1lUmF0ZSA9IDU7ICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6ICBpRnJhbWVSYXRlID0gODsgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOiAgIGlGcmFtZVJhdGUgPSAxMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMl81X0ZQUzogaUZyYW1lUmF0ZSA9IDEzOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzogICBpRnJhbWVSYXRlID0gMTU7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAgIGlGcmFtZVJhdGUgPSAyMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6ICAgaUZyYW1lUmF0ZSA9IDI1OyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzogICBpRnJhbWVSYXRlID0gMzA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOgotICAgICAgICAgICAgaUZyYW1lUmF0ZSA9IDMwOwotICAgICAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgc2V0IHRvIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOiBzZXQgdG8gMzAiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEU6Ci0gICAgICAgICAgICBpRnJhbWVSYXRlID0gMzA7Ci0gICAgICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFOiAgc2V0IHRvIDMwIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbjppbmNvcnJlY3QgZnJhbWVyYXRlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBpRnJhbWVSYXRlKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlCaXRSYXRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAxKTsKLQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQpOwotCi0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgIT0gTTRFTkNPREVSX2tIMjYzKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZW5jb2RlciBEU0kKLSAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJKHBFbmNvZGVyQ29udGV4dCwgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICBOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSNpZmRlZiBWSURFT0VESVRPUl9GT1JDRUNPREVDCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSNlbmRpZiAvKiBWSURFT0VESVRPUl9GT1JDRUNPREVDICovCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBuZXcgTWVkaWFCdWZmZXJQdWxsZXIoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIpOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNE9TQV9Cb29sIGJSZWFjaGVkRU9TKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwT3V0UGxhbmVbM107Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGJlZ2luOiBjdHMgICVmIiwgQ3RzKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGlmICggTTRPU0FfRkFMU0UgPT0gYlJlYWNoZWRFT1MgKSB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplWSA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoICoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemVVID0gc2l6ZVkgPj4gMjsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemUgID0gc2l6ZVkgKyAyKnNpemVVOwotICAgICAgICBNNE9TQV9VSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClzaXplKTsKLSAgICAgICAgcERhdGEgPSAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIHByZS1wcm9jZXNzaW5nCi0gICAgICAgIHBPdXRQbGFuZVswXS51X3dpZHRoICAgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfaGVpZ2h0ICA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfd2lkdGggICA9IHBPdXRQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X2hlaWdodCAgPSBwT3V0UGxhbmVbMF0udV9oZWlnaHQvMjsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV9zdHJpZGUvMjsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfd2lkdGggICA9IHBPdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBwT3V0UGxhbmVbMl0udV9oZWlnaHQgID0gcE91dFBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICBwT3V0UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfc3RyaWRlICA9IHBPdXRQbGFuZVsxXS51X3N0cmlkZTsKLQotICAgICAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBwRGF0YTsKLSAgICAgICAgcE91dFBsYW5lWzFdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWTsKLSAgICAgICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWSArIHNpemVVOwotCi0gICAgICAgIC8vIEFwcGx5IHByZS1wcm9jZXNzaW5nCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbigKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NDb250ZXh0LCBNNE9TQV9OVUxMLCBwT3V0UGxhbmUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAvLyBDb252ZXJ0IE1lZGlhQnVmZmVyIHRvIHRoZSBlbmNvZGVyIGlucHV0IGZvcm1hdCBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICAgICAgSTQyMENvbG9yQ29udmVydGVyKiBjb252ZXJ0ZXIgPSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2lkdGggPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0KLSAgICAgICAgICAgIGludCBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQ7Ci0gICAgICAgICAgICBBUmVjdCBlbmNvZGVyUmVjdDsKLSAgICAgICAgICAgIGludCBlbmNvZGVyQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0QnVmZmVySW5mbygKLSAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyV2lkdGgsICZlbmNvZGVySGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyUmVjdCwgJmVuY29kZXJCdWZmZXJTaXplKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGVuY29kZXJCdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXItPmNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhLCAgLy8gc3JjQml0cwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXJSZWN0LAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbmV3QnVmZmVyLT5kYXRhKCkgKyBuZXdCdWZmZXItPnJhbmdlX29mZnNldCgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG5ldyBidWZmZXIKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIG1ldGFkYXRhCi0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAoaW50NjRfdCkoQ3RzKjEwMDApKTsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIHRoZSBidWZmZXIgdG8gdGhlIHNvdXJjZSwgYSBOVUxMIGJ1ZmZlciwgbm90aWZpZXMgdGhlIHNvdXJjZSBvZiBFT1MKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlcnJvciAweCVYIiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTlVMTCAhPSBidWZmZXIgKSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwgTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBidWZmZXIsICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIEFVCi0gICAgaWYgKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09ICgoKGludHB0cl90KWJ1ZmZlci0+ZGF0YSgpKSU0KSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmdldCgpLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIGlmICggYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaTMyVG1wKSAmJiBpMzJUbXAgKXsKLSAgICAgICAgeyAgIC8vIERpc3BsYXkgdGhlIERTSQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRFNJICVkIiwKLSAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHRtcCA9ICh1aW50OF90KikoYnVmZmVyLT5kYXRhKCkpOwotICAgICAgICAgICAgZm9yKCB1aW50MzJfdCBpPTA7IGk8YnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsgaSsrICkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgWyVkXSAlLjJYIiwgaSwgdG1wW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotICAgICAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJbVFNfQ0hFQ0tdIFZJL0VOQyBXUklURSBmcmFtZSAlZCBAICVsbGQgLT4gJWQgKGxhc3QgJWQpIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzLCBpNjRUbXAsIEN0cywKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotICAgICAgICBpZiAoIEN0cyA8IHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgV0FSTklORyA6IEN0cyBpcyBnb2luZyAiCi0gICAgICAgICAgICAiYmFja3dhcmRzICVkIDwgJWQiLCBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIDogJWQgJWQiLAotICAgICAgICAgICAgQ3RzLCBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTKTsKLQotICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgQVUgY29udGFpbmVyCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBTdGFydEFVKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zdHJlYW0tPnN0cmVhbUlELAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgICAgIC8vIEZvcm1hdCB0aGUgQVUKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDw9IHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvLyBSZW1vdmUgSDI2NCBBVSBzdGFydCBjb2RlCi0gICAgICAgIGlmICggTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCApIHsKLSAgICAgICAgICAgIGlmICghbWVtY21wKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBcCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksICJceDAwXHgwMFx4MDBceDAxIiwgNCkgKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIDQsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKE00RU5DT0RFUl9rSDI2NCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0KSApIHsKLSAgICAgICAgLy8gSDI2NCB0cmltbWluZyBjYXNlLCBOQUxVIHBvc3QgcHJvY2Vzc2luZyBpcyBuZWVkZWQKLSAgICAgICAgTTRPU0FfSW50MzIgb3V0cHV0U2l6ZSA9IHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemU7Ci0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4LAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilidWZmZXItPmRhdGEoKStidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCopcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAmb3V0cHV0U2l6ZSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0gKE00T1NBX1VJbnQzMilvdXRwdXRTaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlIEFVIGNhbiBqdXN0IGJlIGNvcGllZAotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+XAotICAgICAgICAgICAgICAgIGRhdGFBZGRyZXNzLCAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPlwKLSAgICAgICAgICAgICAgICByYW5nZV9vZmZzZXQoKSksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCZpMzJUbXApICYmIGkzMlRtcCl7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMgPSBDdHM7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+RFRTID0gQ3RzOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyOiBBVSBAIDB4JVggMHglWCAlZCAlZCIsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICpwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5DVFMpOwotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBBVQotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zdHJlYW0tPnN0cmVhbUlELAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJblBsYW5lLCBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWYgJWQiLCBwSW5QbGFuZSwgQ3RzLCBGcmFtZU1vZGUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IEJVRkZFUklORzsKLSAgICB9Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0gICAgaWYgKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyApIHsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyA9IEN0czsKLSAgICB9Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdElucHV0Q3RzID0gQ3RzOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSAweCVYICVkICVmICglZCkiLCBwSW5QbGFuZSwgRnJhbWVNb2RlLAotICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgLy8gUHVzaCB0aGUgaW5wdXQgYnVmZmVyIHRvIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsIEN0cywKLSAgICAgICAgTTRPU0FfRkFMU0UpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gTm90aWZ5IHRoZSBzb3VyY2UgaW4gY2FzZSBvZiBFT1MKLSAgICBpZiAoIE00RU5DT0RFUl9rTGFzdEZyYW1lID09IEZyYW1lTW9kZSApIHsKLSAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LCAwLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi0gICAgaWYgKCBCVUZGRVJJTkcgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIC8vIFByZWZldGNoIGlzIGNvbXBsZXRlLCBzdGFydCByZWFkaW5nCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gUkVBRElORzsKLSAgICB9Ci0gICAgLy8gUmVhZAotICAgIHdoaWxlICgxKSAgewotICAgICAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQzMl90IFlVVkJ1ZmZlck51bWJlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPmdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKTsKLSAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIHByZWZldGNoIFlVViBmcmFtZXMgaXMKLSAgICAgICAgICAgICAqIG5vdCBleGNlZWRlZC4gVGhpcyBpcyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FnZSBvZiB2aWRlbyBlZGl0b3IgZW5naW5lLgotICAgICAgICAgICAgICogVGhlIHZhbHVlIG9mIG1heGltdW0gcHJlZmV0Y2ggWXV2IGZyYW1lcyBpcyBkZWZpbmVkIGluIG1lZGlhX3Byb2ZpbGVzLnhtbCAqLwotICAgICAgICAgICAgaWYgKChZVVZCdWZmZXJOdW1iZXIgPCBwRW5jb2RlckNvbnRleHQtPm1NYXhQcmVmZXRjaEZyYW1lcykgfHwKLSAgICAgICAgICAgICAgICAocEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5oYXNNZWRpYVNvdXJjZVJldHVybmVkRXJyb3IoKQotICAgICAgICAgICAgICAgICAgICA9PSB0cnVlKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUHJvdmlkZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+cHV0QnVmZmVyKG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICBlcnIgICAgICAgICAgICAgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgcmVzdWx0ICAgICAgICAgID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPUEVORUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgPSAtMS4wOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9IC0xOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgID0gLTE7Ci0KLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5zdGFydCgpOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IFNUQVJURUQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBvdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTZW5kIEVPUyBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlIHNvdXJjZSBkb2Vzbid0IGJsb2NrLgotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsIDAsCi0gICAgICAgIE00T1NBX1RSVUUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ1ZmZlcnMgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCAoQlVGRkVSSU5HIHwgUkVBRElORykgJiBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgd2hpbGUgKDEpICB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmdldEJ1ZmZlckJsb2NraW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgPT0gTlVMTCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LCBvdXRwdXRCdWZmZXIpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+cHV0QnVmZmVyKG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IFNUQVJURUQ7Ci0gICAgfQotCi0gICAgLy8gU3RvcCB0aGUgZ3JhcGggbW9kdWxlIGlmIG5lY2Vzc2FyeQotICAgIGlmICggU1RBUlRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5zdG9wKCk7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBPUEVORUQ7Ci0gICAgfQotCi0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpIHsKLSAgICAgICAgQUxPR1coIlNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQ6IGlucHV0KCVkKSAhPSBvdXRwdXQoJWQpIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMsIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3Agbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIEFMT0dXKCJyZWd1bEJpdFJhdGUgaXMgbm90IGltcGxlbWVudGVkIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIHN0YXJ0IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0cjoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QgPQotICAgICAgICAgICAgICAgIChIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9IMjY0UHJvY2Vzc05BTFVDb250ZXh0OgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0N0eCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0NvbnRleHQpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpbklkIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXI6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgKihNNEVOQ09ERVJfSGVhZGVyKiopb3B0aW9uVmFsdWUgPSAmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb246IHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRm9ybWF0LCAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBFbmNvZGVySW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSBiZWdpbiAweCV4IDB4JXggJWQiLCBwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci0KLSAgICBTQUZFX01BTExPQygqcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotCi0gICAgKnBGb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBzd2l0Y2goIGZvcm1hdCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9NUEVHNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0KLSAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSA6IHVuc3VwcG9ydGVkIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICAgICAgZm9ybWF0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RPcGVuICAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RhcnQgICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQ7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdG9wICAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UGF1c2UgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlc3VtZSAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsZWFudXAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXA7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RSZWd1bEJpdFJhdGUgPQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9yZWd1bEJpdFJhdGU7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RFbmNvZGUgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGU7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb247Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBFbmNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2MyhNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9rSDI2MywgcEZvcm1hdCwKLSAgICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9rTVBFRzQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjY0LCBwRm9ybWF0LAotICAgICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci0KLX0KLQotfSAgLy8gZXh0ZXJuICJDIgotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyZDIxMTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotI2luY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGZhOTc0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9maWx0ZXJzCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl92aWRlb2ZpbHRlcnMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMgXAotICAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgXAotICAgICAgTTRWSUZJX0NsaXAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYyBcCi0gICAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZGTF90cmFuc2l0aW9uLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE1ZTBiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uYwotICogQGJyaWVmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqIE9TQUwgKG1lbXNldCBhbmQgbWVtY3B5KSAqKiovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKSBhID0gKChhICYgMHhGRikgPDwgOCkgfCAoKGEgJiAweEZGMDApID4+IDgpCi0jZWxzZQotI2RlZmluZSBNNFZGTF9TV0FQX1NIT1JUKGEpCi0jZW5kaWYKLQotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotCi0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRkxfTW9kaWZMdW1QYXJhbSAqbHVtX3BhcmFtLCB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIHVuc2lnbmVkIGxvbmcgbGYxLCBsZjIsIGxmMzsKLSAgICBsb25nIGksIGo7Ci0KLSAgICBpZiAobHVtX3BhcmFtLT5jb3B5X2Nocm9tYSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29weSBjaHJvbWEgcGxhbmUgKi8KLQotICAgIH0KLQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIHN3aXRjaChsdW1fcGFyYW0tPmx1bV9mYWN0b3IpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgLyogdmVyeSBzcGVjaWZpYyBjYXNlIDogc2V0IGx1bWEgcGxhbmUgdG8gMTYgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsMTYsIHVfd2lkdGgpOwotICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMToKLSAgICAgICAgLyogMC4yNSAqLwotICAgICAgICBsZjEgPSA2OyBsZjIgPSA2OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIC8qIDAuMzc1ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgLyogMC41ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgLyogMC42MjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICAvKiAwLjc1ICovCi0gICAgICAgIGxmMSA9IDg7IGxmMiA9IDg7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMC44NzUgKi8KLSAgICAgICAgbGYxID0gOTsgbGYyID0gODsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGNoYXIgKnBfY3NyYywgKnBfY2Rlc3QsICpwX2NzcmNfbGluZSwgKnBfY2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICBsb25nIGksIGo7Ci0KLSAgICAvKiBjb3B5IG9yIGZpbHRlciBjaHJvbWEgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMV0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzFdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gcGxhbmVfaW5bMV0udV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfb3V0ID0gcGxhbmVfb3V0WzFdLnVfc3RyaWRlOwotICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMV0ucGFjX2RhdGFbcGxhbmVfb3V0WzFdLnVfdG9wbGVmdF07Ci0gICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMV0ucGFjX2RhdGFbcGxhbmVfaW5bMV0udV90b3BsZWZ0XTsKLQotICAgIGlmIChsdW1fZmFjdG9yID4gMjU2KQotICAgIHsKLSAgICAgICAgcF9jZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyYyA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICAvKiBjb3B5IGNocm9tYSAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdCwodm9pZCAqKSBwX2NzcmMsIHVfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2NzcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogZmlsdGVyIGNocm9tYSAqLwotICAgICAgICBwaXggPSAoMTAyNCAtIGx1bV9mYWN0b3IpIDw8IDc7Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMrKyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLSAqIEBicmllZiAgIEJsZW5kcyB0d28gWVVWIDQ6MjowIFBsYW5hciBpbWFnZXMuCi0gKiBAbm90ZSAgICBCbGVuZHMgWVVWNDIwIHBsYW5hciBpbWFnZXMsCi0gKiAgICAgICAgICBNYXAgdGhlIHZhbHVlIG9mIHByb2dyZXNzIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpCi0gKiAgICAgICAgICBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yLAotICogICAgICAgICAgICAgICAgICAxLiBmcm9tIDAgdG8gKFByb2dyZXNzIDw8IDEpICAgICAgICAgICAgO2ZvciBQcm9ncmVzcyA8PSA1MTIKLSAqICAgICAgICAgICAgICAgICAgMi4gZnJvbSAoKCBQcm9ncmVzcyAtIDUxMik8PCAxKSB0byAxMDI0IDtvdGhlcndpc2UKLSAqICAgICAgICAgIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyBieSB0aGUgZmFjdG9yLAotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UtMSkgLyAoaW1hZ2Ugd2lkdGgtMSkgIDtmb3Igd2lkdGggPj0gcmFuZ2UKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlKSAvIChpbWFnZSB3aWR0aCkgICAgICA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2goPSBpKSByb3cgb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaikgY29sdW1uIG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIG9uZSBVICYgViBzYW1wbGUgZnJvbSB0d28gaW5wdXQgWVVWNDoyOjAgaW1hZ2VzIGFuZAotICogICAgICAgICAgICAgICAgICBDb21wdXRlIGZvdXIgWSBzYW1wbGUgYW5kIG9uZSBVICYgViBzYW1wbGUgZm9yIG91dHB1dCBZVVY0OjI6MCBpbWFnZQotICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGZvbGxvd2luZywKLSAqICAgICAgICAgICAgICAgICAgT3V0KGksaikgPSBibGVuZGluZ2ZhY3RvcihpLGopICogSW4xKGksaikrIChsIC0gYmxlbmRpbmdmYWN0b3IoaSxqKSkgKkluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lSW4yOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyoqIFVzZWQgZm9yIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uICovCi0jaWZuZGVmIE1BWF9TSE9SVAotI2RlZmluZSBNQVhfU0hPUlQgICAweDEwMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0jZW5kaWYKLQotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLXsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDEsKnB1OF9kYXRhX1Vfc3RhcnQxLCpwdThfZGF0YV9WX3N0YXJ0MTsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDIsKnB1OF9kYXRhX1Vfc3RhcnQyLCpwdThfZGF0YV9WX3N0YXJ0MjsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDMsKnB1OF9kYXRhX1Vfc3RhcnQzLCpwdThfZGF0YV9WX3N0YXJ0MzsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MSwgKnB1OF9kYXRhX1lfbmV4dDEsICpwdThfZGF0YV9VMSwgKnB1OF9kYXRhX1YxOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQyLCAqcHU4X2RhdGFfWV9uZXh0MiwgKnB1OF9kYXRhX1UyLCAqcHU4X2RhdGFfVjI7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDMsKnB1OF9kYXRhX1lfbmV4dDMsICpwdThfZGF0YV9VMywgKnB1OF9kYXRhX1YzOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTEsIHUzMl9zdHJpZGUyX1kxLCB1MzJfc3RyaWRlX1UxLCB1MzJfc3RyaWRlX1YxOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTIsIHUzMl9zdHJpZGUyX1kyLCB1MzJfc3RyaWRlX1UyLCB1MzJfc3RyaWRlX1YyOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTMsIHUzMl9zdHJpZGUyX1kzLCB1MzJfc3RyaWRlX1UzLCB1MzJfc3RyaWRlX1YzOwotICAgIFVJbnQzMiAgIHUzMl9oZWlnaHQsICB1MzJfd2lkdGg7Ci0gICAgVUludDMyICAgdTMyX2JsZW5kZmFjdG9yLCB1MzJfc3RhcnRBLCB1MzJfZW5kQSwgdTMyX2JsZW5kX2luYywgdTMyX3hfYWNjdW07Ci0gICAgVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdywgdTMyX3JhbmdlQSwgdTMyX3Byb2dyZXNzOwotICAgIFVJbnQzMiAgIHUzMl9VMSx1MzJfVjEsdTMyX1UyLHUzMl9WMiwgdTMyX1kxLCB1MzJfWTI7Ci0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIGhlaWdodCBpcyBFVkVOIGFuZCBpbWFnZSBwbGFuZSBoZWlnaHRzIGFyZSBzYW1lICovCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluMVswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZUluMlswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjFbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjJbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIHdpZHRoIGlzIEVWRU4gYW5kIGltYWdlIHBsYW5lIHdpZHRocyBhcmUgc2FtZSAqLwotICAgIGlmKCAoSVNfRVZFTihwUGxhbmVJbjFbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVJbjJbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4xWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4yWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dDEgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQxID0gcFBsYW5lSW4xWzBdLnBhY19kYXRhICsgcFBsYW5lSW4xWzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MSA9IHBQbGFuZUluMVsxXS5wYWNfZGF0YSArIHBQbGFuZUluMVsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDEgPSBwUGxhbmVJbjFbMl0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0MiBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDIgPSBwUGxhbmVJbjJbMF0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQyID0gcFBsYW5lSW4yWzFdLnBhY19kYXRhICsgcFBsYW5lSW4yWzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MiA9IHBQbGFuZUluMlsyXS5wYWNfZGF0YSArIHBQbGFuZUluMlsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MyA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDMgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQzID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBpbnB1dDEgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMSA9IHBQbGFuZUluMVswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UxID0gcFBsYW5lSW4xWzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjEgPSBwUGxhbmVJbjFbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggaW5wdXQyIFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTIgPSBwUGxhbmVJbjJbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMiA9IHBQbGFuZUluMlsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YyID0gcFBsYW5lSW4yWzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIG91dHB1dCBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kzID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTMgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMyA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIHUzMl9zdHJpZGUyX1kxICAgPSB1MzJfc3RyaWRlX1kxIDw8IDE7Ci0gICAgdTMyX3N0cmlkZTJfWTIgICA9IHUzMl9zdHJpZGVfWTIgPDwgMTsKLSAgICB1MzJfc3RyaWRlMl9ZMyAgID0gdTMyX3N0cmlkZV9ZMyA8PCAxOwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgIHUzMl93aWR0aCAgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLQotICAgIC8qIFVzZXIgU3BlY2lmaWVkIFByb2dyZXNzIHZhbHVlICovCi0gICAgdTMyX3Byb2dyZXNzID0gUHJvZ3Jlc3M7Ci0KLSAgICAvKiBNYXAgUHJvZ3Jlc3MgdmFsdWUgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkgLT4gZm9yIG9wdGltaXNhdGlvbiAqLwotICAgIGlmKHUzMl9wcm9ncmVzcyA8IDEwMDApCi0gICAgICAgIHUzMl9wcm9ncmVzcyA9ICgodTMyX3Byb2dyZXNzIDw8IDEwKSAvIDEwMDApOwotICAgIGVsc2UKLSAgICAgICAgdTMyX3Byb2dyZXNzID0gMTAyNDsKLQotICAgIC8qIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IgKi8KLSAgICBpZih1MzJfcHJvZ3Jlc3MgPD0gNTEyKQotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9IDA7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAodTMyX3Byb2dyZXNzIDw8IDEpOwotICAgIH0KLSAgICBlbHNlIC8qIHUzMl9wcm9ncmVzcyA+IDUxMiAqLwotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9ICh1MzJfcHJvZ3Jlc3MgLSA1MTIpIDw8IDE7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAgMTAyNDsKLSAgICB9Ci0gICAgdTMyX3JhbmdlQSA9IHUzMl9lbmRBIC0gdTMyX3N0YXJ0QTsKLQotICAgIC8qIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyAqLwotICAgIGlmICgodTMyX3dpZHRoID49IHUzMl9yYW5nZUEpICYmICh1MzJfcmFuZ2VBID4gMCkgKQotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKCh1MzJfcmFuZ2VBLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGggLSAxKTsKLSAgICB9Ci0gICAgZWxzZSAvKiAodTMyX3dpZHRoIDwgdTMyX3JhbmdlQSkgfHwgKHUzMl9yYW5nZUEgPCAwKSAqLwotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKHUzMl9yYW5nZUEgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aCk7Ci0gICAgfQotCi0gICAgLyogVHdvIFlVVjQyMCByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBpbnB1dCBpbWFnZTEgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MSA9IHB1OF9kYXRhX1lfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9VMSA9IHB1OF9kYXRhX1Vfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9WMSA9IHB1OF9kYXRhX1Zfc3RhcnQxOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggaW5wdXQgaW1hZ2UyIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDIgPSBwdThfZGF0YV9ZX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVTIgPSBwdThfZGF0YV9VX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVjIgPSBwdThfZGF0YV9WX3N0YXJ0MjsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIG91dHB1dCBpbWFnZSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQzID0gcHU4X2RhdGFfWV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1UzID0gcHU4X2RhdGFfVV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1YzID0gcHU4X2RhdGFfVl9zdGFydDM7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93IGZvciBpbWFnZSBsdW1hIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDEgPSBwdThfZGF0YV9ZX2N1cnJlbnQxICsgdTMyX3N0cmlkZV9ZMTsKLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MiA9IHB1OF9kYXRhX1lfY3VycmVudDIgKyB1MzJfc3RyaWRlX1kyOwotICAgICAgICBwdThfZGF0YV9ZX25leHQzID0gcHU4X2RhdGFfWV9jdXJyZW50MyArIHUzMl9zdHJpZGVfWTM7Ci0KLSAgICAgICAgLyogSW5pdGlhbGlzZSBibGVuZGZhY3RvciAqLwotICAgICAgICB1MzJfYmxlbmRmYWN0b3IgICA9IHUzMl9zdGFydEE7Ci0gICAgICAgIC8qIEJsZW5kZmFjdG9yIEluY3JlbWVudCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeF9hY2N1bSA9IDA7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9jdXJyZW50MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgY2hyb21pbmFuY2UyIHZhbHVlICovCi0gICAgICAgICAgICB1MzJfVTEgPSAqcHU4X2RhdGFfVTErKzsKLSAgICAgICAgICAgIHUzMl9WMSA9ICpwdThfZGF0YV9WMSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX2N1cnJlbnQyKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBjaHJvbWluYW5jZTIgdmFsdWUgKi8KLSAgICAgICAgICAgIHUzMl9VMiA9ICpwdThfZGF0YV9VMisrOwotICAgICAgICAgICAgdTMyX1YyID0gKnB1OF9kYXRhX1YyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzKysgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBjaHJvbWEoVSkgdmFsdWUgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfVTMrKyAgICAgICAgICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9VMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfVTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgY2hyb21hKFYpIHZhbHVlIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1YzKysgICAgICAgICAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfVjIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1YxKSA+PiAxMCk7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSsxKSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX25leHQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX2N1cnJlbnQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9jdXJyZW50MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfY3VycmVudDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9uZXh0MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFdvcmtpbmcgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGp1c3QgYWZ0ZXIgZWFjaCBzdG9yYWdlICovCi0KLSAgICAgICAgfS8qIEVuZCBvZiByb3cgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIGlucHV0IGltYWdlMSBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDEgKz0gdTMyX3N0cmlkZTJfWTE7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQxICs9IHUzMl9zdHJpZGVfVTE7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQxICs9IHUzMl9zdHJpZGVfVjE7Ci0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBpbnB1dCBpbWFnZTIgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQyICs9IHUzMl9zdHJpZGUyX1kyOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1UyOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1YyOwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2Ygb3V0cHV0IGltYWdlIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MyArPSB1MzJfc3RyaWRlMl9ZMzsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDMgKz0gdTMyX3N0cmlkZV9VMzsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDMgKz0gdTMyX3N0cmlkZV9WMzsKLQotICAgIH0vKiBFbmQgb2YgY29sdW1uIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYwODc2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBDb2xvciBDb252ZXJzaW9uIEZpbHRlcgotICogICAgICAgICAgIC0jIENvbnRhaW5zIHRoZSBmb3JtYXQgY29udmVyc2lvbiBmaWx0ZXJzIGZyb20gQkdSNTY1IHRvIFlVVjQyMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBUcmFuc2Zvcm0gQkdSNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBCR1I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNFZJRklfVUludDggICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2JnciwgdTMyX3N0cmlkZV8yYmdyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2Jncm5fZGF0YSwgKnB1OF9iZ3JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9iZ3JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfYmdyID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMmJnciA9IHUzMl9zdHJpZGVfYmdyIDw8IDE7Ci0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X2Jncm4gPSBwdThfYmdybl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBCR1IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9iZ3JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMCwgdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjEwLCBpMzJfZzEwLCBpMzJfcjEwLCB1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDEsIHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjExLCBpMzJfZzExLCBpMzJfcjExLCB1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgQkdSIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9iZ3JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X2Jncm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMmJncjsKLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyOTBiMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9DbGlwLmMKLSAqIEBicmllZiAgICBNYW5hZ2VtZW50IG9mIHRoZSBSR0IgQ2xpcHBpbmcgbWF0cml4IGluY2x1c2lvbiBhbmQgRGl2aXNpb24gVGFibGUKLSAqIEBub3RlICAgICAtIyBDbGlwcGluZyBNYXRyaXggaXMgdXNlZCBpbiBvcmRlciB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIGluY2x1c2lvbiBvZgotICogICAgICAgICAgIHRoZSBleHRlcm5hbCBSR0IgQ2xpcHBpbmcgbWF0cml4IHVzZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCi0gKiAgICAgICAgICAgVGhpcyBmaWxlIEhBUyBUTyBCRSBjb21waWxlZCB3aXRoIGFsbCBjb2xvciBjb252ZXJzaW9uIGZpbHRlcnMgcHJvamVjdAotICogICAgICAgICAgIC0jIERpdmlzaW9uIHRhYmxlIGlzIHVzZWQgaW4gUkdCIHRvIEhMUyBjb2xvciBjb252ZXJzaW9uCi0gKiAgICAgICAgICAgSW1wb3J0YW50OiBUaGlzIGZpbGUgbXVzdCBiZSBjb21waWxlZCBkdXJpbmcgdGhlIGFzc2VtYmx5IGxpYnJhcnkgYnVpbGRpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgTTRWSUZJX0NsaXBUYWJsZVsxMjU2XQotPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0weDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsCi0weDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAotMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi0weDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAotMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywKLTB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCi0weDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAotMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwKLTB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsCi0weDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAotMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywKLTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsCi0weDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLAotMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwKLTB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCi0weDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLAotMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywKLTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCi0weGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLAotMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLTB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCi0weGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLAotMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywKLTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCi0weGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLAotMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKLTB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0weGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAotMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKCA2NTUzNS94ICk7IHggPSAwIHRvIDUxMiAqLwotQ05TVCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotQ05TVCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2UxWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsMHgwMDAwMDY0OSwweDAwMDAwZDBmLCAweDAwMDBEODZDLCAweDAwMDBEODNCLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwCi19OwotCi1DTlNUIE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLCAweDFCRjgwMCwgMHgwMDAwMDY0OSwgMHgwMDAwMGQwZiwgMHgxMTAxODAsIDB4NDBjZiwgMHgyMkJFMDAKLX07Ci0KLQotQ05TVCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgKk00VklGSV9DbGlwVGFibGVfemVybwotID0gJk00VklGSV9DbGlwVGFibGVbNTAwXTsKLQotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjYmQ1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiAoKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYgKChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMCxpMzJfZzAwLGkzMl9iMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjEwLGkzMl9nMTAsaTMyX2IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjExLGkzMl9nMTEsaTMyX2IxMSx1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg1YTJhNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm90bzoKLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci1QdXJwb3NlOiAgICBmaWxsaW5nIG9mIHRoZSBZVVY0MjAgcGxhbmUgZnJvbSBhIEJHUjI0IHBsYW5lCi1BYnN0cmFjdDogICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICAgICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gICAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzIGFuZAotICAgICAgICAgICAgICAgICAgICBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gICAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gICAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLQotSW46ICAgICAgICAgICAgUkdCMjQgcGxhbmUKLUluT3V0OiAgICAgICAgbm9uZQotT3V0OiAgICAgICAgYXJyYXkgb2YgMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi1Nb2RpZmllZDogICAgTUw6IFJHQiBmdW5jdGlvbiBtb2RpZmllZCB0byBCR1IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLFwKLSAgICAgICAgICAgICAgICAgICAgIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLQotICAgIC8qIHNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgICA9IFBsYW5lT3V0WzBdLnBhY19kYXRhICsgUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgICAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICAgID0gUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBidWZmZXIgKi8KLSAgICBwdThfcmdibl9kYXRhICAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgICA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICAgICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgICA9IHB1OF95X2RhdGE7Ci0gICAgICAgIHB1OF95cyAgICA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLQotICAgICAgICBwdThfdSAgICA9IHB1OF91X2RhdGE7Ci0gICAgICAgIHB1OF92ICAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgICAgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwICAgID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCAgICA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgICAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgICAvKiBtYXRyaXggbHVtaW5hbmNlICovCi0gICAgICAgICAgICBwdThfeW5bMF09IChNNFZJRklfVUludDgpaTMyX3kwMDsKLQotICAgICAgICAgICAgaTMyX3UxMCAgICA9IFUyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgICAgPSBWMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfeTEwICAgID0gWTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgcHU4X3luWzFdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgICAgPSBVMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxICAgID0gVjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3kwMSAgICA9IFkyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIHB1OF95c1swXT0gKE00VklGSV9VSW50OClpMzJfeTAxOwotCi0gICAgICAgICAgICBpMzJfdTExICAgID0gVTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSAgICA9IFYyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl95MTEgICAgPSBZMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgICpwdThfdSAgICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgICAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICBwdThfcmdibiAgICArPSAgKENTVF9SR0JfMjRfU0laRTw8MSk7Ci0gICAgICAgICAgICBwdThfeW4gICAgICAgICs9IDI7Ci0gICAgICAgICAgICBwdThfeXMgICAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTdlNGVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgUmVzaXplIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIEdlbmVyaWMgcmVzaXppbmcgb2YgUkdCNTY1IChQbGFuYXIpIGltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgUkdCNTY1IFBsYW5hciBwbGFuZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFJHQjU2NSAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfaW47Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY19ib3R0b207Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDIsIGkzMl9nMDIsIGkzMl9yMDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDMsIGkzMl9nMDMsIGkzMl9yMDM7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIGNvdW50X3RyYW5zPTA7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFJHQiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X2hlaWdodCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV9oZWlnaHQpID09IEZBTFNFKSkgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICBwdTE2X2RhdGFfaW4gICAgPSAoTTRWSUZJX1VJbnQxNiopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgIHB1MTZfZGF0YV9vdXQgICA9IChNNFZJRklfVUludDE2KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKSB7Ci0gICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikgewotICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkgewotICAgICAgICAvKgotICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25hbCBwYXJ0LCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKSB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLQotICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgIC8qCi0gICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudAotICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotCi0gICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgIHB1MTZfc3JjX3RvcCA9IHB1MTZfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0gICAgICAgICAgICBwdTE2X3NyY19ib3R0b20gPSBwdTE2X3NyY190b3AgKyAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMywoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfYm90dG9tWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLChNNFZJRklfVUludDE2KXB1MTZfc3JjX2JvdHRvbVsxXSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU29sdXRpb24gdG8gYXZvaWQgZ3JlZW4gZWZmZWN0cyBkdWUgdG8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBjb3VudF90cmFucyA9IDA7Ci0KLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYgKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAyID09IDAgJiYgaTMyX2cwMiA9PSA2MyAmJiBpMzJfcjAyID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMiA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDIgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDMgPT0gMCAmJiBpMzJfZzAzID09IDYzICYmIGkzMl9yMDMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAzID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMyA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudF90cmFucyA+IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBwaXhlbCBpcyB0cmFuc3BhcmVudCAqLwotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gNjM7Ci0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9nMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9nMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9ICAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9iMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9iMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnB1MTZfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDE2KSggKCgodTMyX0d0ZW1wX3ZhbHVlICYgMHgzOCkgPj4gMykgfCAodTMyX0J0ZW1wX3ZhbHVlIDw8IDMpKSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoKHUzMl9HdGVtcF92YWx1ZSAmIDB4NykgPDwgNSApIHwgdTMyX1J0ZW1wX3ZhbHVlKTw8OCApKTsKLQotICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLQotICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotCi0gICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgIHB1MTZfZGF0YV9pbiA9IHB1MTZfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGViOWQ0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBSZXNpemUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgR2VuZXJpYyByZXNpemluZyBvZiBZVVY0MjAgKFBsYW5hcikgaW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBwbGFuZS4KLSAqIEBub3RlICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSBVICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgWVVWIGluIHRoZSBvdXB1dCBwbGFuZQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMDsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAyLCBpMzJfZzAyLCBpMzJfcjAyOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfd2lkdGgpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLQotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gKE00VklGSV9VSW50OCopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSAoTTRWSUZJX1VJbnQ4KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNikqMzsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4pOwotICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgIGlmICgodTMyX3dpZHRoID09IDEpICYmICh1MzJfd2lkdGhfaW4gPT0gdTMyX3dpZHRoX291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQgaW5wdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlIGNvcm5lciBwaXhlbHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgd2lkdGggbm90IGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByb3cgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX3IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX3IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfZzAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfZzAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAgKE00VklGSV9VSW50OCkoKChpMzJfYjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfYjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfQnRlbXBfdmFsdWUgOwotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9HdGVtcF92YWx1ZSA7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX1J0ZW1wX3ZhbHVlIDsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotCi0gICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotICAgICAgICAgICAgLy9wdTE2X2RhdGFfb3V0ID0gcHUxNl9kYXRhX291dCArICh1MzJfc3RyaWRlX291dD4+MSkgLSAodTMyX3dpZHRoX291dCk7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqICh1MzJfc3RyaWRlX2luKSA7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQyZTgwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b0JHUjU2NS5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIENvbWJvIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIFJlc2l6ZXMgWVVWNDIwIGFuZCBjb252ZXJ0cyB0byBSR1I1NjUgd2l0aCByb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gQkdSNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoMl9SR0IgID0gcFBsYW5lT3V0LT51X3dpZHRoID4+IDE7Ci0gICAgdTMyX2hlaWdodDJfUkdCID0gcFBsYW5lT3V0LT51X2hlaWdodCA+PiAxOwotCi0gICAgdTMyX3N0cmlkZV9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDE7Ci0gICAgdTMyX3N0cmlkZTJfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAyOwotCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7IHUzMl9wbGFuZSA8IFBMQU5FUzsgdTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0gICAgfQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFkgUGxhbmUuICovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiAqLwotICAgIGlmICh1MzJfd2lkdGgyX1JHQiA+PSB1MzJfd2lkdGhfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0IpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgVSBhbmQgViBQbGFuZXMuICovCi0KLSAgICBpZiAodTMyX2hlaWdodDJfUkdCID49IHUzMl9oZWlnaHRfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgPSAodTMyX2hlaWdodF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0IpOwotICAgIH0KLQotICAgIHUzMl95X2luY1tWUGxhbmVdID0gdTMyX3lfaW5jW1VQbGFuZV07Ci0gICAgdTMyX3hfaW5jW1ZQbGFuZV0gPSB1MzJfeF9pbmNbVVBsYW5lXTsKLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZCBvbiB0aGUgMTYgaGlnaCBiaXRzLAotICAgICAgICAgICAgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IHUzMl95X2luY1tZUGxhbmVdICYgMHhmZmZmOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gdTMyX3lfaW5jW1VQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bV9ZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotICAgICAgICB1MzJfeV9hY2N1bV9ZID4+PSAxOwotICAgICAgICB1MzJfeV9hY2N1bV9VID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gMDsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luY1tZUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0KLSAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ID0gKE00VklGSV9VSW50MzIqKXB1OF9kYXRhX291dDsKLQotICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIDoKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKSB3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodF9vdXQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPSAyKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fWSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotICAgICAgICB1MzJfeF9hY2N1bV9VID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjX1kgPSAodTMyX3lfYWNjdW1fWSA+PiAxMikgJiAxNTsKLSAgICAgICAgdTMyX3lfZnJhY19VID0gKHUzMl95X2FjY3VtX1UgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgLyogUkdCIGN1cnJlbnQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfY3VycmVudCA9IHB1MzJfcmdiX2RhdGFfc3RhcnQgOwotCi0gICAgICAgIC8qIFJHQiBuZXh0IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX25leHQgICAgPSBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgKyAodTMyX3N0cmlkZTJfb3V0KTsKLQotICAgICAgICAvKiBZIFBsYW5lIG5leHQgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSBwdThfZGF0YV9pbltZUGxhbmVdOwotCi0gICAgICAgIHUzMl9yZ2JfdGVtcDMgPSB1MzJfeV9hY2N1bV9ZICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgaWYgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gIHB1OF9kYXRhX2luW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfcmdiX3RlbXAzICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICB1MzJfcmdiX3RlbXA0ID0gKHUzMl9yZ2JfdGVtcDMgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoX291dDsgdTMyX2NvbCAhPSAwOyB1MzJfY29sIC09IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogSW5wdXQgWSBwbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSW5wdXQgVSBQbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfVSA9IHB1OF9kYXRhX2luW1VQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9VID0gcHU4X3NyY190b3BfVSArIHUzMl9zdHJpZGVfaW5bVVBsYW5lXTsKLQotICAgICAgICAgICAgcHU4X3NyY190b3BfViA9IHB1OF9kYXRhX2luW1ZQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9WID0gcHU4X3NyY190b3BfViArIHUzMl9zdHJpZGVfaW5bVlBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBZIHBsYW5lICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1UgPSAodTMyX3hfYWNjdW1fVSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBVXzMyID0gKCgocHU4X3NyY190b3BfVVswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1VbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVVswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1VbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgVl8zMiA9ICgoKHB1OF9zcmNfdG9wX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9WWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpKyAocHU4X3NyY19ib3R0b21fVlswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1ZbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1UgKz0gKHUzMl94X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KSA7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICk+PjgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLSAgICAgICAgfSAgIC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSAgPSAgdTMyX3JnYl90ZW1wMyArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgKz0gKHUzMl95X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAvKiBZIHBsYW5lIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1kgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfeV9hY2N1bV9ZID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdOwotICAgICAgICB9Ci0gICAgICAgIC8qIFUgYW5kIFYgcGxhbmVzIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1UgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1VQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltVUGxhbmVdKTsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1ZQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVlBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltWUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIC8qIEJHUiBwb2ludGVyIFVwZGF0ZSAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRhOWQwNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBDb21ibyBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBSZXNpemVzIFlVVjQyMCBhbmQgY29udmVydHMgdG8gUkdSNTY1IHdpdGggcm90YXRpb24KLSAqIEBkYXRlCi0gKiAgICAgICAgICAgLSAyMDA0LzA4LzExOiBDcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KHZvaWQgKnBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gUkdCNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlICB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgIHUzMl93aWR0aDJfUkdCICA9IHBQbGFuZU91dC0+dV93aWR0aCA+PiAxOwotICAgIHUzMl9oZWlnaHQyX1JHQiA9IHBQbGFuZU91dC0+dV9oZWlnaHQgPj4gMTsKLSAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgIHUzMl9zdHJpZGVfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAxOwotICAgIHUzMl9zdHJpZGUyX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMjsKLQotICAgIGZvcih1MzJfcGxhbmUgPSAwOyB1MzJfcGxhbmUgPCBQTEFORVM7IHUzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotICAgIH0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiovCi0gICAgaWYgKHUzMl93aWR0aDJfUkdCID49IHUzMl93aWR0aF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQik7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBVIGFuZCBWIFBsYW5lcy4qLwotCi0gICAgaWYgKHUzMl9oZWlnaHQyX1JHQiA+PSB1MzJfaGVpZ2h0X2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gID0gKHUzMl9oZWlnaHRfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCKTsKLSAgICB9Ci0KLSAgICB1MzJfeV9pbmNbVlBsYW5lXSA9IHUzMl95X2luY1tVUGxhbmVdOwotICAgIHUzMl94X2luY1tWUGxhbmVdID0gdTMyX3hfaW5jW1VQbGFuZV07Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkIG9uIHRoZSAxNiBoaWdoIGJpdHMsCi0gICAgICAgIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtX1kgPSB1MzJfeV9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IHUzMl95X2luY1tVUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW1fWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA+Pj0gMTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IDA7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSAwOwotCi0gICAgfQotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLSAgICAvKiBJbnRpYWxpc2UgdGhlIFJHQiBwb2ludGVyICovCi0gICAgcHUzMl9yZ2JfZGF0YV9zdGFydCA9IChNNFZJRklfVUludDMyKilwdThfZGF0YV9vdXQ7Ci0KLSAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYSA6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYikgd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHRfb3V0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0gMikKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX1kgPSB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICAgICAgdTMyX3hfYWNjdW1fVSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhY19ZID0gKHUzMl95X2FjY3VtX1kgPj4gMTIpICYgMTU7Ci0gICAgICAgIHUzMl95X2ZyYWNfVSA9ICh1MzJfeV9hY2N1bV9VID4+IDEyKSAmIDE1OwotCi0gICAgICAgIC8qIFJHQiBjdXJyZW50IGxpbmUgUG9zaXRpb24gUG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgPSBwdTMyX3JnYl9kYXRhX3N0YXJ0IDsKLQotICAgICAgICAvKiBSR0IgbmV4dCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9uZXh0ICAgID0gcHUzMl9yZ2JfZGF0YV9jdXJyZW50ICsgKHUzMl9zdHJpZGUyX291dCk7Ci0KLSAgICAgICAgLyogWSBQbGFuZSBuZXh0IHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gcHU4X2RhdGFfaW5bWVBsYW5lXTsKLQotICAgICAgICB1MzJfcmdiX3RlbXAzID0gdTMyX3lfYWNjdW1fWSArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIGlmICh1MzJfcmdiX3RlbXAzID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9ICBwdThfZGF0YV9pbltZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfcmdiX3RlbXAzID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3JnYl90ZW1wMyAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3JnYl90ZW1wNCA9ICh1MzJfcmdiX3RlbXAzID4+IDEyKSAmIDE1OwotCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aF9vdXQ7IHUzMl9jb2wgIT0gMDsgdTMyX2NvbCAtPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFkgcGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFUgUGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1UgPSBwdThfZGF0YV9pbltVUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fVSA9IHB1OF9zcmNfdG9wX1UgKyB1MzJfc3RyaWRlX2luW1VQbGFuZV07Ci0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1YgPSBwdThfZGF0YV9pbltWUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fViA9IHB1OF9zcmNfdG9wX1YgKyB1MzJfc3RyaWRlX2luW1ZQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgWSBQbGFuZSAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBVIGFuZCBWIFBsYW5lcyAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19VID0gKHUzMl94X2FjY3VtX1UgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgVV8zMiA9ICgoKHB1OF9zcmNfdG9wX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9VWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9VWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFZfMzIgPSAoKChwdThfc3JjX3RvcF9WWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVlsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9WWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVlsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fVSArPSAodTMyX3hfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNikgOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKT4+OCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotICAgICAgICB9ICAgLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICB1MzJfeV9hY2N1bV9ZICA9ICB1MzJfcmdiX3RlbXAzICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSArPSAodTMyX3lfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgIC8qIFkgcGxhbmUgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fWSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9ICBwdThfZGF0YV9pbjFbWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl95X2FjY3VtX1kgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSkpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gcHU4X2RhdGFfaW4xW1lQbGFuZV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogVSBhbmQgViBwbGFuZXMgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fVSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVVBsYW5lXSA9ICBwdThfZGF0YV9pbltVUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1VQbGFuZV0pOwotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVlBsYW5lXSA9ICBwdThfZGF0YV9pbltWUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQubWsgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QwMGJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNSBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTczOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0JZVEVfQVJSQVlfT1VUUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0JZVEVfQVJSQVlfT1VUUFVUX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhY2N1bXVsYXRlcyB3cml0dGVuIGJ5dGVzIGludG8gYSBidWZmZXIuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEJ5dGVBcnJheU91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXQoKTsKKworICAgICAgICB2aXJ0dWFsIH5CeXRlQXJyYXlPdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIEJ5dGVBcnJheU91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhlIG51bWJlciBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQKKyAgICAgICAgICogYXJndW1lbnQgd2lsbCBiZSB3cml0dGVuLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZworICAgICAgICAgKiBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhpcyBCeXRlQXJyYXlPdXRwdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgY3VycmVudCBzaXplIG9mIHRoZSBhcnJheSBvZiBieXRlcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgcG9pbnRlciB0byBhcnJheSBvZiBieXRlcyB3cml0dGVuLiAgSXQgaXMgbm90IHZhbGlkIHRvIHVzZSB0aGlzIHBvaW50ZXIgaWYKKyAgICAgICAgICogb3Blbiwgd3JpdGUsIG9yIGNsb3NlIGlzIGNhbGxlZCBhZnRlciB0aGlzIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXJyYXkoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IG1CeXRlQXJyYXk7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODliMDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRE5HX1VUSUxTX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0ROR19VVElMU19ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKyNkZWZpbmUgTkVMRU1TKHgpICgoaW50KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpKQorCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGJ1aWxkaW5nIHZhbHVlcyBmb3IgdGhlIE9wY29kZUxpc3QgdGFncyBzcGVjaWZpZWQKKyAqIGluIHRoZSBBZG9iZSBETkcgMS40IHNwZWMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIE9wY29kZUxpc3RCdWlsZGVyIDogcHVibGljIExpZ2h0UmVmQmFzZTxPcGNvZGVMaXN0QnVpbGRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBDZmFMYXlvdXQgeworICAgICAgICAgICAgQ0ZBX1JHR0IgPSAwLAorICAgICAgICAgICAgQ0ZBX0dSQkcsCisgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9CR0dSLAorICAgICAgICB9OworCisgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CisgICAgICAgIHZpcnR1YWwgfk9wY29kZUxpc3RCdWlsZGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGlzIG9wY29kZSBsaXN0IGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBvcGNvZGVzIGRlZmluZWQgaW4gdGhpcyBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgb3Bjb2RlIGxpc3QgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhpcyBidWZmZXIKKyAgICAgICAgICogbXVzdCBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QgYXMgbWFueSBlbGVtZW50cyBhcyByZXR1cm5lZAorICAgICAgICAgKiBieSBjYWxsaW5nIHRoZSBnZXRTaXplKCkgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYnVpbGRPcExpc3QoLypvdXQqLyB1aW50OF90KiBidWYpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLiAgVGhlIGdpdmVuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKKyAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFwR2FpbnMpOworCisgICAgICAgIC8vIFRPRE86IEFkZCBvdGhlciBPcGNvZGUgbWV0aG9kcworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEZMQUdfT1BUSU9OQUwgPSAweDF1OworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTF9GT1JfUFJFVklFVyA9IDB4MnU7CisKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBHQUlOX01BUF9JRCA9IDksCisgICAgICAgICAgICBMU01fUl9JTkQgPSAwLAorICAgICAgICAgICAgTFNNX0dFX0lORCA9IDEsCisgICAgICAgICAgICBMU01fR09fSU5EID0gMiwKKyAgICAgICAgICAgIExTTV9CX0lORCA9IDMsCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbUNvdW50OworICAgICAgICBCeXRlQXJyYXlPdXRwdXQgbU9wTGlzdDsKKyAgICAgICAgRW5kaWFuT3V0cHV0IG1FbmRpYW5PdXQ7CisKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19ETkdfVVRJTFNfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRW5kaWFuVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRW5kaWFuVXRpbHMuaApAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRU5ESUFOX1VUSUxTCisjZGVmaW5lIElNR19VVElMU19FTkRJQU5fVVRJTFMKKworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBFbmRpYW5uZXNzIHR5cGVzIHN1cHBvcnRlZC4KKyAqLworZW51bSBBTkRST0lEX0FQSSBFbmRpYW5uZXNzIHsKKyAgICBVTkRFRklORURfRU5ESUFOLCAvLyBEZWZhdWx0IGVuZGlhbm5lc3Mgd2lsbCBiZSB1c2VkLgorICAgIEJJRywKKyAgICBMSVRUTEUKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHRoZSBuYXRpdmUgZGV2aWNlIGVuZGlhbm5lc3MgdG8gYmlnIGVuZGlhbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29udmVydFRvQmlnRW5kaWFuKFQgaW4pOworCisvKioKKyAqIENvbnZlcnQgZnJvbSB0aGUgbmF0aXZlIGRldmljZSBlbmRpYW5uZXNzIHRvIGxpdHRsZSBlbmRpYW4uCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIGNvbnZlcnRUb0xpdHRsZUVuZGlhbihUIGluKTsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHdyaXRpbmcgdG8gYW4gT3V0cHV0IHdpdGggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEVuZGlhbk91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyYXAgdGhlIGdpdmVuIE91dHB1dC4gIENhbGxpbmcgd3JpdGUgbWV0aG9kcyB3aWxsIHJlc3VsdCBpbgorICAgICAgICAgKiB3cml0ZXMgdG8gdGhpcyBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICBFbmRpYW5PdXRwdXQoT3V0cHV0KiBvdXQsIEVuZGlhbm5lc3MgZW5kPUxJVFRMRSk7CisKKyAgICAgICAgdmlydHVhbCB+RW5kaWFuT3V0cHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGwgb3BlbiBvbiB0aGUgd3JhcHBlZCBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCBjbG9zZSBvbiB0aGUgd3JhcHBlZCBvdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgZW5kaWFubmVzcyB0byB1c2Ugd2hlbiB3cml0aW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEVuZGlhbm5lc3MoRW5kaWFubmVzcyBlbmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGVuZGlhbm5lc3MuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhpcyBFbmRpYW5PdXRwdXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldEN1cnJlbnRPZmZzZXQoKSBjb25zdDsKKworCisgICAgICAgIC8vIFRPRE86IHN3aXRjaCB3cml0ZSBtZXRob2RzIHRvIHVpbnQzMl90IGluc3RlYWQgb2Ygc2l6ZV90LAorICAgICAgICAvLyB0aGUgbWF4IHNpemUgb2YgYSBUSUZGIGZpbGVzIGlzIGJvdW5kZWQKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHdpbGwgd3JpdGUgZWxlbWVudHMgZnJvbSBnaXZlbiBpbnB1dCBidWZmZXIgdG8gdGhlIG91dHB1dC4KKyAgICAgICAgICogQ291bnQgZWxlbWVudHMgaW4gdGhlIGJ1ZmZlciB3aWxsIGJlIHdyaXR0ZW4gd2l0aCB0aGUgZW5kaWFubmVzcyBzZXQgZm9yIHRoaXMKKyAgICAgICAgICogRW5kaWFuT3V0cHV0LiAgSWYgdGhlIGdpdmVuIG9mZnNldCBpcyBncmVhdGVyIHRoYW4gemVybywgdGhhdCBtYW55IGVsZW1lbnRzIHdpbGwKKyAgICAgICAgICogYmUgc2tpcHBlZCBpbiB0aGUgYnVmZmVyIGJlZm9yZSB3cml0aW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50MTZfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50MTZfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDMyX3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGludDMyX3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ2NF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQ2NF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBmbG9hdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgZG91YmxlKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGlubGluZSBzdGF0dXNfdCB3cml0ZUhlbHBlcihjb25zdCBUKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICAgICAgT3V0cHV0KiBtT3V0cHV0OworICAgICAgICBFbmRpYW5uZXNzIG1FbmRpYW47Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGVIZWxwZXIoY29uc3QgVCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQob2Zmc2V0IDw9IGNvdW50KTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihUKTsKKyAgICBzd2l0Y2gobUVuZGlhbikgeworICAgICAgICBjYXNlIEJJRzogeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IG9mZnNldDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUIHRtcCA9IGNvbnZlcnRUb0JpZ0VuZGlhbjxUPihidWZbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gbU91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnRtcCksIDAsIHNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBMSVRUTEU6IHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSBvZmZzZXQ7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgVCB0bXAgPSBjb252ZXJ0VG9MaXR0bGVFbmRpYW48VD4oYnVmW29mZnNldCArIGldKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IG1PdXRwdXQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZ0bXApLCAwLCBzaXplKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1PZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQ4X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQ4X3QgaW4pIHsKKyAgICByZXR1cm4gaW47Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ4X3QgY29udmVydFRvQmlnRW5kaWFuKGludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQxNl90IGNvbnZlcnRUb0JpZ0VuZGlhbih1aW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9iZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDE2X3QgY29udmVydFRvQmlnRW5kaWFuKGludDE2X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUxNihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQzMl90IGNvbnZlcnRUb0JpZ0VuZGlhbihpbnQzMl90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlMzIoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDY0X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50NjRfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50NjRfdCBpbikgeworICAgIHJldHVybiBodG9iZTY0KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQ4X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQ4X3QgaW4pIHsKKyAgICByZXR1cm4gaW47Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ4X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQxNl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbih1aW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9sZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDE2X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDE2X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUxNihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQzMl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbihpbnQzMl90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlMzIoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDY0X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50NjRfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50NjRfdCBpbikgeworICAgIHJldHVybiBodG9sZTY0KGluKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0VORElBTl9VVElMUyovCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlSW5wdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRmMjJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0ZJTEVfSU5QVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfRklMRV9JTlBVVF9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvSW5wdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGZyb20gYSBmaWxlLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBGaWxlSW5wdXQgOiBwdWJsaWMgSW5wdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGZpbGUgaW5wdXQgZm9yIHRoZSBnaXZlbiBwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgRmlsZUlucHV0KFN0cmluZzggcGF0aCk7CisKKyAgICAgICAgdmlydHVhbCB+RmlsZUlucHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHBhdGggZ2l2ZW4gaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIGZpbGUgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgQXQgbW9zdCwgdGhlIG51bWJlcgorICAgICAgICAgKiBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQgYXJndW1lbnQgd2lsbCBiZSByZWFkLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuCisgICAgICAgICAqIGludG8gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZyBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIE5PVF9FTk9VR0hfREFUQSBpZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgSWYgYW4KKyAgICAgICAgICogZXJyb3IgaGFzIG9jY3VycmVkLCB0aGlzIHdpbGwgcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlciB0aGFuIE5PVF9FTk9VR0hfREFUQS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworICAgIHByaXZhdGU6CisgICAgICAgIEZJTEUgKm1GcDsKKyAgICAgICAgU3RyaW5nOCBtUGF0aDsKKyAgICAgICAgYm9vbCBtT3BlbjsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX0lOUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1YmUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9GaWxlT3V0cHV0LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRklMRV9PVVRQVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfRklMRV9PVVRQVVRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY2xhc3MgQU5EUk9JRF9BUEkgRmlsZU91dHB1dCA6IHB1YmxpYyBPdXRwdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZU91dHB1dChTdHJpbmc4IHBhdGgpOworICAgICAgICB2aXJ0dWFsIH5GaWxlT3V0cHV0KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworICAgIHByaXZhdGU6CisgICAgICAgIEZJTEUgKm1GcDsKKyAgICAgICAgU3RyaW5nOCBtUGF0aDsKKyAgICAgICAgYm9vbCBtT3BlbjsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19GSUxFX09VVFBVVF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9JbnB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwMzY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9JbnB1dC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX0lOUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX0lOUFVUX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHVzZWQgYXMgYSBzb3VyY2Ugb2YgYnl0ZXMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIElucHV0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfklucHV0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9wZW4gdGhpcyBJbnB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZCBieXRlcyBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBBdCBtb3N0LCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZQorICAgICAgICAgKiBjb3VudCBhcmd1bWVudCB3aWxsIGJlIHJlYWQuICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2tpcHMgYnl0ZXMgaW4gdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHNraXAoc2l6ZV90IGNvdW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhlIElucHV0LiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgb3BlbiBvbiBhIHByZXZpb3VzbHkgY2xvc2VkIElucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX0lOUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL09yZGVyYWJsZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL09yZGVyYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjUzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfT1JERVJBQkxFCisjZGVmaW5lIElNR19VVElMU19PUkRFUkFCTEUKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFX0RFRihvcCkgXAoraW5saW5lIGJvb2wgb3BlcmF0b3Igb3AgKGNvbnN0IE9yZGVyYWJsZSYgb3JkZXJhYmxlKSBjb25zdDsKKworLyoqCisgKiBTdWJjbGFzc2VzIG9mIE9yZGVyYWJsZSBjYW4gYmUgY29tcGFyZWQgYW5kIHNvcnRlZC4gIFRoaXMgaXMKKyAqIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHNvcnRlZCBhcnJheXMgb2YgVElGRiBlbnRyaWVzCisgKiBhbmQgSUZEcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3JkZXJhYmxlICB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PcmRlcmFibGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvdG9ycyBhcmUgYmFzZWQgb24gdGhlIHZhbHVlIHJldHVybmVkCisgICAgICAgICAqIGZyb20gdGhpcyBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbXBhcmFibGVWYWx1ZSgpIGNvbnN0ID0gMDsKKworICAgICAgICBDT01QQVJFX0RFRig+KQorICAgICAgICBDT01QQVJFX0RFRig8KQorICAgICAgICBDT01QQVJFX0RFRig+PSkKKyAgICAgICAgQ09NUEFSRV9ERUYoPD0pCisgICAgICAgIENPTVBBUkVfREVGKD09KQorICAgICAgICBDT01QQVJFX0RFRighPSkKK307CisKKyN1bmRlZiBDT01QQVJFX0RFRgorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfT1JERVJBQkxFKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PdXRwdXQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZhZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX09VVFBVVF9ICisjZGVmaW5lIElNR19VVElMU19PVVRQVVRfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdXNlZCB0byBvdXRwdXQgYnl0ZXMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5PdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIE91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhlIG51bWJlciBvZiBieXRlcyBnaXZlbiBpbiB0aGUgY291bnQKKyAgICAgICAgICogYXJndW1lbnQgd2lsbCBiZSB3cml0dGVuLiAgQnl0ZXMgd2lsbCBiZSB3cml0dGVuIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciBzdGFydGluZworICAgICAgICAgKiBhdCB0aGUgaW5kZXggZ2l2ZW4gaW4gdGhlIG9mZnNldCBhcmd1bWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlIHRoaXMgT3V0cHV0LiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgb3BlbiBvbiBhIHByZXZpb3VzbHkgY2xvc2VkIE91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfT1VUUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9QYWlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MWNhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9QYWlyLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfUEFJUl9ICisjZGVmaW5lIElNR19VVElMU19QQUlSX0gKKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBHZW5lcmljIHBhaXIgdXRpbGl0eSBjbGFzcy4gIE5vdGhpbmcgc3BlY2lhbCBoZXJlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBTPgorY2xhc3MgQU5EUk9JRF9BUEkgUGFpciB7CisgICAgcHVibGljOgorICAgICAgICBGIGZpcnN0OworICAgICAgICBTIHNlY29uZDsKKworICAgICAgICBQYWlyKCkge30KKworICAgICAgICBQYWlyKGNvbnN0IFBhaXImIG8pIDogZmlyc3Qoby5maXJzdCksIHNlY29uZChvLnNlY29uZCkge30KKworICAgICAgICBQYWlyKGNvbnN0IEYmIGYsIGNvbnN0IFMmIHMpIDogZmlyc3QoZiksIHNlY29uZChzKSB7fQorfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1BBSVJfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU29ydGVkRW50cnlWZWN0b3IuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTlhODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU29ydGVkRW50cnlWZWN0b3IuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19TT1JURURfRU5UUllfVkVDVE9SX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1NPUlRFRF9FTlRSWV9WRUNUT1JfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBTdWJjbGFzcyBvZiBTb3J0ZWRWZWN0b3IgdGhhdCBoYXMgYmVlbiBleHRlbmRlZCB0bworICogZG8gY29tcGFyaXNvbnMvbG9va3VwcyBiYXNlZCBvbiB0aGUgdGFnIElEIG9mIHRoZSBlbnRyaWVzLgorICovCitjbGFzcyBTb3J0ZWRFbnRyeVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8VGlmZkVudHJ5PiA+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflNvcnRlZEVudHJ5VmVjdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQsIG9yCisgICAgICAgICAqIC0xIGlmIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgc3NpemVfdCBpbmRleE9mVGFnKHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0OworfTsKKworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfU09SVEVEX0VOVFJZX1ZFQ1RPUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9TdHJpcFNvdXJjZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVjNmI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9TdHJpcFNvdXJjZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1NUUklQX1NPVVJDRV9ICisjZGVmaW5lIElNR19VVElMU19TVFJJUF9TT1VSQ0VfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGhpcyBjbGFzcyBhY3RzIGFzIGEgZGF0YSBzb3VyY2UgZm9yIHN0cmlwcyBzZXQgaW4gYSBUaWZmSWZkLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBTdHJpcFNvdXJjZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5TdHJpcFNvdXJjZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBjb3VudCBieXRlcyB0byB0aGUgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1N0cmVhbShPdXRwdXQmIHN0cmVhbSwgdWludDMyX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBzb3VyY2UgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJZmQoKSBjb25zdCA9IDA7Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfU1RSSVBfU09VUkNFX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWE3NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmgKQEAgLTAsMCArMSwxMzkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX1RBR19ERUZJTklUSU9OX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGFnIGRlZmluaXRpb25zIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgc3RhbmRhcmQgVElGRiBjb21wYXRpYmxlIHRhZ3MuCisgKi8KK3R5cGVkZWYgc3RydWN0IFRhZ0RlZmluaXRpb24geworICAgIC8vIFRoZSB0YWcgbmFtZS4KKyAgICBjb25zdCBjaGFyKiB0YWdOYW1lOworICAgIC8vIFRoZSBzcGVjaWZpZWQgdGFnIElELgorICAgIGNvbnN0IHVpbnQxNl90IHRhZ0lkOworICAgIC8vIFRoZSBkZWZhdWx0IHR5cGUgZm9yIHRoaXMgdGFnLiAgVGhpcyBtdXN0IGJlIGEgdmFsaWQgVElGRiB0eXBlLgorICAgIGNvbnN0IFRhZ1R5cGUgZGVmYXVsdFR5cGU7CisgICAgLy8gVGhlIGRlZmF1bHQgSW1hZ2UgRmlsZSBEaXJlY3RvcnkgKElGRCkgZm9yIHRoaXMgdGFnLgorICAgIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRJZmQ7CisgICAgLy8gVGhlIHZhbGlkIGNvdW50IGZvciB0aGlzIHRhZywgb3IgMCBpZiB0aGUgY291bnQgaXMgbm90IGZpeGVkLgorICAgIGNvbnN0IHVpbnQzMl90IGZpeGVkQ291bnQ7CisgICAgLy8gVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhZyB2YWx1ZSwgb3IgVU5ERUZJTkVEX0VORElBTiBpZiB0aGVyZSBpcyBubyBmaXhlZCBlbmRpYW4KKyAgICBjb25zdCBFbmRpYW5uZXNzIGZpeGVkRW5kaWFuOworfSBUYWdEZWZpbml0aW9uX3Q7CisKKy8qKgorICogQ29udmVuaWVuY2UgZGVmaW5lcyBmb3IgdGFnIGlkcy4KKyAqLworZW51bSB7CisgICAgVEFHX1JBV1RPUFJFVklFV0dBSU4gPSAweEM3QTh1LAorICAgIFRBR19ORVdSQVdJTUFHRURJR0VTVCA9IDB4QzdBN3UsCisgICAgVEFHX09SSUdJTkFMREVGQVVMVENST1BTSVpFID0gMHhDNzkzdSwKKyAgICBUQUdfT1JJR0lOQUxCRVNUUVVBTElUWUZJTkFMU0laRSA9IDB4Qzc5MnUsCisgICAgVEFHX09SSUdJTkFMREVGQVVMVEZJTkFMU0laRSA9IDB4Qzc5MXUsCisgICAgVEFHX1BST0ZJTEVIVUVTQVRNQVBFTkNPRElORyA9IDB4QzdBM3UsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVFTkNPRElORyA9IDB4QzdBNHUsCisgICAgVEFHX0JBU0VMSU5FRVhQT1NVUkVPRkZTRVQgPSAweEM3QTV1LAorICAgIFRBR19ERUZBVUxUQkxBQ0tSRU5ERVIgPSAweEM3QTZ1LAorICAgIFRBR19ERUZBVUxUVVNFUkNST1AgPSAweEM3QjV1LAorICAgIFRBR19OT0lTRVBST0ZJTEUgPSAweEM3NjF1LAorICAgIFRBR19PUENPREVMSVNUMyA9IDB4Qzc0RXUsCisgICAgVEFHX09QQ09ERUxJU1QyID0gMHhDNzQxdSwKKyAgICBUQUdfT1BDT0RFTElTVDEgPSAweEM3NDB1LAorICAgIFRBR19QUk9GSUxFTE9PS1RBQkxFREFUQSA9IDB4QzcyNnUsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVESU1TID0gMHhDNzI1dSwKKyAgICBUQUdfUk9XSU5URVJMRUFWRUZBQ1RPUiA9IDB4QzcxRnUsCisgICAgVEFHX1NVQlRJTEVCTE9DS1NJWkUgPSAweEM3MUV1LAorICAgIFRBR19PUklHSU5BTFJBV0ZJTEVESUdFU1QgPSAweEM3MUR1LAorICAgIFRBR19SQVdJTUFHRURJR0VTVCA9IDB4QzcxQ3UsCisgICAgVEFHX1BSRVZJRVdEQVRFVElNRSA9IDB4QzcxQnUsCisgICAgVEFHX1BSRVZJRVdDT0xPUlNQQUNFID0gMHhDNzFBdSwKKyAgICBUQUdfUFJFVklFV1NFVFRJTkdTRElHRVNUID0gMHhDNzE5dSwKKyAgICBUQUdfUFJFVklFV1NFVFRJTkdTTkFNRSA9IDB4QzcxOHUsCisgICAgVEFHX1BSRVZJRVdBUFBMSUNBVElPTlZFUlNJT04gPSAweEM3MTd1LAorICAgIFRBR19QUkVWSUVXQVBQTElDQVRJT05OQU1FID0gMHhDNzE2dSwKKyAgICBUQUdfRk9SV0FSRE1BVFJJWDIgPSAweEM3MTV1LAorICAgIFRBR19GT1JXQVJETUFUUklYMSA9IDB4QzcxNHUsCisgICAgVEFHX1BST0ZJTEVDT1BZUklHSFQgPSAweEM2RkV1LAorICAgIFRBR19QUk9GSUxFRU1CRURQT0xJQ1kgPSAweEM2RkR1LAorICAgIFRBR19QUk9GSUxFVE9ORUNVUlZFID0gMHhDNkZDdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERBVEEyID0gMHhDNkZCdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERBVEExID0gMHhDNkZBdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUERJTVMgPSAweEM2Rjl1LAorICAgIFRBR19QUk9GSUxFTkFNRSA9IDB4QzZGOHUsCisgICAgVEFHX05PSVNFUkVEVUNUSU9OQVBQTElFRCA9IDB4QzZGN3UsCisgICAgVEFHX0FTU0hPVFBST0ZJTEVOQU1FID0gMHhDNkY2dSwKKyAgICBUQUdfRVhUUkFDQU1FUkFQUk9GSUxFUyA9IDB4QzZGNXUsCisgICAgVEFHX1BST0ZJTEVDQUxJQlJBVElPTlNJR05BVFVSRSA9IDB4QzZGNHUsCisgICAgVEFHX0NBTUVSQUNBTElCUkFUSU9OU0lHTkFUVVJFID0gMHhDNkYzdSwKKyAgICBUQUdfQ09MT1JJTUVUUklDUkVGRVJFTkNFID0gMHhDNkJGdSwKKyAgICBUQUdfQ1VSUkVOVFBSRVBST0ZJTEVNQVRSSVggPSAweEM2OTJ1LAorICAgIFRBR19DVVJSRU5USUNDUFJPRklMRSA9IDB4QzY5MXUsCisgICAgVEFHX0FTU0hPVFBSRVBST0ZJTEVNQVRSSVggPSAweEM2OTB1LAorICAgIFRBR19BU1NIT1RJQ0NQUk9GSUxFID0gMHhDNjhGdSwKKyAgICBUQUdfTUFTS0VEQVJFQVMgPSAweEM2OEV1LAorICAgIFRBR19BQ1RJVkVBUkVBID0gMHhDNjhEdSwKKyAgICBUQUdfT1JJR0lOQUxSQVdGSUxFREFUQSA9IDB4QzY4Q3UsCisgICAgVEFHX09SSUdJTkFMUkFXRklMRU5BTUUgPSAweEM2OEJ1LAorICAgIFRBR19SQVdEQVRBVU5JUVVFSUQgPSAweEM2NUR1LAorICAgIFRBR19NQUtFUk5PVEVTQUZFVFkgPSAweEM2MzV1LAorICAgIFRBR19ETkdQUklWQVRFREFUQSA9IDB4QzYzNHUsCisgICAgVEFHX1NIQURPV1NDQUxFID0gMHhDNjMzdSwKKyAgICBUQUdfQU5USUFMSUFTU1RSRU5HVEggPSAweEM2MzJ1LAorICAgIFRBR19DSFJPTUFCTFVSUkFESVVTID0gMHhDNjMxdSwKKyAgICBUQUdfTEVOU0lORk8gPSAweEM2MzB1LAorICAgIFRBR19DQU1FUkFTRVJJQUxOVU1CRVIgPSAweEM2MkZ1LAorICAgIFRBR19MSU5FQVJSRVNQT05TRUxJTUlUID0gMHhDNjJFdSwKKyAgICBUQUdfQkFZRVJHUkVFTlNQTElUID0gMHhDNjJEdSwKKyAgICBUQUdfQkFTRUxJTkVTSEFSUE5FU1MgPSAweEM2MkN1LAorICAgIFRBR19CQVNFTElORU5PSVNFID0gMHhDNjJCdSwKKyAgICBUQUdfQkFTRUxJTkVFWFBPU1VSRSA9IDB4QzYyQXUsCisgICAgVEFHX0FTU0hPVFdISVRFWFkgPSAweEM2Mjl1LAorICAgIFRBR19BU1NIT1RORVVUUkFMID0gMHhDNjI4dSwKKyAgICBUQUdfQU5BTE9HQkFMQU5DRSA9IDB4QzYyN3UsCisgICAgVEFHX1JFRFVDVElPTk1BVFJJWDIgPSAweEM2MjZ1LAorICAgIFRBR19SRURVQ1RJT05NQVRSSVgxID0gMHhDNjI1dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT04yID0gMHhDNjI0dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT04xID0gMHhDNjIzdSwKKyAgICBUQUdfQ09MT1JNQVRSSVgyID0gMHhDNjIydSwKKyAgICBUQUdfQ09MT1JNQVRSSVgxID0gMHhDNjIxdSwKKyAgICBUQUdfQ0FMSUJSQVRJT05JTExVTUlOQU5UMiA9IDB4QzY1QnUsCisgICAgVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEgPSAweEM2NUF1LAorICAgIFRBR19ERUZBVUxUQ1JPUFNJWkUgPSAweEM2MjB1LAorICAgIFRBR19ERUZBVUxUQ1JPUE9SSUdJTiA9IDB4QzYxRnUsCisgICAgVEFHX0JFU1RRVUFMSVRZU0NBTEUgPSAweEM2NUN1LAorICAgIFRBR19ERUZBVUxUU0NBTEUgPSAweEM2MUV1LAorICAgIFRBR19XSElURUxFVkVMID0gMHhDNjFEdSwKKyAgICBUQUdfQkxBQ0tMRVZFTERFTFRBViA9IDB4QzYxQ3UsCisgICAgVEFHX0JMQUNLTEVWRUxERUxUQUggPSAweEM2MUJ1LAorICAgIFRBR19CTEFDS0xFVkVMID0gMHhDNjFBdSwKKyAgICBUQUdfQkxBQ0tMRVZFTFJFUEVBVERJTSA9IDB4QzYxOXUsCisgICAgVEFHX0xJTkVBUklaQVRJT05UQUJMRSA9IDB4QzYxOHUsCisgICAgVEFHX0NGQUxBWU9VVCA9IDB4QzYxN3UsCisgICAgVEFHX0NGQVBMQU5FQ09MT1IgPSAweEM2MTZ1LAorICAgIFRBR19MT0NBTElaRURDQU1FUkFNT0RFTCA9IDB4QzYxNXUsCisgICAgVEFHX1VOSVFVRUNBTUVSQU1PREVMID0gMHhDNjE0dSwKKyAgICBUQUdfRE5HQkFDS1dBUkRWRVJTSU9OID0gMHhDNjEzdSwKKyAgICBUQUdfRE5HVkVSU0lPTiA9IDB4QzYxMnUsCisgICAgVEFHX1NVQkZJTEVUWVBFID0gMHgwMEZGdSwKKyAgICBUQUdfWVJFU09MVVRJT04gPSAweDAxMUJ1LAorICAgIFRBR19YUkVTT0xVVElPTiA9IDB4MDExQXUsCisgICAgVEFHX1RIUkVTSEhPTERJTkcgPSAweDAxMDd1LAorICAgIFRBR19TVFJJUE9GRlNFVFMgPSAweDAxMTF1LAorICAgIFRBR19TVFJJUEJZVEVDT1VOVFMgPSAweDAxMTd1LAorICAgIFRBR19TT0ZUV0FSRSA9IDB4MDEzMXUsCisgICAgVEFHX1NBTVBMRVNQRVJQSVhFTCA9IDB4MDExNXUsCisgICAgVEFHX1JPV1NQRVJTVFJJUCA9IDB4MDExNnUsCisgICAgVEFHX1JFU09MVVRJT05VTklUID0gMHgwMTI4dSwKKyAgICBUQUdfUExBTkFSQ09ORklHVVJBVElPTiA9IDB4MDExQ3UsCisgICAgVEFHX1BIT1RPTUVUUklDSU5URVJQUkVUQVRJT04gPSAweDAxMDZ1LAorICAgIFRBR19PUklFTlRBVElPTiA9IDB4MDExMnUsCisgICAgVEFHX05FV1NVQkZJTEVUWVBFID0gMHgwMEZFdSwKKyAgICBUQUdfTU9ERUwgPSAweDAxMTB1LAorICAgIFRBR19NSU5TQU1QTEVWQUxVRSA9IDB4MDExOHUsCisgICAgVEFHX01BWFNBTVBMRVZBTFVFID0gMHgwMTE5dSwKKyAgICBUQUdfTUFLRSA9IDB4MDEwRnUsCisgICAgVEFHX0lNQUdFV0lEVEggPSAweDAxMDB1LAorICAgIFRBR19JTUFHRUxFTkdUSCA9IDB4MDEwMXUsCisgICAgVEFHX0lNQUdFREVTQ1JJUFRJT04gPSAweDAxMEV1LAorICAgIFRBR19IT1NUQ09NUFVURVIgPSAweDAxM0N1LAorICAgIFRBR19HUkFZUkVTUE9OU0VVTklUID0gMHgwMTIydSwKKyAgICBUQUdfR1JBWVJFU1BPTlNFQ1VSVkUgPSAweDAxMjN1LAorICAgIFRBR19GUkVFT0ZGU0VUUyA9IDB4MDEyMHUsCisgICAgVEFHX0ZSRUVCWVRFQ09VTlRTID0gMHgwMTIxdSwKKyAgICBUQUdfRklMTE9SREVSID0gMHgwMTBBdSwKKyAgICBUQUdfRVhUUkFTQU1QTEVTID0gMHgwMTUydSwKKyAgICBUQUdfREFURVRJTUUgPSAweDAxMzJ1LAorICAgIFRBR19DT1BZUklHSFQgPSAweDgyOTh1LAorICAgIFRBR19DT01QUkVTU0lPTiA9IDB4MDEwM3UsCisgICAgVEFHX0NPTE9STUFQID0gMHgwMTQwdSwKKyAgICBUQUdfQ0VMTFdJRFRIID0gMHgwMTA4dSwKKyAgICBUQUdfQ0VMTExFTkdUSCA9IDB4MDEwOXUsCisgICAgVEFHX0JJVFNQRVJTQU1QTEUgPSAweDAxMDJ1LAorICAgIFRBR19BUlRJU1QgPSAweDAxM0J1LAorICAgIFRBR19FWElGVkVSU0lPTiA9IDB4OTAwMHUsCisgICAgVEFHX0NGQVJFUEVBVFBBVFRFUk5ESU0gPSAweDgyOER1LAorICAgIFRBR19EQVRFVElNRU9SSUdJTkFMID0gMHg5MDAzdSwKKyAgICBUQUdfQ0ZBUEFUVEVSTiA9IDB4ODI4RXUsCisgICAgVEFHX1NVQklGRFMgPSAweDAxNEF1LAorICAgIFRBR19USUZGRVBTVEFOREFSRElEID0gMHg5MjE2dSwKKyAgICBUQUdfRVhQT1NVUkVUSU1FID0gMHg4MjlBdSwKKyAgICBUQUdfSVNPU1BFRURSQVRJTkdTID0gMHg4ODI3dSwKKyAgICBUQUdfRk9DQUxMRU5HVEggPSAweDkyMEF1LAorICAgIFRBR19GTlVNQkVSID0gMHg4MjlEdSwKKyAgICBUQUdfR1BTSU5GTyA9IDB4ODgyNXUsCisgICAgVEFHX0dQU1ZFUlNJT05JRCA9IDB4MHUsCisgICAgVEFHX0dQU0xBVElUVURFUkVGID0gMHgxdSwKKyAgICBUQUdfR1BTTEFUSVRVREUgPSAweDJ1LAorICAgIFRBR19HUFNMT05HSVRVREVSRUYgPSAweDN1LAorICAgIFRBR19HUFNMT05HSVRVREUgPSAweDR1LAorICAgIFRBR19HUFNUSU1FU1RBTVAgPSAweDd1LAorICAgIFRBR19HUFNEQVRFU1RBTVAgPSAweDAwMUR1LAorfTsKKworLyoqCisgKiBUSUZGX0VQX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIFRJRkYgRVAgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgVElGRl9FUF9UQUdfREVGSU5JVElPTlNbXSA9ICB7CisgICAgeyAvLyBQaG90b21ldHJpY0ludGVycHJldGF0aW9uCisgICAgICAgICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwKKyAgICAgICAgMHgwMTA2dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN1YklmZHMKKyAgICAgICAgIlN1YklmZHMiLAorICAgICAgICAweDAxNEF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFQYXR0ZXJuCisgICAgICAgICJDRkFQYXR0ZXJuIiwKKyAgICAgICAgMHg4MjhFdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBUmVwZWF0UGF0dGVybkRpbQorICAgICAgICAiQ0ZBUmVwZWF0UGF0dGVybkRpbSIsCisgICAgICAgIDB4ODI4RHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEYXRlVGltZU9yaWdpbmFsCisgICAgICAgICJEYXRlVGltZU9yaWdpbmFsIiwKKyAgICAgICAgMHg5MDAzdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBUaWZmL0VQU3RhbmRhcmRJRAorICAgICAgICAiVGlmZiIsCisgICAgICAgIDB4OTIxNnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEV4cG9zdXJlVGltZQorICAgICAgICAiRXhwb3N1cmVUaW1lIiwKKyAgICAgICAgMHg4MjlBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIElTT1NwZWVkUmF0aW5ncworICAgICAgICAiSVNPU3BlZWRSYXRpbmdzIiwKKyAgICAgICAgMHg4ODI3dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvY2FsTGVuZ3RoCisgICAgICAgICJGb2NhbExlbmd0aCIsCisgICAgICAgIDB4OTIwQXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGTnVtYmVyCisgICAgICAgICJGTnVtYmVyIiwKKyAgICAgICAgMHg4MjlEdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0luZm8KKyAgICAgICAgIkdQU0luZm8iLAorICAgICAgICAweDg4MjV1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNWZXJzaW9uSUQKKyAgICAgICAgIkdQU1ZlcnNpb25JRCIsCisgICAgICAgIDB4MHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0xhdGl0dWRlUmVmCisgICAgICAgICJHUFNMYXRpdHVkZVJlZiIsCisgICAgICAgIDB4MXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMYXRpdHVkZQorICAgICAgICAiR1BTTGF0aXR1ZGUiLAorICAgICAgICAweDJ1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTG9uZ2l0dWRlUmVmCisgICAgICAgICJHUFNMb25naXR1ZGVSZWYiLAorICAgICAgICAweDN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTG9uZ2l0dWRlCisgICAgICAgICJHUFNMb25naXR1ZGUiLAorICAgICAgICAweDR1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTVGltZVN0YW1wCisgICAgICAgICJHUFNUaW1lU3RhbXAiLAorICAgICAgICAweDd1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIC8qVE9ETzogUmVtYWluaW5nIFRJRkYgRVAgdGFncyovCit9OworCisvKioKKyAqIEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIEplaXRhIEVYSUYgMi4zIHNwZWMKKyAqLworY29uc3QgVGFnRGVmaW5pdGlvbl90IEVYSUZfMl8zX1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gRXhpZlZlcnNpb24KKyAgICAgICAgIkV4aWZWZXJzaW9uIiwKKyAgICAgICAgMHg5MDAwdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNEYXRlU3RhbXAKKyAgICAgICAgIkdQU0RhdGVTdGFtcCIsCisgICAgICAgIDB4MDAxRHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIC8qVE9ETzogUmVtYWluaW5nIEVYSUYgMi4zIHRhZ3MqLworfTsKKworLyoqCisgKiBUSUZGXzZfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgVElGRiA2LjAgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgVElGRl82X1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gU3ViRmlsZVR5cGUKKyAgICAgICAgIlN1YkZpbGVUeXBlIiwKKyAgICAgICAgMHgwMEZGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFydGlzdAorICAgICAgICAiQXJ0aXN0IiwKKyAgICAgICAgMHgwMTNCdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJpdHNQZXJTYW1wbGUKKyAgICAgICAgIkJpdHNQZXJTYW1wbGUiLAorICAgICAgICAweDAxMDJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2VsbExlbmd0aAorICAgICAgICAiQ2VsbExlbmd0aCIsCisgICAgICAgIDB4MDEwOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDZWxsV2lkdGgKKyAgICAgICAgIkNlbGxXaWR0aCIsCisgICAgICAgIDB4MDEwOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvck1hcAorICAgICAgICAiQ29sb3JNYXAiLAorICAgICAgICAweDAxNDB1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29tcHJlc3Npb24KKyAgICAgICAgIkNvbXByZXNzaW9uIiwKKyAgICAgICAgMHgwMTAzdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvcHlyaWdodAorICAgICAgICAiQ29weXJpZ2h0IiwKKyAgICAgICAgMHg4Mjk4dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERhdGVUaW1lCisgICAgICAgICJEYXRlVGltZSIsCisgICAgICAgIDB4MDEzMnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMjAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXh0cmFTYW1wbGVzCisgICAgICAgICJFeHRyYVNhbXBsZXMiLAorICAgICAgICAweDAxNTJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRmlsbE9yZGVyCisgICAgICAgICJGaWxsT3JkZXIiLAorICAgICAgICAweDAxMEF1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRnJlZUJ5dGVDb3VudHMKKyAgICAgICAgIkZyZWVCeXRlQ291bnRzIiwKKyAgICAgICAgMHgwMTIxdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRnJlZU9mZnNldHMKKyAgICAgICAgIkZyZWVPZmZzZXRzIiwKKyAgICAgICAgMHgwMTIwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR3JheVJlc3BvbnNlQ3VydmUKKyAgICAgICAgIkdyYXlSZXNwb25zZUN1cnZlIiwKKyAgICAgICAgMHgwMTIzdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdyYXlSZXNwb25zZVVuaXQKKyAgICAgICAgIkdyYXlSZXNwb25zZVVuaXQiLAorICAgICAgICAweDAxMjJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSG9zdENvbXB1dGVyCisgICAgICAgICJIb3N0Q29tcHV0ZXIiLAorICAgICAgICAweDAxM0N1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSW1hZ2VEZXNjcmlwdGlvbgorICAgICAgICAiSW1hZ2VEZXNjcmlwdGlvbiIsCisgICAgICAgIDB4MDEwRXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZUxlbmd0aAorICAgICAgICAiSW1hZ2VMZW5ndGgiLAorICAgICAgICAweDAxMDF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZVdpZHRoCisgICAgICAgICJJbWFnZVdpZHRoIiwKKyAgICAgICAgMHgwMTAwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWFrZQorICAgICAgICAiTWFrZSIsCisgICAgICAgIDB4MDEwRnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYXhTYW1wbGVWYWx1ZQorICAgICAgICAiTWF4U2FtcGxlVmFsdWUiLAorICAgICAgICAweDAxMTl1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWluU2FtcGxlVmFsdWUKKyAgICAgICAgIk1pblNhbXBsZVZhbHVlIiwKKyAgICAgICAgMHgwMTE4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1vZGVsCisgICAgICAgICJNb2RlbCIsCisgICAgICAgIDB4MDExMHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOZXdTdWJmaWxlVHlwZQorICAgICAgICAiTmV3U3ViZmlsZVR5cGUiLAorICAgICAgICAweDAwRkV1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmllbnRhdGlvbgorICAgICAgICAiT3JpZW50YXRpb24iLAorICAgICAgICAweDAxMTJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUGhvdG9NZXRyaWNJbnRlcnByZXRhdGlvbgorICAgICAgICAiUGhvdG9NZXRyaWNJbnRlcnByZXRhdGlvbiIsCisgICAgICAgIDB4MDEwNnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQbGFuYXJDb25maWd1cmF0aW9uCisgICAgICAgICJQbGFuYXJDb25maWd1cmF0aW9uIiwKKyAgICAgICAgMHgwMTFDdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlc29sdXRpb25Vbml0CisgICAgICAgICJSZXNvbHV0aW9uVW5pdCIsCisgICAgICAgIDB4MDEyOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSb3dzUGVyU3RyaXAKKyAgICAgICAgIlJvd3NQZXJTdHJpcCIsCisgICAgICAgIDB4MDExNnUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNhbXBsZXNQZXJQaXhlbAorICAgICAgICAiU2FtcGxlc1BlclBpeGVsIiwKKyAgICAgICAgMHgwMTE1dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNvZnR3YXJlCisgICAgICAgICJTb2Z0d2FyZSIsCisgICAgICAgIDB4MDEzMXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBTdHJpcEJ5dGVDb3VudHMKKyAgICAgICAgIlN0cmlwQnl0ZUNvdW50cyIsCisgICAgICAgIDB4MDExN3UsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN0cmlwT2Zmc2V0cworICAgICAgICAiU3RyaXBPZmZzZXRzIiwKKyAgICAgICAgMHgwMTExdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViZmlsZVR5cGUKKyAgICAgICAgIlN1YmZpbGVUeXBlIiwKKyAgICAgICAgMHgwMEZGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFRocmVzaGhvbGRpbmcKKyAgICAgICAgIlRocmVzaGhvbGRpbmciLAorICAgICAgICAweDAxMDd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gWFJlc29sdXRpb24KKyAgICAgICAgIlhSZXNvbHV0aW9uIiwKKyAgICAgICAgMHgwMTFBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFlSZXNvbHV0aW9uCisgICAgICAgICJZUmVzb2x1dGlvbiIsCisgICAgICAgIDB4MDExQnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCit9OworCisvKioKKyAqIEROR19UQUdfREVGSU5JVElPTlMgY29udGFpbnMgdGFncyBkZWZpbmVkIGluIHRoZSBETkcgMS40IHNwZWMKKyAqLworY29uc3QgVGFnRGVmaW5pdGlvbl90IEROR19UQUdfREVGSU5JVElPTlNbXSA9IHsKKyAgICB7IC8vIEROR1ZlcnNpb24KKyAgICAgICAgIkROR1ZlcnNpb24iLAorICAgICAgICAweEM2MTJ1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBETkdCYWNrd2FyZFZlcnNpb24KKyAgICAgICAgIkROR0JhY2t3YXJkVmVyc2lvbiIsCisgICAgICAgIDB4QzYxM3UsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFVuaXF1ZUNhbWVyYU1vZGVsCisgICAgICAgICJVbmlxdWVDYW1lcmFNb2RlbCIsCisgICAgICAgIDB4QzYxNHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMb2NhbGl6ZWRDYW1lcmFNb2RlbAorICAgICAgICAiTG9jYWxpemVkQ2FtZXJhTW9kZWwiLAorICAgICAgICAweEM2MTV1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBUGxhbmVDb2xvcgorICAgICAgICAiQ0ZBUGxhbmVDb2xvciIsCisgICAgICAgIDB4QzYxNnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ0ZBTGF5b3V0CisgICAgICAgICJDRkFMYXlvdXQiLAorICAgICAgICAweEM2MTd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMaW5lYXJpemF0aW9uVGFibGUKKyAgICAgICAgIkxpbmVhcml6YXRpb25UYWJsZSIsCisgICAgICAgIDB4QzYxOHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxSZXBlYXREaW0KKyAgICAgICAgIkJsYWNrTGV2ZWxSZXBlYXREaW0iLAorICAgICAgICAweEM2MTl1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCbGFja0xldmVsCisgICAgICAgICJCbGFja0xldmVsIiwKKyAgICAgICAgMHhDNjFBdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCbGFja0xldmVsRGVsdGFICisgICAgICAgICJCbGFja0xldmVsRGVsdGFIIiwKKyAgICAgICAgMHhDNjFCdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxEZWx0YVYKKyAgICAgICAgIkJsYWNrTGV2ZWxEZWx0YVYiLAorICAgICAgICAweEM2MUN1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gV2hpdGVMZXZlbAorICAgICAgICAiV2hpdGVMZXZlbCIsCisgICAgICAgIDB4QzYxRHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdFNjYWxlCisgICAgICAgICJEZWZhdWx0U2NhbGUiLAorICAgICAgICAweEM2MUV1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCZXN0UXVhbGl0eVNjYWxlCisgICAgICAgICJCZXN0UXVhbGl0eVNjYWxlIiwKKyAgICAgICAgMHhDNjVDdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdENyb3BPcmlnaW4KKyAgICAgICAgIkRlZmF1bHRDcm9wT3JpZ2luIiwKKyAgICAgICAgMHhDNjFGdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0Q3JvcFNpemUKKyAgICAgICAgIkRlZmF1bHRDcm9wU2l6ZSIsCisgICAgICAgIDB4QzYyMHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FsaWJyYXRpb25JbGx1bWluYW50MQorICAgICAgICAiQ2FsaWJyYXRpb25JbGx1bWluYW50MSIsCisgICAgICAgIDB4QzY1QXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYWxpYnJhdGlvbklsbHVtaW5hbnQyCisgICAgICAgICJDYWxpYnJhdGlvbklsbHVtaW5hbnQyIiwKKyAgICAgICAgMHhDNjVCdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWF0cml4MQorICAgICAgICAiQ29sb3JNYXRyaXgxIiwKKyAgICAgICAgMHhDNjIxdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvck1hdHJpeDIKKyAgICAgICAgIkNvbG9yTWF0cml4MiIsCisgICAgICAgIDB4QzYyMnUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FtZXJhQ2FsaWJyYXRpb24xCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvbjEiLAorICAgICAgICAweEM2MjN1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYUNhbGlicmF0aW9uMgorICAgICAgICAiQ2FtZXJhQ2FsaWJyYXRpb24yIiwKKyAgICAgICAgMHhDNjI0dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSZWR1Y3Rpb25NYXRyaXgxCisgICAgICAgICJSZWR1Y3Rpb25NYXRyaXgxIiwKKyAgICAgICAgMHhDNjI1dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSZWR1Y3Rpb25NYXRyaXgyCisgICAgICAgICJSZWR1Y3Rpb25NYXRyaXgyIiwKKyAgICAgICAgMHhDNjI2dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBbmFsb2dCYWxhbmNlCisgICAgICAgICJBbmFsb2dCYWxhbmNlIiwKKyAgICAgICAgMHhDNjI3dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdE5ldXRyYWwKKyAgICAgICAgIkFzU2hvdE5ldXRyYWwiLAorICAgICAgICAweEM2Mjh1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90V2hpdGVYWQorICAgICAgICAiQXNTaG90V2hpdGVYWSIsCisgICAgICAgIDB4QzYyOXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZUV4cG9zdXJlCisgICAgICAgICJCYXNlbGluZUV4cG9zdXJlIiwKKyAgICAgICAgMHhDNjJBdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZU5vaXNlCisgICAgICAgICJCYXNlbGluZU5vaXNlIiwKKyAgICAgICAgMHhDNjJCdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lU2hhcnBuZXNzCisgICAgICAgICJCYXNlbGluZVNoYXJwbmVzcyIsCisgICAgICAgIDB4QzYyQ3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXllckdyZWVuU3BsaXQKKyAgICAgICAgIkJheWVyR3JlZW5TcGxpdCIsCisgICAgICAgIDB4QzYyRHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTGluZWFyUmVzcG9uc2VMaW1pdAorICAgICAgICAiTGluZWFyUmVzcG9uc2VMaW1pdCIsCisgICAgICAgIDB4QzYyRXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFTZXJpYWxOdW1iZXIKKyAgICAgICAgIkNhbWVyYVNlcmlhbE51bWJlciIsCisgICAgICAgIDB4QzYyRnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMZW5zSW5mbworICAgICAgICAiTGVuc0luZm8iLAorICAgICAgICAweEM2MzB1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2hyb21hQmx1clJhZGl1cworICAgICAgICAiQ2hyb21hQmx1clJhZGl1cyIsCisgICAgICAgIDB4QzYzMXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFudGlBbGlhc1N0cmVuZ3RoCisgICAgICAgICJBbnRpQWxpYXNTdHJlbmd0aCIsCisgICAgICAgIDB4QzYzMnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFNoYWRvd1NjYWxlCisgICAgICAgICJTaGFkb3dTY2FsZSIsCisgICAgICAgIDB4QzYzM3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBETkdQcml2YXRlRGF0YQorICAgICAgICAiRE5HUHJpdmF0ZURhdGEiLAorICAgICAgICAweEM2MzR1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYWtlck5vdGVTYWZldHkKKyAgICAgICAgIk1ha2VyTm90ZVNhZmV0eSIsCisgICAgICAgIDB4QzYzNXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSYXdEYXRhVW5pcXVlSUQKKyAgICAgICAgIlJhd0RhdGFVbmlxdWVJRCIsCisgICAgICAgIDB4QzY1RHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICAxNiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbFJhd0ZpbGVOYW1lCisgICAgICAgICJPcmlnaW5hbFJhd0ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNjhCdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZURhdGEKKyAgICAgICAgIk9yaWdpbmFsUmF3RmlsZURhdGEiLAorICAgICAgICAweEM2OEN1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBCSUcKKyAgICB9LAorICAgIHsgLy8gQWN0aXZlQXJlYQorICAgICAgICAiQWN0aXZlQXJlYSIsCisgICAgICAgIDB4QzY4RHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTWFza2VkQXJlYXMKKyAgICAgICAgIk1hc2tlZEFyZWFzIiwKKyAgICAgICAgMHhDNjhFdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RJQ0NQcm9maWxlCisgICAgICAgICJBc1Nob3RJQ0NQcm9maWxlIiwKKyAgICAgICAgMHhDNjhGdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RQcmVQcm9maWxlTWF0cml4CisgICAgICAgICJBc1Nob3RQcmVQcm9maWxlTWF0cml4IiwKKyAgICAgICAgMHhDNjkwdSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDdXJyZW50SUNDUHJvZmlsZQorICAgICAgICAiQ3VycmVudElDQ1Byb2ZpbGUiLAorICAgICAgICAweEM2OTF1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEN1cnJlbnRJQ0NQcm9maWxlCisgICAgICAgICJDdXJyZW50SUNDUHJvZmlsZSIsCisgICAgICAgIDB4QzY5MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ3VycmVudFByZVByb2ZpbGVNYXRyaXgKKyAgICAgICAgIkN1cnJlbnRQcmVQcm9maWxlTWF0cml4IiwKKyAgICAgICAgMHhDNjkydSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb2xvcmltZXRyaWNSZWZlcmVuY2UKKyAgICAgICAgIkNvbG9yaW1ldHJpY1JlZmVyZW5jZSIsCisgICAgICAgIDB4QzZCRnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFDYWxpYnJhdGlvblNpZ25hdHVyZQorICAgICAgICAiQ2FtZXJhQ2FsaWJyYXRpb25TaWduYXR1cmUiLAorICAgICAgICAweEM2RjN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUNhbGlicmF0aW9uU2lnbmF0dXJlCisgICAgICAgICJQcm9maWxlQ2FsaWJyYXRpb25TaWduYXR1cmUiLAorICAgICAgICAweEM2RjR1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXh0cmFDYW1lcmFQcm9maWxlcworICAgICAgICAiRXh0cmFDYW1lcmFQcm9maWxlcyIsCisgICAgICAgIDB4QzZGNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdFByb2ZpbGVOYW1lCisgICAgICAgICJBc1Nob3RQcm9maWxlTmFtZSIsCisgICAgICAgIDB4QzZGNnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOb2lzZVJlZHVjdGlvbkFwcGxpZWQKKyAgICAgICAgIk5vaXNlUmVkdWN0aW9uQXBwbGllZCIsCisgICAgICAgIDB4QzZGN3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVOYW1lCisgICAgICAgICJQcm9maWxlTmFtZSIsCisgICAgICAgIDB4QzZGOHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGltcworICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERpbXMiLAorICAgICAgICAweEM2Rjl1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGF0YTEKKyAgICAgICAgIlByb2ZpbGVIdWVTYXRNYXBEYXRhMSIsCisgICAgICAgIDB4QzZGQXUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlSHVlU2F0TWFwRGF0YTIKKyAgICAgICAgIlByb2ZpbGVIdWVTYXRNYXBEYXRhMiIsCisgICAgICAgIDB4QzZGQnUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlVG9uZUN1cnZlCisgICAgICAgICJQcm9maWxlVG9uZUN1cnZlIiwKKyAgICAgICAgMHhDNkZDdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVFbWJlZFBvbGljeQorICAgICAgICAiUHJvZmlsZUVtYmVkUG9saWN5IiwKKyAgICAgICAgMHhDNkZEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUNvcHlyaWdodAorICAgICAgICAiUHJvZmlsZUNvcHlyaWdodCIsCisgICAgICAgIDB4QzZGRXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGb3J3YXJkTWF0cml4MQorICAgICAgICAiRm9yd2FyZE1hdHJpeDEiLAorICAgICAgICAweEM3MTR1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvcndhcmRNYXRyaXgyCisgICAgICAgICJGb3J3YXJkTWF0cml4MiIsCisgICAgICAgIDB4QzcxNXUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0FwcGxpY2F0aW9uTmFtZQorICAgICAgICAiUHJldmlld0FwcGxpY2F0aW9uTmFtZSIsCisgICAgICAgIDB4QzcxNnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3QXBwbGljYXRpb25WZXJzaW9uCisgICAgICAgICJQcmV2aWV3QXBwbGljYXRpb25WZXJzaW9uIiwKKyAgICAgICAgMHhDNzE3dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByZXZpZXdTZXR0aW5nc05hbWUKKyAgICAgICAgIlByZXZpZXdTZXR0aW5nc05hbWUiLAorICAgICAgICAweEM3MTh1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld1NldHRpbmdzRGlnZXN0CisgICAgICAgICJQcmV2aWV3U2V0dGluZ3NEaWdlc3QiLAorICAgICAgICAweEM3MTl1LAorICAgICAgICBCWVRFLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0NvbG9yU3BhY2UKKyAgICAgICAgIlByZXZpZXdDb2xvclNwYWNlIiwKKyAgICAgICAgMHhDNzFBdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld0RhdGVUaW1lCisgICAgICAgICJQcmV2aWV3RGF0ZVRpbWUiLAorICAgICAgICAweEM3MUJ1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmF3SW1hZ2VEaWdlc3QKKyAgICAgICAgIlJhd0ltYWdlRGlnZXN0IiwKKyAgICAgICAgMHhDNzFDdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZURpZ2VzdAorICAgICAgICAiT3JpZ2luYWxSYXdGaWxlRGlnZXN0IiwKKyAgICAgICAgMHhDNzFEdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN1YlRpbGVCbG9ja1NpemUKKyAgICAgICAgIlN1YlRpbGVCbG9ja1NpemUiLAorICAgICAgICAweEM3MUV1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJvd0ludGVybGVhdmVGYWN0b3IKKyAgICAgICAgIlJvd0ludGVybGVhdmVGYWN0b3IiLAorICAgICAgICAweEM3MUZ1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVEaW1zCisgICAgICAgICJQcm9maWxlTG9va1RhYmxlRGltcyIsCisgICAgICAgIDB4QzcyNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAzLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVEYXRhCisgICAgICAgICJQcm9maWxlTG9va1RhYmxlRGF0YSIsCisgICAgICAgIDB4QzcyNnUsCisgICAgICAgIEZMT0FULAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MQorICAgICAgICAiT3Bjb2RlTGlzdDEiLAorICAgICAgICAweEM3NDB1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MgorICAgICAgICAiT3Bjb2RlTGlzdDIiLAorICAgICAgICAweEM3NDF1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBPcGNvZGVMaXN0MworICAgICAgICAiT3Bjb2RlTGlzdDMiLAorICAgICAgICAweEM3NEV1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBOb2lzZVByb2ZpbGUKKyAgICAgICAgIk5vaXNlUHJvZmlsZSIsCisgICAgICAgIDB4Qzc2MXUsCisgICAgICAgIERPVUJMRSwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0VXNlckNyb3AKKyAgICAgICAgIkRlZmF1bHRVc2VyQ3JvcCIsCisgICAgICAgIDB4QzdCNXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRCbGFja1JlbmRlcgorICAgICAgICAiRGVmYXVsdEJsYWNrUmVuZGVyIiwKKyAgICAgICAgMHhDN0E2dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmFzZWxpbmVFeHBvc3VyZU9mZnNldAorICAgICAgICAiQmFzZWxpbmVFeHBvc3VyZU9mZnNldCIsCisgICAgICAgIDB4QzdBNXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlTG9va1RhYmxlRW5jb2RpbmcKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVFbmNvZGluZyIsCisgICAgICAgIDB4QzdBNHUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBFbmNvZGluZworICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcEVuY29kaW5nIiwKKyAgICAgICAgMHhDN0EzdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxEZWZhdWx0RmluYWxTaXplCisgICAgICAgICJPcmlnaW5hbERlZmF1bHRGaW5hbFNpemUiLAorICAgICAgICAweEM3OTF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbEJlc3RRdWFsaXR5RmluYWxTaXplCisgICAgICAgICJPcmlnaW5hbEJlc3RRdWFsaXR5RmluYWxTaXplIiwKKyAgICAgICAgMHhDNzkydSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxEZWZhdWx0Q3JvcFNpemUKKyAgICAgICAgIk9yaWdpbmFsRGVmYXVsdENyb3BTaXplIiwKKyAgICAgICAgMHhDNzkzdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTmV3UmF3SW1hZ2VEaWdlc3QKKyAgICAgICAgIk5ld1Jhd0ltYWdlRGlnZXN0IiwKKyAgICAgICAgMHhDN0E3dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJhd1RvUHJldmlld0dhaW4KKyAgICAgICAgIlJhd1RvUHJldmlld0dhaW4iLAorICAgICAgICAweEM3QTh1LAorICAgICAgICBET1VCTEUsCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX1RBR19ERUZJTklUSU9OX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfRU5UUlkKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfRU5UUlkKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKyNkZWZpbmUgQ09NUEFSRV9ERUYob3ApIFwKK2lubGluZSBib29sIG9wZXJhdG9yIG9wIChjb25zdCBUaWZmRW50cnkmIGVudHJ5KSBjb25zdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgc2luZ2xlIFRJRkYgSUZEIGVudHJ5LgorICoKKyAqIFN1YmNsYXNzZXMgYXJlIGV4cGVjdGVkIHRvIHN1cHBvcnQgYXNzaWdubWVudCBhbmQgY29weWluZyBvcGVyYXRpb25zLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmRW50cnkgOiBwdWJsaWMgVGlmZldyaXRhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflRpZmZFbnRyeSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgMTItYnl0ZSBJRkQgZW50cnkgdG8gdGhlIG91dHB1dC4gVGhlIGdpdmVuIG9mZnNldCB3aWxsIGJlCisgICAgICAgICAqIHNldCBhcyB0aGUgdGFnIHZhbHVlIGlmIHRoZSBzaXplIG9mIHRoZSB0YWcgdmFsdWUgZXhjZWVkcyB0aGUgbWF4CisgICAgICAgICAqIHNpemUgZm9yIHRoZSBUSUZGIFZhbHVlIGZpZWxkICg0IGJ5dGVzKSwgYW5kIHNob3VsZCBiZSB3b3JkIGFsaWduZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGNvdW50IHNldCBmb3IgdGhpcyBlbnRyeS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBDb3VudAorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q291bnQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdGFnIGlkIHNldCBmb3IgdGhpcyBlbnRyeS4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBUYWcKKyAgICAgICAgICogZmllbGQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQxNl90IGdldFRhZygpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0eXBlIHNldCBmb3IgdGhpcyBlbnRyeS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFRJRkYgVHlwZQorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgVGFnVHlwZSBnZXRUeXBlKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlZmluZWQgZW5kaWFubmVzcyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgaXMgZGVmaW5lZCwKKyAgICAgICAgICogdGhlIHRhZyB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gd2l0aCB0aGUgZ2l2ZW4gYnl0ZSBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgRW5kaWFubmVzcyBnZXRFbmRpYW5uZXNzKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciB0aGlzIGVudHJ5LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBWYWx1ZQorICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSB2YWx1ZSBpcyBOVUxMLCBvciBpZiB0aGUgdHlwZSB1c2VkIGRvZXMgbm90CisgICAgICAgICAqIG1hdGNoIHRoZSB0eXBlIG9mIHRoaXMgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgY29uc3QgVCogZ2V0RGF0YSgpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3JjZSB0aGUgdHlwZSB1c2VkIGhlcmUgdG8gYmUgYSB2YWxpZCBUSUZGIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgTlVMTCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgTlVMTCwgb3IgaWYgdGhlIHR5cGUgZ2l2ZW4gZG9lcworICAgICAgICAgKiBub3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGdpdmVuLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIGNvbnN0IFQqIGZvcmNlVmFsaWRUeXBlKFRhZ1R5cGUgdHlwZSwgY29uc3QgVCogdmFsdWUpOworCisgICAgICAgIHZpcnR1YWwgY29uc3Qgdm9pZCogZ2V0RGF0YUhlbHBlcigpIGNvbnN0ID0gMDsKKworICAgICAgICBDT01QQVJFX0RFRig+KQorICAgICAgICBDT01QQVJFX0RFRig8KQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIID0gMjU2CisgICAgICAgIH07Cit9OworCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgVGlmZkVudHJ5OjpvcGVyYXRvciBvcCAoY29uc3QgVGlmZkVudHJ5JiBlbnRyeSkgY29uc3QgeyBcCisgICAgcmV0dXJuIGdldENvbXBhcmFibGVWYWx1ZSgpIG9wIGVudHJ5LmdldENvbXBhcmFibGVWYWx1ZSgpOyBcCit9CisKK0NPTVBBUkUoPikKK0NPTVBBUkUoPCkKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3QgVCogVGlmZkVudHJ5OjpnZXREYXRhKCkgY29uc3QgeworICAgIGNvbnN0IFQqIHZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oZ2V0RGF0YUhlbHBlcigpKTsKKyAgICByZXR1cm4gZm9yY2VWYWxpZFR5cGU8VD4oZ2V0VHlwZSgpLCB2YWx1ZSk7Cit9CisKKyN1bmRlZiBDT01QQVJFCisjdW5kZWYgQ09NUEFSRV9ERUYKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfRU5UUlkqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnlJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjY2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnlJbXBsLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfRU5UUllfSU1QTAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZklmZC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVGlmZkVudHJ5SW1wbCA6IHB1YmxpYyBUaWZmRW50cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZkVudHJ5SW1wbCh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwgdWludDMyX3QgY291bnQsIEVuZGlhbm5lc3MgZW5kLCBjb25zdCBUKiBkYXRhKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZkVudHJ5SW1wbCgpOworCisgICAgICAgIHN0YXR1c190IHdyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHdyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisKKyAgICAgICAgdWludDMyX3QgZ2V0Q291bnQoKSBjb25zdDsKKyAgICAgICAgdWludDE2X3QgZ2V0VGFnKCkgY29uc3Q7CisgICAgICAgIFRhZ1R5cGUgZ2V0VHlwZSgpIGNvbnN0OworICAgICAgICBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSBjb25zdDsKKyAgICAgICAgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IHZvaWQqIGdldERhdGFIZWxwZXIoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZ2V0QWN0dWFsU2l6ZSgpIGNvbnN0OworCisgICAgICAgIHVpbnQxNl90IG1UYWc7CisgICAgICAgIHVpbnQxNl90IG1UeXBlOworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIEVuZGlhbm5lc3MgbUVuZDsKKyAgICAgICAgVmVjdG9yPFQ+IG1EYXRhOworCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGlmZkVudHJ5SW1wbDxUPjo6VGlmZkVudHJ5SW1wbCh1aW50MTZfdCB0YWcsIFRhZ1R5cGUgdHlwZSwgdWludDMyX3QgY291bnQsIEVuZGlhbm5lc3MgZW5kLAorICAgICAgICBjb25zdCBUKiBkYXRhKQorICAgICAgICA6IG1UYWcodGFnKSwgbVR5cGUoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHR5cGUpKSwgbUNvdW50KGNvdW50KSwgbUVuZChlbmQpIHsKKyAgICBjb3VudCA9ICh0eXBlID09IFJBVElPTkFMIHx8IHR5cGUgPT0gU1JBVElPTkFMKSA/IGNvdW50ICogMiA6IGNvdW50OworICAgIHNzaXplX3QgaW5kZXggPSBtRGF0YS5hcHBlbmRBcnJheShkYXRhLCBjb3VudCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICIlczogQ291bGQgbm90IGFsbG9jYXRlIHZlY3RvciBmb3IgZGF0YS4iLCBfX0ZVTkNUSU9OX18pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGlmZkVudHJ5SW1wbDxUPjo6flRpZmZFbnRyeUltcGwoKSB7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db3VudDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3VpbnQxNl90IFRpZmZFbnRyeUltcGw8VD46OmdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1RhZ1R5cGUgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnVHlwZT4obVR5cGUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgdm9pZCogVGlmZkVudHJ5SW1wbDxUPjo6Z2V0RGF0YUhlbHBlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4obURhdGEuYXJyYXkoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzaXplX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IGdldEFjdHVhbFNpemUoKTsKKyAgICBXT1JEX0FMSUdOKHRvdGFsKQorICAgIHJldHVybiAodG90YWwgPD0gT0ZGU0VUX1NJWkUpID8gMCA6IHRvdGFsOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0QWN0dWFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IHNpemVvZihUKSAqIG1Db3VudDsKKyAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgLy8gMiBpbnRzIHN0b3JlZCBmb3IgZWFjaCByYXRpb25hbCwgbXVsdGlwbHkgYnkgMgorICAgICAgICB0b3RhbCA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorRW5kaWFubmVzcyBUaWZmRW50cnlJbXBsPFQ+OjpnZXRFbmRpYW5uZXNzKCkgY29uc3QgeworICAgIHJldHVybiBtRW5kOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDMyX3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtVGFnOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgYXNzZXJ0KChvZmZzZXQgJSBUSUZGX1dPUkRfU0laRSkgPT0gMCk7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UYWcsIDAsIDEpLCByZXQpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtVHlwZSwgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1Db3VudCwgMCwgMSksIHJldCk7CisKKyAgICB1aW50MzJfdCBkYXRhU2l6ZSA9IGdldEFjdHVhbFNpemUoKTsKKyAgICBpZiAoZGF0YVNpemUgPiBPRkZTRVRfU0laRSkgeworICAgICAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmb2Zmc2V0LCAwLCAxKSwgcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IG1Db3VudDsKKyAgICAgICAgaWYgKGdldFR5cGUoKSA9PSBSQVRJT05BTCB8fCBnZXRUeXBlKCkgPT0gU1JBVElPTkFMKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJhdGlvbmFscyBhcmUgc3RvcmVkIGFzIGFuIGFycmF5IG9mIGludHMuICBFYWNoCisgICAgICAgICAgICAgKiByYXRpb25hbCBpcyByZXByZXNlbnRlZCBieSAyIGludHMuICBUbyByZWNvdmVyIHRoZQorICAgICAgICAgICAgICogc2l6ZSBvZiB0aGUgYXJyYXkgaGVyZSwgbXVsdGlwbHkgdGhlIGNvdW50IGJ5IDIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvdW50IDw8PSAxOworICAgICAgICB9CisgICAgICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKG1EYXRhLmFycmF5KCksIDAsIGNvdW50KSwgcmV0KTsKKyAgICAgICAgWkVST19USUxMX1dPUkQob3V0LCBkYXRhU2l6ZSwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZFbnRyeUltcGw8VD46OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIEVuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisKKyAgICAvLyBTb21lIHRhZ3MgaGF2ZSBmaXhlZC1lbmRpYW4gdmFsdWUgb3V0cHV0CisgICAgRW5kaWFubmVzcyB0bXAgPSBVTkRFRklORURfRU5ESUFOOworICAgIGlmIChtRW5kICE9IFVOREVGSU5FRF9FTkRJQU4pIHsKKyAgICAgICAgdG1wID0gb3V0LT5nZXRFbmRpYW5uZXNzKCk7CisgICAgICAgIG91dC0+c2V0RW5kaWFubmVzcyhtRW5kKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IG1Db3VudDsKKyAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJhdGlvbmFscyBhcmUgc3RvcmVkIGFzIGFuIGFycmF5IG9mIGludHMuICBFYWNoCisgICAgICAgICAqIHJhdGlvbmFsIGlzIHJlcHJlc2VudGVkIGJ5IDIgaW50cy4gIFRvIHJlY292ZXIgdGhlCisgICAgICAgICAqIHNpemUgb2YgdGhlIGFycmF5IGhlcmUsIG11bHRpcGx5IHRoZSBjb3VudCBieSAyLgorICAgICAgICAgKi8KKyAgICAgICAgY291bnQgPDw9IDE7CisgICAgfQorCisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUobURhdGEuYXJyYXkoKSwgMCwgY291bnQpLCByZXQpOworCisgICAgaWYgKG1FbmQgIT0gVU5ERUZJTkVEX0VORElBTikgeworICAgICAgICBvdXQtPnNldEVuZGlhbm5lc3ModG1wKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byBuZXh0IHdvcmQgYWxpZ25tZW50CisgICAgWkVST19USUxMX1dPUkQob3V0LCBzaXplb2YoVCkgKiBjb3VudCwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxzcDxUaWZmSWZkPiA+Ojp3cml0ZVRhZ0luZm8odWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVRhZywgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UeXBlLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbUNvdW50LCAwLCAxKSwgcmV0KTsKKworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZvZmZzZXQsIDAsIDEpLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50MzJfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OmdldEFjdHVhbFNpemUoKSBjb25zdCB7CisgICAgdWludDMyX3QgdG90YWwgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURhdGEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gbURhdGFbaV0tPmdldFNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxzcDxUaWZmSWZkPiA+Ojp3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCBFbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ291bnQ7ICsraSkgeworICAgICAgICBCQUlMX09OX0ZBSUwobURhdGFbaV0tPndyaXRlRGF0YShvZmZzZXQsIG91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBtRGF0YVtpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkhlbHBlcnMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjllNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkhlbHBlcnMuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfSEVMUEVSU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK2NvbnN0IHVpbnQ4X3QgWkVST19XT1JEW10gPSB7MCwgMCwgMCwgMH07CisKKyNkZWZpbmUgQkFJTF9PTl9GQUlMKHgsIGZsYWcpIFwKKyAgICBpZiAoKGZsYWcgPSAoeCkpICE9IE9LKSByZXR1cm4gZmxhZzsKKworI2RlZmluZSBCWVRFU19USUxMX1dPUkQoaW5kZXgpIFwKKyAgICAoKFRJRkZfV09SRF9TSVpFIC0gKChpbmRleCkgJSBUSUZGX1dPUkRfU0laRSkpICUgVElGRl9XT1JEX1NJWkUpCisKKyNkZWZpbmUgV09SRF9BTElHTihjb3VudCkgXAorICAgIGNvdW50ICs9IEJZVEVTX1RJTExfV09SRChjb3VudCk7CisKKyNkZWZpbmUgWkVST19USUxMX1dPUkQob3V0cHV0LCBpbmRleCwgcmV0KSBcCisgICAgeyBcCisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBCWVRFU19USUxMX1dPUkQoaW5kZXgpOyBcCisgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7IFwKKyAgICAgICAgICAgIEJBSUxfT05fRkFJTCgob3V0cHV0KS0+d3JpdGUoWkVST19XT1JELCAwLCByZW1haW5pbmcpLCByZXQpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworLyoqCisgKiBCYXNpYyBUSUZGIGhlYWRlciBjb25zdGFudHMuCisgKi8KK2VudW0geworICAgIEJBRF9PRkZTRVQgPSAwLAorICAgIFRJRkZfV09SRF9TSVpFID0gNCwgLy8gU2l6ZSBpbiBieXRlcworICAgIElGRF9IRUFERVJfU0laRSA9IDIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBJRkRfRk9PVEVSX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9FTlRSWV9TSVpFID0gMTIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBNQVhfSUZEX0VOVFJJRVMgPSBVSU5UMTZfTUFYLAorICAgIEZJTEVfSEVBREVSX1NJWkUgPSA4LCAvLyBTaXplIGluIGJ5dGVzCisgICAgRU5ESUFOX01BUktFUl9TSVpFID0gMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIFRJRkZfTUFSS0VSX1NJWkUgPSAyLCAvLyBTaXplIGluIGJ5dGVzCisgICAgT0ZGU0VUX01BUktFUl9TSVpFID0gNCwgLy8gU2l6ZSBpbiBieXRlcworICAgIFRJRkZfRklMRV9NQVJLRVIgPSA0MiwKKyAgICBCSUdfRU5ESUFOX01BUktFUiA9IDB4NEQ0RHUsCisgICAgTElUVExFX0VORElBTl9NQVJLRVIgPSAweDQ5NDl1Cit9OworCisvKioKKyAqIENvbnN0YW50cyBmb3IgdGhlIFRJRkYgdGFnIHR5cGVzLgorICovCitlbnVtIFRhZ1R5cGUgeworICAgIFVOS05PV05fVEFHVFlQRSA9IDAsCisgICAgQllURT0xLAorICAgIEFTQ0lJLAorICAgIFNIT1JULAorICAgIExPTkcsCisgICAgUkFUSU9OQUwsCisgICAgU0JZVEUsCisgICAgVU5ERUZJTkVELAorICAgIFNTSE9SVCwKKyAgICBTTE9ORywKKyAgICBTUkFUSU9OQUwsCisgICAgRkxPQVQsCisgICAgRE9VQkxFCit9OworCisvKioKKyAqIFNpemVzIG9mIHRoZSBUSUZGIGVudHJ5IGZpZWxkcyAoaW4gYnl0ZXMpLgorICovCitlbnVtIHsKKyAgICBUQUdfU0laRSA9IDIsCisgICAgVFlQRV9TSVpFID0gMiwKKyAgICBDT1VOVF9TSVpFID0gNCwKKyAgICBPRkZTRVRfU0laRSA9IDQKK307CisKKy8qKgorICogQ29udmVuaWVuY2UgSUZEIGlkIGNvbnN0YW50cy4KKyAqLworZW51bSB7CisgICAgSUZEXzAgPSAwLAorICAgIFJBV19JRkQsCisgICAgUFJPRklMRV9JRkQsCisgICAgUFJFVklFV19JRkQKK307CisKK2lubGluZSBzaXplX3QgZ2V0VHlwZVNpemUoVGFnVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBVTkRFRklORUQ6CisgICAgICAgIGNhc2UgQVNDSUk6CisgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgY2FzZSBTQllURToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICBjYXNlIFNTSE9SVDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIExPTkc6CisgICAgICAgIGNhc2UgU0xPTkc6CisgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgY2FzZSBSQVRJT05BTDoKKyAgICAgICAgY2FzZSBTUkFUSU9OQUw6CisgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuIDg7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2lubGluZSB1aW50MzJfdCBjYWxjdWxhdGVJZmRTaXplKHNpemVfdCBudW1iZXJPZkVudHJpZXMpIHsKKyAgICByZXR1cm4gSUZEX0hFQURFUl9TSVpFICsgSUZEX0ZPT1RFUl9TSVpFICsgVElGRl9FTlRSWV9TSVpFICogbnVtYmVyT2ZFbnRyaWVzOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSWZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNWM5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSWZkLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfSUZEX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfSUZEX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGhpcyBjbGFzcyBob2xkcyBhIHNpbmdsZSBUSUZGIEltYWdlIEZpbGUgRGlyZWN0b3J5IChJRkQpIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIG1hcHMgdG8gdGhlIFRJRkYgSUZEIHN0cnVjdHVyZSB0aGF0IGlzIGxvZ2ljYWxseSBjb21wb3NlZCBvZjoKKyAqIC0gQSAyLWJ5dGUgZmllbGQgbGlzdGluZyB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCisgKiAtIEEgbGlzdCBvZiAxMi1ieXRlIFRJRkYgZW50cmllcy4KKyAqIC0gQSA0LWJ5dGUgb2Zmc2V0IHRvIHRoZSBuZXh0IElGRC4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgVGlmZklmZCA6IHB1YmxpYyBUaWZmV3JpdGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZklmZCh1aW50MzJfdCBpZmRJZCk7CisgICAgICAgIHZpcnR1YWwgflRpZmZJZmQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgVGlmZkVudHJ5IHRvIHRoaXMgSUZEIG9yIHJlcGxhY2UgYW4gZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUKKyAgICAgICAgICogc2FtZSB0YWcgSUQuICBObyB2YWxpZGF0aW9uIGlzIGRvbmUuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IElGRC4gIFRoaXMgaXMgdXNlZCB0byBjcmVhdGUgYSBsaW5rZWQKKyAgICAgICAgICogbGlzdCBvZiBJRkRzIGFzIGRlZmluZWQgYnkgdGhlIFRJRkYgNi4wIHNwZWMuLCBhbmQgaXMgbm90IGluY2x1ZGVkCisgICAgICAgICAqIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHNpemUgb2YgSUZEIGFuZCBlbnRyaWVzIGZvciB0aGUgZ2V0U2l6ZSgpCisgICAgICAgICAqIG1ldGhvZCAodW5saWtlIFN1YklGRHMpLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldE5leHRJZmQoY29uc3Qgc3A8VGlmZklmZD4mIGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBJRkQsIG9yIE5VTEwgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZJZmQ+IGdldE5leHRJZmQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgdGhlIElGRCBkYXRhLiAgVGhpcyBpbmNsdWRlcyB0aGUgSUZEIGhlYWRlciwgZW50cmllcywgZm9vdGVyLAorICAgICAgICAgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBlYWNoIGVudHJ5IChyZWN1cnNpdmVseSBpbmNsdWRpbmcKKyAgICAgICAgICogc3ViLUlGRHMpLiAgVGhlIHdyaXR0ZW4gYW1vdW50IHNob3VsZCBlbmQgb24gYSB3b3JkIGJvdW5kYXJ5LCBhbmQKKyAgICAgICAgICogdGhlIGdpdmVuIG9mZnNldCBzaG91bGQgYmUgd29yZCBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIElGRC4gVGhpcyBpbmNsdWRlcyB0aGUgSUZEIGhlYWRlciwgZW50cmllcywgZm9vdGVyLAorICAgICAgICAgKiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciBlYWNoIGVudHJ5IChyZWN1cnNpdmVseSBpbmNsdWRpbmcKKyAgICAgICAgICogYW55IHN1Yi1JRkRzKS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBpZCBvZiB0aGlzIElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SWQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGFuIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBlbnRyeSBpZiBpdCBleGlzdHMsIG9yIGFuIGVtcHR5IHN0cm9uZworICAgICAgICAgKiBwb2ludGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzcDxUaWZmRW50cnk+IGdldEVudHJ5KHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCByZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gdmFsaWRhdGUgYW5kIHNldCBzdHJpcC1yZWxhdGVkIGltYWdlIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc2V0cyBhbGwgc3RyaXAgcmVsYXRlZCB0YWdzLCBidXQgbGVhdmVzIG9mZnNldCB2YWx1ZXMgdW5pdGlhbGl6ZWQuCisgICAgICAgICAqIHNldFN0cmlwT2Zmc2V0cyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIG9mZnNldCBiZWZvcmUgd3JpdGluZy4KKyAgICAgICAgICogVGhlIHN0cmlwIHRhZyB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZXhpc3RpbmcgdGFncyBmb3IgaW1hZ2UKKyAgICAgICAgICogZGltZW5zaW9ucyBhbmQgcGl4ZWwgdHlwZSBzZXQgaW4gdGhlIElGRC4KKyAgICAgICAgICoKKyAgICAgICAgICogRG9lcyBub3QgaGFuZGxlIHBsYW5hciBpbWFnZSBjb25maWd1cmF0aW9ucyAoUGxhbmFyQ29uZmlndXJhdGlvbiAhPSAxKS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0ZUFuZFNldFN0cmlwVGFncyBoYXMgYmVlbiBjYWxsZWQsIGJ1dCBub3Qgc2V0U3RyaXBPZmZzZXRzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBib29sIHVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzZXQgYmVnaW5uaW5nIG9mZnNldCBmb3Igc3RyaXBzLgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsIHRoaXMgdG8gdXBkYXRlIHRoZSBzdHJpcCBvZmZzZXRzIGJlZm9yZSBjYWxsaW5nIHdyaXRlRGF0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmlwT2Zmc2V0KHVpbnQzMl90IG9mZnNldCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgc3RyaXBzIGluIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHN1bXMgdGhlIGJ5dGUgY291bnQgYXQgZWFjaCBzdHJpcCBvZmZzZXQsIGFuZCByZXR1cm5zCisgICAgICAgICAqIHRoZSB0b3RhbCBjb3VudCBvZiBieXRlcyBzdG9yZWQgaW4gc3RyaXBzIGZvciB0aGlzIElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyaXBTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50IGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBJRkQgdG8gbG9nY2F0LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBsb2coKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHZhbHVlIHVzZWQgdG8gZGV0ZXJtaW5lIHNvcnQgb3JkZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbXBhcmFibGVWYWx1ZSgpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGNoZWNrQW5kR2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3Q7CisgICAgICAgIFNvcnRlZEVudHJ5VmVjdG9yIG1FbnRyaWVzOworICAgICAgICBzcDxUaWZmSWZkPiBtTmV4dElmZDsKKyAgICAgICAgdWludDMyX3QgbUlmZElkOworICAgICAgICBib29sIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZDsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0lGRF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGFibGUuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJjZWNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUKKworI2luY2x1ZGUgPGltZ191dGlscy9PcmRlcmFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFRpZmZXcml0YWJsZSBzdWJjbGFzc2VzIHJlcHJlc2VudCBUSUZGIG1ldGFkYXRhIG9iamVjdHMgdGhhdCBjYW4gYmUgd3JpdHRlbgorICogdG8gYW4gRW5kaWFuT3V0cHV0IG9iamVjdC4gIFRoaXMgaXMgdXNlZCBmb3IgVElGRiBlbnRyaWVzIGFuZCBJRkRzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmV3JpdGFibGUgOiBwdWJsaWMgT3JkZXJhYmxlLCBwdWJsaWMgTGlnaHRSZWZCYXNlPFRpZmZXcml0YWJsZT4geworICAgIHB1YmxpYzoKKyAgICAgICAgVGlmZldyaXRhYmxlKCk7CisgICAgICAgIHZpcnR1YWwgflRpZmZXcml0YWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0LiBUaGUgZ2l2ZW4gb2Zmc2V0IGlzIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgICAgICAqIHRoZSBoZWFkZXIgb2Zmc2V0IGZvciB2YWx1ZXMgd3JpdHRlbi4gIFRoZSBvZmZzZXQgaXMgZGVmaW5lZAorICAgICAgICAgKiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUSUZGIGhlYWRlciwgYW5kIGlzIHdvcmQgYWxpZ25lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byB3cml0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCA9IDA7CisKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX1dSSVRBQkxFKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRlci5oCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX1dSSVRFUl9ICisjZGVmaW5lIElNR19VVElMU19USUZGX1dSSVRFUl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvU3RyaXBTb3VyY2UuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY2xhc3MgVGlmZkVudHJ5OworY2xhc3MgVGlmZklmZDsKK2NsYXNzIE91dHB1dDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgY29sbGVjdGlvbiBvZiBUSUZGIElGRHMgdGhhdCBjYW4gYmUgd3JpdHRlbiBhcyBhCisgKiBjb21wbGV0ZSBETkcgZmlsZSBoZWFkZXIuCisgKgorICogVGhpcyBtYXBzIHRvIHRoZSBUSUZGIGhlYWRlciBzdHJ1Y3R1cmUgdGhhdCBpcyBsb2dpY2FsbHkgY29tcG9zZWQgb2Y6CisgKiAtIEFuIDgtYnl0ZSBmaWxlIGhlYWRlciBjb250YWluaW5nIGFuIGVuZGlhbm5lc3MgaW5kaWNhdG9yLCB0aGUgVElGRgorICogICBmaWxlIG1hcmtlciwgYW5kIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IElGRC4KKyAqIC0gQSBsaXN0IG9mIFRJRkYgSUZEIHN0cnVjdHVyZXMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZXcml0ZXIgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFRpZmZXcml0ZXI+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gU3ViSWZkVHlwZSB7CisgICAgICAgICAgICBTVUJJRkQgPSAwLAorICAgICAgICAgICAgR1BTSU5GTworICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVGlmZldyaXRlciB3aXRoIHRoZSBkZWZhdWx0IHRhZyBtYXBwaW5ncy4gVGhpcyBlbmFibGVzCisgICAgICAgICAqIGFsbCBvZiB0aGUgdGFncyBkZWZpbmVkIGluIFRhZ0RlZmluaXRpb25zLmgsIGFuZCB1c2VzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICogbWFwcGluZyBwcmVjZWRlbmNlIHRvIHJlc29sdmUgY29sbGlzaW9uczoKKyAgICAgICAgICogKGhpZ2hlc3QgcHJlY2VkZW5jZSkgVElGRi9FUCA+IERORyA+IEVYSUYgMi4zID4gVElGRiA2LjAKKyAgICAgICAgICovCisgICAgICAgIFRpZmZXcml0ZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIFRpZmZXcml0ZXIgd2l0aCB0aGUgZ2l2ZW4gdGFnIG1hcHBpbmdzLiAgVGhlIG1hcHBpbmcKKyAgICAgICAgICogcHJlY2VkZW5jZSB3aWxsIGJlIGluIHRoZSBvcmRlciB0aGF0IHRoZSBkZWZpbml0aW9uIG1hcHMgYXJlIGdpdmVuLAorICAgICAgICAgKiB3aGVyZSB0aGUgbG93ZXIgaW5kZXggbWFwIGdldHMgcHJlY2VkZW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCB3aXRoIHVzZXItZGVmaW5lZCBkZWZpbml0aW9ucywgb3IgZGVmaW5pdGlvbnMgZm9ybQorICAgICAgICAgKiBUYWdEZWZpbml0aW9ucy5oCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBlbmFibGVkRGVmaW5pdGlvbnMgbWFwcGluZyBvYmplY3QgaXMgb3duZWQgYnkgdGhlIGNhbGxlciwgYW5kIG11c3QKKyAgICAgICAgICogc3RheSBhbGl2ZSBmb3IgdGhlIGxpZmVzcGFuIG9mIHRoZSBjb25zdHJ1Y3RlZCBUaWZmV3JpdGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIFRpZmZXcml0ZXIoS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+KiBlbmFibGVkRGVmaW5pdGlvbnMsCisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7CisKKyAgICAgICAgdmlydHVhbCB+VGlmZldyaXRlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBhIFRJRkYgaGVhZGVyIGNvbnRhaW5pbmcgZWFjaCBJRkQgc2V0LiAgVGhpcyB3aWxsIHJlY3Vyc2l2ZWx5CisgICAgICAgICAqIHdyaXRlIGFsbCBTdWJJRkRzIGFuZCB0YWdzLgorICAgICAgICAgKgorICAgICAgICAgKiBBbnkgU3RyaXBTb3VyY2VzIHBhc3NlZCBpbiB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBhcyBpbWFnZSBzdHJpcHMKKyAgICAgICAgICogYXQgdGhlIGFwcHJvcHJpYXRlIG9mZmVzdHMuICBUaGUgU3RyaXBCeXRlQ291bnRzLCBSb3dzUGVyU3RyaXAsIGFuZAorICAgICAgICAgKiBTdHJpcE9mZnNldHMgdGFncyBtdXN0IGJlIHNldCB0byB1c2UgdGhpcy4gIFRvIHNldCB0aGVzZSB0YWdzIGluIGEKKyAgICAgICAgICogZ2l2ZW4gSUZELCB1c2UgdGhlIGFkZFN0cmlwIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoT3V0cHV0KiBvdXQsIFN0cmlwU291cmNlKiogc291cmNlcywgc2l6ZV90IHNvdXJjZXNDb3VudCwKKyAgICAgICAgICAgICAgICBFbmRpYW5uZXNzIGVuZCA9IExJVFRMRSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGEgVElGRiBoZWFkZXIgY29udGFpbmluZyBlYWNoIElGRCBzZXQuICBUaGlzIHdpbGwgcmVjdXJzaXZlbHkKKyAgICAgICAgICogd3JpdGUgYWxsIFN1YklGRHMgYW5kIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIEltYWdlIGRhdGEgZm9yIHN0cmlwcyBvciB0aWxlcyBtdXN0IGJlIHdyaXR0ZW4gc2VwYXJhdGVseSBhdCB0aGUKKyAgICAgICAgICogYXBwcm9wcmlhdGUgb2Zmc2V0cy4gIFRoZXNlIG9mZnNldHMgbXVzdCBub3QgZmFsbCB3aXRoaW4gdGhlIGZpbGUKKyAgICAgICAgICogaGVhZGVyIHdyaXR0ZW4gdGhpcyB3YXkuICBUaGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHdyaXR0ZW4gaXMgZ2l2ZW4KKyAgICAgICAgICogYnkgdGhlIGdldFRvdGFsU2l6ZSgpIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoT3V0cHV0KiBvdXQsIEVuZGlhbm5lc3MgZW5kID0gTElUVExFKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSBUSUZGIGhlYWRlci4gIFRoaXMgaW5jbHVkZXMgYWxsCisgICAgICAgICAqIElGRHMsIHRhZ3MsIGFuZCB2YWx1ZXMgc2V0IGZvciB0aGlzIFRpZmZXcml0ZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFRvdGFsU2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYW4gZW50cnkgdG8gdGhlIElGRCB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVmFsaWQKKyAgICAgICAgICogZXJyb3IgY29kZXMgZm9yIHRoaXMgbWV0aG9kIGFyZToKKyAgICAgICAgICogLSBCQURfSU5ERVggLSBUaGUgZ2l2ZW4gdGFnIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqIC0gQkFEX1ZBTFVFIC0gVGhlIGdpdmVuIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvdW50IGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoaXMgdGFnLgorICAgICAgICAgKiAtIEJBRF9UWVBFICAtIFRoZSB0eXBlIG9mIHRoZSBnaXZlbiBkYXRhIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB0eXBlIHJlcXVpcmVkIGZvciB0aGlzIHRhZy4KKyAgICAgICAgICogLSBOQU1FX05PVF9GT1VORCAtIE5vIGlmZCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5LCB1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbiBlbnRyeSBmb3IgYSBrbm93biB0YWcgYW5kIGFkZCBpdCB0byB0aGUgSUZEIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKiBUaGlzIHRhZyBtdXN0IGJlIGRlZmluZWQgaW4gb25lIG9mIHRoZSBkZWZpbml0aW9uIHZlY3RvcnMgdGhpcyBUSUZGIHdyaXRlcgorICAgICAgICAgKiB3YXMgY29uc3RydWN0ZWQgd2l0aC4gVGhlIGNvdW50IGFuZCB0eXBlIGFyZSB2YWxpZGF0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIFZhbGlkCisgICAgICAgICAqIGVycm9yIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBhcmU6CisgICAgICAgICAqIC0gQkFEX0lOREVYIC0gVGhlIGdpdmVuIHRhZyBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgKiAtIEJBRF9WQUxVRSAtIFRoZSBnaXZlbiBjb3VudCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1aXJlZCBjb3VudCBmb3IKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGlzIHRhZy4KKyAgICAgICAgICogLSBCQURfVFlQRSAgLSBUaGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZGF0YSBpc24ndCBjb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgdHlwZSByZXF1aXJlZCBmb3IgdGhpcyB0YWcuCisgICAgICAgICAqIC0gTkFNRV9OT1RfRk9VTkQgLSBObyBpZmQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdHVzX3QgYWRkRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCogZGF0YSwgdWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYW4gZW50cnkgZm9yIGEga25vd24gdGFnLiAgVGhpcyB0YWcgbXVzdCBiZSBvbmUgb2YgdGhlIHRhZ3MKKyAgICAgICAgICogZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRlZmluaXRpb24gdmVjdG9ycyB0aGlzIFRJRkYgd3JpdGVyIHdhcyBjb25zdHJ1Y3RlZAorICAgICAgICAgKiB3aXRoLiBUaGUgY291bnQgYW5kIHR5cGUgYXJlIHZhbGlkYXRlZC4gSWYgdGhpcyBzdWNjZWVkcywgdGhlIHJlc3VsdGluZworICAgICAgICAgKiBlbnRyeSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgb3V0RW50cnkgcG9pbnRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVmFsaWQKKyAgICAgICAgICogZXJyb3IgY29kZXMgZm9yIHRoaXMgbWV0aG9kIGFyZToKKyAgICAgICAgICogLSBCQURfSU5ERVggLSBUaGUgZ2l2ZW4gdGFnIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqIC0gQkFEX1ZBTFVFIC0gVGhlIGdpdmVuIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvdW50IGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoaXMgdGFnLgorICAgICAgICAgKiAtIEJBRF9UWVBFICAtIFRoZSB0eXBlIG9mIHRoZSBnaXZlbiBkYXRhIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB0eXBlIHJlcXVpcmVkIGZvciB0aGlzIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXR1c190IGJ1aWxkRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgVCogZGF0YSwKKyAgICAgICAgICAgICAgICAgIC8qb3V0Ki9zcDxUaWZmRW50cnk+KiBvdXRFbnRyeSkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHNldCB0aGUgc3RyaXAgcmVsYXRlZCB0YWdzIGZvciBhIGdpdmVuIElGRC4KKyAgICAgICAgICoKKyAgICAgICAgICogQ2FsbCB0aGlzIGJlZm9yZSB1c2luZyBhIFN0cmlwU291cmNlIGFzIGFuIGlucHV0IHRvIHdyaXRlLgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIHRhZ3MgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2Q6CisgICAgICAgICAqIC0gSW1hZ2VXaWR0aAorICAgICAgICAgKiAtIEltYWdlTGVuZ3RoCisgICAgICAgICAqIC0gU2FtcGxlc1BlclBpeGVsCisgICAgICAgICAqIC0gQml0c1BlclNhbXBsZQorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyaXAodWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBUSUZGIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRCBpbiB0aGUgSUZEIHdpdGggdGhlIGdpdmVuIElELAorICAgICAgICAgKiBvciBhbiBlbXB0eSBwb2ludGVyIGlmIG5vbmUgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzcDxUaWZmRW50cnk+IGdldEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSBUSUZGIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRCBpbiB0aGUgZ2l2ZW4gSUZEIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCByZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgKiBsaXN0IG9mIElGRHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZElmZCh1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYW4gZW1wdHkgSUZEIHdpdGggdGhlIGdpdmVuIElEIGFuZCBhZGQgaXQgYXMgYSBTdWJJZmQgb2YgdGhlCisgICAgICAgICAqIHBhcmVudCBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN1YklmZCh1aW50MzJfdCBwYXJlbnRJZmQsIHVpbnQzMl90IGlmZCwgU3ViSWZkVHlwZSB0eXBlID0gU1VCSUZEKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB0eXBlIGZvciB0aGUgZ2l2ZW4gdGFnIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBUYWdUeXBlIGdldERlZmF1bHRUeXBlKHVpbnQxNl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgY291bnQgZm9yIGEgZ2l2ZW4gdGFnIElELCBvciAwIGlmIHRoaXMKKyAgICAgICAgICogdGFnIG5vcm1hbGx5IGhhcyBhIHZhcmlhYmxlIGNvdW50LgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZWZhdWx0Q291bnQodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGFuIElGRCB3aXRoIHRoZSBnaXZlbiBJRCBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzSWZkKHVpbnQzMl90IGlmZCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGRlZmluaXRpb24gZXhpc3QgZm9yIHRoZSBnaXZlbiB0YWcgSUQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGJvb2wgY2hlY2tJZkRlZmluZWQodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGFnIGlmIGEgZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiB0YWcKKyAgICAgICAgICogSUQsIG9yIG51bGwgaWYgbm8gZGVmaW5pdGlvbiBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFRhZ05hbWUodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIElGRHMgYW5kIGVudHJpZXMgdG8gbG9nY2F0LgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbiBlbnRyeS4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogV0FSTklORzogVXNpbmcgdGhpcyBtZXRob2QgY2FuIHJlc3VsdCBpbiBjcmVhdGluZyBwb29ybHkgZm9ybWF0dGVkCisgICAgICAgICAqIFRJRkYgZmlsZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgYSBUaWZmRW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnLCB0eXBlLCBjb3VudCwgZW5kaWFubmVzcywKKyAgICAgICAgICogYW5kIGRhdGEuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3A8VGlmZkVudHJ5PiB1bmNoZWNrZWRCdWlsZEVudHJ5KHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsIEVuZGlhbm5lc3MgZW5kLCBjb25zdCBUKiBkYXRhKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXRpbGl0eSBmdW5jdGlvbiB0byBidWlsZCBhdGFnLXRvLWRlZmluaXRpb24gbWFwcGluZyBmcm9tIGEgZ2l2ZW4KKyAgICAgICAgICogYXJyYXkgb2YgdGFnIGRlZmluaXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBidWlsZFRhZ01hcCgKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbnMsIHNpemVfdCBsZW5ndGgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIERFRkFVTFRfTlVNX1RBR19NQVBTID0gNCwKKyAgICAgICAgfTsKKworICAgICAgICBzcDxUaWZmSWZkPiBmaW5kTGFzdElmZCgpOworICAgICAgICBzdGF0dXNfdCB3cml0ZUZpbGVIZWFkZXIoRW5kaWFuT3V0cHV0JiBvdXQpOworICAgICAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGxvb2t1cERlZmluaXRpb24odWludDE2X3QgdGFnKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3QgY2FsY3VsYXRlT2Zmc2V0cygpOworCisgICAgICAgIHNwPFRpZmZJZmQ+IG1JZmQ7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBzcDxUaWZmSWZkPiA+IG1OYW1lZElmZHM7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiogbVRhZ01hcHM7CisgICAgICAgIHNpemVfdCBtTnVtVGFnTWFwczsKKworICAgICAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IHNUYWdNYXBzW107Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZldyaXRlcjo6YnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLAorICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPFRpZmZFbnRyeT4qIG91dEVudHJ5KSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworCisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHN1Y2ggdGFnIGV4aXN0cyBmb3IgaWQgJXguIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIHVpbnQzMl90IGZpeGVkQ291bnQgPSBkZWZpbml0aW9uLT5maXhlZENvdW50OworICAgIGlmIChmaXhlZENvdW50ID4gMCAmJiBmaXhlZENvdW50ICE9IGNvdW50KSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb3VudCAlZCBmb3IgdGFnICV4IChleHBlY3RzICVkKS4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCB0YWcsCisgICAgICAgICAgICAgICAgZml4ZWRDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVGFnVHlwZSBmaXhlZFR5cGUgPSBkZWZpbml0aW9uLT5kZWZhdWx0VHlwZTsKKyAgICBpZiAoVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZShmaXhlZFR5cGUsIGRhdGEpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHR5cGUgdXNlZCBmb3IgdGFnIHZhbHVlIGZvciB0YWcgJXguIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorCisgICAgKm91dEVudHJ5ID0gbmV3IFRpZmZFbnRyeUltcGw8VD4odGFnLCBmaXhlZFR5cGUsIGNvdW50LAorICAgICAgICBkZWZpbml0aW9uLT5maXhlZEVuZGlhbiwgZGF0YSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLCB1aW50MzJfdCBpZmQpIHsKKyAgICBzcDxUaWZmRW50cnk+IG91dEVudHJ5OworCisgICAgc3RhdHVzX3QgcmV0ID0gYnVpbGRFbnRyeTxUPih0YWcsIGNvdW50LCBkYXRhLCAmb3V0RW50cnkpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIHRhZyAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIGFkZEVudHJ5KG91dEVudHJ5LCBpZmQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3A8VGlmZkVudHJ5PiBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpIHsKKyAgICBUaWZmRW50cnlJbXBsPFQ+KiBlbnRyeSA9IG5ldyBUaWZmRW50cnlJbXBsPFQ+KHRhZywgdHlwZSwgY291bnQsIGVuZCwgZGF0YSk7CisgICAgcmV0dXJuIHNwPFRpZmZFbnRyeT4oZW50cnkpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX1dSSVRFUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvQW5kcm9pZC5tayBiL21lZGlhL2ltZ191dGlscy9zcmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc0ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjIgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgRW5kaWFuVXRpbHMuY3BwIFwKKyAgRmlsZUlucHV0LmNwcCBcCisgIEZpbGVPdXRwdXQuY3BwIFwKKyAgU29ydGVkRW50cnlWZWN0b3IuY3BwIFwKKyAgSW5wdXQuY3BwIFwKKyAgT3V0cHV0LmNwcCBcCisgIE9yZGVyYWJsZS5jcHAgXAorICBUaWZmSWZkLmNwcCBcCisgIFRpZmZXcml0YWJsZS5jcHAgXAorICBUaWZmV3JpdGVyLmNwcCBcCisgIFRpZmZFbnRyeS5jcHAgXAorICBUaWZmRW50cnlJbXBsLmNwcCBcCisgIEJ5dGVBcnJheU91dHB1dC5jcHAgXAorICBEbmdVdGlscy5jcHAgXAorICBTdHJpcFNvdXJjZS5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliZXhwYXQgXAorICBsaWJ1dGlscyBcCisgIGxpYmN1dGlscyBcCisgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCisgIGxpYmNhbWVyYV9jbGllbnQKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZSBcCisgIHN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgKz0gXAorICAtV2FsbCBcCisgIC1XZXh0cmEgXAorICAtV2Vycm9yIFwKKyAgLWZ2aXNpYmlsaXR5PWhpZGRlbgorCitpZm5lcSAoJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksKQorICAgICMgRW5hYmxlIGFzc2VydCgpIGluIGVuZyBidWlsZHMKKyAgICBMT0NBTF9DRkxBR1MgKz0gLVVOREVCVUcgLURMT0dfTkRFQlVHPTEKK2VuZGlmCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFIDo9IGxpYmltZ191dGlscworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0J5dGVBcnJheU91dHB1dC5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0J5dGVBcnJheU91dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyZDI0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitCeXRlQXJyYXlPdXRwdXQ6OkJ5dGVBcnJheU91dHB1dCgpIHt9CisKK0J5dGVBcnJheU91dHB1dDo6fkJ5dGVBcnJheU91dHB1dCgpIHt9CisKK3N0YXR1c190IEJ5dGVBcnJheU91dHB1dDo6b3BlbigpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEJ5dGVBcnJheU91dHB1dDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBpZiAobUJ5dGVBcnJheS5hcHBlbmRBcnJheShidWYgKyBvZmZzZXQsIGNvdW50KSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgdG8gQnl0ZUFycmF5T3V0cHV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0OjpjbG9zZSgpIHsKKyAgICBtQnl0ZUFycmF5LmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgQnl0ZUFycmF5T3V0cHV0OjpnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtQnl0ZUFycmF5LnNpemUoKTsKK30KKworY29uc3QgdWludDhfdCogQnl0ZUFycmF5T3V0cHV0OjpnZXRBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJ5dGVBcnJheS5hcnJheSgpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2I0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvRG5nVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK09wY29kZUxpc3RCdWlsZGVyOjpPcGNvZGVMaXN0QnVpbGRlcigpIDogbUNvdW50KDApLCBtT3BMaXN0KCksIG1FbmRpYW5PdXQoJm1PcExpc3QsIEJJRykgeworICAgIGlmKG1FbmRpYW5PdXQub3BlbigpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogT3BlbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK09wY29kZUxpc3RCdWlsZGVyOjp+T3Bjb2RlTGlzdEJ1aWxkZXIoKSB7CisgICAgaWYobUVuZGlhbk91dC5jbG9zZSgpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2xvc2UgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorfQorCitzaXplX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1PcExpc3QuZ2V0U2l6ZSgpICsgc2l6ZW9mKG1Db3VudCk7Cit9CisKK3VpbnQzMl90IE9wY29kZUxpc3RCdWlsZGVyOjpnZXRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvdW50OworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YnVpbGRPcExpc3QodWludDhfdCogYnVmKSBjb25zdCB7CisgICAgdWludDMyX3QgY291bnQgPSBjb252ZXJ0VG9CaWdFbmRpYW4obUNvdW50KTsKKyAgICBtZW1jcHkoYnVmLCAmY291bnQsIHNpemVvZihjb3VudCkpOworICAgIG1lbWNweShidWYgKyBzaXplb2YoY291bnQpLCBtT3BMaXN0LmdldEFycmF5KCksIG1PcExpc3QuZ2V0U2l6ZSgpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKKyAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7CisgICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gbHNtSGVpZ2h0OworICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIGxzbVdpZHRoOworCisgICAgZmxvYXQgcmVkTWFwW2xzbVdpZHRoICogbHNtSGVpZ2h0XTsKKyAgICBmbG9hdCBncmVlbkV2ZW5NYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGdyZWVuT2RkTWFwW2xzbVdpZHRoICogbHNtSGVpZ2h0XTsKKyAgICBmbG9hdCBibHVlTWFwW2xzbVdpZHRoICogbHNtSGVpZ2h0XTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOworICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07CisgICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOworICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgfQorCisgICAgdWludDMyX3QgcmVkVG9wID0gMDsKKyAgICB1aW50MzJfdCByZWRMZWZ0ID0gMDsKKyAgICB1aW50MzJfdCBncmVlbkV2ZW5Ub3AgPSAwOworICAgIHVpbnQzMl90IGdyZWVuRXZlbkxlZnQgPSAxOworICAgIHVpbnQzMl90IGdyZWVuT2RkVG9wID0gMTsKKyAgICB1aW50MzJfdCBncmVlbk9kZExlZnQgPSAwOworICAgIHVpbnQzMl90IGJsdWVUb3AgPSAxOworICAgIHVpbnQzMl90IGJsdWVMZWZ0ID0gMTsKKworICAgIHN3aXRjaChjZmEpIHsKKyAgICAgICAgY2FzZSBDRkFfUkdHQjoKKyAgICAgICAgICAgIHJlZFRvcCA9IDA7CisgICAgICAgICAgICByZWRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDA7CisgICAgICAgICAgICBibHVlVG9wID0gMTsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9HUkJHOgorICAgICAgICAgICAgcmVkVG9wID0gMDsKKyAgICAgICAgICAgIHJlZExlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAxOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0dCUkc6CisgICAgICAgICAgICByZWRUb3AgPSAxOworICAgICAgICAgICAgcmVkTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAxOworICAgICAgICAgICAgYmx1ZVRvcCA9IDA7CisgICAgICAgICAgICBibHVlTGVmdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfQkdHUjoKKyAgICAgICAgICAgIHJlZFRvcCA9IDE7CisgICAgICAgICAgICByZWRMZWZ0ID0gMTsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDA7CisgICAgICAgICAgICBibHVlVG9wID0gMDsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIENGQSBsYXlvdXQgJWQiLCBfX0ZVTkNUSU9OX18sIGNmYSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL3JlZFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovcmVkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL3JlZE1hcCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2dyZWVuRXZlblRvcCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovZ3JlZW5FdmVuTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL2dyZWVuRXZlbk1hcCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2dyZWVuT2RkVG9wLAorICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbk9kZExlZnQsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9ncmVlbk9kZE1hcCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2JsdWVUb3AsCisgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2JsdWVMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovYmx1ZU1hcCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXAodWludDMyX3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByb3dQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbFBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBvaW50c0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwU3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwU3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwT3JpZ2luViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG1hcEdhaW5zKSB7CisKKyAgICB1aW50MzJfdCBvcGNvZGVJZCA9IEdBSU5fTUFQX0lEOworCisgICAgc3RhdHVzX3QgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmb3Bjb2RlSWQsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICB1aW50OF90IHZlcnNpb25bXSA9IHsxLCAzLCAwLCAwfTsKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKHZlcnNpb24sIDAsIE5FTEVNUyh2ZXJzaW9uKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIC8vIERvIG5vdCBpbmNsdWRlIG9wdGlvbmFsIGZsYWcgZm9yIHByZXZpZXcsIGFzIHRoaXMgY2FuIGhhdmUgYSBsYXJnZSBlZmZlY3Qgb24gdGhlIG91dHB1dC4KKyAgICB1aW50MzJfdCBmbGFncyA9IEZMQUdfT1BUSU9OQUw7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZmbGFncywgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGNvbnN0IHVpbnQzMl90IE5VTUJFUl9JTlRfQVJHUyA9IDExOworICAgIGNvbnN0IHVpbnQzMl90IE5VTUJFUl9ET1VCTEVfQVJHUyA9IDQ7CisKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSBOVU1CRVJfSU5UX0FSR1MgKiBzaXplb2YodWludDMyX3QpICsgTlVNQkVSX0RPVUJMRV9BUkdTICogc2l6ZW9mKGRvdWJsZSkgKworICAgICAgICAgICAgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgKiBzaXplb2YoZmxvYXQpOworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmdG90YWxTaXplLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgLy8gQmF0Y2ggd3JpdGVzIGFzIG11Y2ggYXMgcG9zc2libGUKKyAgICB1aW50MzJfdCBzZXR0aW5nczFbXSA9IHsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFBvaW50c0ggfTsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoc2V0dGluZ3MxLCAwLCBORUxFTVMoc2V0dGluZ3MxKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGRvdWJsZSBzZXR0aW5nczJbXSA9IHsgbWFwU3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFNwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBPcmlnaW5IIH07CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKHNldHRpbmdzMiwgMCwgTkVMRU1TKHNldHRpbmdzMikpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZtYXBQbGFuZXMsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKG1hcEdhaW5zLCAwLCBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIG1Db3VudCsrOworCisgICAgcmV0dXJuIE9LOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9FbmRpYW5VdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjgxY2JlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9FbmRpYW5VdGlscy5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRW5kaWFuT3V0cHV0OjpFbmRpYW5PdXRwdXQoT3V0cHV0KiBvdXQsIEVuZGlhbm5lc3MgZW5kKQorICAgICAgICA6IG1PZmZzZXQoMCksIG1PdXRwdXQob3V0KSwgbUVuZGlhbihlbmQpIHt9CisKK0VuZGlhbk91dHB1dDo6fkVuZGlhbk91dHB1dCgpIHt9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6b3BlbigpIHsKKyAgICBtT2Zmc2V0ID0gMDsKKyAgICByZXR1cm4gbU91dHB1dC0+b3BlbigpOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OmNsb3NlKCkgeworICAgIHJldHVybiBtT3V0cHV0LT5jbG9zZSgpOworfQorCit2b2lkIEVuZGlhbk91dHB1dDo6c2V0RW5kaWFubmVzcyhFbmRpYW5uZXNzIGVuZCkgeworICAgIG1FbmRpYW4gPSBlbmQ7Cit9CisKK3VpbnQzMl90IEVuZGlhbk91dHB1dDo6Z2V0Q3VycmVudE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9mZnNldDsKK30KKworRW5kaWFubmVzcyBFbmRpYW5PdXRwdXQ6OmdldEVuZGlhbm5lc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FbmRpYW47Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZigocmVzID0gbU91dHB1dC0+d3JpdGUoYnVmLCBvZmZzZXQsIGNvdW50KSkgPT0gT0spIHsKKyAgICAgICAgbU9mZnNldCArPSBjb3VudDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgcmV0dXJuIHdyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZiksIG9mZnNldCwgY291bnQpOworfQorCisjZGVmaW5lIERFRklORV9XUklURShfdHlwZV8pIFwKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGUoY29uc3QgX3R5cGVfKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeyBcCisgICAgcmV0dXJuIHdyaXRlSGVscGVyPF90eXBlXz4oYnVmLCBvZmZzZXQsIGNvdW50KTsgXAorfQorCitERUZJTkVfV1JJVEUodWludDE2X3QpCitERUZJTkVfV1JJVEUoaW50MTZfdCkKK0RFRklORV9XUklURSh1aW50MzJfdCkKK0RFRklORV9XUklURShpbnQzMl90KQorREVGSU5FX1dSSVRFKHVpbnQ2NF90KQorREVGSU5FX1dSSVRFKGludDY0X3QpCisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGUoY29uc3QgZmxvYXQqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgYXNzZXJ0KHNpemVvZihmbG9hdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgcmV0dXJuIHdyaXRlSGVscGVyPHVpbnQzMl90PihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oYnVmKSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6d3JpdGUoY29uc3QgZG91YmxlKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGFzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8dWludDY0X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QqPihidWYpLCBvZmZzZXQsIGNvdW50KTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZUlucHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZUlucHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThlNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvRmlsZUlucHV0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0ZpbGVJbnB1dDo6RmlsZUlucHV0KFN0cmluZzggcGF0aCkgOiBtRnAoTlVMTCksIG1QYXRoKHBhdGgpLCBtT3BlbihmYWxzZSkge30KKworRmlsZUlucHV0Ojp+RmlsZUlucHV0KCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HRSgiJXM6IEZpbGVJbnB1dCBkZXN0cm95ZWQgd2l0aG91dCBjYWxsaW5nIGNsb3NlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCit9CisKK3N0YXR1c190IEZpbGVJbnB1dDo6b3BlbigpIHsKKyAgICBpZiAobU9wZW4pIHsKKyAgICAgICAgQUxPR1coIiVzOiBPcGVuIGNhbGxlZCB3aGVuIGZpbGUgJXMgYWxyZWFkeSBvcGVuLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1GcCA9IDo6Zm9wZW4obVBhdGgsICJyYiIpOworICAgIGlmICghbUZwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtT3BlbiA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IEZpbGVJbnB1dDo6cmVhZCh1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGlmICghbU9wZW4pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcmVhZCBmaWxlICVzLCBmaWxlIG5vdCBvcGVuLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBieXRlc1JlYWQgPSA6OmZyZWFkKGJ1ZiArIG9mZnNldCwgc2l6ZW9mKHVpbnQ4X3QpLCBjb3VudCwgbUZwKTsKKyAgICBpbnQgZXJyb3IgPSA6OmZlcnJvcihtRnApOworICAgIGlmIChlcnJvciAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgJWQgb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBmaWxlICVzLiIsIF9fRlVOQ1RJT05fXywgZXJyb3IsIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBFbmQgb2YgZmlsZSByZWFjaGVkCisgICAgaWYgKDo6ZmVvZihtRnApICE9IDAgJiYgYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBGaWxlSW5wdXQ6OmNsb3NlKCkgeworICAgIGlmKCFtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IENsb3NlIGNhbGxlZCB3aGVuIGZpbGUgJXMgYWxyZWFkeSBjbG9zZS4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGlmKDo6ZmNsb3NlKG1GcCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjbG9zZSBmaWxlICVzLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZU91dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3NjNmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRmlsZU91dHB1dC5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9GaWxlT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0ZpbGVPdXRwdXQ6OkZpbGVPdXRwdXQoU3RyaW5nOCBwYXRoKSA6IG1GcChOVUxMKSwgbVBhdGgocGF0aCksIG1PcGVuKGZhbHNlKSB7fQorCitGaWxlT3V0cHV0Ojp+RmlsZU91dHB1dCgpIHsKKyAgICBpZiAobU9wZW4pIHsKKyAgICAgICAgQUxPR1coIiVzOiBEZXN0cnVjdG9yIGNhbGxlZCB3aXRoICVzIHN0aWxsIG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBGaWxlT3V0cHV0OjpvcGVuKCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IE9wZW4gY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbUZwID0gOjpmb3BlbihtUGF0aCwgIndiIik7CisgICAgaWYgKCFtRnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZpbGVPdXRwdXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKCFtT3BlbikgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCB3cml0ZSBmaWxlICVzLCBmaWxlIG5vdCBvcGVuLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIDo6ZndyaXRlKGJ1ZiArIG9mZnNldCwgc2l6ZW9mKHVpbnQ4X3QpLCBjb3VudCwgbUZwKTsKKworICAgIGludCBlcnJvciA9IDo6ZmVycm9yKG1GcCk7CisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciAlZCBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBlcnJvciwgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZpbGVPdXRwdXQ6OmNsb3NlKCkgeworICAgIGlmKCFtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IENsb3NlIGNhbGxlZCB3aGVuIGZpbGUgJXMgYWxyZWFkeSBjbG9zZS4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGlmKDo6ZmNsb3NlKG1GcCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjbG9zZSBmaWxlICVzLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9JbnB1dC5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzgyMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9JbnB1dC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9JbnB1dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworSW5wdXQ6On5JbnB1dCgpIHt9CisKK3N0YXR1c190IElucHV0OjpvcGVuKCkgeyByZXR1cm4gT0s7IH0KKworc3RhdHVzX3QgSW5wdXQ6OmNsb3NlKCkgeyByZXR1cm4gT0s7IH0KKworc3NpemVfdCBJbnB1dDo6c2tpcChzaXplX3QgY291bnQpIHsKKyAgICBjb25zdCBzaXplX3QgU0tJUF9CVUZfU0laRSA9IDEwMjQ7CisgICAgdWludDhfdCBza2lwQnVmW1NLSVBfQlVGX1NJWkVdOworCisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGNvdW50OworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHNpemVfdCBhbXQgPSAoU0tJUF9CVUZfU0laRSA+IHJlbWFpbmluZykgPyByZW1haW5pbmcgOiBTS0lQX0JVRl9TSVpFOworICAgICAgICBzc2l6ZV90IHJldCA9IHJlYWQoc2tpcEJ1ZiwgMCwgYW10KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmKHJldCA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgICAgICAvLyBFbmQgb2YgZmlsZSBlbmNvdW50ZXJlZAorICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBubyBieXRlcywgcmV0dXJuIEVPRgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBudW0gYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQgLSByZW1haW5pbmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmV0dXJuIGVycm9yIGNvZGUuCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJlbWFpbmluZyAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9PcmRlcmFibGUuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PcmRlcmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGYxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9PcmRlcmFibGUuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFKG9wKSBcCitib29sIE9yZGVyYWJsZTo6b3BlcmF0b3Igb3AgKGNvbnN0IE9yZGVyYWJsZSYgb3JkZXJhYmxlKSBjb25zdCB7IFwKKyAgICByZXR1cm4gZ2V0Q29tcGFyYWJsZVZhbHVlKCkgb3Agb3JkZXJhYmxlLmdldENvbXBhcmFibGVWYWx1ZSgpOyBcCit9CisKK0NPTVBBUkUoPikKK0NPTVBBUkUoPCkKK0NPTVBBUkUoPj0pCitDT01QQVJFKDw9KQorQ09NUEFSRSg9PSkKK0NPTVBBUkUoIT0pCisKK09yZGVyYWJsZTo6fk9yZGVyYWJsZSgpIHt9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL091dHB1dC5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9PdXRwdXQuY3BwCmluZGV4IDEzY2FjNmQuLjBlMzk1YjkKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvT3V0cHV0LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgewogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCitPdXRwdXQ6On5PdXRwdXQoKSB7fQorc3RhdHVzX3QgT3V0cHV0OjpvcGVuKCkgeyByZXR1cm4gT0s7IH0KK3N0YXR1c190IE91dHB1dDo6Y2xvc2UoKSB7IHJldHVybiBPSzsgfQogCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9Tb3J0ZWRFbnRyeVZlY3Rvci5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUxZmExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9Tb3J0ZWRFbnRyeVZlY3Rvci5jcHAKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oPgorCisjaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK1NvcnRlZEVudHJ5VmVjdG9yOjp+U29ydGVkRW50cnlWZWN0b3IoKSB7fQorCitzc2l6ZV90IFNvcnRlZEVudHJ5VmVjdG9yOjppbmRleE9mVGFnKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIC8vIFRPRE86IFVzZSBiaW5hcnkgc2VhcmNoIGhlcmUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRUYWcoKSA9PSB0YWcpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworaW50IFNvcnRlZEVudHJ5VmVjdG9yOjpkb19jb21wYXJlKGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzKSBjb25zdCB7CisgICAgY29uc3Qgc3A8VGlmZkVudHJ5PiogbEVudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzcDxUaWZmRW50cnk+Kj4obGhzKTsKKyAgICBjb25zdCBzcDxUaWZmRW50cnk+KiByRW50cnkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHNwPFRpZmZFbnRyeT4qPihyaHMpOworICAgIHJldHVybiBjb21wYXJlX3R5cGUoKipsRW50cnksICoqckVudHJ5KTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvU3RyaXBTb3VyY2UuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvU3RyaXBTb3VyY2UuY3BwCmluZGV4IDEzY2FjNmQuLjU3YjYwODIKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvU3RyaXBTb3VyY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2luY2x1ZGUgPGltZ191dGlscy9TdHJpcFNvdXJjZS5oPgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK1N0cmlwU291cmNlOjp+U3RyaXBTb3VyY2UoKSB7fQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCi0KK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeS5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMGUzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZIZWxwZXJzLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworVGlmZkVudHJ5Ojp+VGlmZkVudHJ5KCkge30KKworLyoqCisgKiBTcGVjaWFsaXplIGZvciBlYWNoIHZhbGlkIHR5cGUsIGluY2x1ZGluZyBzdWItSUZEcy4KKyAqCisgKiBWYWx1ZXMgd2l0aCB0eXBlcyBvdGhlciB0aGFuIHRoZSBvbmVzIGdpdmVuIGhlcmUgc2hvdWxkIG5vdCBjb21waWxlLgorICovCisKK3RlbXBsYXRlPD4KK2NvbnN0IHNwPFRpZmZJZmQ+KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHNwPFRpZmZJZmQ+ID4oVGFnVHlwZSB0eXBlLCBjb25zdCBzcDxUaWZmSWZkPiogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBMT05HKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdpZmQnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCB1aW50OF90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQ4X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgdWludDhfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBCWVRFIHx8IHR5cGUgPT0gQVNDSUkgfHwgdHlwZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ3VpbnQ4X3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBpbnQ4X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8aW50OF90PihUYWdUeXBlIHR5cGUsIGNvbnN0IGludDhfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTQllURSB8fCB0eXBlID09IEFTQ0lJIHx8IHR5cGUgPT0gVU5ERUZJTkVEKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdpbnQ4X3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCB1aW50MTZfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTx1aW50MTZfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCB1aW50MTZfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTSE9SVCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDE2X3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBpbnQxNl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGludDE2X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50MTZfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTU0hPUlQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2ludDE2X3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCB1aW50MzJfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTx1aW50MzJfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCB1aW50MzJfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBMT05HIHx8IHR5cGUgPT0gUkFUSU9OQUwpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ3VpbnQzMl90JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgaW50MzJfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxpbnQzMl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IGludDMyX3QqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gU0xPTkcgfHwgdHlwZSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2ludDMyX3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBkb3VibGUqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8ZG91YmxlPihUYWdUeXBlIHR5cGUsIGNvbnN0IGRvdWJsZSogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBET1VCTEUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2RvdWJsZScgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGZsb2F0KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGZsb2F0PihUYWdUeXBlIHR5cGUsIGNvbnN0IGZsb2F0KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IEZMT0FUKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICdmbG9hdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1N0cmluZzggVGlmZkVudHJ5Ojp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBTdHJpbmc4IG91dHB1dDsKKyAgICB1aW50MzJfdCBjb3VudCA9IGdldENvdW50KCk7CisgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiW2lkOiAleCwgdHlwZTogJWQsIGNvdW50OiAldSwgdmFsdWU6ICciLCBnZXRUYWcoKSwgZ2V0VHlwZSgpLCBjb3VudCk7CisKKyAgICBzaXplX3QgY2FwcGVkQ291bnQgPSBjb3VudDsKKyAgICBpZiAoY291bnQgPiBNQVhfUFJJTlRfU1RSSU5HX0xFTkdUSCkgeworICAgICAgICBjYXBwZWRDb3VudCA9IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIOworICAgIH0KKworICAgIFRhZ1R5cGUgdHlwZSA9IGdldFR5cGUoKTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBVTkRFRklORUQ6CisgICAgICAgIGNhc2UgQllURTogeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8dWludDhfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1ICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBU0NJSTogeworICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZWRfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGdldERhdGE8dWludDhfdD4oKSk7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gY291bnQ7CisgICAgICAgICAgICBpZiAoY291bnQgPiBNQVhfUFJJTlRfU1RSSU5HX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICBsZW4gPSBNQVhfUFJJTlRfU1RSSU5HX0xFTkdUSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQodHlwZWRfZGF0YSwgbGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0hPUlQ6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50MTZfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1ICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBMT05HOiB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8dWludDMyX3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIldSAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgUkFUSU9OQUw6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhcHBlZENvdW50IDw8PSAxOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgaSs9MikgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1LyV1ICIsIHR5cGVkX2RhdGFbaV0sIHR5cGVkX2RhdGFbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0JZVEU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDhfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50OF90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNTSE9SVDogeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50MTZfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTTE9ORzogeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTUkFUSU9OQUw6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGludDMyX3Q+KCk7CisgICAgICAgICAgICBjYXBwZWRDb3VudCA8PD0gMTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7IGkrPTIpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZC8lZCAiLCB0eXBlZF9kYXRhW2ldLCB0eXBlZF9kYXRhW2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZMT0FUOiB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogdHlwZWRfZGF0YSA9IGdldERhdGE8ZmxvYXQ+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZiAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRE9VQkxFOiB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIHR5cGVkX2RhdGEgPSBnZXREYXRhPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVmICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgidW5rbm93biB0eXBlICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY291bnQgPiBNQVhfUFJJTlRfU1RSSU5HX0xFTkdUSCkgeworICAgICAgICBvdXRwdXQuYXBwZW5kKCIuLi4iKTsKKyAgICB9CisgICAgb3V0cHV0LmFwcGVuZCgiJ10iKTsKKyAgICByZXR1cm4gb3V0cHV0OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnlJbXBsLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeUltcGwuY3BwCmluZGV4IDEzY2FjNmQuLjI1N2MyNjYKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5SW1wbC5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaD4KIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQorfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZJZmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjAwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZJZmQuY3BwCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlRpZmZJZmQiCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZklmZC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGVyLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK1RpZmZJZmQ6OlRpZmZJZmQodWludDMyX3QgaWZkSWQpCisgICAgICAgIDogbU5leHRJZmQoKSwgbUlmZElkKGlmZElkKSwgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkKGZhbHNlKSB7fQorCitUaWZmSWZkOjp+VGlmZklmZCgpIHt9CisKK3N0YXR1c190IFRpZmZJZmQ6OmFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5KSB7CisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisgICAgaWYgKHNpemUgPj0gTUFYX0lGRF9FTlRSSUVTKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGFkZCBlbnRyeSBmb3IgdGFnIDB4JXggdG8gSUZEICV1LCB0b28gbWFueSBlbnRyaWVzIGluIElGRCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZW50cnktPmdldFRhZygpLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGlmIChtRW50cmllcy5hZGQoZW50cnkpIDwgMCkgeworICAgICAgICBBTE9HVygiJXM6IEZhaWxlZCB0byBhZGQgZW50cnkgZm9yIHRhZyAweCV4IHRvIGlmZCAldS4iLCBfX0ZVTkNUSU9OX18sIGVudHJ5LT5nZXRUYWcoKSwKKyAgICAgICAgICAgICAgICBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPFRpZmZFbnRyeT4gVGlmZklmZDo6Z2V0RW50cnkodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1FbnRyaWVzLmluZGV4T2ZUYWcodGFnKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gZW50cnkgZm9yIHRhZyAweCV4IGluIGlmZCAldS4iLCBfX0ZVTkNUSU9OX18sIHRhZywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtRW50cmllc1tpbmRleF07Cit9CisKK3ZvaWQgVGlmZklmZDo6cmVtb3ZlRW50cnkodWludDE2X3QgdGFnKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1FbnRyaWVzLmluZGV4T2ZUYWcodGFnKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtRW50cmllcy5yZW1vdmVBdChpbmRleCk7CisgICAgfQorfQorCisKK3ZvaWQgVGlmZklmZDo6c2V0TmV4dElmZChjb25zdCBzcDxUaWZmSWZkPiYgaWZkKSB7CisgICAgbU5leHRJZmQgPSBpZmQ7Cit9CisKK3NwPFRpZmZJZmQ+IFRpZmZJZmQ6OmdldE5leHRJZmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OZXh0SWZkOworfQorCit1aW50MzJfdCBUaWZmSWZkOjpjaGVja0FuZEdldE9mZnNldCh1aW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKworICAgIGlmIChzaXplID4gTUFYX0lGRF9FTlRSSUVTKSB7CisgICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IGNhbGN1bGF0ZSBJRkQgb2Zmc2V0cywgSUZEICV1IGNvbnRhaW5zIHRvbyBtYW55IGVudHJpZXMuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfT0ZGU0VUOworICAgIH0KKworICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgY29udGFpbnMgbm8gZW50cmllcy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9PRkZTRVQ7CisgICAgfQorCisgICAgaWYgKG9mZnNldCA9PSBCQURfT0ZGU0VUKSB7CisgICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IGNhbGN1bGF0ZSBJRkQgb2Zmc2V0cywgSUZEICV1IGhhZCBhIGJhZCBpbml0aWFsIG9mZnNldC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9PRkZTRVQ7CisgICAgfQorCisgICAgdWludDMyX3QgaWZkU2l6ZSA9IGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSk7CisgICAgV09SRF9BTElHTihpZmRTaXplKTsKKyAgICByZXR1cm4gb2Zmc2V0ICsgaWZkU2l6ZTsKK30KKworc3RhdHVzX3QgVGlmZklmZDo6d3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgYXNzZXJ0KChvZmZzZXQgJSBUSUZGX1dPUkRfU0laRSkgPT0gMCk7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisKKyAgICBBTE9HVigiJXM6IElGRCAldSB3cml0dGVuIHRvIG9mZnNldCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkLCBvZmZzZXQgKTsKKyAgICB1aW50MzJfdCB2YWx1ZU9mZnNldCA9IGNoZWNrQW5kR2V0T2Zmc2V0KG9mZnNldCk7CisgICAgaWYgKHZhbHVlT2Zmc2V0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKworICAgIC8vIFdyaXRlciBJRkQgaGVhZGVyICgyIGJ5dGVzLCBudW1iZXIgb2YgZW50cmllcykuCisgICAgdWludDE2X3QgaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHNpemUpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZoZWFkZXIsIDAsIDEpLCByZXQpOworCisgICAgLy8gV3JpdGUgdGFnIGVudHJpZXMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBCQUlMX09OX0ZBSUwobUVudHJpZXNbaV0tPndyaXRlVGFnSW5mbyh2YWx1ZU9mZnNldCwgb3V0KSwgcmV0KTsKKyAgICAgICAgdmFsdWVPZmZzZXQgKz0gbUVudHJpZXNbaV0tPmdldFNpemUoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZXIgSUZEIGZvb3RlciAoNCBieXRlcywgb2Zmc2V0IHRvIG5leHQgSUZEKS4KKyAgICB1aW50MzJfdCBmb290ZXIgPSAobU5leHRJZmQgIT0gTlVMTCkgPyBvZmZzZXQgKyBnZXRTaXplKCkgOiAwOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZmb290ZXIsIDAsIDEpLCByZXQpOworCisgICAgYXNzZXJ0KG91dC0+Z2V0Q3VycmVudE9mZnNldCgpID09IG9mZnNldCArIGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSkpOworCisgICAgLy8gV3JpdGUgemVyb2VzIHRpbGwgd29yZCBhbGlnbmVkCisgICAgWkVST19USUxMX1dPUkQob3V0LCBjYWxjdWxhdGVJZmRTaXplKHNpemUpLCByZXQpOworCisgICAgLy8gV3JpdGUgdmFsdWVzIGZvciBlYWNoIHRhZyBlbnRyeQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHNpemVfdCBsYXN0ID0gb3V0LT5nZXRDdXJyZW50T2Zmc2V0KCk7CisgICAgICAgIC8vIE9ubHkgd3JpdGUgdmFsdWVzIHRoYXQgYXJlIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIDEyLWJ5dGUgVElGRiBlbnRyeQorICAgICAgICBpZiAobUVudHJpZXNbaV0tPmdldFNpemUoKSA+IE9GRlNFVF9TSVpFKSB7CisgICAgICAgICAgICBCQUlMX09OX0ZBSUwobUVudHJpZXNbaV0tPndyaXRlRGF0YShvdXQtPmdldEN1cnJlbnRPZmZzZXQoKSwgb3V0KSwgcmV0KTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgbmV4dCA9IG91dC0+Z2V0Q3VycmVudE9mZnNldCgpOworICAgICAgICBzaXplX3QgZGlmZiA9IChuZXh0IC0gbGFzdCk7CisgICAgICAgIHNpemVfdCBhY3R1YWwgPSBtRW50cmllc1tpXS0+Z2V0U2l6ZSgpOworICAgICAgICBpZiAoZGlmZiAhPSBhY3R1YWwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJTaXplcyBkbyBub3QgbWF0Y2ggZm9yIHRhZyAleC4gRXhwZWN0ZWQgJXp1LCByZWNlaXZlZCAlenUiLAorICAgICAgICAgICAgICAgICAgICBtRW50cmllc1tpXS0+Z2V0VGFnKCksIGFjdHVhbCwgZGlmZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQob3V0LT5nZXRDdXJyZW50T2Zmc2V0KCkgPT0gb2Zmc2V0ICsgZ2V0U2l6ZSgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3NpemVfdCBUaWZmSWZkOjpnZXRTaXplKCkgY29uc3QgeworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworICAgIHVpbnQzMl90IHRvdGFsID0gY2FsY3VsYXRlSWZkU2l6ZShzaXplKTsKKyAgICBXT1JEX0FMSUdOKHRvdGFsKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB0b3RhbCArPSBtRW50cmllc1tpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSWZkSWQ7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmdldENvbXBhcmFibGVWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlmZElkOworfQorCitzdGF0dXNfdCBUaWZmSWZkOjp2YWxpZGF0ZUFuZFNldFN0cmlwVGFncygpIHsKKyAgICBzcDxUaWZmRW50cnk+IHdpZHRoRW50cnkgPSBnZXRFbnRyeShUQUdfSU1BR0VXSURUSCk7CisgICAgaWYgKHdpZHRoRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBJbWFnZVdpZHRoIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBoZWlnaHRFbnRyeSA9IGdldEVudHJ5KFRBR19JTUFHRUxFTkdUSCk7CisgICAgaWYgKGhlaWdodEVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lc24ndCBoYXZlIGEgSW1hZ2VMZW5ndGggdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IHNhbXBsZXNFbnRyeSA9IGdldEVudHJ5KFRBR19TQU1QTEVTUEVSUElYRUwpOworICAgIGlmIChzYW1wbGVzRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBTYW1wbGVzUGVyUGl4ZWwgdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IGJpdHNFbnRyeSA9IGdldEVudHJ5KFRBR19CSVRTUEVSU0FNUExFKTsKKyAgICBpZiAoYml0c0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lc24ndCBoYXZlIGEgQml0c1BlclNhbXBsZSB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IHdpZHRoID0gKih3aWR0aEVudHJ5LT5nZXREYXRhPHVpbnQzMl90PigpKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSAqKGhlaWdodEVudHJ5LT5nZXREYXRhPHVpbnQzMl90PigpKTsKKyAgICB1aW50MTZfdCBiaXRzUGVyU2FtcGxlID0gKihiaXRzRW50cnktPmdldERhdGE8dWludDE2X3Q+KCkpOworICAgIHVpbnQxNl90IHNhbXBsZXNQZXJQaXhlbCA9ICooc2FtcGxlc0VudHJ5LT5nZXREYXRhPHVpbnQxNl90PigpKTsKKworICAgIGlmICgoYml0c1BlclNhbXBsZSAlIDgpICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCaXRzUGVyU2FtcGxlICVkIGluIElGRCAldSBpcyBub3QgYnl0ZS1hbGlnbmVkLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IGJ5dGVzUGVyU2FtcGxlID0gYml0c1BlclNhbXBsZSAvIDg7CisKKyAgICAvLyBDaG9vc2Ugc3RyaXAgc2l6ZSBhcyBjbG9zZSB0byA4a2IgYXMgcG9zc2libGUgd2l0aG91dCBzcGxpdHRpbmcgcm93cy4KKyAgICAvLyBJZiB0aGUgcm93IGxlbmd0aCBpcyA+OGtiLCBlYWNoIHN0cmlwIHdpbGwgb25seSBjb250YWluIGEgc2luZ2xlIHJvdy4KKyAgICBjb25zdCB1aW50MzJfdCByb3dMZW5ndGhCeXRlcyA9IGJ5dGVzUGVyU2FtcGxlICogc2FtcGxlc1BlclBpeGVsICogd2lkdGg7CisgICAgY29uc3QgdWludDMyX3QgaWRlYWxDaHVua1NpemUgPSAoMSA8PCAxMyk7IC8vIDhrYgorICAgIHVpbnQzMl90IHJvd3NQZXJDaHVuayA9IGlkZWFsQ2h1bmtTaXplIC8gcm93TGVuZ3RoQnl0ZXM7CisgICAgcm93c1BlckNodW5rID0gKHJvd3NQZXJDaHVuayA9PSAwKSA/IDEgOiByb3dzUGVyQ2h1bms7CisgICAgY29uc3QgdWludDMyX3QgYWN0dWFsQ2h1bmtTaXplID0gcm93TGVuZ3RoQnl0ZXMgKiByb3dzUGVyQ2h1bms7CisKKyAgICBjb25zdCB1aW50MzJfdCBsYXN0Q2h1bmtSb3dzID0gaGVpZ2h0ICUgcm93c1BlckNodW5rOworICAgIGNvbnN0IHVpbnQzMl90IGxhc3RDaHVua1NpemUgPSBsYXN0Q2h1bmtSb3dzICogcm93TGVuZ3RoQnl0ZXM7CisKKyAgICBpZiAoYWN0dWFsQ2h1bmtTaXplID4gLyptYXggc3RyaXAgc2l6ZSBmb3IgVElGRi9FUCovNjU1MzYpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJpcCBsZW5ndGggdG9vIGxvbmcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtU3RyaXBzID0gaGVpZ2h0IC8gcm93c1BlckNodW5rOworCisgICAgLy8gQWRkIGFub3RoZXIgc3RyaXAgZm9yIHRoZSBpbmNvbXBsZXRlIGNodW5rLgorICAgIGlmIChsYXN0Q2h1bmtSb3dzID4gMCkgeworICAgICAgICBudW1TdHJpcHMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBQdXQgZWFjaCByb3cgaW4gaXQncyBvd24gc3RyaXAKKyAgICB1aW50MzJfdCByb3dzUGVyU3RyaXBWYWwgPSByb3dzUGVyQ2h1bms7CisgICAgc3A8VGlmZkVudHJ5PiByb3dzUGVyU3RyaXAgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19ST1dTUEVSU1RSSVAsIExPTkcsIDEsCisgICAgICAgICAgICBVTkRFRklORURfRU5ESUFOLCAmcm93c1BlclN0cmlwVmFsKTsKKworICAgIGlmIChyb3dzUGVyU3RyaXAgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgUm93c1BlclN0cmlwIHRhZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50MzJfdD4gYnl0ZUNvdW50czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyaXBzOyArK2kpIHsKKyAgICAgICAgaWYgKGxhc3RDaHVua1Jvd3MgPiAwICYmIGkgPT0gKG51bVN0cmlwcyAtIDEpKSB7CisgICAgICAgICAgICBieXRlQ291bnRzLmFkZChsYXN0Q2h1bmtTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVDb3VudHMuYWRkKGFjdHVhbENodW5rU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgYnl0ZSBjb3VudHMgZm9yIGVhY2ggc3RyaXAKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwQnl0ZUNvdW50cyA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1NUUklQQllURUNPVU5UUywgTE9ORywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1TdHJpcHMpLCBVTkRFRklORURfRU5ESUFOLCBieXRlQ291bnRzLmFycmF5KCkpOworCisgICAgaWYgKHN0cmlwQnl0ZUNvdW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBTdHJpcEJ5dGVDb3VudHMgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiBzdHJpcE9mZnNldHNWZWN0b3I7CisgICAgc3RyaXBPZmZzZXRzVmVjdG9yLnJlc2l6ZShudW1TdHJpcHMpOworCisgICAgLy8gU2V0IHVuaW5pdGlhbGl6ZWQgb2Zmc2V0cworICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBPZmZzZXRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBPRkZTRVRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIHN0cmlwT2Zmc2V0c1ZlY3Rvci5hcnJheSgpKTsKKworICAgIGlmIChzdHJpcE9mZnNldHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgU3RyaXBPZmZzZXRzIHRhZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmKGFkZEVudHJ5KHN0cmlwQnl0ZUNvdW50cykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYWRkIGVudHJ5IGZvciBTdHJpcEJ5dGVDb3VudHMgdG8gSUZEICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmKGFkZEVudHJ5KHJvd3NQZXJTdHJpcCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYWRkIGVudHJ5IGZvciBTdHJpcEJ5dGVDb3VudHMgdG8gSUZEICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmKGFkZEVudHJ5KHN0cmlwT2Zmc2V0cykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYWRkIGVudHJ5IGZvciBTdHJpcEJ5dGVDb3VudHMgdG8gSUZEICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFRpZmZJZmQ6OnVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkgY29uc3QgeworICAgIHJldHVybiBtU3RyaXBPZmZzZXRzSW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXR1c190IFRpZmZJZmQ6OnNldFN0cmlwT2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworCisgICAgLy8gR2V0IG9sZCBvZmZzZXRzIGFuZCBieXRlY291bnRzCisgICAgc3A8VGlmZkVudHJ5PiBvbGRPZmZzZXRzID0gZ2V0RW50cnkoVEFHX1NUUklQT0ZGU0VUUyk7CisgICAgaWYgKG9sZE9mZnNldHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2VzIG5vdCBjb250YWluIFN0cmlwT2Zmc2V0cyBlbnRyeS4iLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcEJ5dGVDb3VudHMgPSBnZXRFbnRyeShUQUdfU1RSSVBCWVRFQ09VTlRTKTsKKyAgICBpZiAoc3RyaXBCeXRlQ291bnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJRkQgJXUgZG9lcyBub3QgY29udGFpbiBTdHJpcEJ5dGVDb3VudHMgZW50cnkuIiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IG9mZnNldHNDb3VudCA9IG9sZE9mZnNldHMtPmdldENvdW50KCk7CisgICAgdWludDMyX3QgYnl0ZUNvdW50ID0gc3RyaXBCeXRlQ291bnRzLT5nZXRDb3VudCgpOworICAgIGlmIChvZmZzZXRzQ291bnQgIT0gYnl0ZUNvdW50KSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyaXBPZmZzZXRzIGNvdW50ICgldSkgZG9lc24ndCBtYXRjaCBTdHJpcEJ5dGVDb3VudHMgY291bnQgKCV1KSBpbiBJRkQgJXUiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvZmZzZXRzQ291bnQsIGJ5dGVDb3VudCwgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCogc3RyaXBCeXRlQ291bnRzQXJyYXkgPSBzdHJpcEJ5dGVDb3VudHMtPmdldERhdGE8dWludDMyX3Q+KCk7CisKKyAgICBzaXplX3QgbnVtU3RyaXBzID0gb2Zmc2V0c0NvdW50OworCisgICAgVmVjdG9yPHVpbnQzMl90PiBzdHJpcE9mZnNldHM7CisKKyAgICAvLyBDYWxjdWxhdGUgdXBkYXRlZCBieXRlIG9mZnNldHMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmlwczsgKytpKSB7CisgICAgICAgIHN0cmlwT2Zmc2V0cy5hZGQob2Zmc2V0KTsKKyAgICAgICAgb2Zmc2V0ICs9IHN0cmlwQnl0ZUNvdW50c0FycmF5W2ldOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gbmV3T2Zmc2V0cyA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1NUUklQT0ZGU0VUUywgTE9ORywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihudW1TdHJpcHMpLCBVTkRFRklORURfRU5ESUFOLCBzdHJpcE9mZnNldHMuYXJyYXkoKSk7CisKKyAgICBpZiAobmV3T2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bHQgbm90IGJ1aWxkIHVwZGF0ZWQgb2Zmc2V0cyBlbnRyeSBpbiBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGFkZEVudHJ5KG5ld09mZnNldHMpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZCB1cGRhdGVkIG9mZnNldHMgZW50cnkgaW4gSUZEICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmdldFN0cmlwU2l6ZSgpIGNvbnN0IHsKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwQnl0ZUNvdW50cyA9IGdldEVudHJ5KFRBR19TVFJJUEJZVEVDT1VOVFMpOworICAgIGlmIChzdHJpcEJ5dGVDb3VudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2VzIG5vdCBjb250YWluIFN0cmlwQnl0ZUNvdW50cyBlbnRyeS4iLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgY291bnQgPSBzdHJpcEJ5dGVDb3VudHMtPmdldENvdW50KCk7CisgICAgY29uc3QgdWludDMyX3QqIGJ5dGVDb3VudHMgPSBzdHJpcEJ5dGVDb3VudHMtPmdldERhdGE8dWludDMyX3Q+KCk7CisKKyAgICB1aW50MzJfdCB0b3RhbCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KTsgKytpKSB7CisgICAgICAgIHRvdGFsICs9IGJ5dGVDb3VudHNbaV07CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKworU3RyaW5nOCBUaWZmSWZkOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzaXplX3QgcyA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBTdHJpbmc4IG91dHB1dDsKKyAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCJbaWZkOiAleCwgbnVtX2VudHJpZXM6ICV6dSwgZW50cmllczpcbiIsIGdldElkKCksIHMpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtRW50cmllcy5zaXplKCk7ICsraSkgeworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcdCIpOworICAgICAgICBvdXRwdXQuYXBwZW5kKG1FbnRyaWVzW2ldLT50b1N0cmluZygpKTsKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgb3V0cHV0LmFwcGVuZCgiLCBuZXh0X2lmZDogJXhdIiwgKChtTmV4dElmZCAhPSBOVUxMKSA/IG1OZXh0SWZkLT5nZXRJZCgpIDogMCkpOworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK3ZvaWQgVGlmZklmZDo6bG9nKCkgY29uc3QgeworICAgIHNpemVfdCBzID0gbUVudHJpZXMuc2l6ZSgpOworICAgIEFMT0dJKCJbaWZkOiAleCwgbnVtX2VudHJpZXM6ICV6dSwgZW50cmllczpcbiIsIGdldElkKCksIHMpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzOyArK2kpIHsKKyAgICAgICAgQUxPR0koIlx0JXMiLCBtRW50cmllc1tpXS0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgfQorICAgIEFMT0dJKCIsIG5leHRfaWZkOiAleF0iLCAoKG1OZXh0SWZkICE9IE5VTEwpID8gbU5leHRJZmQtPmdldElkKCkgOiAwKSk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0YWJsZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY0JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGFibGUuY3BwCmluZGV4IDEzY2FjNmQuLmY4ZDdkZTcKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRhYmxlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKIAotLyogLS0tLS0gTWFpbiBmZWF0dXJlcyAtLS0tLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgiIC8qIFRyYW5zY29kZXIgKi8KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZldyaXRhYmxlLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZIZWxwZXJzLmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKK1RpZmZXcml0YWJsZTo6VGlmZldyaXRhYmxlKCkge30KKworVGlmZldyaXRhYmxlOjp+VGlmZldyaXRhYmxlKCkge30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDE3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlRpZmZXcml0ZXIiCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZldyaXRlci5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gVGlmZldyaXRlcjo6YnVpbGRUYWdNYXAoCisgICAgICAgICAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb25zLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IG1hcDsKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgbWFwLmFkZChkZWZpbml0aW9uc1tpXS50YWdJZCwgZGVmaW5pdGlvbnMgKyBpKTsKKyAgICB9CisgICAgcmV0dXJuIG1hcDsKK30KKworI2RlZmluZSBDT01QQVJFKG9wKSBcCitib29sIE9yZGVyYWJsZTo6b3BlcmF0b3Igb3AgKGNvbnN0IE9yZGVyYWJsZSYgb3JkZXJhYmxlKSBjb25zdCB7IFwKKyAgICByZXR1cm4gZ2V0Q29tcGFyYWJsZVZhbHVlKCkgb3Agb3JkZXJhYmxlLmdldENvbXBhcmFibGVWYWx1ZSgpOyBcCit9CisKKyNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgXAorICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKKworS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IFRpZmZXcml0ZXI6OnNUYWdNYXBzW10gPSB7CisgICAgYnVpbGRUYWdNYXAoVElGRl9FUF9UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoVElGRl9FUF9UQUdfREVGSU5JVElPTlMpKSwKKyAgICBidWlsZFRhZ01hcChETkdfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKEROR19UQUdfREVGSU5JVElPTlMpKSwKKyAgICBidWlsZFRhZ01hcChFWElGXzJfM19UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TKSksCisgICAgYnVpbGRUYWdNYXAoVElGRl82X1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShUSUZGXzZfVEFHX0RFRklOSVRJT05TKSkKK307CisKK1RpZmZXcml0ZXI6OlRpZmZXcml0ZXIoKSA6IG1UYWdNYXBzKHNUYWdNYXBzKSwgbU51bVRhZ01hcHMoREVGQVVMVF9OVU1fVEFHX01BUFMpIHt9CisKK1RpZmZXcml0ZXI6OlRpZmZXcml0ZXIoS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+KiBlbmFibGVkRGVmaW5pdGlvbnMsCisgICAgICAgIHNpemVfdCBsZW5ndGgpIDogbVRhZ01hcHMoZW5hYmxlZERlZmluaXRpb25zKSwgbU51bVRhZ01hcHMobGVuZ3RoKSB7fQorCitUaWZmV3JpdGVyOjp+VGlmZldyaXRlcigpIHt9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OndyaXRlKE91dHB1dCogb3V0LCBTdHJpcFNvdXJjZSoqIHNvdXJjZXMsIHNpemVfdCBzb3VyY2VzQ291bnQsCisgICAgICAgIEVuZGlhbm5lc3MgZW5kKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgRW5kaWFuT3V0cHV0IGVuZE91dChvdXQsIGVuZCk7CisKKyAgICBpZiAobUlmZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVGlmZiBoZWFkZXIgaXMgZW1wdHkuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSBnZXRUb3RhbFNpemUoKTsKKworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gb2Zmc2V0VmVjdG9yOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmFtZWRJZmRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtTmFtZWRJZmRzW2ldLT51bmluaXRpYWxpemVkT2Zmc2V0cygpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJpcFNpemUgPSBtTmFtZWRJZmRzW2ldLT5nZXRTdHJpcFNpemUoKTsKKyAgICAgICAgICAgIGlmIChtTmFtZWRJZmRzW2ldLT5zZXRTdHJpcE9mZnNldCh0b3RhbFNpemUpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgc2V0IHN0cmlwIG9mZnNldHMuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxTaXplICs9IHN0cmlwU2l6ZTsKKyAgICAgICAgICAgIFdPUkRfQUxJR04odG90YWxTaXplKTsKKyAgICAgICAgICAgIG9mZnNldFZlY3Rvci5hZGQobU5hbWVkSWZkcy5rZXlBdChpKSwgdG90YWxTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBvZmZWZWNTaXplID0gb2Zmc2V0VmVjdG9yLnNpemUoKTsKKyAgICBpZiAob2ZmVmVjU2l6ZSAhPSBzb3VyY2VzQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNaXNtYXRjaCBiZXR3ZWVuIG51bWJlciBvZiBJRkRzIHdpdGggdW5pbml0aWFsaXplZCBzdHJpcHMgKCV6dSkgYW5kIgorICAgICAgICAgICAgICAgICIgc291cmNlcyAoJXp1KS4iLCBfX0ZVTkNUSU9OX18sIG9mZlZlY1NpemUsIHNvdXJjZXNDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQkFJTF9PTl9GQUlMKHdyaXRlRmlsZUhlYWRlcihlbmRPdXQpLCByZXQpOworCisgICAgdWludDMyX3Qgb2Zmc2V0ID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChpZmQtPndyaXRlRGF0YShvZmZzZXQsICZlbmRPdXQpLCByZXQpOworICAgICAgICBvZmZzZXQgKz0gaWZkLT5nZXRTaXplKCk7CisgICAgICAgIGlmZCA9IGlmZC0+Z2V0TmV4dElmZCgpOworICAgIH0KKworICAgIGlmIChMT0dfTkRFQlVHID09IDApIHsKKyAgICAgICAgbG9nKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmZWZWNTaXplOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgaWZkS2V5ID0gb2Zmc2V0VmVjdG9yLmtleUF0KGkpOworICAgICAgICB1aW50MzJfdCBuZXh0T2Zmc2V0ID0gb2Zmc2V0VmVjdG9yW2ldOworICAgICAgICB1aW50MzJfdCBzaXplVG9Xcml0ZSA9IG1OYW1lZElmZHNbaWZkS2V5XS0+Z2V0U3RyaXBTaXplKCk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzb3VyY2VzQ291bnQ7ICsraikgeworICAgICAgICAgICAgaWYgKHNvdXJjZXNbal0tPmdldElmZCgpID09IGlmZEtleSkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gc291cmNlc1tpXS0+d3JpdGVUb1N0cmVhbShlbmRPdXQsIHNpemVUb1dyaXRlKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgd3JpdGUgdG8gc3RyZWFtLCByZWNlaXZlZCAlZC4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFpFUk9fVElMTF9XT1JEKCZlbmRPdXQsIHNpemVUb1dyaXRlLCByZXQpOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHN0cmVhbSBmb3IgYnl0ZSBzdHJpcHMgZm9yIElGRCAldSIsIF9fRlVOQ1RJT05fXywgaWZkS2V5KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KG5leHRPZmZzZXQgPT0gZW5kT3V0LmdldEN1cnJlbnRPZmZzZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGUoT3V0cHV0KiBvdXQsIEVuZGlhbm5lc3MgZW5kKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgRW5kaWFuT3V0cHV0IGVuZE91dChvdXQsIGVuZCk7CisKKyAgICBpZiAobUlmZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVGlmZiBoZWFkZXIgaXMgZW1wdHkuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQkFJTF9PTl9GQUlMKHdyaXRlRmlsZUhlYWRlcihlbmRPdXQpLCByZXQpOworCisgICAgdWludDMyX3Qgb2Zmc2V0ID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChpZmQtPndyaXRlRGF0YShvZmZzZXQsICZlbmRPdXQpLCByZXQpOworICAgICAgICBvZmZzZXQgKz0gaWZkLT5nZXRTaXplKCk7CisgICAgICAgIGlmZCA9IGlmZC0+Z2V0TmV4dElmZCgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK2NvbnN0IFRhZ0RlZmluaXRpb25fdCogVGlmZldyaXRlcjo6bG9va3VwRGVmaW5pdGlvbih1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bVRhZ01hcHM7ICsraSkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ01hcHNbaV0uaW5kZXhPZktleSh0YWcpOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgZGVmaW5pdGlvbiA9IG1UYWdNYXBzW2ldW2luZGV4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlZmluaXRpb24gZXhpc3RzIGZvciB0YWcgd2l0aCBpZCAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uOworfQorCitzcDxUaWZmRW50cnk+IFRpZmZXcml0ZXI6OmdldEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBJRkQgJWQgc2V0IGZvciB0aGlzIHdyaXRlci4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbU5hbWVkSWZkc1tpbmRleF0tPmdldEVudHJ5KHRhZyk7Cit9CisKK3ZvaWQgVGlmZldyaXRlcjo6cmVtb3ZlRW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgbU5hbWVkSWZkc1tpbmRleF0tPnJlbW92ZUVudHJ5KHRhZyk7CisgICAgfQorfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRFbnRyeShjb25zdCBzcDxUaWZmRW50cnk+JiBlbnRyeSwgdWludDMyX3QgaWZkKSB7CisgICAgdWludDE2X3QgdGFnID0gZW50cnktPmdldFRhZygpOworCisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworCisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlZmluaXRpb24gZXhpc3RzIGZvciB0YWcgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworCisgICAgLy8gQWRkIGEgbmV3IElGRCBpZiBuZWNlc3NhcnkKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gSUZEICV1IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzcDxUaWZmSWZkPiBzZWxlY3RlZElmZCAgPSBtTmFtZWRJZmRzW2luZGV4XTsKKyAgICByZXR1cm4gc2VsZWN0ZWRJZmQtPmFkZEVudHJ5KGVudHJ5KTsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkU3RyaXAodWludDMyX3QgaWZkKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJZmQgJXUgZG9lc24ndCBleGlzdCwgY2Fubm90IGFkZCBzdHJpcCBlbnRyaWVzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8VGlmZklmZD4gc2VsZWN0ZWQgPSBtTmFtZWRJZmRzW2luZGV4XTsKKyAgICByZXR1cm4gc2VsZWN0ZWQtPnZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCk7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZElmZCh1aW50MzJfdCBpZmQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJZmQgd2l0aCBJRCAweCV4IGFscmVhZHkgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmSWZkPiBuZXdJZmQgPSBuZXcgVGlmZklmZChpZmQpOworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgbUlmZCA9IG5ld0lmZDsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxUaWZmSWZkPiBsYXN0ID0gZmluZExhc3RJZmQoKTsKKyAgICAgICAgbGFzdC0+c2V0TmV4dElmZChuZXdJZmQpOworICAgIH0KKworICAgIGlmKG1OYW1lZElmZHMuYWRkKGlmZCwgbmV3SWZkKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIG5ldyBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRTdWJJZmQodWludDMyX3QgcGFyZW50SWZkLCB1aW50MzJfdCBpZmQsIFN1YklmZFR5cGUgdHlwZSkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCB3aXRoIElEIDB4JXggYWxyZWFkeSBleGlzdHMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgcGFyZW50SW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkocGFyZW50SWZkKTsKKyAgICBpZiAocGFyZW50SW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogUGFyZW50IElGRCB3aXRoIElEIDB4JXggZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IHBhcmVudCA9IG1OYW1lZElmZHNbcGFyZW50SW5kZXhdOworICAgIHNwPFRpZmZJZmQ+IG5ld0lmZCA9IG5ldyBUaWZmSWZkKGlmZCk7CisKKyAgICB1aW50MTZfdCBzdWJJZmRUYWc7CisgICAgaWYgKHR5cGUgPT0gU1VCSUZEKSB7CisgICAgICAgIHN1YklmZFRhZyA9IFRBR19TVUJJRkRTOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBHUFNJTkZPKSB7CisgICAgICAgIHN1YklmZFRhZyA9IFRBR19HUFNJTkZPOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBTdWJJRkQgdHlwZSAlZC4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gc3ViSWZkcyA9IHBhcmVudC0+Z2V0RW50cnkoc3ViSWZkVGFnKTsKKyAgICBpZiAoc3ViSWZkcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChidWlsZEVudHJ5KHN1YklmZFRhZywgMSwgJm5ld0lmZCwgJnN1YklmZHMpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodHlwZSA9PSBHUFNJTkZPKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBhZGQgR1BTSW5mbyBTdWJJRkQgdG8gSUZEICV1LCBvbmUgYWxyZWFkeSBleGlzdHMuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxzcDxUaWZmSWZkPiA+IHN1YklmZExpc3Q7CisgICAgICAgIGNvbnN0IHNwPFRpZmZJZmQ+KiBvbGRJZmRBcnJheSA9IHN1YklmZHMtPmdldERhdGE8c3A8VGlmZklmZD4gPigpOworICAgICAgICBpZiAoc3ViSWZkTGlzdC5hcHBlbmRBcnJheShvbGRJZmRBcnJheSwgc3ViSWZkcy0+Z2V0Q291bnQoKSkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWJJZmRMaXN0LmFkZChuZXdJZmQpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHN1YklmZExpc3Quc2l6ZSgpOworICAgICAgICBpZiAoYnVpbGRFbnRyeShzdWJJZmRUYWcsIGNvdW50LCBzdWJJZmRMaXN0LmFycmF5KCksICZzdWJJZmRzKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBhcmVudC0+YWRkRW50cnkoc3ViSWZkcykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGFkZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmKG1OYW1lZElmZHMuYWRkKGlmZCwgbmV3SWZkKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIG5ldyBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitUYWdUeXBlIFRpZmZXcml0ZXI6OmdldERlZmF1bHRUeXBlKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGZpbmQgZGVmaW5pdGlvbiBmb3IgdGFnICV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9UQUdUWVBFOworICAgIH0KKyAgICByZXR1cm4gZGVmaW5pdGlvbi0+ZGVmYXVsdFR5cGU7Cit9CisKK3VpbnQzMl90IFRpZmZXcml0ZXI6OmdldERlZmF1bHRDb3VudCh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisgICAgaWYgKGRlZmluaXRpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBmaW5kIGRlZmluaXRpb24gZm9yIHRhZyAleCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT5maXhlZENvdW50OworfQorCitib29sIFRpZmZXcml0ZXI6Omhhc0lmZCh1aW50MzJfdCBpZmQpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgcmV0dXJuIGluZGV4ID49IDA7Cit9CisKK2Jvb2wgVGlmZldyaXRlcjo6Y2hlY2tJZkRlZmluZWQodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgcmV0dXJuIGxvb2t1cERlZmluaXRpb24odGFnKSAhPSBOVUxMOworfQorCitjb25zdCBjaGFyKiBUaWZmV3JpdGVyOjpnZXRUYWdOYW1lKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGVmaW5pdGlvbi0+dGFnTmFtZTsKK30KKworc3A8VGlmZklmZD4gVGlmZldyaXRlcjo6ZmluZExhc3RJZmQoKSB7CisgICAgc3A8VGlmZklmZD4gaWZkID0gbUlmZDsKKyAgICB3aGlsZShpZmQgIT0gTlVMTCkgeworICAgICAgICBzcDxUaWZmSWZkPiBuZXh0SWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgICAgIGlmIChuZXh0SWZkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmZCA9IG5leHRJZmQ7CisgICAgfQorICAgIHJldHVybiBpZmQ7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OndyaXRlRmlsZUhlYWRlcihFbmRpYW5PdXRwdXQmIG91dCkgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIHVpbnQxNl90IGVuZE1hcmtlciA9IChvdXQuZ2V0RW5kaWFubmVzcygpID09IEJJRykgPyBCSUdfRU5ESUFOX01BUktFUiA6IExJVFRMRV9FTkRJQU5fTUFSS0VSOworICAgIEJBSUxfT05fRkFJTChvdXQud3JpdGUoJmVuZE1hcmtlciwgMCwgMSksIHJldCk7CisKKyAgICB1aW50MTZfdCB0aWZmTWFya2VyID0gVElGRl9GSUxFX01BUktFUjsKKyAgICBCQUlMX09OX0ZBSUwob3V0LndyaXRlKCZ0aWZmTWFya2VyLCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQzMl90IG9mZnNldE1hcmtlciA9IEZJTEVfSEVBREVSX1NJWkU7CisgICAgQkFJTF9PTl9GQUlMKG91dC53cml0ZSgmb2Zmc2V0TWFya2VyLCAwLCAxKSwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCit1aW50MzJfdCBUaWZmV3JpdGVyOjpnZXRUb3RhbFNpemUoKSBjb25zdCB7CisgICAgdWludDMyX3QgdG90YWxTaXplID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbFNpemU7Cit9CisKK3ZvaWQgVGlmZldyaXRlcjo6bG9nKCkgY29uc3QgeworICAgIEFMT0dJKCIlczogVGlmZldyaXRlcjoiLCBfX0ZVTkNUSU9OX18pOworICAgIHNpemVfdCBsZW5ndGggPSBtTmFtZWRJZmRzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIG1OYW1lZElmZHNbaV0tPmxvZygpOworICAgIH0KK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggMmJiNmRiZS4uZTBjYThhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTE1LDE2ICsxNSwxMCBAQAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CiAKLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IDE2NjNkNDcuLjY2ODZmMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMzAsMjUgKzMwLDEzIEBACiAKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgogCisvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCiB0eXBlZGVmIGVudW0gewotICAgIENIQU5ORUxfTUFTS19TVVJST1VORCA9IEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAotICAgIENIQU5ORUxfTUFTS19RVUFEX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF9RVUFELAotICAgIC8vIGxpa2UgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCB3aXRoICpfU0lERV8qIGluc3RlYWQgb2YgKl9CQUNLXyosIHNhbWUgY2hhbm5lbCBvcmRlcgotICAgIENIQU5ORUxfTUFTS19RVUFEX1NJREUgPQotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCwKLSAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKLSAgICAvLyBsaWtlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgd2l0aCAqX1NJREVfKiBpbnN0ZWFkIG9mICpfQkFDS18qLCBzYW1lIGNoYW5uZWwgb3JkZXIKLSAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFID0KLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQsCi0gICAgQ0hBTk5FTF9NQVNLXzdQT0lOVDFfU0lERV9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgIENIQU5ORUxfTUFTS19RVUFEX1NJREUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgIENIQU5ORUxfTUFTS183UE9JTlQxID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKIH0gZG93bm1peF9pbnB1dF9jaGFubmVsX21hc2tfdDsKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZG93bm1peCBlZmZlY3QKQEAgLTEzMCw3ICsxMTgsNyBAQAogICAgICAgICBoYXNCYWNrcyA9IHRydWU7CiAgICAgfQogCi0gICAgY29uc3QgaW50IG51bUNoYW4gPSBwb3Bjb3VudChtYXNrKTsKKyAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKICAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOwogICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KICAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOwpAQCAtMzQwLDE0ICszMjgsMTEgQEAKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19TVVJST1VORDoKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxX1NJREVfQkFDSzoKKyAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKICAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTY0NCw3ICs2MjksOCBAQAogICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2sgY2FuJ3QgYmUgMCIpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9IHBvcGNvdW50KHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB9CiAKICAgICBEb3dubWl4X1Jlc2V0KHBEb3dubWl4ZXIsIGluaXQpOwpAQCAtODI4LDY1ICs4MTQsNiBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSAic3Vycm91bmQgc291bmQiIChtb25vIHJlYXIpIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICBzdXJyb3VuZCBzaWduYWwgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBzdXJyb3VuZCBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXZvaWQgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0gICAgaW50MzJfdCBsdCwgcnQsIGNlbnRlclBsdXNSZWFyQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0Ci0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUkMKLSAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKLSAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCi0gICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c1JlYXJDb250cmliID0gRkMoLTNkQikgKyBSQygtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c1JlYXJDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBydCA9IChwU3JjWzFdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KHBEc3RbMF0gKyAobHQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHBEc3RbMV0gKyAocnQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c1JlYXJDb250cmliID0gRkMoLTNkQikgKyBSQygtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c1JlYXJDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c1JlYXJDb250cmliCi0gICAgICAgICAgICBydCA9IChwU3JjWzFdIDw8IDEyKSArIGNlbnRlclBsdXNSZWFyQ29udHJpYjsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihsdCA+PiAxMyk7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wMTYocnQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRG93bm1peF9mb2xkRnJvbTVQb2ludDEoKQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBQdXJwb3NlOgpAQCAtMTA3MSw3ICs5OTgsNyBAQAogICAgICAgICBoYXNCYWNrcyA9IHRydWU7CiAgICAgfQogCi0gICAgY29uc3QgaW50IG51bUNoYW4gPSBwb3Bjb3VudChtYXNrKTsKKyAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKICAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOwogICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KICAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKaW5kZXggZmNiM2M5ZS4uMjM5OWFiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCkBAIC05Nyw3ICs5Nyw2IEBACiBpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOwogCiB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXZvaWQgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCBkYjVjNzhmLi42YzJjYmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKIAogCkBAIC0xNjEsNyArMTYzLDcgQEAKIAogZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSGFuZGxlKXsKICAgICBpbnQgcmV0ID0gMDsKICAgICBpbnQgc2Vzc2lvbk5vOwpAQCAtMjIxLDYgKzIyMyw4IEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkICAgICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCAgICAgID0gTFZNX0ZBTFNFOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCAgICAgID0gMDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgICAgICAgICAgICAgID0gTFZNX1RSVUU7CkBAIC01NjAsMTEgKzU2NCwxMiBAQAogICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKIAogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01NzYsMTEgKzU4MSwxMSBAQAogICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCiAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KQEAgLTg4OSwxNiArODk0LDE2IEBACiAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExNjMsNiArMTE2OCwxNzcgQEAKICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuXG4iKTsKIH0gICAgLyogZW5kIHNldFN0cmVuZ3RoICovCiAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBDaGVjayBpZiBhbiBhdWRpbyBkZXZpY2UgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBkZXZpY2VUeXBlICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvciBpdCBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgeworICAgIHN3aXRjaCAoZGV2aWNlVHlwZSkgeworICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQgOgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQ2hlY2sgaWYgYSBjaGFubmVsIG1hc2sgKyBhdWRpbyBkZXZpY2UgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBjaGFubmVsTWFzayAgdGhlIGNoYW5uZWwgbWFzayBvZiB0aGUgaW5wdXQgdG8gdmlydHVhbGl6ZQorLy8gIGRldmljZVR5cGUgICB0aGUgdHlwZSBvZiBkZXZpY2UgdGhhdCBhZmZlY3RzIHRoZSBwcm9jZXNzaW5nIChlLmcuIGZvciBiaW5hdXJhbCB2cyB0cmFuc2F1cmFsKQorLy8gT3V0cHV0OgorLy8gIC1FSU5WQUwgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9yIGl0IGlzIHVua25vd24KKy8vICAwICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEZvcmNlIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIHRvIHRoYXQgb2YgdGhlIGdpdmVuIGF1ZGlvIGRldmljZQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dCAgICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgZm9yY2VkRGV2aWNlIHRoZSB0eXBlIG9mIGRldmljZSB3aG9zZSB2aXJ0dWFsaXphdGlvbiBtb2RlIHdlJ2xsIGFsd2F5cyB1c2UKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIG9yIGlzIHVua25vd24KKy8vICAwICAgICAgICAgICAgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGZvcmNlZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGF1ZGlvX2RldmljZXNfdCBmb3JjZWREZXZpY2UpIHsKKyAgICBBTE9HVigiVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZTogZm9yY2VkRGV2PTB4JXggZW5hYmxlZD0lZCB0bXBEaXNhYmxlZD0lZCIsCisgICAgICAgICAgICBmb3JjZWREZXZpY2UsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQsCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQpOworICAgIGludCBzdGF0dXMgPSAwOworICAgIGJvb2wgdXNlVmlydHVhbGl6ZXIgPSBmYWxzZTsKKworICAgIGlmIChWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGZvcmNlZERldmljZSkgIT0gMCkgeworICAgICAgICAvLyBmb3JjZWQgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQsIG1ha2UgaXQgYmVoYXZlIGFzIGEgcmVzZXQgb2YgZm9yY2VkIG1vZGUKKyAgICAgICAgZm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIC8vIGJ1dCByZXR1cm4gYW4gZXJyb3IKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoZm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIGRpc2FibGluZyBmb3JjZWQgdmlydHVhbGl6YXRpb24gbW9kZToKKyAgICAgICAgLy8gdmVyaWZ5IHdoZXRoZXIgdGhlIHZpcnR1YWxpemF0aW9uIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkCisgICAgICAgIGlmIChWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UpID09IDApIHsKKyAgICAgICAgICAgIHVzZVZpcnR1YWxpemVyID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZvcmNpbmcgdmlydHVhbGl6YXRpb24gbW9kZTogaGVyZSB3ZSBhbHJlYWR5IGtub3cgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7CisgICAgICAgIC8vIG9ubHkgZW5hYmxlIGZvciBhIHN1cHBvcnRlZCBtb2RlLCB3aGVuIHRoZSBlZmZlY3QgaXMgZW5hYmxlZAorICAgICAgICB1c2VWaXJ0dWFsaXplciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKTsKKyAgICB9CisKKyAgICBpZiAodXNlVmlydHVhbGl6ZXIpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgbGVhdmluZyBMVk1fVklSVFVBTElaRVIgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSBsZWF2aW5nIExWTV9WSVJUVUFMSVpFUiBkaXNhYmxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIlx0YWZ0ZXIgVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZTogZW5hYmxlZD0lZCB0bXBEaXNhYmxlZD0lZCIsCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIHZpcnR1YWwgc3BlYWtlciBhbmdsZXMgZm9yIGEgY2hhbm5lbCBtYXNrICsgYXVkaW8gZGV2aWNlIHR5cGUKKy8vIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorLy8KKy8vIElucHV0czoKKy8vICBjaGFubmVsTWFzazogICB0aGUgY2hhbm5lbCBtYXNrIG9mIHRoZSBpbnB1dCB0byB2aXJ0dWFsaXplCisvLyAgZGV2aWNlVHlwZSAgICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIElucHV0L091dHB1dDoKKy8vICBwU3BlYWtlckFuZ2xlcyB0aGUgYXJyYXkgb2YgaW50ZWdlciB3aGVyZSBlYWNoIHNwZWFrZXIgYW5nbGUgaXMgd3JpdHRlbiBhcyBhIHRyaXBsZXQgaW4gdGhlCisvLyAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGZvcm1hdDoKKy8vICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGEgYml0IG1hc2sgd2l0aCBhIHNpbmdsZSB2YWx1ZSBzZWxlY3RlZCBmb3IgZWFjaCBzcGVha2VyLCBmb2xsb3dpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb252ZW50aW9uIG9mIHRoZSBhdWRpb19jaGFubmVsX21hc2tfdCB0eXBlCisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIHZhbHVlIGluIGRlZ3JlZXMgZXhwcmVzc2luZyB0aGUgc3BlYWtlciBhemltdXRoLCB3aGVyZSAwIGlzIGluIGZyb250CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdXNlciwgMTgwIGJlaGluZCwgLTkwIHRvIHRoZSBsZWZ0LCA5MCB0byB0aGUgcmlnaHQgb2YgdGhlIHVzZXIKKy8vICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGEgdmFsdWUgaW4gZGVncmVlcyBleHByZXNzaW5nIHRoZSBzcGVha2VyIGVsZXZhdGlvbiwgd2hlcmUgMCBpcyB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgcGxhbmUsICs5MCBpcyBkaXJlY3RseSBhYm92ZSB0aGUgdXNlciwgLTkwIGJlbG93CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFZpcnR1YWxpemVyR2V0U3BlYWtlckFuZ2xlcyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgX191bnVzZWQsIGludDMyX3QgKnBTcGVha2VyQW5nbGVzKSB7CisgICAgLy8gdGhlIGNoYW5uZWwgY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSAxIG9yIDIKKyAgICAvLyB0aGUgZGV2aWNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBoZWFkcGhvbmUKKyAgICAvLyB0aGlzIHZpcnR1YWxpemVyIGlzIGFsd2F5cyAyaW4gd2l0aCBzcGVha2VycyBhdCAtOTAgYW5kIDkwZGVnIG9mIGF6aW11dGgsIDBkZWcgb2YgZWxldmF0aW9uCisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVDsKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IC05MDsgLy8gYXppbXV0aAorICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgICAvLyBlbGV2YXRpb24KKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDsKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDkwOyAgLy8gYXppbXV0aAorICAgICpwU3BlYWtlckFuZ2xlcyAgID0gMDsgICAvLyBlbGV2YXRpb24KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBkZXZpY2Ugd2hvc2UgcHJvY2Vzc2luZyBtb2RlIGlzIHVzZWQgYnkgdGhpcyBlZmZlY3QKKy8vCisvLyBPdXRwdXQ6CisvLyAgIEFVRElPX0RFVklDRV9OT05FIGlmIHRoZSBlZmZlY3QgaXMgbm90IHZpcnR1YWxpemluZworLy8gICBvciB0aGUgZGV2aWNlIHR5cGUgaWYgdGhlIGVmZmVjdCBpcyB2aXJ0dWFsaXppbmcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYXVkaW9fZGV2aWNlc190IFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7CisgICAgYXVkaW9fZGV2aWNlc190IHZpcnREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICAmJiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID09IExWTV9GQUxTRSkpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgLy8gdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQsIHJldHVybiB0aGF0IGRldmljZQorICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIGZvcmNlZCBtb2RlLCByZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlCisgICAgICAgICAgICB2aXJ0RGV2aWNlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoKSByZXR1cm5pbmcgMHgleCIsIHZpcnREZXZpY2UpOworICAgIHJldHVybiB2aXJ0RGV2aWNlOworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVxdWFsaXplckxpbWl0QmFuZExldmVscygpCkBAIC0xMzU3LDcgKzE1MzMsNyBAQAogLy8gIHBMb3c6ICAgICAgIGxvd2VyIGJhbmQgcmFuZ2UKIC8vICBwTG93OiAgICAgICB1cHBlciBiYW5kIHJhbmdlCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCAqcExvdywKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgaW50MzJfdCBiYW5kLCB1aW50MzJfdCAqcExvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcEhpKXsKICAgICAqcExvdyA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMF07CiAgICAgKnBIaSAgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzFdOwpAQCAtMTM4MSw3ICsxNTU3LDcgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHRhcmdldEZyZXEpeworaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0IF9fdW51c2VkLCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKICAgICBpbnQgYmFuZCA9IDA7CiAKICAgICBpZih0YXJnZXRGcmVxIDwgYmFuZEZyZXFSYW5nZVswXVswXSl7CkBAIC0xODgxLDcgKzIwNTcsNiBAQAogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICBpbnQzMl90IHBhcmFtMjsKICAgICBjaGFyICpuYW1lOwogCiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKQEAgLTE5MDEsNyArMjA3NiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKLQorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6CisgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgc2l6ZSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byBpbnB1dCB2YWx1ZSwKKyAgICAgICAgICAgIC8vIGRlZmVycmluZyB2YWxpZGl0eSBjaGVjayB0byBiZWxvdworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgJWQiLCpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMiwxMyArMjEwNywzNiBAQAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSAqcFBhcmFtVGVtcCsrOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqcFBhcmFtVGVtcDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgc3VwcG9ydHMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKKyAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kIHJldHVybmluZyBzdGF0dXM9JWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMTk2Myw2ICsyMTcxLDE1IEBACiAgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CiAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERTogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAqKGF1ZGlvX2RldmljZXNfdCAqKSBwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIC8vQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPTB4JXggcmVzdWx0PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI4NjMsNyArMzA4MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7Ci0KICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCkBAIC0yOTc0LDE0ICszMTkwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICAgICAgICAvLyBXYXJuaW5nIHRoaXMgbG9nIHdpbGwgZmFpbCB0byBwcm9wZXJseSByZWFkIGFuIGludDMyX3QgdmFsdWUsIGFzc3VtZXMgaW50MTZfdAogICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkIiwKICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMfHwKLSAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAhPSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArc2l6ZW9mKGludDE2X3QpKXx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAvLyBsZWdhbCBwYXJhbWV0ZXJzIGFyZSBpbnQxNl90IG9yIGludDMyX3QKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICA+IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArc2l6ZW9mKGludDE2X3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKQEAgLTMwNzMsNiArMzI5Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFIHN0YXJ0Iik7CiAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkgZGV2aWNlOwogCiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKQEAgLTMxMDgsMzcgKzMzMjgsMzggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSB1bmxlc3MgY29uZmlndXJhdGlvbiBpcyBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OlZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKIAotICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAotCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMzMwYmIzMi4uNDIwZjk3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTczLDYgKzczLDggQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBjNmQzNzU5Li4xM2YxYTBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKIC8vIGZyb20gUmV2ZXJiL2xpYgogI2luY2x1ZGUgIkxWUkVWLmgiCkBAIC0yNjksNyArMjcxLDcgQEAKICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKICAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKIAotICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlZCIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOworICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAlcCwgc2l6ZSAlenUiLCBwQ29udGV4dCwgc2l6ZW9mKFJldmVyYkNvbnRleHQpKTsKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kXG4iKTsKICAgICByZXR1cm4gMDsKIH0gLyogZW5kIEVmZmVjdENyZWF0ZSAqLwpAQCAtNTcwLDE1ICs1NzIsMTUgQEAKICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewogICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGZyZWUoKSAtIFNUQVJUIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGZyZWUoKSAtIEVORCAgIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBmcmVlKCkgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMiAiIGJ5dGVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CkBAIC03NzEsMTEgKzc3MywxMiBAQAogICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKIAogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc4NywxMSArNzkwLDExIEBACiAgICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpewogICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgLSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgLSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsKaW5kZXggOWU4Y2I4My4uZWEzYzU5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsKQEAgLTI0LDEyICsyNCw3IEBACiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZwogCi1pZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZWxzZQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotZW5kaWYKLQogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCmluZGV4IGE5NmE3MDMuLmNmOThmNTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKQEAgLTg3OSw4ICs4NzksOCBAQAogaW50IFNlc3Npb25fU2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKIHsKICAgICB1aW50MzJfdCBzcjsKLSAgICB1aW50MzJfdCBpbkNubCA9IHBvcGNvdW50KGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIHVpbnQzMl90IG91dENubCA9IHBvcGNvdW50KGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAogICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKQEAgLTEwMzUsNyArMTAzNSw3IEBACiAgICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgdWludDMyX3QgaW5DbmwgPSBwb3Bjb3VudChjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5zZXRfbnVtX3JldmVyc2VfY2hhbm5lbHMoaW5DbmwpOwogICAgIGlmIChzdGF0dXMgPCAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCBkZDJkMzA2Li5jOTJjNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMTcsNyArMTcsNiBAQAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDQ3Y2FiNjIuLmU1MDg5ZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTIwNyw3ICsyMDcsOCBAQAogICAgIHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9OT1JNQUxJWkVEOwogCiAgICAgLy8gbWVhc3VyZW1lbnQgaW5pdGlhbGl6YXRpb24KLSAgICBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlID0gTUVBU1VSRU1FTlRfTU9ERV9OT05FOwogICAgIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRXaW5kb3dTaXplSW5CdWZmZXJzID0gTUVBU1VSRU1FTlRfV0lORE9XX01BWF9TSVpFX0lOX0JVRkZFUlM7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCAxZTMyMmY5Li5lMDEyMTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTI1LDYgKzI1LDkgQEAKICAgICBBdWRpb1JlY29yZC5jcHAgXAogICAgIEF1ZGlvU3lzdGVtLmNwcCBcCiAgICAgbWVkaWFwbGF5ZXIuY3BwIFwKKyAgICBJTWVkaWFDb2RlY0xpc3QuY3BwIFwKKyAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAgXAorICAgIElNZWRpYUhUVFBTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhTG9nU2VydmljZS5jcHAgXAogICAgIElNZWRpYVBsYXllclNlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJDbGllbnQuY3BwIFwKQEAgLTM0LDYgKzM3LDcgQEAKICAgICBJUmVtb3RlRGlzcGxheS5jcHAgXAogICAgIElSZW1vdGVEaXNwbGF5Q2xpZW50LmNwcCBcCiAgICAgSVN0cmVhbVNvdXJjZS5jcHAgXAorICAgIE1lZGlhQ29kZWNJbmZvLmNwcCBcCiAgICAgTWV0YWRhdGEuY3BwIFwKICAgICBtZWRpYXJlY29yZGVyLmNwcCBcCiAgICAgSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwIFwKQEAgLTQyLDkgKzQ2LDEwIEBACiAgICAgSmV0UGxheWVyLmNwcCBcCiAgICAgSU9NWC5jcHAgXAogICAgIElBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBcCiAgICAgTWVkaWFTY2FubmVyLmNwcCBcCiAgICAgTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBcCi0gICAgYXV0b2RldGVjdC5jcHAgXAorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIFwKICAgICBJTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBcCiAgICAgTWVkaWFQcm9maWxlcy5jcHAgXAogICAgIElFZmZlY3QuY3BwIFwKQEAgLTU4LDI2ICs2MywzNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgKz0gLi4vbGlibmJhaW8vcm91bmR1cC5jCiAKLSMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQotTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLSMgQ29uc2lkZXIgYSBzZXBhcmF0ZSBhIGxpYnJhcnkgZm9yIFNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy4KLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJleHBhdCBcCisJbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJpY3VpMThuIGxpYmV4cGF0IFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMKKyAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMgbGlibmJhaW8KIAotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUlkgOj0gbGlibWVkaWFfaGVscGVyCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgIGV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCisgICAgJChUT1ApL2V4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvaTE4biBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQorTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCitMT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKKworTE9DQUxfTU9EVUxFIDo9IGxpYmluc3RhbnRzc3EKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcAppbmRleCA4ZGZmZmIzLi4wZDVkN2U0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0xNDUsMTUgKzE0NSwxOSBAQAogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiAKLSAgICBtSUVmZmVjdCA9IGlFZmZlY3Q7CiAgICAgbUNibGtNZW1vcnkgPSBjYmxrOwogICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGstPmJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiAKICAgICBpRWZmZWN0LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7Ci0gICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLAotICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQpOworICAgIG1DbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgQUxPR1YoInNldCgpICVwIE9LIGVmZmVjdDogJXMgaWQ6ICVkIHN0YXR1cyAlZCBlbmFibGVkICVkIHBpZCAlZCIsIHRoaXMsIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwKKyAgICAgICAgICAgIG1TdGF0dXMsIG1FbmFibGVkLCBtQ2xpZW50UGlkKTsKKworICAgIGlmIChtU2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgfQogCiAgICAgcmV0dXJuIG1TdGF0dXM7CiB9CkBAIC0xNjQsNiArMTY4LDkgQEAKICAgICBBTE9HVigiRGVzdHJ1Y3RvciAlcCIsIHRoaXMpOwogCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IgfHwgbVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgewogICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKQEAgLTM4MCw5ICszODcsOSBAQAogfQogCiB2b2lkIEF1ZGlvRWZmZWN0Ojpjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSkKIHsKICAgICBpZiAoY21kRGF0YSA9PSBOVUxMIHx8IHJlcGx5RGF0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKaW5kZXggY2NiYzVhMy4uOWU3YmE4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcApAQCAtMTgsNyArMTgsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1JlY29yZCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNDEsMzcgKzQzLDMwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgc2l6ZV90IHNpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAmc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZTsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAlI3giLAorICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KKyAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQorICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gV2UgZG91YmxlIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgotICAgIHNpemUgPDw9IDE7Ci0KLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBzaXplIC89IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLQotICAgICpmcmFtZUNvdW50ID0gc2l6ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKQogewogfQpAQCAtODEsMjAgKzc2LDIwIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApLAorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1Qcm94eShOVUxMKQogewogICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0xMTAsMTIgKzEwNSwxMiBAQAogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvUmVjb3JkLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwotICAgICAgICB9CisgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CisgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOworICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSk7CiAgICAgfQogfQogCkBAIC0xMjQsMTUgKzExOSwyMCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogeworICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7CkBAIC0xNTYsMjMgKzE1NiwxNSBAQAogICAgIH0KICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCi0gICAgQUxPR1YoInNldCgpOiBzYW1wbGVSYXRlICV1LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXUiLCBzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQpOwotCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWVzIGZpcnN0LgogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewogICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQpAQCAtMTkxLDEyICsxODMsMTIgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBUZW1wb3JhcnkgcmVzdHJpY3Rpb246IEF1ZGlvRmxpbmdlciBjdXJyZW50bHkgc3VwcG9ydHMgMTYtYml0IFBDTSBvbmx5CiAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKQEAgLTIwNiw2MSArMTk4LDUwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAotICAgIC8vIEFzc3VtZXMgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBlbHNlIHNpemVvZih1aW50OF90KQotICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSAwOwotICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUmVjb3JkOjpnZXRNaW5GcmFtZUNvdW50KCZtaW5GcmFtZUNvdW50LAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0TWluRnJhbWVDb3VudCgpIGZhaWxlZDsgc3RhdHVzICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKICAgICB9Ci0gICAgQUxPR1YoIkF1ZGlvUmVjb3JkOjpzZXQoKSBtaW5GcmFtZUNvdW50ID0gJWQiLCBtaW5GcmFtZUNvdW50KTsKIAotICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICBBTE9HRSgiZnJhbWVDb3VudCAldSA8IG1pbkZyYW1lQ291bnQgJXUiLCBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIG9wZW5SZWNvcmRfbAorICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKIAogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7Ci0gICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CisgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBvcGVuUmVjb3JkX2wKIAotICAgIGlmIChzZXNzaW9uSWQgPT0gMCApIHsKLSAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBtU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KICAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKIAogICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOwotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CisgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgfQogCisgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkX2woMCAvKmVwb2NoKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KLSAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50XzsKLQogICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICBtQ2JmID0gY2JmOwotICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwKm1GcmFtZUNvdW50KSAvIHNhbXBsZVJhdGU7CkBAIC0yNjgsNyArMjQ5LDcgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xKTsKICAgICBtU2VxdWVuY2UgPSAxOwogICAgIG1PYnNlcnZlZFNlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgIG1Jbk92ZXJydW4gPSBmYWxzZTsKQEAgLTI4OSw2ICsyNzAsOSBAQAogCiAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CisgICAgLy8gcmVhZCBiZWZvcmUgc3RvcCBjb3VsZCBiZSBwYXJ0aWFsLgorICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKIAogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPm1GbGFncyk7CkBAIC0zNTIsNiArMzM2LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90IG1hcmtlcikKIHsKKyAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCiAgICAgaWYgKG1DYmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzc3LDYgKzM2Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CisgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKICAgICBpZiAobUNiZiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC00MTIsNyArMzk4LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXVuc2lnbmVkIGludCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKK3VpbnQzMl90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdAogewogICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgbUFjdGl2ZSwgYmVjYXVzZSBpZiBpbmFjdGl2ZSB0aGlzIHdpbGwgcmV0dXJuIDAsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGdldElucHV0KCkpOwpAQCAtNDMwLDU2ICs0MTYsNzkgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICAvLyBGYXN0IHRyYWNrcyBtdXN0IGJlIGF0IHRoZSBwcmltYXJ5IF9vdXRwdXRfIFtzaWNdIHNhbXBsaW5nIHJhdGUsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gY29uY2VwdCBvZiBhIHByaW1hcnkgaW5wdXQgc2FtcGxpbmcgcmF0ZQorICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSA9IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgaWYgKGFmU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlIGZhaWxlZCIpOworICAgIH0KIAogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICAvLyBUaGUgb25seSBzdXBwb3J0ZWQgdXNlIGNhc2UgZm9yIEZBU1QgaXMgY2FsbGJhY2sgdHJhbnNmZXIgbW9kZS4KKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgeworICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKKyAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCisgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorCisgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKKworICAgIHBpZF90IHRpZCA9IC0xOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgaWYgKChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHx8IChtQXVkaW9SZWNvcmRUaHJlYWQgPT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOwotICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCi0gICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICB0cmFja0ZsYWdzIHw9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotCi0gICAgaWYgKCEobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSkgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuCi0gICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50LzIpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtRnJhbWVDb3VudC8yOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQobUlucHV0U291cmNlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCk7Ci0gICAgaWYgKGlucHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQiLCBtSW5wdXRTb3VyY2UpOworICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBpbnB1dCBmb3IgcmVjb3JkIHNvdXJjZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3gsIHNlc3Npb24gJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgbUZsYWdzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KIAorICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbVJlcUZyYW1lQ291bnQ7CisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCiAgICAgaW50IG9yaWdpbmFsU2Vzc2lvbklkID0gbVNlc3Npb25JZDsKKworICAgIC8vIFRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQgaXMgdGhlIHBlcmlvZCBiZXR3ZWVuIGNhbGxiYWNrcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7CisKKyAgICBzcDxJTWVtb3J5PiBpTWVtOyAgICAgICAgICAgLy8gZm9yIGNibGsKKyAgICBzcDxJTWVtb3J5PiBidWZmZXJNZW07CiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IDAgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKKyAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAic2Vzc2lvbiBJRCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvcmlnaW5hbFNlc3Npb25JZCwgbVNlc3Npb25JZCk7CiAKLSAgICBpZiAocmVjb3JkID09IDAgfHwgc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9Ci0gICAgc3A8SU1lbW9yeT4gaU1lbSA9IHJlY29yZC0+Z2V0Q2JsaygpOworICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKKworICAgIC8vIEF1ZGlvRmxpbmdlciBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJL08gaGFuZGxlLAorICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KKwogICAgIGlmIChpTWVtID09IDApIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4OSwzNyArNDk4LDY3IEBACiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworCisgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuCisgICAgLy8gVGhlIGJ1ZmZlcnMgYXJlIGVpdGhlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jaywKKyAgICAvLyBvciBpbiBhIHNlcGFyYXRlIGFyZWEgYXQgZGlzY3JldGlvbiBvZiBzZXJ2ZXIuCisgICAgdm9pZCAqYnVmZmVyczsKKyAgICBpZiAoYnVmZmVyTWVtID09IDApIHsKKyAgICAgICAgYnVmZmVycyA9IGNibGsgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlcnMgPSBidWZmZXJNZW0tPnBvaW50ZXIoKTsKKyAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQotICAgIG1JbnB1dCA9IGlucHV0OwogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IGlNZW07Ci0gICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190Kj4oaU1lbVBvaW50ZXIpOworICAgIG1CdWZmZXJNZW1vcnkgPSBidWZmZXJNZW07CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgbUNibGsgPSBjYmxrOwotICAgIC8vIEZJWE1FIG1pc3NpbmcgZmFzdCB0cmFjayBmcmFtZUNvdW50IGxvZ2ljCisgICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50CisgICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgeworICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQsIHRlbXApOworICAgIH0KKyAgICBmcmFtZUNvdW50ID0gdGVtcDsKKwogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAldSIsIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGRvdWJsZS1idWZmZXJpbmcgaXMgbm90IHJlcXVpcmVkIGZvciBmYXN0IHRyYWNrcywgZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBtRnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50LzI7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBzdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeQotICAgIHZvaWQgKmJ1ZmZlcnMgPSAoY2hhciopY2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4KKyAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID09IDAgfHwgbm90aWZpY2F0aW9uRnJhbWVzID4gZnJhbWVDb3VudCkgeworICAgICAgICBBTE9HVygiUmVjZWl2ZWQgbm90aWZpY2F0aW9uRnJhbWVzICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbm90aWZpY2F0aW9uRnJhbWVzOworCisgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCisgICAgbUlucHV0ID0gaW5wdXQ7CisgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOworCisgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIC8vIElmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CisgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCisgICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgeworICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQogCiAgICAgLy8gdXBkYXRlIHByb3h5CiAgICAgbVByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwpAQCAtNTMwLDYgKzU2OSwxNCBAQAogICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworcmVsZWFzZToKKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGlucHV0LCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTU4MCw2ICs2MjcsNyBAQAogICAgICAgICAvLyBrZWVwIHRoZW0gZnJvbSBnb2luZyBhd2F5IGlmIGFub3RoZXIgdGhyZWFkIHJlLWNyZWF0ZXMgdGhlIHRyYWNrIGR1cmluZyBvYnRhaW5CdWZmZXIoKQogICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudFByb3h5PiBwcm94eTsKICAgICAgICAgc3A8SU1lbW9yeT4gaU1lbTsKKyAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyTWVtOwogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzdGFydCBvZiBsb2NrIHNjb3BlCiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC01OTEsNiArNjM5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAobmV3U2VxdWVuY2UgPT0gb2xkU2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJvYnRhaW5CdWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLm1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tUmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tTm9uQ29udGlnID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNjAwLDYgKzY1MSw3IEBACiAgICAgICAgICAgICAvLyBLZWVwIHRoZSBleHRyYSByZWZlcmVuY2VzCiAgICAgICAgICAgICBwcm94eSA9IG1Qcm94eTsKICAgICAgICAgICAgIGlNZW0gPSBtQ2Jsa01lbW9yeTsKKyAgICAgICAgICAgIGJ1ZmZlck1lbSA9IG1CdWZmZXJNZW1vcnk7CiAKICAgICAgICAgICAgIC8vIE5vbi1ibG9ja2luZyBpZiB0cmFjayBpcyBzdG9wcGVkCiAgICAgICAgICAgICBpZiAoIW1BY3RpdmUpIHsKQEAgLTY2MCw3ICs3MTIsNyBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0ldSAoJWQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOworICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTY5Miw3ICs3NDQsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW5zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCkKK25zZWNzX3QgQXVkaW9SZWNvcmQ6OnByb2Nlc3NBdWRpb0J1ZmZlcigpCiB7CiAgICAgbUxvY2subG9jaygpOwogICAgIGlmIChtQXdhaXRCb29zdCkgewpAQCAtNzYwLDE3ICs4MTIsMTcgQEAKICAgICB9CiAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCi0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyID0gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBtaXNhbGlnbm1lbnQgPSBtUHJveHktPmdldE1pc2FsaWdubWVudCgpOwotICAgIGludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CisgICAgdWludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAKICAgICAvLyBUaGVzZSBmaWVsZHMgZG9uJ3QgbmVlZCB0byBiZSBjYWNoZWQsIGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgb25seSBieSBzZXQoKToKLSAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZQorICAgIC8vICAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1TYW1wbGVSYXRlLCBtRnJhbWVTaXplCiAKICAgICBtTG9jay51bmxvY2soKTsKIApAQCAtODQxLDExICs4OTMsMTEgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IiwKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzLCBhdmFpbCwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCwgbm9uQ29udGlnKTsKKyAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3Miw4ICs5MjQsOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAldSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJWQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCAoaW50KSByZWFkU2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC05MzIsNyArOTg0LDcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyBpZiB0aGUgbmV3IElBdWRpb1JlY29yZCBpcyBjcmVhdGVkLCBvcGVuUmVjb3JkX2woKSB3aWxsIG1vZGlmeSB0aGUKLSAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCisgICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnksIG1DYmxrLCBtQnVmZmVyTWVtb3J5LgogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQogICAgIHNpemVfdCBwb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CkBAIC05NTQsNyArMTAwNiw3IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPEF1ZGlvUmVjb3JkPiBhdWRpb1JlY29yZCA9IG1BdWRpb1JlY29yZC5wcm9tb3RlKCk7CiAgICAgaWYgKGF1ZGlvUmVjb3JkICE9IDApIHsKQEAgLTk2Niw3ICsxMDE4LDggQEAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhKQotICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKQorICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKKyAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQogCkBAIC05ODMsNiArMTAzNiwxMCBAQAogICAgICAgICAgICAgLy8gY2FsbGVyIHdpbGwgY2hlY2sgZm9yIGV4aXRQZW5kaW5nKCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtSWdub3JlTmV4dFBhdXNlZEludCkgeworICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVBhdXNlZEludCkgewogICAgICAgICAgICAgaWYgKG1QYXVzZWROcyA+IDApIHsKICAgICAgICAgICAgICAgICAodm9pZCkgbU15Q29uZC53YWl0UmVsYXRpdmUobU15TG9jaywgbVBhdXNlZE5zKTsKQEAgLTk5Myw3ICsxMDUwLDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIG5zZWNzX3QgbnMgPSAgbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcih0aGlzKTsKKyAgICBuc2Vjc190IG5zID0gIG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIoKTsKICAgICBzd2l0Y2ggKG5zKSB7CiAgICAgY2FzZSAwOgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwMDcsNyArMTA2NCw3IEBACiAgICAgICAgIG5zID0gMTAwMDAwMDAwMExMOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMDE3LDEyICsxMDc0LDcgQEAKIHsKICAgICAvLyBtdXN0IGJlIGluIHRoaXMgb3JkZXIgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbgogICAgIFRocmVhZDo6cmVxdWVzdEV4aXQoKTsKLSAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7Ci0gICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewotICAgICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKLSAgICAgICAgbU15Q29uZC5zaWduYWwoKTsKLSAgICB9CisgICAgcmVzdW1lKCk7CiB9CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpwYXVzZSgpCkBAIC0xMDM0LDYgKzEwODYsNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OnJlc3VtZSgpCiB7CiAgICAgQXV0b011dGV4IF9sKG1NeUxvY2spOworICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gdHJ1ZTsKICAgICBpZiAobVBhdXNlZCB8fCBtUGF1c2VkSW50KSB7CiAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICAgICAgbVBhdXNlZEludCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IGNjNWI4MTAuLmRkYTM2NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTM1LDE2ICszNSwxNyBAQAogc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXI7CiBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlckNsaWVudDsKIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnQXVkaW9FcnJvckNhbGxiYWNrID0gTlVMTDsKLS8vIENhY2hlZCB2YWx1ZXMKIAotRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoMCk7CisvLyBDYWNoZWQgdmFsdWVzIGZvciBvdXRwdXQgaGFuZGxlcworRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoTlVMTCk7CiAKIC8vIENhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBxdWVyaWVzLCBhbGwgcHJvdGVjdGVkIGJ5IGdMb2NrCi11aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZSA9IDE2MDAwOwotYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvU3lzdGVtOjpnUHJldkluQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87Ci1zaXplX3QgQXVkaW9TeXN0ZW06OmdJbkJ1ZmZTaXplID0gMDsKK3VpbnQzMl90IEF1ZGlvU3lzdGVtOjpnUHJldkluU2FtcGxpbmdSYXRlOworYXVkaW9fZm9ybWF0X3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5Gb3JtYXQ7CithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrOworc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKIAorc3A8QXVkaW9TeXN0ZW06OkF1ZGlvUG9ydENhbGxiYWNrPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9ydENhbGxiYWNrOwogCiAvLyBlc3RhYmxpc2ggYmluZGVyIGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgc2VydmljZQogY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpCkBAIC04NCwxMyArODUsMTUgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShib29sIHN0YXRlKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhZi0+c2V0TWljTXV0ZShzdGF0ZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjppc01pY3JvcGhvbmVNdXRlZChib29sKiBzdGF0ZSkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzTWljcm9waG9uZU11dGVkKGJvb2wqIHN0YXRlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgKnN0YXRlID0gYWYtPmdldE1pY011dGUoKTsKQEAgLTE3NSwxMyArMTc4LDE1IEBACiAgICAgcmV0dXJuIGFmLT5zZXRNb2RlKG1vZGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMpOwogfQogCi1TdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSB7CitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nOCgiIik7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7CkBAIC0xOTAsNiArMTk1LDE2IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKKyAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5VmFsdWVQYWlycyk7Cit9CisKK1N0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICByZXR1cm4gZ2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5cyk7Cit9CisKIC8vIGNvbnZlcnQgdm9sdW1lIHN0ZXBzIHRvIG5hdHVyYWwgbG9nIHNjYWxlCiAKIC8vIGNoYW5nZSB0aGlzIHZhbHVlIHRvIGNoYW5nZSB2b2x1bWUgc2NhbGluZwpAQCAtMjI3LDExICsyNDIsMjMgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCBzYW1wbGluZ1JhdGUpOworICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cih1aW50MzJfdCogc2FtcGxpbmdSYXRlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIpOworICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzYW1wbGluZ1JhdGUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKQogewogICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2M7CkBAIC0yNDksOSArMjc2LDEyIEBACiAgICAgICAgICpzYW1wbGluZ1JhdGUgPSBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGU7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKnNhbXBsaW5nUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlIGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBBTE9HVigiZ2V0U2FtcGxpbmdSYXRlKCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBzYW1wbGluZyByYXRlICV1Iiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKnNhbXBsaW5nUmF0ZSk7CisgICAgQUxPR1YoImdldFNhbXBsaW5nUmF0ZSgpIG91dHB1dCAlZCwgc2FtcGxpbmcgcmF0ZSAldSIsIG91dHB1dCwgKnNhbXBsaW5nUmF0ZSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yNjUsMTUgKzI5NSwxNCBAQAogICAgIH0KIAogICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW1UeXBlKTsKLSAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQpOworICAgIHJldHVybiBnZXRGcmFtZUNvdW50KG91dHB1dCwgZnJhbWVDb3VudCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMjg5LDkgKzMxOCwxMiBAQAogICAgICAgICAqZnJhbWVDb3VudCA9IG91dHB1dERlc2MtPmZyYW1lQ291bnQ7CiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KKyAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQgZmFpbGVkIGZvciBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LAotICAgICAgICAgICAgKmZyYW1lQ291bnQpOworICAgIEFMT0dWKCJnZXRGcmFtZUNvdW50KCkgb3V0cHV0ICVkLCBmcmFtZUNvdW50ICV6dSIsIG91dHB1dCwgKmZyYW1lQ291bnQpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzA1LDE1ICszMzcsMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCBsYXRlbmN5KTsKKyAgICByZXR1cm4gZ2V0TGF0ZW5jeShvdXRwdXQsIGxhdGVuY3kpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMzMwLDcgKzM2MSw3IEBACiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgc3RyZWFtVHlwZSAlZCwgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgc3RyZWFtVHlwZSwgb3V0cHV0LCAqbGF0ZW5jeSk7CisgICAgQUxPR1YoImdldExhdGVuY3koKSBvdXRwdXQgJWQsIGxhdGVuY3kgJWQiLCBvdXRwdXQsICpsYXRlbmN5KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTM0OSw2ICszODAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgfQogICAgICAgICBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKICAgICAgICAgZ0xvY2subG9jaygpOwogICAgICAgICAvLyBzYXZlIHRoZSByZXF1ZXN0IHBhcmFtcwogICAgICAgICBnUHJldkluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTM3MSw1NSArNDA4LDU5IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIHVpbnQzMl90ICpoYWxGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICBzdHJlYW0gPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCA9PSAwKSB7Ci0gICAgICAgIG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0pOwotICAgIH0KLQogICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIG91dHB1dCk7CiB9CiAKLXNpemVfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgICAgaWYgKGFmID09IDApIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybiByZXN1bHQ7CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gYWYtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpIHsKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFmLT5uZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFOworICAgIHJldHVybiBhZi0+bmV3QXVkaW9VbmlxdWVJZCgpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikgewordm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgIT0gMCkgewotICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGFmLT5hY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKK2F1ZGlvX2h3X3N5bmNfdCBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CisgICAgcmV0dXJuIGFmLT5nZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIAogICAgIEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyLmNsZWFyKCk7CkBAIC00MzgsNyArNDc5LDcgQEAKICAgICBjb25zdCBPdXRwdXREZXNjcmlwdG9yICpkZXNjOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHJldHVybjsKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwogCkBAIC00NTUsNyArNDk2LDcgQEAKIAogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gIG5ldyBPdXRwdXREZXNjcmlwdG9yKCpkZXNjKTsKICAgICAgICAgZ091dHB1dHMuYWRkKGlvSGFuZGxlLCBvdXRwdXREZXNjKTsKLSAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCBmcmFtZUNvdW50ICV1ICIKKyAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBvdXRwdXQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgIgogICAgICAgICAgICAgICAgICJsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zYW1wbGluZ1JhdGUsIG91dHB1dERlc2MtPmZvcm1hdCwgb3V0cHV0RGVzYy0+Y2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZnJhbWVDb3VudCwgb3V0cHV0RGVzYy0+bGF0ZW5jeSk7CkBAIC00NzksOCArNTIwLDggQEAKICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKICAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCi0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJWQgY2hhbm5lbCBtYXNrICUjeCAiCi0gICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJWQgbGF0ZW5jeSAlZCIsCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4IGNoYW5uZWwgbWFzayAlI3ggIgorICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCiAgICAgICAgICAgICAgICAgZGVzYy0+Y2hhbm5lbE1hc2ssIGRlc2MtPmZyYW1lQ291bnQsIGRlc2MtPmxhdGVuY3kpOwogICAgICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gZ091dHB1dHMudmFsdWVBdChpbmRleCk7CkBAIC00OTYsMTIgKzUzNywxNSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikgewordm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKK3sKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBjYjsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworCitib29sIEF1ZGlvU3lzdGVtOjpyb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorewogICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgewogICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgogICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6CkBAIC01MzksNyArNTgzLDEyIEBACiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICBnTG9jay51bmxvY2soKTsKKyAgICAgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIGNsaWVudCB0YWtlcyB0aGUgQXVkaW9Qb2xpY3lTZXJ2aWNlIGxvY2suCisgICAgICAgIC8vIERvbid0IGhvbGQgdGhlIEF1ZGlvU3lzdGVtIGxvY2sgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZS0+cmVnaXN0ZXJDbGllbnQoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUgZXhpc3RzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIHdoZXJlIGdBdWRpb1BvbGljeVNlcnZpY2UKKyAgICAgICAgLy8gaXMgc2V0LCBidXQgZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCiAgICAgICAgIGdMb2NrLnVubG9jaygpOwogICAgIH0KICAgICByZXR1cm4gZ0F1ZGlvUG9saWN5U2VydmljZTsKQEAgLTYwOCw2ICs2NTcsMTkgQEAKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7CiB9CiAKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKGF0dHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiAwOworICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtNjM3LDMyICs2OTksMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKLSAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQpOworICAgIHJldHVybiBhcHMtPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb25JZCwgZmxhZ3MpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KGlucHV0KTsKKyAgICByZXR1cm4gYXBzLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VJbnB1dChpbnB1dCk7CisgICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQsIHNlc3Npb24pOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTcwMiwxNCArNzY4LDE1IEBACiBhdWRpb19kZXZpY2VzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CiAgICAgcmV0dXJuIGFwcy0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQgaGVyZQorICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKIH0KIApAQCAtODAyLDEzICs4NjksMTEyIEBACiAgICAgcmV0dXJuIGFwcy0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldEF1ZGlvUG9ydChwb3J0KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDYWxsYmFjayhzcDxBdWRpb1BvcnRDYWxsYmFjaz4gY2FsbEJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBnQXVkaW9Qb3J0Q2FsbGJhY2sgPSBjYWxsQmFjazsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworfQorCithdWRpb19tb2RlX3QgQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOworICAgIHJldHVybiBhcHMtPmdldFBob25lU3RhdGUoKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25TZXJ2aWNlRGllZCgpOworICAgIH0KICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwogCiAgICAgQUxPR1coIkF1ZGlvUG9saWN5U2VydmljZSBzZXJ2ZXIgZGllZCEiKTsKIH0KIAordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGdBdWRpb1BvcnRDYWxsYmFjay0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKaW5kZXggM2YzYTg4Yy4uMGE4OWZiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAKQEAgLTE1LDE3ICsxNSwyMCBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0KIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9UcmFjayIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAgICAgICAgIDEwCiAjZGVmaW5lIFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQyAgICAgMTIwCkBAIC0zNCw2ICszNywxOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBpbnQ2NF90IGNvbnZlcnRUaW1lc3BlY1RvVXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZ0dikKK3sKKyAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7Cit9CisKKy8vIGN1cnJlbnQgbW9ub3RvbmljIHRpbWUgaW4gbWljcm9zZWNvbmRzLgorc3RhdGljIGludDY0X3QgZ2V0Tm93VXMoKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgICAodm9pZCkgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0dik7CisgICAgcmV0dXJuIGNvbnZlcnRUaW1lc3BlY1RvVXModHYpOworfQorCiAvLyBzdGF0aWMKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQoCiAgICAgICAgIHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTQ0LDkgKzYwLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBkZWZhdWx0IHRvIDAgaW4gY2FzZSBvZiBlcnJvcgotICAgICpmcmFtZUNvdW50ID0gMDsKLQogICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBjb2RlIGluIGNyZWF0ZVRyYWNrX2woKSwgZXhjZXB0IHdlJ3JlIG1pc3NpbmcKICAgICAvLyAgICAgICBzb21lIGluZm9ybWF0aW9uIGhlcmUgdGhhdCBpcyBhdmFpbGFibGUgaW4gY3JlYXRlVHJhY2tfbCgpOgogICAgIC8vICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dApAQCAtNTQsMTYgKzY3LDI2IEBACiAgICAgLy8gICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sKICAgICAvLyAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncwogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgbGF0ZW5jeSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKQEAgLTczLDggKzk2LDE1IEBACiAgICAgfQogCiAgICAgKmZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSA9PSAwKSA/IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50IDoKLSAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogc2FtcGxlUmF0ZSAvIGFmU2FtcGxlUmF0ZTsKLSAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lZDogYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSVkLCBhZkxhdGVuY3k9JWQiLAorICAgICAgICAgICAgYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKKyAgICAvLyBUaGUgZm9ybXVsYSBhYm92ZSBzaG91bGQgYWx3YXlzIHByb2R1Y2UgYSBub24temVybyB2YWx1ZSwgYnV0IHJldHVybiBhbiBlcnJvcgorICAgIC8vIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgorICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKICAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtODgsNiArMTE4LDEwIEBACiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCkKIHsKKyAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSAweDA7CisgICAgc3RyY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsICIiKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTk1LDE1ICsxMjksMTcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTExMyw3ICsxNDksNyBAQAogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8sIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC0xMjUsMTEgKzE2MSwxMyBAQAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKQEAgLTEzOCw3ICsxNzYsOCBAQAogewogICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sIHVpZCk7CisgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAorICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzKTsKIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMTU2LDggKzE5NSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIG1BdWRpb1RyYWNrLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgfQogfQogCkBAIC0xNjYsMTggKzIwOSwyNSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudEludCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICBpbnQgdWlkKQorICAgICAgICBpbnQgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCiB7CisgICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCIsCisgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yMTEsMTkgKzI2MSwxMyBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAKLSAgICAvLyBGSVhNRSAiaW50IiBoZXJlIGlzIGxlZ2FjeSBhbmQgd2lsbCBiZSByZXBsYWNlZCBieSBzaXplX3QgbGF0ZXIKLSAgICBpZiAoZnJhbWVDb3VudEludCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgY291bnQgJWQiLCBmcmFtZUNvdW50SW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50SW50OwotCiAgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlZCIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAldSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAKQEAgLTIzMywxOSArMjc3LDM5IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtT3V0cHV0ID0gMDsKLQogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewogICAgICAgICBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIH0KIAotICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHNhbXBsZVJhdGUgPSBhZlNhbXBsZVJhdGU7CisgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShzdHJlYW1UeXBlKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMocEF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dXNhZ2UsIHBBdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIHBBdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+dGFncyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBzZXRTdHJlYW1UeXBlRnJvbUF0dHJpYnV0ZXMobUF0dHJpYnV0ZXMpOworICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlRm9yQXR0cigmc2FtcGxlUmF0ZSwgJm1BdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgfQogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKIApAQCAtMjUzLDE1ICszMTcsMjEgQEAKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgewotICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKKworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIC8vIEF1ZGlvRmxpbmdlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkKICAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgJiYgc2hhcmVkQnVmZmVyICE9IDApIHsKQEAgLTI4MSw1MCArMzUxLDU2IEBACiAgICAgICAgICAgICAgICAgKChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgaWYgKHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgaWYgKG1TdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgewogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7CiAgICAgfQogCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwotICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lU2l6ZUFGID0gbUZyYW1lU2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwotICAgICAgICBtRnJhbWVTaXplQUYgPSBzaXplb2YodWludDhfdCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSk7CisgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoCisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IGZvcm1hdCk7CisgICAgICAgIC8vIGNyZWF0ZVRyYWNrIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIFBDTSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIsCisgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNwZWNpZmljIFBDTSBmb3JtYXRzIGhlcmUKICAgICB9CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKLQotICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgLy8gTWFrZSBjb3B5IG9mIGlucHV0IHBhcmFtZXRlciBvZmZsb2FkSW5mbyBzbyB0aGF0IGluIHRoZSBmdXR1cmU6CisgICAgLy8gIChhKSBjcmVhdGVUcmFja19sIGRvZXNuJ3QgbmVlZCBpdCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIKKyAgICAvLyAgKGIpIHdlIGNhbiBzdXBwb3J0IHJlLWNyZWF0aW9uIG9mIG9mZmxvYWRlZCB0cmFja3MKKyAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gKm9mZmxvYWRJbmZvOworICAgICAgICBtT2ZmbG9hZEluZm8gPSAmbU9mZmxvYWRJbmZvQ29weTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgIH0KIAotICAgIG1Wb2x1bWVbTEVGVF0gPSAxLjBmOwotICAgIG1Wb2x1bWVbUklHSFRdID0gMS4wZjsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0gPSAxLjBmOwogICAgIG1TZW5kTGV2ZWwgPSAwLjBmOwotICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVUcmFja19sCiAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBpZiAodWlkID09IC0xIHx8IChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpKSB7CisgICAgaW50IGNhbGxpbmdwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IG15cGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKHVpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKICAgICAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2xpZW50VWlkID0gdWlkOwogICAgIH0KKyAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgeworICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ3BpZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2xpZW50UGlkID0gcGlkOworICAgIH0KICAgICBtQXV4RWZmZWN0SWQgPSAwOwogICAgIG1GbGFncyA9IGZsYWdzOwogICAgIG1DYmYgPSBjYmY7CkBAIC0zMzUsMTQgKzQxMSw3IEBACiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKmVwb2NoKi8pOworICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKQEAgLTM1MCwxNyArNDE5LDEwIEBACiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwogICAgICAgICB9Ci0gICAgICAgIC8vVXNlIG9mIGRpcmVjdCBhbmQgb2ZmbG9hZGVkIG91dHB1dCBzdHJlYW1zIGlzIHJlZiBjb3VudGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgotICAgICAgICAvLyBBcyBnZXRPdXRwdXQgd2FzIGNhbGxlZCBhYm92ZSBhbmQgcmVzdWx0ZWQgaW4gYW4gb3V0cHV0IHN0cmVhbSB0byBiZSBvcGVuZWQsCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gcmVsZWFzZSBpdC4KLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0gICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgIG1Vc2VyRGF0YSA9IHVzZXI7CiAgICAgbUxvb3BQZXJpb2QgPSAwOwpAQCAtMzY4LDExICs0MzAsMTQgQEAKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkKTsKKyAgICBtU2VydmVyID0gMDsKKyAgICBtUG9zaXRpb24gPSAwOworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgbVN0YXJ0VXMgPSAwOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5VbmRlcnJ1biA9IGZhbHNlOwotICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zOTUsMTQgKzQ2MCwyMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FDVElWRTsKICAgICB9CisgICAgKHZvaWQpIHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICBpZiAocHJldmlvdXNTdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgewogICAgICAgICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uIGFzIHNlZW4gYnkgY2xpZW50IHRvIDAKLSAgICAgICAgbVByb3h5LT5zZXRFcG9jaChtUHJveHktPmdldEVwb2NoKCkgLSBtUHJveHktPmdldFBvc2l0aW9uKCkpOworICAgICAgICBtUG9zaXRpb24gPSAwOworICAgICAgICAvLyBGb3Igb2ZmbG9hZGVkIHRyYWNrcywgd2UgZG9uJ3Qga25vdyBpZiB0aGUgaGFyZHdhcmUgY291bnRlcnMgYXJlIHJlYWxseSB6ZXJvIGhlcmUsCisgICAgICAgIC8vIHNpbmNlIHRoZSBmbHVzaCBpcyBhc3luY2hyb25vdXMgYW5kIHN0b3AgbWF5IG5vdCBmdWxseSBkcmFpbi4KKyAgICAgICAgLy8gV2Ugc2F2ZSB0aGUgdGltZSB3aGVuIHRoZSB0cmFjayBpcyBzdGFydGVkIHRvIGxhdGVyIHZlcmlmeSB3aGV0aGVyCisgICAgICAgIC8vIHRoZSBjb3VudGVycyBhcmUgcmVhbGlzdGljIChpLmUuIHN0YXJ0IGZyb20gemVybyBhZnRlciB0aGlzIHRpbWUpLgorICAgICAgICBtU3RhcnRVcyA9IGdldE5vd1VzKCk7CisKICAgICAgICAgLy8gZm9yY2UgcmVmcmVzaCBvZiByZW1haW5pbmcgZnJhbWVzIGJ5IHByb2Nlc3NBdWRpb0J1ZmZlcigpIGFzIGxhc3QKICAgICAgICAgLy8gd3JpdGUgYmVmb3JlIHN0b3AgY291bGQgYmUgcGFydGlhbC4KICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogICAgIH0KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IG1Qb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpOwogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOwpAQCAtNDQ4LDE1ICs1MjAsMTUgQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIC8vIEZJWE1FIHBhdXNlIHRoZW4gc3RvcCBzaG91bGQgbm90IGJlIGEgbm9wCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUpIHsKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0FDVElWRSAmJiBtU3RhdGUgIT0gU1RBVEVfUEFVU0VEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBJTkc7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICBtUHJveHktPmludGVycnVwdCgpOwpAQCAtNDc1LDcgKzU0Nyw3IEBACiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgaWYgKHQgIT0gMCkgewotICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpIHsKKyAgICAgICAgaWYgKCFpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgICAgIHQtPnBhdXNlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNTEzLDcgKzU4NSw4IEBACiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgbVN0YXRlID0gU1RBVEVfRkxVU0hFRDsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIG1SZWxlYXNlZCA9IDA7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIH0KICAgICBtUHJveHktPmZsdXNoKCk7CkBAIC01MzMsMTEgKzYwNiwyMCBAQAogICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgLy8gQW4gb2ZmbG9hZCBvdXRwdXQgY2FuIGJlIHJlLXVzZWQgYmV0d2VlbiB0d28gYXVkaW8gdHJhY2tzIGhhdmluZworICAgICAgICAgICAgLy8gdGhlIHNhbWUgY29uZmlndXJhdGlvbi4gQSB0aW1lc3RhbXAgcXVlcnkgZm9yIGEgcGF1c2VkIHRyYWNrCisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgb3RoZXIgaXMgcnVubmluZyB3b3VsZCByZXR1cm4gYW4gaW5jb3JyZWN0IHRpbWUuCisgICAgICAgICAgICAvLyBUbyBmaXggdGhpcywgY2FjaGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG9uIGEgcGF1c2UoKSBhbmQgcmV0dXJuCisgICAgICAgICAgICAvLyB0aGlzIHRpbWUgd2hlbiByZXF1ZXN0ZWQgdW50aWwgdGhlIHRyYWNrIGlzIHJlc3VtZWQuCisKKyAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLiBUaW1lIHNhdmVkCisgICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYuCisKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHJldHVybiBjb2RlIGZvciBnZXRSZW5kZXJQb3NpdGlvbi4KKwogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwotICAgICAgICAgICAgLy8gT2ZmbG9hZFRocmVhZCBzZW5kcyBIQUwgcGF1c2UgaW4gaXRzIHRocmVhZExvb3AuLiB0aW1lIHNhdmVkCi0gICAgICAgICAgICAvLyBoZXJlIGNhbiBiZSBzbGlnaHRseSBvZmYKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KQEAgLTU0NiwxNyArNjI4LDE5IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKIHsKLSAgICBpZiAobGVmdCA8IDAuMGYgfHwgbGVmdCA+IDEuMGYgfHwgcmlnaHQgPCAwLjBmIHx8IHJpZ2h0ID4gMS4wZikgeworICAgIC8vIFRoaXMgZHVwbGljYXRlcyBhIHRlc3QgYnkgQXVkaW9UcmFjayBKTkksIGJ1dCB0aGF0IGlzIG5vdCB0aGUgb25seSBjYWxsZXIKKyAgICBpZiAoaXNuYW5mKGxlZnQpIHx8IGxlZnQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgbGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkgfHwKKyAgICAgICAgICAgIGlzbmFuZihyaWdodCkgfHwgcmlnaHQgPCBHQUlOX0ZMT0FUX1pFUk8gfHwgcmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1Wb2x1bWVbTEVGVF0gPSBsZWZ0OwotICAgIG1Wb2x1bWVbUklHSFRdID0gcmlnaHQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gbGVmdDsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gcmlnaHQ7CiAKLSAgICBtUHJveHktPnNldFZvbHVtZUxSKCh1aW50MzJfdCh1aW50MTZfdChyaWdodCAqIDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KGxlZnQgKiAweDEwMDApKTsKKyAgICBtUHJveHktPnNldFZvbHVtZUxSKGdhaW5fbWluaWZsb2F0X3BhY2soZ2Fpbl9mcm9tX2Zsb2F0KGxlZnQpLCBnYWluX2Zyb21fZmxvYXQocmlnaHQpKSk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPnNpZ25hbCgpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01NjksNyArNjUzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQogewotICAgIGlmIChsZXZlbCA8IDAuMGYgfHwgbGV2ZWwgPiAxLjBmKSB7CisgICAgLy8gVGhpcyBkdXBsaWNhdGVzIGEgdGVzdCBieSBBdWRpb1RyYWNrIEpOSSwgYnV0IHRoYXQgaXMgbm90IHRoZSBvbmx5IGNhbGxlcgorICAgIGlmIChpc25hbmYobGV2ZWwpIHx8IGxldmVsIDwgR0FJTl9GTE9BVF9aRVJPIHx8IGxldmVsID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTg5LDE2ICs2NzQsMTUgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewotICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGluZ1JhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxpbmdSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIoJmFmU2FtcGxpbmdSYXRlLCAmbUF0dHJpYnV0ZXMpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgotICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlKjIgKSB7CisgICAgaWYgKHJhdGUgPT0gMCB8fCByYXRlID4gYWZTYW1wbGluZ1JhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTYyMCwxMCArNzA0LDEwIEBACiAgICAgLy8gc2FtcGxlIHJhdGUgY2FuIGJlIHVwZGF0ZWQgZHVyaW5nIHBsYXliYWNrIGJ5IHRoZSBvZmZsb2FkZWQgZGVjb2RlciBzbyB3ZSBuZWVkIHRvCiAgICAgLy8gcXVlcnkgdGhlIEhBTCBhbmQgdXBkYXRlIGlmIG5lZWRlZC4KIC8vIEZJWE1FIHVzZSBQcm94eSByZXR1cm4gY2hhbm5lbCB0byB1cGRhdGUgdGhlIHJhdGUgZnJvbSBzZXJ2ZXIgYW5kIGF2b2lkIHBvbGxpbmcgaGVyZQotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0ICE9IDApIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCBtU3RyZWFtVHlwZSwgJnNhbXBsZVJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShtT3V0cHV0LCAmc2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgICAgICAgICAgfQpAQCAtNjM0LDcgKzcxOCw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldExvb3AodWludDMyX3QgbG9vcFN0YXJ0LCB1aW50MzJfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQogewotICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTY2MCw3ICs3NDQsNyBAQAogewogICAgIC8vIEZJWE1FIElmIHNldHRpbmcgYSBsb29wIGFsc28gc2V0cyBwb3NpdGlvbiB0byBzdGFydCBvZiBsb29wLCB0aGVuCiAgICAgLy8gICAgICAgdGhpcyBpcyBjb3JyZWN0LiAgT3RoZXJ3aXNlIGl0IHNob3VsZCBiZSByZW1vdmVkLgotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IGxvb3BDb3VudCAhPSAwID8gbG9vcEVuZCAtIGxvb3BTdGFydCA6IDA7CiAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50KTsKIH0KQEAgLTY2OCw3ICs3NTIsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQogewogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBtYXJrZXIgcG9zaXRpb24gaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02ODEsNyArNzY1LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgKm1hcmtlcikgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobWFya2VyID09IE5VTEwpIHsKQEAgLTY5NywxOSArNzgxLDIwIEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1aW50MzJfdCB1cGRhdGVQZXJpb2QpCiB7CiAgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIHBvc2l0aW9uIHVwZGF0ZSBwZXJpb2QgaXMgdG8gZ2V0IGEgY2FsbGJhY2sKLSAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobUNiZiA9PSBOVUxMIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIHVwZGF0ZVBlcmlvZDsKKyAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgKnVwZGF0ZVBlcmlvZCkgY29uc3QKIHsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAodXBkYXRlUGVyaW9kID09IE5VTEwpIHsKQEAgLTcyNCw3ICs4MDksNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQb3NpdGlvbih1aW50MzJfdCBwb3NpdGlvbikKIHsKLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChwb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7CkBAIC03NDEsNyArODI2LDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKICAgICBtTG9vcFBlcmlvZCA9IDA7CiAgICAgLy8gRklYTUUgQ2hlY2sgd2hldGhlciBsb29wcyBhbmQgc2V0dGluZyBwb3NpdGlvbiBhcmUgaW5jb21wYXRpYmxlIGluIG9sZCBjb2RlLgogICAgIC8vIElmIHdlIHVzZSBzZXRMb29wIGZvciBib3RoIHB1cnBvc2VzIHdlIGxvc2UgdGhlIGNhcGFiaWxpdHkgdG8gc2V0IHRoZSBwb3NpdGlvbiB3aGlsZSBsb29waW5nLgpAQCAtNzUwLDMxICs4MzUsMzMgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikKIHsKICAgICBpZiAocG9zaXRpb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCi0gICAgICAgIGlmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7CiAgICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICAqcG9zaXRpb24gPSBtUGF1c2VkUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXM7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJmRzcEZyYW1lcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUU6IGRzcEZyYW1lcyBtYXkgbm90IGJlIHplcm8gaW4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKQorICAgICAgICAvLyBkdWUgdG8gaGFyZHdhcmUgbGF0ZW5jeS4gV2UgbGVhdmUgdGhpcyBiZWhhdmlvciBmb3Igbm93LgogICAgICAgICAqcG9zaXRpb24gPSBkc3BGcmFtZXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gSUF1ZGlvVHJhY2s6OnN0b3AoKSBpc24ndCBzeW5jaHJvbm91czsgd2UgZG9uJ3Qga25vdyB3aGVuIHByZXNlbnRhdGlvbiBjb21wbGV0ZXMKLSAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/IDAgOgotICAgICAgICAgICAgICAgIG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICAgICAgKnBvc2l0aW9uID0gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKSA/CisgICAgICAgICAgICAgICAgMCA6IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzk1LDcgKzg4Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlbG9hZCgpCiB7Ci0gICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtODEyLDIzICs4OTksMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvVHJhY2s6OmdldE91dHB1dCgpCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXQoKSBjb25zdAogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAotLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXRfbCgpCi17Ci0gICAgaWYgKG1PdXRwdXQpIHsKLSAgICAgICAgcmV0dXJuIG1PdXRwdXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQobVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTg0MiwxNSArOTE4LDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgIHNpemVfdCBlcG9jaCkKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmNyZWF0ZVRyYWNrX2woKQogewogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CkBAIC04NTksNTAgKzkyNyw1NyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAorICAgICAgICAgICAgbUNoYW5uZWxNYXNrLCBtRmxhZ3MsIG1PZmZsb2FkSW5mbyk7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBvdXRwdXQgZm9yIHN0cmVhbSB0eXBlICVkLCB1c2FnZSAlZCwgc2FtcGxlIHJhdGUgJXUsIGZvcm1hdCAlI3gsIgorICAgICAgICAgICAgICAiIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAorICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KKwogICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCiAKICAgICB1aW50MzJfdCBhZkxhdGVuY3k7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZMYXRlbmN5KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShvdXRwdXQsICZhZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsIHN0cmVhbVR5cGUsICZhZkZyYW1lQ291bnQpOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KG91dHB1dCwgJmFmRnJhbWVDb3VudCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRGcmFtZUNvdW50KG91dHB1dD0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogCiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZTYW1wbGVSYXRlKTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJmFmU2FtcGxlUmF0ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0U2FtcGxpbmdSYXRlKG91dHB1dD0lZCwgc3RyZWFtVHlwZT0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdHJlYW1UeXBlLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIC8vIENsaWVudCBkZWNpZGVzIHdoZXRoZXIgdGhlIHRyYWNrIGlzIFRJTUVEIChzZWUgYmVsb3cpLCBidXQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UKICAgICAvLyBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgJiYgISgKKyAgICBpZiAoKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmICEoKAogICAgICAgICAgICAgLy8gZWl0aGVyIG9mIHRoZXNlIHVzZSBjYXNlczoKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDE6IHNoYXJlZCBidWZmZXIKLSAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgfHwKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIGhhbmRsZXIKLSAgICAgICAgICAgIChtQ2JmICE9IE5VTEwpKSkgeworICAgICAgICAgICAgKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDI6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spKSAmJgorICAgICAgICAgICAgLy8gbWF0Y2hpbmcgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpKSkgewogICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CiAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCi0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQogICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgb3V0cHV0ICVkIGFmTGF0ZW5jeSAlZCIsIG91dHB1dCwgYWZMYXRlbmN5KTsKIAotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAmJiBzYW1wbGVSYXRlICE9IGFmU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50IGR1ZSB0byBtaXNtYXRjaGluZyBzYW1wbGUgcmF0ZSAoJWQgdnMgJWQpIiwKLSAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICB9Ci0KICAgICAvLyBUaGUgY2xpZW50J3MgQXVkaW9UcmFjayBidWZmZXIgaXMgZGl2aWRlZCBpbnRvIG4gcGFydHMgZm9yIHB1cnBvc2Ugb2Ygd2FrZXVwIGJ5IHNlcnZlciwgd2hlcmUKICAgICAvLyAgbiA9IDEgICBmYXN0IHRyYWNrIHdpdGggc2luZ2xlIGJ1ZmZlcmluZzsgbkJ1ZmZlcmluZyBpcyBpZ25vcmVkCiAgICAgLy8gIG4gPSAyICAgZmFzdCB0cmFjayB3aXRoIGRvdWJsZSBidWZmZXJpbmcKQEAgLTkxMCw2NCArOTg1LDcwIEBACiAgICAgLy8gIG4gPSAzICAgbm9ybWFsIHRyYWNrLCB3aXRoIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KICAgICAvLyAgICAgICAgICAocGVzc2ltaXN0aWM7IHNvbWUgbm9uLTE6MSBjb252ZXJzaW9uIHJhdGlvcyBkb24ndCBhY3R1YWxseSBuZWVkIHRyaXBsZS1idWZmZXJpbmcpCiAgICAgLy8gIG4gPiAzICAgdmVyeSBoaWdoIGxhdGVuY3kgb3IgdmVyeSBzbWFsbCBub3RpZmljYXRpb24gaW50ZXJ2YWw7IG5CdWZmZXJpbmcgaXMgaWdub3JlZAotICAgIGNvbnN0IHVpbnQzMl90IG5CdWZmZXJpbmcgPSAoc2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CisgICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKIAotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKIAotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBhZkZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgfSBlbHNlIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbCBjb3VudAogICAgICAgICAvLyA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSAvKiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IDEgOiAqLyAyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQpOworICAgICAgICBpZiAoYWxpZ25tZW50ICYgMSkgeworICAgICAgICAgICAgYWxpZ25tZW50ID0gMTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA+IDEpIHsKICAgICAgICAgICAgIC8vIE1vcmUgdGhhbiAyIGNoYW5uZWxzIGRvZXMgbm90IHJlcXVpcmUgc3Ryb25nZXIgYWxpZ25tZW50IHRoYW4gc3RlcmVvCiAgICAgICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCgodWludHB0cl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7CisgICAgICAgIGlmICgoKHVpbnRwdHJfdCltU2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbm1lbnQ6IGFkZHJlc3MgJXAsIGNoYW5uZWwgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgbUNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIGNvbnN0cnVjdG9ycywKICAgICAgICAgLy8gdGhlcmUncyBubyBmcmFtZUNvdW50IHBhcmFtZXRlci4KICAgICAgICAgLy8gQnV0IHdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBzZXQoKSwKICAgICAgICAgLy8gdGhlcmUgX2lzXyBhIGZyYW1lQ291bnQgcGFyYW1ldGVyLiAgV2Ugc2lsZW50bHkgaWdub3JlIGl0LgotICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCkvbUNoYW5uZWxDb3VudC9zaXplb2YoaW50MTZfdCk7CisgICAgICAgIGZyYW1lQ291bnQgPSBtU2hhcmVkQnVmZmVyLT5zaXplKCkgLyBtRnJhbWVTaXplQUY7CiAKLSAgICB9IGVsc2UgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgeworICAgIH0gZWxzZSBpZiAoIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewogCiAgICAgICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgY2FsY3VsYXRpb25zIGFuZCBhc3NvY2lhdGVkIGNoZWNrcyB0byBzZXJ2ZXIKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKICAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0lZCIsCisgICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JWQiLAogICAgICAgICAgICAgICAgIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDw9IG5CdWZmZXJpbmcpIHsKICAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gbkJ1ZmZlcmluZzsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gKGFmRnJhbWVDb3VudCpzYW1wbGVSYXRlKm1pbkJ1ZkNvdW50KS9hZlNhbXBsZVJhdGU7Ci0gICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAldSwgYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgorICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3QobVNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOworICAgICAgICBBTE9HVigibWluRnJhbWVDb3VudDogJXp1LCBhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgogICAgICAgICAgICAgICAgICIsIGFmTGF0ZW5jeT0lZCIsCi0gICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgc2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgICAgICAgICAgICAgIG1pbkZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIG1TYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIC8vIG5vdCBBTE9HVyBiZWNhdXNlIGl0IGhhcHBlbnMgYWxsIHRoZSB0aW1lIHdoZW4gcGxheWluZyBrZXkgY2xpY2tzIG92ZXIgQTJEUAotICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJXp1IHRvICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9CkBAIC05ODYsNDIgKzEwNjcsNTggQEAKICAgICB9CiAKICAgICBwaWRfdCB0aWQgPSAtMTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwogICAgICAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvVHJhY2tUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CiAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRDsKICAgICB9CiAKLSAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ESVJFQ1Q7CisgICAgfQorCisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCisgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIG9ubHkgc2VlcyAxNi1iaXQgUENNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAotICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOworCisgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCisgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgorCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKKyAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwpAQCAtMTAyOSwyMiArMTEyNiwyNSBAQAogICAgIH0KICAgICBtQXVkaW9UcmFjayA9IHRyYWNrOwogICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKLSAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtLT5wb2ludGVyKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgc2l6ZV90IHRlbXAgPSBjYmxrLT5mcmFtZUNvdW50XzsKKyAgICAvLyBub3RlIHRoYXQgdGVtcCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIGZyYW1lQ291bnQKICAgICBpZiAodGVtcCA8IGZyYW1lQ291bnQgfHwgKGZyYW1lQ291bnQgPT0gMCAmJiB0ZW1wID09IDApKSB7CiAgICAgICAgIC8vIEluIGN1cnJlbnQgZGVzaWduLCBBdWRpb1RyYWNrIGNsaWVudCBjaGVja3MgYW5kIGVuc3VyZXMgZnJhbWUgY291bnQgdmFsaWRpdHkgYmVmb3JlCiAgICAgICAgIC8vIHBhc3NpbmcgaXQgdG8gQXVkaW9GbGluZ2VyIHNvIEF1ZGlvRmxpbmdlciBzaG91bGQgbm90IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSBleGNlcHQKICAgICAgICAgLy8gZm9yIGZhc3QgdHJhY2sgYXMgaXQgdXNlcyBhIHNwZWNpYWwgbWV0aG9kIG9mIGFzc2lnbmluZyBmcmFtZSBjb3VudC4KLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCwgdGVtcCk7CisgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7CiAgICAgfQogICAgIGZyYW1lQ291bnQgPSB0ZW1wOworCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCiAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCiAgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KQEAgLTEwNTMsMjggKzExNTMsMzkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IGZyYW1lQ291bnQvbkJ1ZmZlcmluZykgewogICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC9uQnVmZmVyaW5nOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEKSB7CiAgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBzdWNjZXNzZnVsIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBkZW5pZWQgYnkgc2VydmVyIik7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIHNvIGRvbid0IHJldHVybiBlcnJvciBzdGF0dXMKKyAgICAgICAgICAgIC8vcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVCkgeworICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIGRlbmllZCBieSBzZXJ2ZXIiKTsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgc28gZG9uJ3QgcmV0dXJuIGVycm9yIHN0YXR1cworICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQorICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuICBJZiB0aGVyZSBpcyBhIHNoYXJlZCBidWZmZXIsIGJ1ZmZlcnMKQEAgLTEwODIsMTUgKzExOTMsMTYgQEAKICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jay4gIFRoaXMgYWRkcmVzcyBpcyBmb3IgdGhlIG1hcHBpbmcgd2l0aGluIGNsaWVudAogICAgIC8vIGFkZHJlc3Mgc3BhY2UuICBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6bUJ1ZmZlciBpcyBmb3IgdGhlIHNlcnZlciBhZGRyZXNzIHNwYWNlLgogICAgIHZvaWQqIGJ1ZmZlcnM7Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJzID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgfQogCiAgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgIC8vIEZJWE1FIGRvbid0IGJlbGlldmUgdGhpcyBsaWUKLSAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKKyAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CisKICAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgLy8gSWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAogICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgpAQCAtMTA5OSwyNCArMTIxMSwzMCBAQAogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQotICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbVN0YXRpY1Byb3h5LmNsZWFyKCk7CiAgICAgICAgIG1Qcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemVBRik7CiAgICAgICAgIG1Qcm94eSA9IG1TdGF0aWNQcm94eTsKICAgICB9Ci0gICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QobVZvbHVtZVtSSUdIVF0gKiAweDEwMDApKSA8PCAxNikgfAotICAgICAgICAgICAgdWludDE2X3QobVZvbHVtZVtMRUZUXSAqIDB4MTAwMCkpOworICAgIG1Qcm94eS0+c2V0Vm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKTsKICAgICBtUHJveHktPnNldFNlbmRMZXZlbChtU2VuZExldmVsKTsKICAgICBtUHJveHktPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTEyMzcsNiArMTM1NSw3IEBACiAgICAgYnVmZmVyLm1SYXcgPSBhdWRpb0J1ZmZlci0+cmF3OwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIG1SZWxlYXNlZCArPSBzdGVwQ291bnQ7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAKQEAgLTEyNDQsOCArMTM2Myw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBuYW1lPSVzIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgdGhpcyk7CiAgICAgICAgICAgICAvLyBGSVhNRSBpZ25vcmluZyBzdGF0dXMKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICB9CkBAIC0xMjU0LDEyICsxMzcyLDIyIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSkKK3NzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DIHx8IG1Jc1RpbWVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoaXNEaXJlY3QoKSkgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihDQkxLX1VOREVSUlVOIHwgQ0JMS19MT09QX0NZQ0xFIHwgQ0JMS19MT09QX0ZJTkFMIHwgQ0JMS19CVUZGRVJfRU5EKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNibGstPm1GbGFncyk7CisgICAgICAgIGlmIChmbGFncyAmIENCTEtfSU5WQUxJRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgpAQCAtMTI3Myw3ICsxNDAxLDggQEAKICAgICB3aGlsZSAodXNlclNpemUgPj0gbUZyYW1lU2l6ZSkgewogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUgLyBtRnJhbWVTaXplOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsICZDbGllbnRQcm94eTo6a0ZvcmV2ZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJsb2NraW5nID8gJkNsaWVudFByb3h5OjprRm9yZXZlciA6ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM2OSw3ICsxNDk4LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1uc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiYgdGhyZWFkKQorbnNlY3NfdCBBdWRpb1RyYWNrOjpwcm9jZXNzQXVkaW9CdWZmZXIoKQogewogICAgIC8vIEN1cnJlbnRseSB0aGUgQXVkaW9UcmFjayB0aHJlYWQgaXMgbm90IGNyZWF0ZWQgaWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcy4KICAgICAvLyBXb3VsZCBpdCBldmVyIG1ha2Ugc2Vuc2UgdG8gcnVuIHRoZSB0aHJlYWQsIGV2ZW4gd2l0aG91dCBjYWxsYmFja3M/CkBAIC0xNDA3LDcgKzE1MzYsNyBAQAogICAgICAgICAvLyBmb3Igb2ZmbG9hZGVkIHRyYWNrcyByZXN0b3JlVHJhY2tfbCgpIHdpbGwganVzdCB1cGRhdGUgdGhlIHNlcXVlbmNlIGFuZCBjbGVhcgogICAgICAgICAvLyBBdWRpb1N5c3RlbSBjYWNoZS4gV2Ugc2hvdWxkIG5vdCBleGl0IGhlcmUgYnV0IGFmdGVyIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHNvCiAgICAgICAgIC8vIHRoYXQgdGhlIHVwcGVyIGxheWVycyBjYW4gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmICghaXNPZmZsb2FkZWQoKSB8fCAobVNlcXVlbmNlID09IG1PYnNlcnZlZFNlcXVlbmNlKSkgeworICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseSwgYnV0IHdpdGggYSBuZXcgSUF1ZGlvVHJhY2sKQEAgLTE0MzksNyArMTU2OCw3IEBACiAgICAgfQogCiAgICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gb2Ygc2VydmVyCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpOworICAgIHNpemVfdCBwb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKIAogICAgIC8vIE1hbmFnZSBtYXJrZXIgY2FsbGJhY2sKICAgICBib29sIG1hcmtlclJlYWNoZWQgPSBmYWxzZTsKQEAgLTE0NjIsNyArMTU5MSw3IEBACiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgogICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSBtTG9vcFBlcmlvZDsKICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE0OTcsNiArMTYyNiw3IEBACiAgICAgICAgICAgICAgICAgd2FpdFN0cmVhbUVuZCA9IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgICAgICBpZiAod2FpdFN0cmVhbUVuZCkgewogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh3YWl0U3RyZWFtRW5kICYmIHN0YXR1cyAhPSBERUFEX09CSkVDVCkgewpAQCAtMTUzMyw3ICsxNjYzLDcgQEAKICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgbUNiZihFVkVOVF9ORVdfSUFVRElPVFJBQ0ssIG1Vc2VyRGF0YSwgTlVMTCk7CiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzLCBqdXN0IHdhaXQgZm9yIHRoZSB1cHBlciBsYXllcnMgdG8gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgICAgIHJldHVybiBOU19JTkFDVElWRTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1OTEsMTAgKzE3MjEsMTAgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IGVyciAlZCIsCisgICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAogICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSIHx8CkBAIC0xNjI2LDEyICsxNzU2LDExIEBACiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKICAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgc2l6ZV90IHdyaXR0ZW5GcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIChpbnQpIHdyaXR0ZW5TaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTE2OTIsMzcgKzE4MjEsMzEgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7CiAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWRlZCIgOiAiUENNIiwgZnJvbSk7CisgICAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gcmVmcmVzaCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBjYWNoZSBpbiB0aGlzIHByb2Nlc3MgdG8gbWFrZSBzdXJlIHdlIGdldCBuZXcKLSAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBnZXRPdXRwdXRfbCgpIGFuZCBjcmVhdGVUcmFja19sKCkKKyAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBjcmVhdGVUcmFja19sKCkKICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICAvLyBGSVhNRSByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KIAotICAgIC8vIGZvcmNlIG5ldyBvdXRwdXQgcXVlcnkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlcjsKLSAgICBtT3V0cHV0ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRfbCgpOworICAgIC8vIHNhdmUgdGhlIG9sZCBzdGF0aWMgYnVmZmVyIHBvc2l0aW9uCisgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uID0gbVN0YXRpY1Byb3h5ICE9IE5VTEwgPyBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uKCkgOiAwOwogCi0gICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9UcmFjayBpcyBjcmVhdGVkLCBjcmVhdGVUcmFja19sKCkgd2lsbCBtb2RpZnkgdGhlCisgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvVHJhY2ssIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KLSAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9UcmFjayBhbmQgSU1lbW9yeQorICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5LgorICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCisgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCiAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVByb3h5LT5nZXRGcmFtZXNGaWxsZWQoKTsKLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7Ci0gICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbChtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgLy8gc28gdGhhdCBmcmFtZSBjb3VudCBuZXZlciBnb2VzIGRvd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAvKmVwb2NoKi8pOworICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgbVBvc2l0aW9uID0gbVJlbGVhc2VkOwogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBjb250aW51ZSBwbGF5YmFjayBmcm9tIGxhc3Qga25vd24gcG9zaXRpb24sIGJ1dApAQCAtMTc1MCwxNyArMTg3MywzNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy9Vc2Ugb2YgZGlyZWN0IGFuZCBvZmZsb2FkZWQgb3V0cHV0IHN0cmVhbXMgaXMgcmVmIGNvdW50ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCi0gICAgICAgIC8vIEFzIGdldE91dHB1dCB3YXMgY2FsbGVkIGFib3ZlIGFuZCByZXN1bHRlZCBpbiBhbiBvdXRwdXQgc3RyZWFtIHRvIGJlIG9wZW5lZCwKLSAgICAgICAgLy8gd2UgbmVlZCB0byByZWxlYXNlIGl0LgotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQpOwogICAgICAgICBBTE9HVygicmVzdG9yZVRyYWNrX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCit1aW50MzJfdCBBdWRpb1RyYWNrOjp1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkKK3sKKyAgICAvLyBUaGlzIGlzIHRoZSBzb2xlIHBsYWNlIHRvIHJlYWQgc2VydmVyIGNvbnN1bWVkIGZyYW1lcworICAgIHVpbnQzMl90IG5ld1NlcnZlciA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICBpbnQzMl90IGRlbHRhID0gbmV3U2VydmVyIC0gbVNlcnZlcjsKKyAgICBtU2VydmVyID0gbmV3U2VydmVyOworICAgIC8vIFRPRE8gVGhlcmUgaXMgY29udHJvdmVyc3kgYWJvdXQgd2hldGhlciB0aGVyZSBjYW4gYmUgIm5lZ2F0aXZlIGppdHRlciIgaW4gc2VydmVyIHBvc2l0aW9uLgorICAgIC8vICAgICAgVGhpcyBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGZ1cnRoZXIsIGFuZCBpZiBwb3NzaWJsZSwgaXQgc2hvdWxkIGJlIGFkZHJlc3NlZC4KKyAgICAvLyAgICAgIEEgbW9yZSBkZWZpbml0ZSBmYWlsdXJlIG1vZGUgaXMgaW5mcmVxdWVudCBwb2xsaW5nIGJ5IGNsaWVudC4KKyAgICAvLyAgICAgIE9uZSBjb3VsZCBjYWxsICh2b2lkKWdldFBvc2l0aW9uX2woKSBpbiByZWxlYXNlQnVmZmVyKCksCisgICAgLy8gICAgICBzbyBtUmVsZWFzZWQgYW5kIG1Qb3NpdGlvbiBhcmUgYWx3YXlzIGxvY2stc3RlcCBhcyBiZXN0IHBvc3NpYmxlLgorICAgIC8vICAgICAgVGhhdCBzaG91bGQgZW5zdXJlIGRlbHRhIG5ldmVyIGdvZXMgbmVnYXRpdmUgZm9yIGluZnJlcXVlbnQgcG9sbGluZworICAgIC8vICAgICAgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIG1vcmUgdGhhbiAyXjMxIGZyYW1lcyBpbiBpdHMgYnVmZmVyLAorICAgIC8vICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgdXNlIG9mIHVpbnQzMl90IGZvciB0aGVzZSBjb3VudGVycyBoYXMgYmlnZ2VyIGlzc3Vlcy4KKyAgICBpZiAoZGVsdGEgPCAwKSB7CisgICAgICAgIEFMT0dFKCJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLCBkZWx0YSk7CisgICAgICAgIGRlbHRhID0gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Qb3NpdGlvbiArPSAodWludDMyX3QpIGRlbHRhOworfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTc3NCwyNiArMTkxNSwxMjggQEAKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFNUQVRFX0FDVElWRToKKyAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgYnJlYWs7IC8vIGhhbmRsZSBiZWxvdworICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKKyAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOgorICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOgorICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBvZmZsb2FkZWQgdHJhY2tzIGhhbmRsZWQgYmVsb3cKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBicmVhazsKICAgICB9CisKKyAgICAvLyBUaGUgcHJlc2VudGVkIGZyYW1lIGNvdW50IG11c3QgYWx3YXlzIGxhZyBiZWhpbmQgdGhlIGNvbnN1bWVkIGZyYW1lIGNvdW50LgorICAgIC8vIFRvIGF2b2lkIGEgcmFjZSwgcmVhZCB0aGUgcHJlc2VudGVkIGZyYW1lcyBmaXJzdC4gIFRoaXMgZW5zdXJlcyB0aGF0IHByZXNlbnRlZCA8PSBjb25zdW1lZC4KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uICs9IG1Qcm94eS0+Z2V0RXBvY2goKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRCB8fCBtU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1NUT1BQSU5HKSkgeworICAgICAgICAgICAgLy8gdXNlIGNhY2hlZCBwYXVzZWQgcG9zaXRpb24gaW4gY2FzZSBhbm90aGVyIG9mZmxvYWRlZCB0cmFjayBpcyBydW5uaW5nLgorICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwZW5kaW5nIGZsdXNoIG9yIHN0b3AgaGFzIGNvbXBsZXRlZCwgYXMgdGhvc2UgY29tbWFuZHMgbWF5CisgICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2guCisgICAgICAgIGlmIChtU3RhcnRVcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOworCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOb3cgPSBnZXROb3dVcygpOworCisgICAgICAgICAgICBpZiAodGltZU5vdyA8IG1TdGFydFVzICsgazFTZWNVcykgeyAvLyB3aXRoaW4gZmlyc3Qgc2Vjb25kIG9mIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBUaW1lVXMgPSBjb252ZXJ0VGltZXNwZWNUb1VzKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFRpbWVVcyA8IG1TdGFydFVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IHRpbWVzdGFtcC5tUG9zaXRpb24gKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uQnlVcyA+IGRlbHRhVGltZVVzICsga1RpbWVKaXR0ZXJVcykgeworICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY291bnRlciBjYW4ndCBjb3VudCBmYXN0ZXIgdGhhbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW5jb21wbGV0ZSBmbHVzaCBvciBzdG9wOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWVzdGFtcCBoYXMgZWl0aGVyIGV4cGlyZWQgb3IgdW5uZWVkZWQuCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgdGhlIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBjb25zdW1lZCAobVBvc2l0aW9uKSBhbmQgc2VydmVyIGNvbnN1bWVkIChtU2VydmVyKQorICAgICAgICAodm9pZCkgdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOworICAgICAgICAvLyBTZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpIGFuZCBwcmVzZW50ZWQgYm90aCB1c2UgdGhlIHNhbWUgc2VydmVyIHRpbWUgYmFzZSwKKyAgICAgICAgLy8gYW5kIHNlcnZlciBjb25zdW1lZCBpcyBhbHdheXMgPj0gcHJlc2VudGVkLgorICAgICAgICAvLyBUaGUgZGVsdGEgYmV0d2VlbiB0aGVzZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBidWZmZXIgcGlwZWxpbmUuCisgICAgICAgIC8vIElmIHRoaXMgZGVsdGEgYmV0d2VlbiB0aGVzZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNsaWVudCBwb3NpdGlvbiwgaXQgbWVhbnMgdGhhdAorICAgICAgICAvLyBhY3R1YWxseSBwcmVzZW50ZWQgaXMgc3RpbGwgc3R1Y2sgYXQgdGhlIHN0YXJ0aW5nIGxpbmUgKGZpZ3VyYXRpdmVseSBzcGVha2luZyksCisgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBmcmFtZSB0byBnbyBieS4gIFNvIHdlIGNhbid0IHJlcG9ydCBhIHZhbGlkIHRpbWVzdGFtcCB5ZXQuCisgICAgICAgIGlmICgodWludDMyX3QpIChtU2VydmVyIC0gdGltZXN0YW1wLm1Qb3NpdGlvbikgPiBtUG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0IHRpbWVzdGFtcCBwb3NpdGlvbiBmcm9tIHNlcnZlciB0aW1lIGJhc2UgdG8gY2xpZW50IHRpbWUgYmFzZS4KKyAgICAgICAgLy8gVE9ETyBUaGUgZm9sbG93aW5nIGNvZGUgc2hvdWxkIHdvcmsgT0sgbm93IGJlY2F1c2UgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyAzMi1iaXQuCisgICAgICAgIC8vIEJ1dCBpZiB3ZSBjaGFuZ2UgaXQgdG8gNjQtYml0IHRoZW4gdGhpcyBjb3VsZCBmYWlsLgorICAgICAgICAvLyBJZiAobVBvc2l0aW9uIC0gbVNlcnZlcikgY2FuIGJlIG5lZ2F0aXZlIHRoZW4gc2hvdWxkIHVzZToKKyAgICAgICAgLy8gICAoaW50MzJfdCkobVBvc2l0aW9uIC0gbVNlcnZlcikKKyAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiArPSBtUG9zaXRpb24gLSBtU2VydmVyOworICAgICAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgdG8gZ2V0UG9zaXRpb25fbCgpLCBtUG9zaXRpb24gYW5kCisgICAgICAgIC8vIG1TZXJ2ZXIgYm90aCByZXByZXNlbnQgdGhlIHNhbWUgZnJhbWUgcG9zaXRpb24uICBtUG9zaXRpb24gaXMKKyAgICAgICAgLy8gaW4gY2xpZW50J3MgcG9pbnQgb2YgdmlldywgYW5kIG1TZXJ2ZXIgaXMgaW4gc2VydmVyJ3MgcG9pbnQgb2YKKyAgICAgICAgLy8gdmlldy4gIFNvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgImZ1ZGdlIGZhY3RvciIKKyAgICAgICAgLy8gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciB2aWV3cyBkdWUgdG8gc3RvcCgpIGFuZC9vciBuZXcKKyAgICAgICAgLy8gSUF1ZGlvVHJhY2suICBBbmQgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyBpbml0aWFsbHkgaW4gc2VydmVyJ3MKKyAgICAgICAgLy8gcG9pbnQgb2Ygdmlldywgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgc2FtZSBmdWRnZSBmYWN0b3IgdG8gaXQuCiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIFN0cmluZzggQXVkaW9UcmFjazo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQogewotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhtT3V0cHV0LCBrZXlzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhvdXRwdXQsIGtleXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0Citib29sIEF1ZGlvVHJhY2s6OmlzT2ZmbG9hZGVkKCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzT2ZmbG9hZGVkX2woKTsKK30KKworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc0RpcmVjdF9sKCk7Cit9CisKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc09mZmxvYWRlZE9yRGlyZWN0X2woKTsKK30KKworCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTgwMiw3ICsyMDQ1LDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CisgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCV6dSlcbiIsIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBtRnJhbWVDb3VudCk7CkBAIC0xODIxLDkgKzIwNjQsMTQ2IEBACiAgICAgcmV0dXJuIG1Qcm94eS0+Z2V0VW5kZXJydW5GcmFtZXMoKTsKIH0KIAordm9pZCBBdWRpb1RyYWNrOjpzZXRBdHRyaWJ1dGVzRnJvbVN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSAweDA7CisKKyAgICBzd2l0Y2goc3RyZWFtVHlwZSkgeworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RFRkFVTFQ6CisgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQzsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgorICAgICAgICBtQXR0cmlidXRlcy5mbGFncyAgfD0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEOworICAgICAgICAvLyBpbnRlbmRlZCBmYWxsIHRocm91Z2gsIGF0dHJpYnV0ZXMgaW4gY29tbW9uIHdpdGggU1RSRUFNX1NZU1RFTQorICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9BTEFSTTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19GTEFHX1NDTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVkIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgc3RyZWFtVHlwZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvVHJhY2s6OnNldFN0cmVhbVR5cGVGcm9tQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QmIGFhKSB7CisgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIGlmICgoYWEuZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoYWEuZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBzd2l0Y2ggKGFhLnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIC8vIFRPRE8gb25jZSBBdWRpb1BvbGljeU1hbmFnZXIgZnVsbHkgc3VwcG9ydHMgYXVkaW9fYXR0cmlidXRlc190LAorICAgICAgICAvLyAgIHJlbW92ZSBzdHJlYW0gY2hhbmdlIGJhc2VkIG9uIHBob25lIHN0YXRlCisgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfUklOR1RPTkUpIHsKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1JJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLy8gRkFMTCBUSFJPVUdICisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fU1lTVEVNOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRFRNRjsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fQUxBUk07CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1JJTkc7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9UcmFjazo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpIHsKKyAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJhdGVneT8KKyAgICBpZiAoKHBhYS0+ZmxhZ3MgJiAoQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIHwgQVVESU9fRkxBR19TQ08pKSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIGhhcyBrbm93biB1c2FnZT8KKyAgICBzd2l0Y2ggKHBhYS0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQgQXVkaW9UcmFjazo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQordm9pZCBBdWRpb1RyYWNrOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgc3A8QXVkaW9UcmFjaz4gYXVkaW9UcmFjayA9IG1BdWRpb1RyYWNrLnByb21vdGUoKTsKICAgICBpZiAoYXVkaW9UcmFjayAhPSAwKSB7CkBAIC0xODY3LDcgKzIyNDcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIG5zZWNzX3QgbnMgPSBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKHRoaXMpOworICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbnNlY3NfdCBucyA9IG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIoKTsKICAgICBzd2l0Y2ggKG5zKSB7CiAgICAgY2FzZSAwOgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE4ODEsNyArMjI2NCw3IEBACiAgICAgICAgIG5zID0gMTAwMDAwMDAwMExMOwogICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IGQ1YjBiMDcuLmVlYzAyNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGF1ZGlvX3RyYWNrX2NibGtfdDo6YXVkaW9fdHJhY2tfY2Jsa190KCkKLSAgICA6IG1TZXJ2ZXIoMCksIGZyYW1lQ291bnRfKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAotICAgIG1Wb2x1bWVMUigweDEwMDAxMDAwKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQorICAgIDogbVNlcnZlcigwKSwgbUZ1dGV4KDApLCBtTWluaW11bSgwKSwKKyAgICBtVm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQogewogICAgIG1lbXNldCgmdSwgMCwgc2l6ZW9mKHUpKTsKIH0KQEAgLTEzNCwxMCArMTM0LDE3IEBACiAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKLSAgICAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGlmIChtSXNPdXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGluZyBkb3duIiwgZmlsbGVkLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3IgaW5wdXQsIHN5bmMgdXAgb24gb3ZlcnJ1bgorICAgICAgICAgICAgZmlsbGVkID0gMDsKKyAgICAgICAgICAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQgPSByZWFyOworICAgICAgICAgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfT1ZFUlJVTiwgJmNibGstPm1GbGFncyk7CiAgICAgICAgIH0KICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZmlsbGluZyBwaXBlIGJleW9uZCB0aGUgbm9taW5hbCBzaXplCiAgICAgICAgIHNpemVfdCBhdmFpbCA9IG1Jc091dCA/IG1GcmFtZUNvdW50IC0gZmlsbGVkIDogZmlsbGVkOwpAQCAtMjAwLDcgKzIwNyw3IEBACiAgICAgICAgICAgICB0cyA9ICZyZW1haW5pbmc7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgib2J0YWluQnVmZmVyKCkgdGltZW91dD0lZCIsIHRpbWVvdXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgib2J0YWluQnVmZmVyKCkgdGltZW91dD0lZCIsIHRpbWVvdXQpOwogICAgICAgICAgICAgdHMgPSBOVUxMOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMzMSw3ICszMzgsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKKyAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gKHNpemVfdClmaWxsZWQ7CkBAIC00MjksNyArNDM2LDcgQEAKICAgICAgICAgICAgIHRzID0gJnJlbWFpbmluZzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJ3YWl0U3RyZWFtRW5kRG9uZSgpIHRpbWVvdXQ9JWQiLCB0aW1lb3V0KTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIndhaXRTdHJlYW1FbmREb25lKCkgdGltZW91dD0lZCIsIHRpbWVvdXQpOwogICAgICAgICAgICAgdHMgPSBOVUxMOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQ3MCw3ICs0NzcsNyBAQAogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6Zmx1c2goKQogewotICAgIExPR19GQVRBTCgic3RhdGljIGZsdXNoIik7CisgICAgTE9HX0FMV0FZU19GQVRBTCgic3RhdGljIGZsdXNoIik7CiB9CiAKIHZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpzZXRMb29wKHNpemVfdCBsb29wU3RhcnQsIHNpemVfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQpAQCAtNTQ4LDcgKzU1NSw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSVkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CisgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwogICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgfQogICAgIGlmIChtSXNTaHV0ZG93bikgewpAQCAtNjIxLDcgKzYyOCw3IEBACiAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoc3RlcENvdW50ICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgfQogCi0gICAgbUNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OworICAgIGNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OwogCiAgICAgc2l6ZV90IGhhbGYgPSBtRnJhbWVDb3VudCAvIDI7CiAgICAgaWYgKGhhbGYgPT0gMCkgewpAQCAtNjM1LDcgKzY0Miw3IEBACiAgICAgfQogICAgIC8vIEZJWE1FIEF1ZGlvUmVjb3JkIHdha2V1cCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQ7IGl0IGN1cnJlbnRseSB3YWtlcyB1cCBjbGllbnQgZXZlcnkgdGltZQogICAgIGlmICghbUlzT3V0IHx8IChtQXZhaWxUb0NsaWVudCArIHN0ZXBDb3VudCA+PSBtaW5pbXVtKSkgewotICAgICAgICBBTE9HVigibUF2YWlsVG9DbGllbnQ9JXUgc3RlcENvdW50PSV1IG1pbmltdW09JXUiLCBtQXZhaWxUb0NsaWVudCwgc3RlcENvdW50LCBtaW5pbXVtKTsKKyAgICAgICAgQUxPR1YoIm1BdmFpbFRvQ2xpZW50PSV6dSBzdGVwQ291bnQ9JXp1IG1pbmltdW09JXp1IiwgbUF2YWlsVG9DbGllbnQsIHN0ZXBDb3VudCwgbWluaW11bSk7CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewogICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKQEAgLTY2OCw3ICs2NzUsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSVkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CisgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOwogICAgICAgICBtSXNTaHV0ZG93biA9IHRydWU7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTY3OSwxMCArNjg2LDExIEBACiB9CiAKIGJvb2wgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c2V0U3RyZWFtRW5kRG9uZSgpIHsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBtQ2JsazsKICAgICBib29sIG9sZCA9Ci0gICAgICAgICAgICAoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19TVFJFQU1fRU5EX0RPTkUsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfU1RSRUFNX0VORF9ET05FKSAhPSAwOworICAgICAgICAgICAgKGFuZHJvaWRfYXRvbWljX29yKENCTEtfU1RSRUFNX0VORF9ET05FLCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfU1RSRUFNX0VORF9ET05FKSAhPSAwOwogICAgIGlmICghb2xkKSB7Ci0gICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtQ2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAorICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAogICAgICAgICAgICAgICAgIDEpOwogICAgIH0KICAgICByZXR1cm4gb2xkOwpAQCAtNjkwLDEwICs2OTgsMTEgQEAKIAogdm9pZCBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKIHsKLSAgICBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1VbmRlcnJ1bkZyYW1lcyArPSBmcmFtZUNvdW50OworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOworICAgIGNibGstPnUubVN0cmVhbWluZy5tVW5kZXJydW5GcmFtZXMgKz0gZnJhbWVDb3VudDsKIAogICAgIC8vIEZJWE1FIGFsc28gd2FrZSBmdXRleCBzbyB0aGF0IHVuZGVycnVuIGlzIG5vdGljZWQgbW9yZSBxdWlja2x5Ci0gICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU4sICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19VTkRFUlJVTiwgJmNibGstPm1GbGFncyk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzcxLDcgKzc4MCw3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBwb3NpdGlvbjsKIH0KIAotc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2gpCitzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCBfX3VudXNlZCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb3VudCA9IDA7CkBAIC04MjUsNyArODM0LDcgQEAKICAgICBzaXplX3QgbmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIHN0ZXBDb3VudDsKICAgICBpbnQzMl90IHNldEZsYWdzID0gMDsKICAgICBpZiAoIShwb3NpdGlvbiA8PSBuZXdQb3NpdGlvbiAmJiBuZXdQb3NpdGlvbiA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV1IG91dHNpZGUgWyV1LCAldV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CisgICAgICAgIEFMT0dXKCIlcyBuZXdQb3NpdGlvbiAlenUgb3V0c2lkZSBbJXp1LCAlenVdIiwgX19mdW5jX18sIG5ld1Bvc2l0aW9uLCBwb3NpdGlvbiwgbUZyYW1lQ291bnQpOwogICAgICAgICBuZXdQb3NpdGlvbiA9IG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgIT0gMCAmJiBuZXdQb3NpdGlvbiA9PSBtU3RhdGUubUxvb3BFbmQpIHsKICAgICAgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID09IC0xIHx8IC0tbVN0YXRlLm1Mb29wQ291bnQgIT0gMCkgewpAQCAtODU0LDcgKzg2Myw3IEBACiAgICAgYnVmZmVyLT5tTm9uQ29udGlnID0gMDsKIH0KIAotdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXModWludDMyX3QgZnJhbWVDb3VudCkKK3ZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQgX191bnVzZWQpCiB7CiAgICAgLy8gVW5saWtlIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcygpIHVzZWQgZm9yIHN0cmVhbWluZyB0cmFja3MsCiAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhIGxvY2F0aW9uIHRvIGNvdW50IHVuZGVycnVuIGZyYW1lcy4gIFRoZSB1bmRlcnJ1biBmcmFtZSBjb3VudGVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTk0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2hhcmFjdGVyRW5jb2RpbmdEZWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CisjaW5jbHVkZSAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIgorCisjaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKKworI2luY2x1ZGUgInVuaWNvZGUvdWNudi5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNzZGV0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKKworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIG1VdGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKKyAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKKyAgICAgICAgbVV0ZjhDb252ID0gTlVMTDsKKyAgICB9Cit9CisKK0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6On5DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCkgeworICAgIHVjbnZfY2xvc2UobVV0ZjhDb252KTsKK30KKwordm9pZCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjphZGRUYWcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBtTmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgIG1WYWx1ZXMucHVzaF9iYWNrKHZhbHVlKTsKK30KKworc2l6ZV90IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OnNpemUoKSB7CisgICAgcmV0dXJuIG1OYW1lcy5zaXplKCk7Cit9CisKK3N0YXR1c190IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSkgeworICAgIGlmIChpbmRleCA+PSBtTmFtZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaW5kZXgpOworICAgICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaW5kZXgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIGJvb2wgaXNQcmludGFibGVBc2NpaShjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCh2YWx1ZVtpXSAmIDB4ODApIHx8IHZhbHVlW2ldIDwgMHgyMCB8fCB2YWx1ZVtpXSA9PSAweDdmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6ZGV0ZWN0QW5kQ29udmVydCgpIHsKKworICAgIGludCBzaXplID0gbU5hbWVzLnNpemUoKTsKKyAgICBBTE9HVigiJWQgdGFncyBiZWZvcmUgY29udmVyc2lvbiIsIHNpemUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIlczogJXMiLCBtTmFtZXMuZ2V0RW50cnkoaSksIG1WYWx1ZXMuZ2V0RW50cnkoaSkpOworICAgIH0KKworICAgIGlmIChzaXplICYmIG1VdGY4Q29udikgeworCisgICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBVQ2hhcnNldERldGVjdG9yICpjc2QgPSB1Y3NkZXRfb3Blbigmc3RhdHVzKTsKKyAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCAqdWNtOworCisgICAgICAgIC8vIHRyeSBjb21iaW5lZCBkZXRlY3Rpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgIGludCBpZHg7CisgICAgICAgIGJvb2wgYWxscHJpbnRhYmxlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBpZiAoIWlzUHJpbnRhYmxlQXNjaWkodmFsdWUsIHN0cmxlbih2YWx1ZSkpICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJjb21wb3NlciIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgeworICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCB2YWx1ZSwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIHRhZ3MgYnkgc3BhY2Ugc28gSUNVJ3MgbmdyYW0gZGV0ZWN0b3IgY2FuIGRvIGl0cyBqb2IKKyAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgIiAiLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgYWxscHJpbnRhYmxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpjb21iaW5lZGVuYyA9ICJVVEYtOCI7CisgICAgICAgIGlmIChhbGxwcmludGFibGUpIHsKKyAgICAgICAgICAgIC8vIHNpbmNlICdidWYnIGlzIGVtcHR5LCBJQ1Ugd291bGQgcmV0dXJuIGEgVVRGLTggbWF0Y2hlciB3aXRoIGxvdyBjb25maWRlbmNlLCBzbworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBldmVuIGNhbGwgaXQKKyAgICAgICAgICAgIEFMT0dWKCJhbGwgdGFncyBhcmUgcHJpbnRhYmxlLCBhc3N1bWluZyBhc2NpaSAoJXp1KSIsIHN0cmxlbihidWYpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgYnVmLCBzdHJsZW4oYnVmKSwgJnN0YXR1cyk7CisgICAgICAgICAgICBpbnQzMl90IG1hdGNoZXM7CisgICAgICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiogdWNtYSA9IHVjc2RldF9kZXRlY3RBbGwoY3NkLCAmbWF0Y2hlcywgJnN0YXR1cyk7CisgICAgICAgICAgICBib29sIGdvb2RtYXRjaCA9IHRydWU7CisgICAgICAgICAgICBpbnQgaGlnaGVzdCA9IDA7CisgICAgICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiBiZXN0Q29tYmluZWRNYXRjaCA9IGdldFByZWZlcnJlZChidWYsIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICB1Y21hLCBtYXRjaGVzLCAmZ29vZG1hdGNoLCAmaGlnaGVzdCk7CisKKyAgICAgICAgICAgIEFMT0dWKCJnb29kbWF0Y2g6ICVzLCBoaWdoZXN0OiAlZCIsIGdvb2RtYXRjaCA/ICJ0cnVlIiA6ICJmYWxzZSIsIGhpZ2hlc3QpOworICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2ggJiYgKGhpZ2hlc3QgPCAxNSB8fCBzdHJsZW4oYnVmKSA8IDIwKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJub3QgYSBnb29kIG1hdGNoLCB0cnlpbmcgd2l0aCBtb3JlIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmluZyBtaWdodCBiZSB0b28gc2hvcnQgZm9yIElDVSB0byBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aC4KKyAgICAgICAgICAgICAgICAvLyAocmVhbCB3b3JsZCBleGFtcGxlOiAiQmrDtnJrIiBpbiBJU08tODg1OS0xIG1pZ2h0IGJlIGRldGVjdGVkIGFzIEdCMTgwMzAsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyAgdGhlIElTTyBkZXRlY3RvciByZXBvcnRzIGEgY29uZmlkZW5jZSBvZiAwLCB3aGlsZSB0aGUgR0IxODAzMCBkZXRlY3RvciByZXBvcnRzCisgICAgICAgICAgICAgICAgLy8gIGEgY29uZmlkZW5jZSBvZiAxMCB3aXRoIG5vIGludmFsaWQgY2hhcmFjdGVycykKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgYXJ0aXN0LCBhbGJ1bSBhbmQgdGl0bGUgaWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgb21pdHRlZCBiZWNhdXNlIHRoZXkKKyAgICAgICAgICAgICAgICAvLyB3ZXJlIHByaW50YWJsZSBhc2NpaS4KKyAgICAgICAgICAgICAgICBib29sIGFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1OYW1lcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmludGFibGVBc2NpaSh2YWx1ZSwgc3RybGVuKHZhbHVlKSkgJiYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgInRpdGxlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgdmFsdWUsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoYnVmLCAiICIsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWNzZGV0X3NldFRleHQoY3NkLCBidWYsIHN0cmxlbihidWYpLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdWNtYSA9IHVjc2RldF9kZXRlY3RBbGwoY3NkLCAmbWF0Y2hlcywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGJlc3RDb21iaW5lZE1hdGNoID0gZ2V0UHJlZmVycmVkKGJ1Ziwgc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaCwgJmhpZ2hlc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWdvb2RtYXRjaCAmJiBoaWdoZXN0IDw9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RpbGwgbm90IGEgZ29vZCBtYXRjaCBhZnRlciBhZGRpbmcgcHJpbnRhYmxlIHRhZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RDb21iaW5lZE1hdGNoID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJubyBwcmludGFibGUgdGFncyB0byBhZGQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiZXN0Q29tYmluZWRNYXRjaCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29tYmluZWRlbmMgPSB1Y3NkZXRfZ2V0TmFtZShiZXN0Q29tYmluZWRNYXRjaCwgJnN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gIklTTy04ODU5LTEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICB1aW50OF90KiBzcmMgPSAodWludDhfdCAqKW1WYWx1ZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKChjaGFyICopc3JjKTsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QgPSBzcmM7CisKKyAgICAgICAgICAgIEFMT0dWKCJAQEAgY2hlY2tpbmcgJXMiLCBuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaW50MzJfdCBpbnB1dExlbmd0aCA9IHN0cmxlbihzKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuYzsKKworICAgICAgICAgICAgaWYgKCFhbGxwcmludGFibGUgJiYgKCFzdHJjbXAobmFtZSwgImFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtYXJ0aXN0IikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJnZW5yZSIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImFsYnVtIikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgZW5jb2RpbmcgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjb21iaW5hdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgorICAgICAgICAgICAgICAgIGVuYyA9IGNvbWJpbmVkZW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQcmludGFibGVBc2NpaShzLCBpbnB1dExlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jID0gIlVURi04IjsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkBAQEAgJXMgaXMgYXNjaWkiLCBtTmFtZXMuZ2V0RW50cnkoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgcywgaW5wdXRMZW5ndGgsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB1Y20gPSB1Y3NkZXRfZGV0ZWN0KGNzZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdWNtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLnNldEVudHJ5KGksICI/Pz8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVuYyA9IHVjc2RldF9nZXROYW1lKHVjbSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJAQEBAIHJlY29nbml6ZWQgY2hhcnNldDogJXMgZm9yICVzIGNvbmZpZGVuY2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywgbU5hbWVzLmdldEVudHJ5KGkpLCB1Y3NkZXRfZ2V0Q29uZmlkZW5jZSh1Y20sICZzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZW5jLCJVVEYtOCIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IGNvbnZlcnQgaWYgdGhlIHNvdXJjZSBlbmNvZGluZyBpc24ndCBhbHJlYWR5IFVURi04CisgICAgICAgICAgICAgICAgQUxPR1YoIkBAQCB1c2luZyBjb252ZXJ0ZXIgJXMgZm9yICVzIiwgZW5jLCBtTmFtZXMuZ2V0RW50cnkoaSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuYywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzICglZCksIGZhbGxpbmcgYmFjayB0byBJU08tODg1OS0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgY29udiA9IHVjbnZfb3BlbigiSVNPLTg4NTktMSIsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yIElTTy04ODU5LTEgZWl0aGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBuYXRpdmUgZW5jb2RpbmcgdG8gVVRGLTgKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzb3VyY2UgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgICAgIGludCB0YXJnZXRMZW5ndGggPSBsZW4gKiAzICsgMTsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhclt0YXJnZXRMZW5ndGhdOworICAgICAgICAgICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNoZWNrIGZvciBOVUxMLCBidXQgaW4gdGhpcyBjYXNlIHRhcmdldExlbmd0aCBtYXkgYmUgbGFyZ2UKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2hhciogdGFyZ2V0ID0gYnVmZmVyOworCisgICAgICAgICAgICAgICAgdWNudl9jb252ZXJ0RXgobVV0ZjhDb252LCBjb252LCAmdGFyZ2V0LCB0YXJnZXQgKyB0YXJnZXRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlLCBzb3VyY2UgKyBzdHJsZW4oc291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUsIFRSVUUsICZzdGF0dXMpOworCisgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCAiPz8/Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyB0ZXJtaW5hdGUKKyAgICAgICAgICAgICAgICAgICAgKnRhcmdldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIHRyYWlsaW5nIHNwYWNlcworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS10YXJnZXQgPiBidWZmZXIgJiYgKnRhcmdldCA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgbGVhZGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RhcnQgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgqc3RhcnQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZXMuc2V0RW50cnkoaSwgc3RhcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoc3RybGVuKG1WYWx1ZXMuZ2V0RW50cnkoaSkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXJhc2luZyAlcyBiZWNhdXNlIGVudHJ5IGlzIGVtcHR5IiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBtTmFtZXMuZXJhc2UoaSk7CisgICAgICAgICAgICAgICAgbVZhbHVlcy5lcmFzZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVjc2RldF9jbG9zZShjc2QpOworICAgIH0KK30KKworLyoKKyAqIFdoZW4gSUNVIGRldGVjdHMgbXVsdGlwbGUgZW5jb2RpbmcgbWF0Y2hlcywgYXBwbHkgYWRkaXRpb25hbCBoZXVyaXN0aWNzIHRvIGRldGVybWluZQorICogd2hpY2ggb25lIGlzIHRoZSBiZXN0IG1hdGNoLCBzaW5jZSBJQ1UgY2FuJ3QgYWx3YXlzIGJlIHRydXN0ZWQgdG8gbWFrZSB0aGUgcmlnaHQgY2hvaWNlLgorICoKKyAqIFdoYXQgdGhpcyBtZXRob2QgZG9lcyBpczoKKyAqIC0gZGVjb2RlIHRoZSBpbnB1dCB1c2luZyBlYWNoIG9mIHRoZSBtYXRjaGVzIGZvdW5kCisgKiAtIHJlY2FsY3VsYXRlIHRoZSBzdGFydGluZyBjb25maWRlbmNlIGxldmVsIGZvciBtdWx0aWJ5dGUgZW5jb2RpbmdzIHVzaW5nIGEgZGlmZmVyZW50CisgKiAgIGFsZ29yaXRobSBhbmQgbGFyZ2VyIGZyZXF1ZW50IGNoYXJhY3RlciBsaXN0cyB0aGFuIElDVQorICogLSBkZXZhbHVlIGVuY29kaW5nIHdoZXJlIHRoZSBjb252ZXJzaW9uIGNvbnRhaW5zIHVubGlrZWx5IGNoYXJhY3RlcnMgKHN5bWJvbHMsIHJlc2VydmVkLCBldGMpCisgKiAtIHBpY2sgdGhlIGhpZ2hlc3QgbWF0Y2gKKyAqIC0gc2lnbmFsIHRvIHRoZSBjYWxsZXIgd2hldGhlciB0aGlzIG1hdGNoIGlzIGNvbnNpZGVyZWQgZ29vZDogY29uZmlkZW5jZSA+IDE1LCBhbmQgY29uZmlkZW5jZQorICogICBkZWx0YSB3aXRoIHRoZSBuZXh0IHJ1bm5lciB1cCA+IDE1CisgKi8KK2NvbnN0IFVDaGFyc2V0TWF0Y2ggKkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmdldFByZWZlcnJlZCgKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2gqKiB1Y21hLCBzaXplX3QgbnVtbWF0Y2hlcywKKyAgICAgICAgYm9vbCAqZ29vZG1hdGNoLCBpbnQgKmhpZ2hlc3RtYXRjaCkgeworCisgICAgKmdvb2RtYXRjaCA9IGZhbHNlOworICAgIFZlY3Rvcjxjb25zdCBVQ2hhcnNldE1hdGNoKj4gbWF0Y2hlczsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworICAgIEFMT0dWKCIlenUgbWF0Y2hlcyIsIG51bW1hdGNoZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtbWF0Y2hlczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmVuY25hbWUgPSB1Y3NkZXRfZ2V0TmFtZSh1Y21hW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaW50IGNvbmZpZGVuY2UgPSB1Y3NkZXRfZ2V0Q29uZmlkZW5jZSh1Y21hW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIiV6dTogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgbWF0Y2hlcy5wdXNoX2JhY2sodWNtYVtpXSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bSA9IG1hdGNoZXMuc2l6ZSgpOworICAgIGlmIChudW0gPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG51bSA9PSAxKSB7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UobWF0Y2hlc1swXSwgJnN0YXR1cyk7CisgICAgICAgIGlmIChjb25maWRlbmNlID4gMTUpIHsKKyAgICAgICAgICAgICpnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVzWzBdOworICAgIH0KKworICAgIEFMT0dWKCJjb25zaWRlcmluZyAlenUgbWF0Y2hlcyIsIG51bSk7CisKKyAgICAvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55ICJzcGVjaWFsIiBjaGFyYWN0ZXJzIHJlc3VsdCB3aGVuIGNvbnZlcnRpbmcgdGhlIGlucHV0IHVzaW5nIGVhY2gKKyAgICAvLyBlbmNvZGluZworICAgIFZlY3RvcjxpbnQ+IG5ld2NvbmZpZGVuY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqZnJlcWRhdGEgPSBOVUxMOworICAgICAgICBmbG9hdCBmcmVxY292ZXJhZ2UgPSAwOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGNvbnN0IGNoYXIgKmVuY25hbWUgPSB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaW50IGNvbmZpZGVuY2UgPSB1Y3NkZXRfZ2V0Q29uZmlkZW5jZShtYXRjaGVzW2ldLCAmc3RhdHVzKTsKKyAgICAgICAgaWYgKCFzdHJjbXAoIkdCMTgwMzAiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF96aENOOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfemhDTl9jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJCaWc1IiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfemhUVzsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X3poVFdfY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiRVVDLUtSIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfa287CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF9rb19jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJFVUMtSlAiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF9qYTsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X2phX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlNoaWZ0X0pJUyIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X2phOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfamFfY292ZXJhZ2U7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXp1OiAlcyAlZCIsIGksIGVuY25hbWUsIGNvbmZpZGVuY2UpOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIFVDb252ZXJ0ZXIgKmNvbnYgPSB1Y252X29wZW4oZW5jbmFtZSwgJnN0YXR1cyk7CisgICAgICAgIGludCBkZW1lcml0ID0gMDsKKyAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIG9wZW4gJXM6ICVkIiwgZW5jbmFtZSwgc3RhdHVzKTsKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwOworICAgICAgICAgICAgZGVtZXJpdCArPSAxMDAwOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSA9IGlucHV0OworICAgICAgICBjb25zdCBjaGFyICpzb3VyY2VMaW1pdCA9IGlucHV0ICsgbGVuOworICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgIGludCBmcmVxdWVudGNoYXJzID0gMDsKKyAgICAgICAgaW50IHRvdGFsY2hhcnMgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gZGVtZXJpdCB0aGUgY3VycmVudCBlbmNvZGluZyBmb3IgZWFjaCAic3BlY2lhbCIgY2hhcmFjdGVyIGZvdW5kIGFmdGVyIGNvbnZlcnNpb24uCisgICAgICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRlbWVyaXQgaXMgc29tZXdoYXQgYXJiaXRyYXJpbHkgY2hvc2VuLgorICAgICAgICAgICAgaW50IGluY2hhcjsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gc291cmNlTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpbmNoYXIgPSAoc291cmNlWzBdIDw8IDgpICsgc291cmNlWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUNoYXIzMiBjID0gdWNudl9nZXROZXh0VUNoYXIoY29udiwgJnNvdXJjZSwgc291cmNlTGltaXQsICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPCAweDIwIHx8IChjID49IDB4N2YgJiYgYyA8PSAweDAwOWYpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbnRyb2wgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjID09IDB4YTApICAgICAgICAgICAgICAgICAgICAgIC8vIG5vLWJyZWFrIHNwYWNlCisgICAgICAgICAgICAgICAgICAgIHx8IChjID49IDB4YTIgJiYgYyA8PSAweGJlKSAgICAgICAgIC8vIHN5bWJvbHMsIHN1cGVyc2NyaXB0cworICAgICAgICAgICAgICAgICAgICB8fCAoYyA9PSAweGQ3KSB8fCAoYyA9PSAweGY3KSAgICAgICAvLyBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gc2lnbnMKKyAgICAgICAgICAgICAgICAgICAgfHwgKGMgPj0gMHgyMDAwICYmIGMgPD0gMHgyMDlmKSkgeyAgLy8gcHVuY3R1YXRpb24sIHN1cGVyc2NyaXB0cworICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmxpa2VseSBjaGFyYWN0ZXIgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDEwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4ZTAwMCAmJiBjIDw9IDB4ZjhmZikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJwcml2YXRlIHVzZSBjaGFyYWN0ZXIgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDMwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4MjE5MCAmJiBjIDw9IDB4MmJmZikgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmFuZ2UgY29tcHJpc2VzIHZhcmlvdXMgc3ltYm9sIHJhbmdlcyB0aGF0IGFyZSB1bmxpa2VseSB0byBhcHBlYXIgaW4KKyAgICAgICAgICAgICAgICAvLyBtdXNpYyBmaWxlIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgIEFMT0dWKCJzeW1ib2wgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDEwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IDB4ZmZmZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBsYWNlbWVudCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDUwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4ZmZmMCAmJiBjIDw9IDB4ZmZmYykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmljb2RlIHNwZWNpYWwgJXgiLCBjKTsKKyAgICAgICAgICAgICAgICBkZW1lcml0ICs9IDUwOworICAgICAgICAgICAgfSBlbHNlIGlmIChmcmVxZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdG90YWxjaGFycysrOworICAgICAgICAgICAgICAgIGlmIChpc0ZyZXF1ZW50KGZyZXFkYXRhLCBjKSkgeworICAgICAgICAgICAgICAgICAgICBmcmVxdWVudGNoYXJzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcmVxZGF0YSAhPSBOVUxMICYmIHRvdGFsY2hhcnMgIT0gMCkgeworICAgICAgICAgICAgaW50IG15Y29uZmlkZW5jZSA9IDEwICsgZmxvYXQoKDEwMCAqIGZyZXF1ZW50Y2hhcnMpIC8gdG90YWxjaGFycykgLyBmcmVxY292ZXJhZ2U7CisgICAgICAgICAgICBBTE9HVigiSUNVIGNvbmZpZGVuY2U6ICVkLCBteSBjb25maWRlbmNlOiAlZCAoJWQgJWQpIiwgY29uZmlkZW5jZSwgbXljb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB0b3RhbGNoYXJzLCBmcmVxdWVudGNoYXJzKTsKKyAgICAgICAgICAgIGlmIChteWNvbmZpZGVuY2UgPiAxMDApIG15Y29uZmlkZW5jZSA9IDEwMDsKKyAgICAgICAgICAgIGlmIChteWNvbmZpZGVuY2UgPCAwKSBteWNvbmZpZGVuY2UgPSAwOworICAgICAgICAgICAgY29uZmlkZW5jZSA9IG15Y29uZmlkZW5jZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJWQtJWQ9JWQiLCBjb25maWRlbmNlLCBkZW1lcml0LCBjb25maWRlbmNlIC0gZGVtZXJpdCk7CisgICAgICAgIG5ld2NvbmZpZGVuY2UucHVzaF9iYWNrKGNvbmZpZGVuY2UgLSBkZW1lcml0KTsKKyAgICAgICAgdWNudl9jbG9zZShjb252KTsKKyAgICAgICAgaWYgKGkgPT0gMCAmJiAoY29uZmlkZW5jZSAtIGRlbWVyaXQpID09IDEwMCkgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnkgZnVydGhlciwgd2UnbGwgZW5kIHVwIHVzaW5nIHRoaXMgbWF0Y2ggYW55d2F5CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGZpbmQgbWF0Y2ggd2l0aCBoaWdoZXN0IGNvbmZpZGVuY2UgYWZ0ZXIgYWRqdXN0aW5nIGZvciB1bmxpa2VseSBjaGFyYWN0ZXJzCisgICAgaW50IGhpZ2hlc3QgPSBuZXdjb25maWRlbmNlWzBdOworICAgIHNpemVfdCBoaWdoZXN0aWR4ID0gMDsKKyAgICBpbnQgcnVubmVydXAgPSAtMTAwMDA7CisgICAgaW50IHJ1bm5lcnVwaWR4ID0gLTEwMDAwOworICAgIG51bSA9IG5ld2NvbmZpZGVuY2Uuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgaWYgKG5ld2NvbmZpZGVuY2VbaV0gPiBoaWdoZXN0KSB7CisgICAgICAgICAgICBydW5uZXJ1cCA9IGhpZ2hlc3Q7CisgICAgICAgICAgICBydW5uZXJ1cGlkeCA9IGhpZ2hlc3RpZHg7CisgICAgICAgICAgICBoaWdoZXN0ID0gbmV3Y29uZmlkZW5jZVtpXTsKKyAgICAgICAgICAgIGhpZ2hlc3RpZHggPSBpOworICAgICAgICB9IGVsc2UgaWYgKG5ld2NvbmZpZGVuY2VbaV0gPiBydW5uZXJ1cCl7CisgICAgICAgICAgICBydW5uZXJ1cCA9IG5ld2NvbmZpZGVuY2VbaV07CisgICAgICAgICAgICBydW5uZXJ1cGlkeCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIEFMT0dWKCJzZWxlY3Rpbmc6ICclcycgdy8gJWQgY29uZmlkZW5jZSIsCisgICAgICAgICAgICB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW2hpZ2hlc3RpZHhdLCAmc3RhdHVzKSwgaGlnaGVzdCk7CisgICAgaWYgKHJ1bm5lcnVwaWR4IDwgMCkgeworICAgICAgICBBTE9HVigibm8gcnVubmVyIHVwIik7CisgICAgICAgIGlmIChoaWdoZXN0ID4gMTUpIHsKKyAgICAgICAgICAgICpnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJ1bm5lciB1cDogJyVzJyB3LyAlZCBjb25maWRlbmNlIiwKKyAgICAgICAgICAgICAgICB1Y3NkZXRfZ2V0TmFtZShtYXRjaGVzW3J1bm5lcnVwaWR4XSwgJnN0YXR1cyksIHJ1bm5lcnVwKTsKKyAgICAgICAgaWYgKHJ1bm5lcnVwIDwgMCkgeworICAgICAgICAgICAgcnVubmVydXAgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgoaGlnaGVzdCAtIHJ1bm5lcnVwKSA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqaGlnaGVzdG1hdGNoID0gaGlnaGVzdDsKKyAgICByZXR1cm4gbWF0Y2hlc1toaWdoZXN0aWR4XTsKK30KKworCitib29sIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmlzRnJlcXVlbnQoY29uc3QgdWludDE2X3QgKnZhbHVlcywgdWludDMyX3QgYykgeworCisgICAgaW50IHN0YXJ0ID0gMDsKKyAgICBpbnQgZW5kID0gNTExOyAvLyBBbGwgdGhlIHRhYmxlcyBoYXZlIDUxMiBlbnRyaWVzCisgICAgaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CisKKyAgICB3aGlsZShzdGFydCA8PSBlbmQpIHsKKyAgICAgICAgaWYoYyA9PSB2YWx1ZXNbbWlkXSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+IHZhbHVlc1ttaWRdKSB7CisgICAgICAgICAgICBzdGFydCA9IG1pZCArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmQgPSBtaWQgLSAxOworICAgICAgICB9CisKKyAgICAgICAgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmggYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlMTEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaApAQCAtMCwwICsxLDIwOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUgemhDTiBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF96aENOW10gPSB7CisgICAgMHg0RTAwLCAvLyDkuIAsICMyCisgICAgMHg0RTA3LCAvLyDkuIcsICMzMDYKKyAgICAweDRFMDksIC8vIOS4iSwgIzEzOAorICAgIDB4NEUwQSwgLy8g5LiKLCAjMTYKKyAgICAweDRFMEIsIC8vIOS4iywgIzI1CisgICAgMHg0RTBELCAvLyDkuI0sICM3CisgICAgMHg0RTBFLCAvLyDkuI4sICMxMzMKKyAgICAweDRFMTMsIC8vIOS4kywgIzE1MQorICAgIDB4NEUxNiwgLy8g5LiWLCAjMzQ2CisgICAgMHg0RTFBLCAvLyDkuJosICMzOQorICAgIDB4NEUxQywgLy8g5LicLCAjMTk3CisgICAgMHg0RTI0LCAvLyDkuKQsICMzNzYKKyAgICAweDRFMkEsIC8vIOS4qiwgIzIzCisgICAgMHg0RTJELCAvLyDkuK0sICM0CisgICAgMHg0RTNBLCAvLyDkuLosICMzMQorICAgIDB4NEUzQiwgLy8g5Li7LCAjOTUKKyAgICAweDRFM0UsIC8vIOS4viwgIzQxOAorICAgIDB4NEU0OCwgLy8g5LmILCAjOTMKKyAgICAweDRFNEIsIC8vIOS5iywgIzEzMQorICAgIDB4NEU1MCwgLy8g5LmQLCAjMTMwCisgICAgMHg0RTVGLCAvLyDkuZ8sICMxNDUKKyAgICAweDRFNjYsIC8vIOS5piwgIzI4MworICAgIDB4NEU3MCwgLy8g5LmwLCAjNDgzCisgICAgMHg0RTg2LCAvLyDkuoYsICMxMworICAgIDB4NEU4QiwgLy8g5LqLLCAjMTY4CisgICAgMHg0RThDLCAvLyDkuowsICMyMTgKKyAgICAweDRFOEUsIC8vIOS6jiwgIzY0CisgICAgMHg0RTk0LCAvLyDkupQsICM0MzAKKyAgICAweDRFOUEsIC8vIOS6miwgIzQ2OAorICAgIDB4NEU5QiwgLy8g5LqbLCAjMzY2CisgICAgMHg0RUE0LCAvLyDkuqQsICMyNDMKKyAgICAweDRFQTcsIC8vIOS6pywgIzg2CisgICAgMHg0RUFCLCAvLyDkuqssICMzNDUKKyAgICAweDRFQUMsIC8vIOS6rCwgIzIwNgorICAgIDB4NEVCQSwgLy8g5Lq6LCAjMworICAgIDB4NEVDMCwgLy8g5LuALCAjMjg3CisgICAgMHg0RUNCLCAvLyDku4ssICM0NzgKKyAgICAweDRFQ0UsIC8vIOS7jiwgIzM4MQorICAgIDB4NEVENiwgLy8g5LuWLCAjMTI5CisgICAgMHg0RUUzLCAvLyDku6MsICMyNDEKKyAgICAweDRFRTUsIC8vIOS7pSwgIzUxCisgICAgMHg0RUVDLCAvLyDku6wsICM4MworICAgIDB4NEVGNiwgLy8g5Lu2LCAjMTQxCisgICAgMHg0RUY3LCAvLyDku7csICMxNDAKKyAgICAweDRFRkIsIC8vIOS7uywgIzM4MworICAgIDB4NEYwMSwgLy8g5LyBLCAjNDM5CisgICAgMHg0RjE4LCAvLyDkvJgsICMzNzQKKyAgICAweDRGMUEsIC8vIOS8miwgIzI5CisgICAgMHg0RjIwLCAvLyDkvKAsICMyMjIKKyAgICAweDRGNDYsIC8vIOS9hiwgIzQ1MQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMjA4CisgICAgMHg0RjUzLCAvLyDkvZMsICM5OAorICAgIDB4NEY1NSwgLy8g5L2VLCAjMzM5CisgICAgMHg0RjVDLCAvLyDkvZwsICM0NAorICAgIDB4NEY2MCwgLy8g5L2gLCAjNzYKKyAgICAweDRGN0YsIC8vIOS9vywgIzI3MgorICAgIDB4NEY5QiwgLy8g5L6bLCAjMzc1CisgICAgMHg0RkRELCAvLyDkv50sICMxODAKKyAgICAweDRGRTEsIC8vIOS/oSwgIzg0CisgICAgMHg0RkVFLCAvLyDkv64sICM0MzcKKyAgICAweDUwM0MsIC8vIOWAvCwgIzQ1MAorICAgIDB4NTA1QSwgLy8g5YGaLCAjMzY4CisgICAgMHg1MDY1LCAvLyDlgaUsICM0ODQKKyAgICAweDUwQ0YsIC8vIOWDjywgIzQ4NworICAgIDB4NTEzRiwgLy8g5YS/LCAjMzI2CisgICAgMHg1MTQzLCAvLyDlhYMsICMyMDIKKyAgICAweDUxNDgsIC8vIOWFiCwgIzQ4NQorICAgIDB4NTE0OSwgLy8g5YWJLCAjMjU0CisgICAgMHg1MTRCLCAvLyDlhYssICM1MDMKKyAgICAweDUxNEQsIC8vIOWFjSwgIzM0OQorICAgIDB4NTE2NSwgLy8g5YWlLCAjMTU2CisgICAgMHg1MTY4LCAvLyDlhagsICM0NworICAgIDB4NTE2QywgLy8g5YWsLCAjMzUKKyAgICAweDUxNzEsIC8vIOWFsSwgIzQ0OAorICAgIDB4NTE3MywgLy8g5YWzLCAjNDkKKyAgICAweDUxNzYsIC8vIOWFtiwgIzE5NQorICAgIDB4NTE3NywgLy8g5YW3LCAjMzI5CisgICAgMHg1MTg1LCAvLyDlhoUsICMxMDkKKyAgICAweDUxOEMsIC8vIOWGjCwgIzIyNQorICAgIDB4NTE5QiwgLy8g5YabLCAjNDY2CisgICAgMHg1MUZBLCAvLyDlh7osICM1MworICAgIDB4NTFGQiwgLy8g5Ye7LCAjMzU5CisgICAgMHg1MjA2LCAvLyDliIYsICMyMgorICAgIDB4NTIxNywgLy8g5YiXLCAjNDEwCisgICAgMHg1MjFCLCAvLyDliJssICMzOTkKKyAgICAweDUyMjksIC8vIOWIqSwgIzI5NgorICAgIDB4NTIyQiwgLy8g5YirLCAjMzcyCisgICAgMHg1MjMwLCAvLyDliLAsICMzMworICAgIDB4NTIzNiwgLy8g5Yi2LCAjMTkyCisgICAgMHg1MjRELCAvLyDliY0sICMxMTcKKyAgICAweDUyOUIsIC8vIOWKmywgIzE3MworICAgIDB4NTI5RSwgLy8g5YqeLCAjNDM2CisgICAgMHg1MjlGLCAvLyDlip8sICM0NTUKKyAgICAweDUyQTAsIC8vIOWKoCwgIzk3CisgICAgMHg1MkExLCAvLyDliqEsICMxMDAKKyAgICAweDUyQTgsIC8vIOWKqCwgIzQ2CisgICAgMHg1MkE5LCAvLyDliqksICMzNjUKKyAgICAweDUzMDUsIC8vIOWMhSwgIzMzMQorICAgIDB4NTMxNiwgLy8g5YyWLCAjMTU1CisgICAgMHg1MzE3LCAvLyDljJcsICMxOTQKKyAgICAweDUzM0EsIC8vIOWMuiwgIzEwNQorICAgIDB4NTMzQiwgLy8g5Yy7LCAjMjM0CisgICAgMHg1MzQxLCAvLyDljYEsICMyOTQKKyAgICAweDUzNEUsIC8vIOWNjiwgIzIwNQorICAgIDB4NTM1NSwgLy8g5Y2VLCAjMjU5CisgICAgMHg1MzU3LCAvLyDljZcsICMxODIKKyAgICAweDUzNUEsIC8vIOWNmiwgIzE1MworICAgIDB4NTM2MSwgLy8g5Y2hLCAjMzMyCisgICAgMHg1MzlGLCAvLyDljp8sICMyNzEKKyAgICAweDUzQkIsIC8vIOWOuywgIzI4MgorICAgIDB4NTNDMiwgLy8g5Y+CLCAjNTAwCisgICAgMHg1M0NBLCAvLyDlj4osICMyNTUKKyAgICAweDUzQ0IsIC8vIOWPiywgIzE4NgorICAgIDB4NTNDRCwgLy8g5Y+NLCAjNDIyCisgICAgMHg1M0QxLCAvLyDlj5EsICMxNQorICAgIDB4NTNENywgLy8g5Y+XLCAjNTA3CisgICAgMHg1M0Q4LCAvLyDlj5gsICMzOTUKKyAgICAweDUzRTMsIC8vIOWPoywgIzI5MworICAgIDB4NTNFQSwgLy8g5Y+qLCAjMzQwCisgICAgMHg1M0VGLCAvLyDlj68sICM0NQorICAgIDB4NTNGMCwgLy8g5Y+wLCAjMjY3CisgICAgMHg1M0Y3LCAvLyDlj7csICMxMjEKKyAgICAweDUzRjgsIC8vIOWPuCwgIzE1MAorICAgIDB4NTQwNCwgLy8g5ZCELCAjNDkxCisgICAgMHg1NDA4LCAvLyDlkIgsICMxMTUKKyAgICAweDU0MEMsIC8vIOWQjCwgIzE4OQorICAgIDB4NTQwRCwgLy8g5ZCNLCAjMTI3CisgICAgMHg1NDBFLCAvLyDlkI4sICM3NQorICAgIDB4NTQxMSwgLy8g5ZCRLCAjNDU5CisgICAgMHg1NDI3LCAvLyDlkKcsICMzNTMKKyAgICAweDU0NEEsIC8vIOWRiiwgIzMxOAorICAgIDB4NTQ1OCwgLy8g5ZGYLCAjMjMyCisgICAgMHg1NDY4LCAvLyDlkagsICMzNDcKKyAgICAweDU0OEMsIC8vIOWSjCwgIzQzCisgICAgMHg1NEMxLCAvLyDlk4EsICMzNgorICAgIDB4NTU0NiwgLy8g5ZWGLCAjMTQ4CisgICAgMHg1NjY4LCAvLyDlmagsICMyMjgKKyAgICAweDU2REIsIC8vIOWbmywgIzM1MgorICAgIDB4NTZERSwgLy8g5ZueLCAjMzgKKyAgICAweDU2RTAsIC8vIOWboCwgIzM1NQorICAgIDB4NTZFMiwgLy8g5ZuiLCAjNDEyCisgICAgMHg1NkVELCAvLyDlm60sICM0NzAKKyAgICAweDU2RkQsIC8vIOWbvSwgIzEyCisgICAgMHg1NkZFLCAvLyDlm74sICMzMgorICAgIDB4NTcyOCwgLy8g5ZyoLCAjMTAKKyAgICAweDU3MzAsIC8vIOWcsCwgIzMwCisgICAgMHg1NzNBLCAvLyDlnLosICMxNzcKKyAgICAweDU3NUIsIC8vIOWdmywgIzM2NAorICAgIDB4NTc4QiwgLy8g5Z6LLCAjMjc0CisgICAgMHg1N0NFLCAvLyDln44sICMxNzIKKyAgICAweDU3RkEsIC8vIOWfuiwgIzMxNQorICAgIDB4NThFQiwgLy8g5aOrLCAjNDM0CisgICAgMHg1OEYwLCAvLyDlo7AsICMzOTcKKyAgICAweDU5MDQsIC8vIOWkhCwgIzQxNgorICAgIDB4NTkwNywgLy8g5aSHLCAjMjcwCisgICAgMHg1OTBELCAvLyDlpI0sICMxMjIKKyAgICAweDU5MTYsIC8vIOWkliwgIzE5MAorICAgIDB4NTkxQSwgLy8g5aSaLCAjNDAKKyAgICAweDU5MjcsIC8vIOWkpywgIzgKKyAgICAweDU5MjksIC8vIOWkqSwgIzUyCisgICAgMHg1OTJBLCAvLyDlpKosICM0NTYKKyAgICAweDU5MzQsIC8vIOWktCwgIzI1OAorICAgIDB4NTk3MywgLy8g5aWzLCAjNjUKKyAgICAweDU5N0QsIC8vIOWlvSwgIzYyCisgICAgMHg1OTgyLCAvLyDlpoIsICMxMzUKKyAgICAweDVBMzEsIC8vIOWosSwgIzQ1MgorICAgIDB4NUI1MCwgLy8g5a2QLCAjMzcKKyAgICAweDVCNTcsIC8vIOWtlywgIzI4NQorICAgIDB4NUI2NiwgLy8g5a2mLCAjMTkKKyAgICAweDVCODksIC8vIOWuiSwgIzE0NAorICAgIDB4NUI4QywgLy8g5a6MLCAjNDY5CisgICAgMHg1QjlBLCAvLyDlrposICMxNzkKKyAgICAweDVCOUQsIC8vIOWunSwgIzE4OAorICAgIDB4NUI5RSwgLy8g5a6eLCAjMTU0CisgICAgMHg1QkEyLCAvLyDlrqIsICMxNzQKKyAgICAweDVCQjYsIC8vIOWutiwgIzI2CisgICAgMHg1QkI5LCAvLyDlrrksICMzMDcKKyAgICAweDVCQzYsIC8vIOWvhiwgIzQ3MQorICAgIDB4NUJGOSwgLy8g5a+5LCAjOTAKKyAgICAweDVCRkMsIC8vIOWvvCwgIzM0OAorICAgIDB4NUMwNiwgLy8g5bCGLCAjMjY1CisgICAgMHg1QzBGLCAvLyDlsI8sICMyOAorICAgIDB4NUMxMSwgLy8g5bCRLCAjMzc5CisgICAgMHg1QzE0LCAvLyDlsJQsICM0OTAKKyAgICAweDVDMzEsIC8vIOWwsSwgIzEwMQorICAgIDB4NUM1NSwgLy8g5bGVLCAjMjkxCisgICAgMHg1QzcxLCAvLyDlsbEsICMyMzkKKyAgICAweDVEREUsIC8vIOW3niwgIzIyNworICAgIDB4NURFNSwgLy8g5belLCAjNzMKKyAgICAweDVERjEsIC8vIOW3sSwgIzQ4MAorICAgIDB4NURGMiwgLy8g5beyLCAjMzEwCisgICAgMHg1RTAyLCAvLyDluIIsICM3OAorICAgIDB4NUUwMywgLy8g5biDLCAjMzUwCisgICAgMHg1RTA4LCAvLyDluIgsICMyNzcKKyAgICAweDVFMTYsIC8vIOW4liwgIzM5NgorICAgIDB4NUUyNiwgLy8g5bimLCAjNDQ5CisgICAgMHg1RTJFLCAvLyDluK4sICM0NjEKKyAgICAweDVFMzgsIC8vIOW4uCwgIzMxOQorICAgIDB4NUU3MywgLy8g5bmzLCAjMjE3CisgICAgMHg1RTc0LCAvLyDlubQsICMyMAorICAgIDB4NUU3NiwgLy8g5bm2LCAjNDQwCisgICAgMHg1RTdGLCAvLyDlub8sICMxNjYKKyAgICAweDVFOTMsIC8vIOW6kywgIzQ0NgorICAgIDB4NUU5NCwgLy8g5bqULCAjMTg3CisgICAgMHg1RTk3LCAvLyDlupcsICMzMjAKKyAgICAweDVFQTYsIC8vIOW6piwgIzExNAorICAgIDB4NUVCNywgLy8g5bq3LCAjNDk5CisgICAgMHg1RUZBLCAvLyDlu7osICMyMTEKKyAgICAweDVGMDAsIC8vIOW8gCwgIzcyCisgICAgMHg1RjBGLCAvLyDlvI8sICMyMDcKKyAgICAweDVGMTUsIC8vIOW8lSwgIzQ5NQorICAgIDB4NUYyMCwgLy8g5bygLCAjMzg1CisgICAgMHg1RjNBLCAvLyDlvLosICM0MDQKKyAgICAweDVGNTMsIC8vIOW9kywgIzIzMworICAgIDB4NUY1NSwgLy8g5b2VLCAjMTQ2CisgICAgMHg1RjYyLCAvLyDlvaIsICM0OTQKKyAgICAweDVGNjksIC8vIOW9qSwgIzM1NgorICAgIDB4NUY3MSwgLy8g5b2xLCAjMjE0CisgICAgMHg1Rjg4LCAvLyDlvogsICMzMDAKKyAgICAweDVGOTcsIC8vIOW+lywgIzE5MworICAgIDB4NUZBRSwgLy8g5b6uLCAjMjQ1CisgICAgMHg1RkMzLCAvLyDlv4MsICM3MAorICAgIDB4NUZFQiwgLy8g5b+rLCAjMzI0CisgICAgMHg2MDAxLCAvLyDmgIEsICM1MDgKKyAgICAweDYwMEUsIC8vIOaAjiwgIzM3MAorICAgIDB4NjAyNywgLy8g5oCnLCAjOTkKKyAgICAweDYwM0IsIC8vIOaAuywgIzM5OAorICAgIDB4NjA2RiwgLy8g5oGvLCAjMTc2CisgICAgMHg2MEE4LCAvLyDmgqgsICMyNTEKKyAgICAweDYwQzUsIC8vIOaDhSwgIzg3CisgICAgMHg2MEYzLCAvLyDmg7MsICMyOTAKKyAgICAweDYxMEYsIC8vIOaEjywgIzE4NAorICAgIDB4NjExRiwgLy8g5oSfLCAjMjUzCisgICAgMHg2MjBGLCAvLyDmiI8sICMyMzcKKyAgICAweDYyMTAsIC8vIOaIkCwgIzcxCisgICAgMHg2MjExLCAvLyDmiJEsICMxMQorICAgIDB4NjIxNiwgLy8g5oiWLCAjMzIxCisgICAgMHg2MjE4LCAvLyDmiJgsICMzNjkKKyAgICAweDYyMzcsIC8vIOaItywgIzIxNQorICAgIDB4NjIzRiwgLy8g5oi/LCAjMjM2CisgICAgMHg2MjQwLCAvLyDmiYAsICMxNDcKKyAgICAweDYyNEIsIC8vIOaJiywgIzU1CisgICAgMHg2MjRELCAvLyDmiY0sICM0MDcKKyAgICAweDYyNTMsIC8vIOaJkywgIzI4MQorICAgIDB4NjI4MCwgLy8g5oqALCAjMjAzCisgICAgMHg2Mjk1LCAvLyDmipUsICM0MDgKKyAgICAweDYyQTQsIC8vIOaKpCwgIzUwMgorICAgIDB4NjJBNSwgLy8g5oqlLCAjMTEzCisgICAgMHg2MkRCLCAvLyDmi5ssICMzNjMKKyAgICAweDYzMDEsIC8vIOaMgSwgIzQwMworICAgIDB4NjMwNywgLy8g5oyHLCAjNDE0CisgICAgMHg2MzZFLCAvLyDmja4sICM0MDkKKyAgICAweDYzOTIsIC8vIOaOkiwgIzM3NworICAgIDB4NjNBNSwgLy8g5o6lLCAjMjY2CisgICAgMHg2M0E4LCAvLyDmjqgsICMyNDQKKyAgICAweDYzRDAsIC8vIOaPkCwgIzE4MQorICAgIDB4NjQxQywgLy8g5pCcLCAjMzAxCisgICAgMHg2NEFELCAvLyDmkq0sICM0MDEKKyAgICAweDY1MkYsIC8vIOaUrywgIzQwMAorICAgIDB4NjUzNiwgLy8g5pS2LCAjMTU4CisgICAgMHg2NTNFLCAvLyDmlL4sICMzMTcKKyAgICAweDY1M0YsIC8vIOaUvywgIzM4MAorICAgIDB4NjU0OCwgLy8g5pWILCAjNDk2CisgICAgMHg2NTU5LCAvLyDmlZksICMxNzAKKyAgICAweDY1NzAsIC8vIOaVsCwgIzEzNgorICAgIDB4NjU4NywgLy8g5paHLCAjMjEKKyAgICAweDY1OTksIC8vIOaWmSwgIzI5NQorICAgIDB4NjVBRiwgLy8g5pavLCAjNDczCisgICAgMHg2NUIwLCAvLyDmlrAsICMxNAorICAgIDB4NjVCOSwgLy8g5pa5LCAjNjgKKyAgICAweDY1QzUsIC8vIOaXhSwgIzQ1NworICAgIDB4NjVFMCwgLy8g5pegLCAjMTY0CisgICAgMHg2NUU1LCAvLyDml6UsICM1MAorICAgIDB4NjVGNiwgLy8g5pe2LCAjMTgKKyAgICAweDY2MEUsIC8vIOaYjiwgIzEzMgorICAgIDB4NjYxMywgLy8g5piTLCAjNDI4CisgICAgMHg2NjFGLCAvLyDmmJ8sICMyNDAKKyAgICAweDY2MkYsIC8vIOaYrywgIzYKKyAgICAweDY2M0UsIC8vIOaYviwgIzQ4NgorICAgIDB4NjZGNCwgLy8g5pu0LCAjMTAzCisgICAgMHg2NzAwLCAvLyDmnIAsICM2MQorICAgIDB4NjcwOCwgLy8g5pyILCAjODAKKyAgICAweDY3MDksIC8vIOaciSwgIzUKKyAgICAweDY3MEQsIC8vIOacjSwgIzk0CisgICAgMHg2NzFGLCAvLyDmnJ8sICMxMzkKKyAgICAweDY3MkMsIC8vIOacrCwgIzU2CisgICAgMHg2NzJGLCAvLyDmnK8sICMyMTYKKyAgICAweDY3M0EsIC8vIOacuiwgIzI3CisgICAgMHg2NzQzLCAvLyDmnYMsICMyNTAKKyAgICAweDY3NjEsIC8vIOadoSwgIzMwOQorICAgIDB4Njc2NSwgLy8g5p2lLCAjNDIKKyAgICAweDY3N0YsIC8vIOadvywgIzUwNQorICAgIDB4Njc5NywgLy8g5p6XLCAjNDc1CisgICAgMHg2NzlDLCAvLyDmnpwsICMyMTIKKyAgICAweDY3RTUsIC8vIOafpSwgIzE2NQorICAgIDB4NjgwNywgLy8g5qCHLCAjMjY5CisgICAgMHg2ODIxLCAvLyDmoKEsICM0NjIKKyAgICAweDY4MzcsIC8vIOagtywgIzMxNAorICAgIDB4NjgzQywgLy8g5qC8LCAjMjM4CisgICAgMHg2ODQ4LCAvLyDmoYgsICMzNzgKKyAgICAweDY5N0MsIC8vIOalvCwgIzM0MgorICAgIDB4NkEyMSwgLy8g5qihLCAjNDEzCisgICAgMHg2QjIxLCAvLyDmrKEsICMyNjMKKyAgICAweDZCMjIsIC8vIOasoiwgIzQ0MworICAgIDB4NkIzRSwgLy8g5qy+LCAjMzU4CisgICAgMHg2QjYzLCAvLyDmraMsICMyMTkKKyAgICAweDZCNjQsIC8vIOatpCwgIzM2MgorICAgIDB4NkJENCwgLy8g5q+ULCAjMjk4CisgICAgMHg2QzExLCAvLyDmsJEsICMyNzkKKyAgICAweDZDMTQsIC8vIOawlCwgIzMwMworICAgIDB4NkMzNCwgLy8g5rC0LCAjMTYzCisgICAgMHg2QzQyLCAvLyDmsYIsICMzNzMKKyAgICAweDZDNUYsIC8vIOaxnywgIzMzNgorICAgIDB4NkNBMSwgLy8g5rKhLCAjMjI5CisgICAgMHg2Q0JCLCAvLyDmsrssICM0MjUKKyAgICAweDZDRDUsIC8vIOazlSwgIzg1CisgICAgMHg2Q0U4LCAvLyDms6gsICMxMTkKKyAgICAweDZEM0IsIC8vIOa0uywgIzIzMQorICAgIDB4NkQ0MSwgLy8g5rWBLCAjMjgwCisgICAgMHg2RDRCLCAvLyDmtYssICM0NjAKKyAgICAweDZENzcsIC8vIOa1tywgIzEyNAorICAgIDB4NkQ4OCwgLy8g5raILCAjNDE1CisgICAgMHg2REYxLCAvLyDmt7EsICM0NzcKKyAgICAweDZFMDUsIC8vIOa4hSwgIzMxMQorICAgIDB4NkUzOCwgLy8g5ri4LCAjODEKKyAgICAweDZFOTAsIC8vIOa6kCwgIzMyNQorICAgIDB4NzA2QiwgLy8g54GrLCAjNDk4CisgICAgMHg3MEI5LCAvLyDngrksICM1OAorICAgIDB4NzBFRCwgLy8g54OtLCAjMTgzCisgICAgMHg3MTM2LCAvLyDnhLYsICMzMDgKKyAgICAweDcxNjcsIC8vIOeFpywgIzQzMQorICAgIDB4NzIzMSwgLy8g54ixLCAjMjIzCisgICAgMHg3MjQ3LCAvLyDniYcsICMxMjgKKyAgICAweDcyNDgsIC8vIOeJiCwgIzkxCisgICAgMHg3MjRDLCAvLyDniYwsICM0MjkKKyAgICAweDcyNjksIC8vIOeJqSwgIzE2OQorICAgIDB4NzI3OSwgLy8g54m5LCAjMjI0CisgICAgMHg3MzhCLCAvLyDnjossICMzNTEKKyAgICAweDczQTksIC8vIOeOqSwgIzQ3NgorICAgIDB4NzNCMCwgLy8g546wLCAjMTI1CisgICAgMHg3NDAzLCAvLyDnkIMsICMzNjcKKyAgICAweDc0MDYsIC8vIOeQhiwgIzY5CisgICAgMHg3NTFGLCAvLyDnlJ8sICMyNAorICAgIDB4NzUyOCwgLy8g55SoLCAjMTcKKyAgICAweDc1MzEsIC8vIOeUsSwgIzQ0MQorICAgIDB4NzUzNSwgLy8g55S1LCAjMzQKKyAgICAweDc1MzcsIC8vIOeUtywgIzI3NQorICAgIDB4NzU0QywgLy8g55WMLCAjNDE5CisgICAgMHg3NUM1LCAvLyDnl4UsICMzNzEKKyAgICAweDc2N0IsIC8vIOeZuywgIzIwNAorICAgIDB4NzY3RCwgLy8g55m9LCAjMzM4CisgICAgMHg3NjdFLCAvLyDnmb4sICMxNTcKKyAgICAweDc2ODQsIC8vIOeahCwgIzEKKyAgICAweDc2RDgsIC8vIOebmCwgIzQ5MworICAgIDB4NzZFRSwgLy8g55uuLCAjMjYxCisgICAgMHg3NkY0LCAvLyDnm7QsICMzOTEKKyAgICAweDc2RjgsIC8vIOebuCwgIzE0MworICAgIDB4NzcwMSwgLy8g55yBLCAjNDY0CisgICAgMHg3NzBCLCAvLyDnnIssICM1NAorICAgIDB4NzcxRiwgLy8g55yfLCAjMjQ5CisgICAgMHg3NzQwLCAvLyDnnYAsICMzMDIKKyAgICAweDc3RTUsIC8vIOefpSwgIzE0MgorICAgIDB4NzgwMSwgLy8g56CBLCAjMjU3CisgICAgMHg3ODE0LCAvLyDnoJQsICMzODcKKyAgICAweDc5M0EsIC8vIOekuiwgIzMzNAorICAgIDB4NzkzRSwgLy8g56S+LCAjMzQzCisgICAgMHg3OTVFLCAvLyDnpZ4sICMzMzAKKyAgICAweDc5OEYsIC8vIOemjywgIzUwOQorICAgIDB4NzlCQiwgLy8g56a7LCAjNDU0CisgICAgMHg3OUNELCAvLyDnp40sICMyNzgKKyAgICAweDc5RDEsIC8vIOenkSwgIzEyNgorICAgIDB4NzlFRiwgLy8g56evLCAjMzkwCisgICAgMHg3QTBCLCAvLyDnqIssICMyMDkKKyAgICAweDdBNzYsIC8vIOeptiwgIzUwNAorICAgIDB4N0E3QSwgLy8g56m6LCAjMzEyCisgICAgMHg3QUNCLCAvLyDnq4ssICMzOTMKKyAgICAweDdBRDksIC8vIOermSwgIzEwNworICAgIDB4N0FFMCwgLy8g56ugLCAjMzA0CisgICAgMHg3QjJDLCAvLyDnrKwsICM5NgorICAgIDB4N0I0OSwgLy8g562JLCAjMjEwCisgICAgMHg3QjU0LCAvLyDnrZQsICMyNTYKKyAgICAweDdCODAsIC8vIOeugCwgIzQ3NAorICAgIDB4N0JBMSwgLy8g566hLCAjMjIxCisgICAgMHg3QzdCLCAvLyDnsbssICMyNDYKKyAgICAweDdDQkUsIC8vIOeyviwgIzIyNgorICAgIDB4N0NGQiwgLy8g57O7LCAjODkKKyAgICAweDdEMjIsIC8vIOe0oiwgIzM1NAorICAgIDB4N0VBMiwgLy8g57qiLCAjNDE3CisgICAgMHg3RUE3LCAvLyDnuqcsICMxNzgKKyAgICAweDdFQkYsIC8vIOe6vywgIzEwOAorICAgIDB4N0VDNCwgLy8g57uELCAjMzg5CisgICAgMHg3RUM2LCAvLyDnu4YsICM0NDIKKyAgICAweDdFQ0YsIC8vIOe7jywgIzc0CisgICAgMHg3RUQzLCAvLyDnu5MsICMzMzMKKyAgICAweDdFRDksIC8vIOe7mSwgIzM4NAorICAgIDB4N0VEQywgLy8g57ucLCAjNDcyCisgICAgMHg3RURGLCAvLyDnu58sICMzNDQKKyAgICAweDdGMTYsIC8vIOe8liwgIzQyNAorICAgIDB4N0Y1MSwgLy8g572RLCAjOQorICAgIDB4N0Y2RSwgLy8g572uLCAjNDExCisgICAgMHg3RjhFLCAvLyDnvo4sICM2MAorICAgIDB4ODAwMSwgLy8g6ICBLCAjMjkyCisgICAgMHg4MDAzLCAvLyDogIMsICMyODgKKyAgICAweDgwMDUsIC8vIOiAhSwgIzEwNgorICAgIDB4ODAwQywgLy8g6ICMLCAjMjk3CisgICAgMHg4MDU0LCAvLyDogZQsICMxNTkKKyAgICAweDgwQjIsIC8vIOiCsiwgIzMyNworICAgIDB4ODBGRCwgLy8g6IO9LCAjNTkKKyAgICAweDgxRUEsIC8vIOiHqiwgIzc3CisgICAgMHg4MjcyLCAvLyDoibIsICMxOTgKKyAgICAweDgyODIsIC8vIOiKgiwgIzM2MQorICAgIDB4ODJCMSwgLy8g6IqxLCAjMjk5CisgICAgMHg4MkYxLCAvLyDoi7EsICMzMTYKKyAgICAweDgzNTAsIC8vIOiNkCwgIzQwMgorICAgIDB4ODM2RiwgLy8g6I2vLCAjNDgxCisgICAgMHg4NDI1LCAvLyDokKUsICMzOTQKKyAgICAweDg1Q0YsIC8vIOiXjywgIzMzNworICAgIDB4ODg0QywgLy8g6KGMLCAjNDEKKyAgICAweDg4NjgsIC8vIOihqCwgIzEwNAorICAgIDB4ODhBQiwgLy8g6KKrLCAjMjg5CisgICAgMHg4OEM1LCAvLyDoo4UsICMxNjEKKyAgICAweDg5N0YsIC8vIOilvywgIzE5OQorICAgIDB4ODk4MSwgLy8g6KaBLCAjNDgKKyAgICAweDg5QzEsIC8vIOingSwgIzM2MAorICAgIDB4ODlDMiwgLy8g6KeCLCAjNDIzCisgICAgMHg4OUM0LCAvLyDop4QsICM0NTMKKyAgICAweDg5QzYsIC8vIOinhiwgIzEyMAorICAgIDB4ODlFMywgLy8g6KejLCAjMjY0CisgICAgMHg4QTAwLCAvLyDoqIAsICM0MzMKKyAgICAweDhCQTEsIC8vIOiuoSwgIzE5MQorICAgIDB4OEJBNCwgLy8g6K6kLCAjNDgyCisgICAgMHg4QkE5LCAvLyDorqksICM0MjEKKyAgICAweDhCQUUsIC8vIOiuriwgIzQyNworICAgIDB4OEJBRiwgLy8g6K6vLCAjMzg4CisgICAgMHg4QkIwLCAvLyDorrAsICMyNzMKKyAgICAweDhCQkEsIC8vIOiuuiwgIzY2CisgICAgMHg4QkJFLCAvLyDorr4sICMxNjIKKyAgICAweDhCQzEsIC8vIOivgSwgIzIwMQorICAgIDB4OEJDNCwgLy8g6K+ELCAjMTExCisgICAgMHg4QkM2LCAvLyDor4YsICM0NjMKKyAgICAweDhCRDUsIC8vIOivlSwgIzMyMworICAgIDB4OEJERCwgLy8g6K+dLCAjMjQ3CisgICAgMHg4QkUyLCAvLyDor6IsICM0MzIKKyAgICAweDhCRTUsIC8vIOivpSwgIzQ0NworICAgIDB4OEJFNiwgLy8g6K+mLCAjNDk3CisgICAgMHg4QkVELCAvLyDor60sICMyNjgKKyAgICAweDhCRjQsIC8vIOivtCwgIzExMgorICAgIDB4OEJGNywgLy8g6K+3LCAjMjEzCisgICAgMHg4QkZCLCAvLyDor7ssICMzNDEKKyAgICAweDhDMDMsIC8vIOiwgywgIzQzOAorICAgIDB4OEQyMiwgLy8g6LSiLCAjNDg4CisgICAgMHg4RDI4LCAvLyDotKgsICMzODYKKyAgICAweDhEMkQsIC8vIOi0rSwgIzI2MAorICAgIDB4OEQzNCwgLy8g6LS0LCAjNTEwCisgICAgMHg4RDM5LCAvLyDotLksICMyNDIKKyAgICAweDhENDQsIC8vIOi1hCwgIzExNgorICAgIDB4OEQ3NywgLy8g6LW3LCAjMjIwCisgICAgMHg4RDg1LCAvLyDotoUsICM0MDYKKyAgICAweDhERUYsIC8vIOi3rywgIzIzNQorICAgIDB4OEVBQiwgLy8g6LqrLCAjMjYyCisgICAgMHg4RjY2LCAvLyDovaYsICM4MgorICAgIDB4OEY2QywgLy8g6L2sLCAjMzIyCisgICAgMHg4RjdELCAvLyDovb0sICMxNzUKKyAgICAweDhGQkUsIC8vIOi+viwgIzQzNQorICAgIDB4OEZDNywgLy8g6L+HLCAjMTE4CisgICAgMHg4RkQwLCAvLyDov5AsICMzNTcKKyAgICAweDhGRDEsIC8vIOi/kSwgIzQ5MgorICAgIDB4OEZEOCwgLy8g6L+YLCAjMTcxCisgICAgMHg4RkQ5LCAvLyDov5ksICM1NworICAgIDB4OEZEQiwgLy8g6L+bLCAjMTYwCisgICAgMHg4RkRFLCAvLyDov54sICM0ODkKKyAgICAweDkwMDksIC8vIOmAiSwgIzMyOAorICAgIDB4OTAxQSwgLy8g6YCaLCAjMTM3CisgICAgMHg5MDFGLCAvLyDpgJ8sICM0NTgKKyAgICAweDkwMjAsIC8vIOmAoCwgIzUxMQorICAgIDB4OTA1MywgLy8g6YGTLCAjNzkKKyAgICAweDkwQTMsIC8vIOmCoywgIzMwNQorICAgIDB4OTBFOCwgLy8g6YOoLCAjMTAyCisgICAgMHg5MEZELCAvLyDpg70sICMxNjcKKyAgICAweDkxNEQsIC8vIOmFjSwgIzQ3OQorICAgIDB4OTE1MiwgLy8g6YWSLCAjNDQ0CisgICAgMHg5MUNDLCAvLyDph4wsICMxOTYKKyAgICAweDkxQ0QsIC8vIOmHjSwgIzIzMAorICAgIDB4OTFDRiwgLy8g6YePLCAjMjQ4CisgICAgMHg5MUQxLCAvLyDph5EsICMxMzQKKyAgICAweDk1MDAsIC8vIOmUgCwgIzQ2NQorICAgIDB4OTU3RiwgLy8g6ZW/LCAjMTUyCisgICAgMHg5NUU4LCAvLyDpl6gsICMxODUKKyAgICAweDk1RUUsIC8vIOmXriwgIzkyCisgICAgMHg5NUY0LCAvLyDpl7QsICM4OAorICAgIDB4OTVGQiwgLy8g6Ze7LCAjMzEzCisgICAgMHg5NjA1LCAvLyDpmIUsICM0NjcKKyAgICAweDk2MzMsIC8vIOmYsywgIzQyMAorICAgIDB4OTY0NSwgLy8g6ZmFLCAjNTAxCisgICAgMHg5NjUwLCAvLyDpmZAsICMyODYKKyAgICAweDk2NjIsIC8vIOmZoiwgIzI3NgorICAgIDB4OTZDNiwgLy8g6ZuGLCAjMjg0CisgICAgMHg5NzAwLCAvLyDpnIAsICM0MDUKKyAgICAweDk3NjIsIC8vIOmdoiwgIzEyMworICAgIDB4OTdGMywgLy8g6Z+zLCAjMzM1CisgICAgMHg5ODc1LCAvLyDpobUsICM2MworICAgIDB4OTg3OSwgLy8g6aG5LCAjNTA2CisgICAgMHg5ODkxLCAvLyDpopEsICMyMDAKKyAgICAweDk4OTgsIC8vIOmimCwgIzExMAorICAgIDB4OThDRSwgLy8g6aOOLCAjMjUyCisgICAgMHg5OERGLCAvLyDpo58sICM0NDUKKyAgICAweDk5OTYsIC8vIOmmliwgIzE0OQorICAgIDB4OTk5OSwgLy8g6aaZLCAjNTEyCisgICAgMHg5QTZDLCAvLyDpqawsICMzOTIKKyAgICAweDlBOEMsIC8vIOmqjCwgIzM4MgorICAgIDB4OUFEOCwgLy8g6auYLCAjNjcKKyAgICAweDlGOTksIC8vIOm+mSwgIzQyNgorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X3poQ05fY292ZXJhZ2U9MC43MTg5NTAzNjkzMzk5NzM7CisKKy8vIFRoZSA1MTIgbW9zdCBmcmVxdWVudGx5IG9jY3VyaW5nIGNoYXJhY3RlcnMgZm9yIHRoZSB6aFRXIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X3poVFdbXSA9IHsKKyAgICAweDRFMDAsIC8vIOS4gCwgIzIKKyAgICAweDRFMDksIC8vIOS4iSwgIzEzMQorICAgIDB4NEUwQSwgLy8g5LiKLCAjMTIKKyAgICAweDRFMEIsIC8vIOS4iywgIzM3CisgICAgMHg0RTBELCAvLyDkuI0sICM2CisgICAgMHg0RTE2LCAvLyDkuJYsICMzMTIKKyAgICAweDRFMjYsIC8vIOS4piwgIzQzNAorICAgIDB4NEUyRCwgLy8g5LitLCAjOQorICAgIDB4NEUzQiwgLy8g5Li7LCAjOTcKKyAgICAweDRFNEIsIC8vIOS5iywgIzU1CisgICAgMHg0RTVGLCAvLyDkuZ8sICM5NQorICAgIDB4NEU4NiwgLy8g5LqGLCAjMTkKKyAgICAweDRFOEIsIC8vIOS6iywgIzEyOAorICAgIDB4NEU4QywgLy8g5LqMLCAjMTg3CisgICAgMHg0RTk0LCAvLyDkupQsICMzMzkKKyAgICAweDRFOUIsIC8vIOS6mywgIzQzNQorICAgIDB4NEU5RSwgLy8g5LqeLCAjNDMyCisgICAgMHg0RUE0LCAvLyDkuqQsICMyNjQKKyAgICAweDRFQUIsIC8vIOS6qywgIzE2MAorICAgIDB4NEVCQSwgLy8g5Lq6LCAjMworICAgIDB4NEVDMCwgLy8g5LuALCAjNDgzCisgICAgMHg0RUNBLCAvLyDku4osICMzODAKKyAgICAweDRFQ0IsIC8vIOS7iywgIzQ2OAorICAgIDB4NEVENiwgLy8g5LuWLCAjNjUKKyAgICAweDRFRTMsIC8vIOS7oywgIzI4NAorICAgIDB4NEVFNSwgLy8g5LulLCAjMjYKKyAgICAweDRFRjYsIC8vIOS7tiwgIzIzNAorICAgIDB4NEVGQiwgLy8g5Lu7LCAjMzgxCisgICAgMHg0RUZELCAvLyDku70sICM0NDcKKyAgICAweDRGNDYsIC8vIOS9hiwgIzI4MQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMjAyCisgICAgMHg0RjRGLCAvLyDkvY8sICM0NzEKKyAgICAweDRGNTUsIC8vIOS9lSwgIzMzNAorICAgIDB4NEY1QywgLy8g5L2cLCAjNTYKKyAgICAweDRGNjAsIC8vIOS9oCwgIzY0CisgICAgMHg0RjdGLCAvLyDkvb8sICMyMzYKKyAgICAweDRGODYsIC8vIOS+hiwgIzM4CisgICAgMHg0RjlCLCAvLyDkvpssICMzOTcKKyAgICAweDRGQkYsIC8vIOS+vywgIzQ0MAorICAgIDB4NEZDMiwgLy8g5L+CLCAjNTA2CisgICAgMHg0RkRELCAvLyDkv50sICMxNjEKKyAgICAweDRGRTEsIC8vIOS/oSwgIzI2OAorICAgIDB4NEZFRSwgLy8g5L+uLCAjNDczCisgICAgMHg1MDBCLCAvLyDlgIssICMyNworICAgIDB4NTAxMSwgLy8g5YCRLCAjMTA5CisgICAgMHg1MDVBLCAvLyDlgZosICMzODMKKyAgICAweDUwNjUsIC8vIOWBpSwgIzQxNQorICAgIDB4NTA5OSwgLy8g5YKZLCAjNDYxCisgICAgMHg1MEIzLCAvLyDlgrMsICMyNzcKKyAgICAweDUwQ0YsIC8vIOWDjywgIzQwMworICAgIDB4NTBGOSwgLy8g5YO5LCAjOTMKKyAgICAweDUxMkEsIC8vIOWEqiwgIzM5NgorICAgIDB4NTE0MywgLy8g5YWDLCAjMTU4CisgICAgMHg1MTQ4LCAvLyDlhYgsICMzODIKKyAgICAweDUxNDksIC8vIOWFiSwgIzIxNgorICAgIDB4NTE0RCwgLy8g5YWNLCAjMzIxCisgICAgMHg1MTUyLCAvLyDlhZIsICMzNzQKKyAgICAweDUxNjUsIC8vIOWFpSwgIzU4CisgICAgMHg1MTY3LCAvLyDlhacsICMxMDYKKyAgICAweDUxNjgsIC8vIOWFqCwgIzY3CisgICAgMHg1MTY5LCAvLyDlhaksICMzMjIKKyAgICAweDUxNkMsIC8vIOWFrCwgIzUzCisgICAgMHg1MTZELCAvLyDlha0sICM0OTMKKyAgICAweDUxNzEsIC8vIOWFsSwgIzQ1NgorICAgIDB4NTE3NiwgLy8g5YW2LCAjMTQ4CisgICAgMHg1MTc3LCAvLyDlhbcsICMzMjgKKyAgICAweDUxOEEsIC8vIOWGiiwgIzM2MAorICAgIDB4NTE4RCwgLy8g5YaNLCAjMzExCisgICAgMHg1MUZBLCAvLyDlh7osICM0NAorICAgIDB4NTIwNiwgLy8g5YiGLCAjMTUKKyAgICAweDUyMTcsIC8vIOWIlywgIzI1OQorICAgIDB4NTIyNSwgLy8g5YilLCAjMzYxCisgICAgMHg1MjI5LCAvLyDliKksICMyNTEKKyAgICAweDUyMzAsIC8vIOWIsCwgIzI5CisgICAgMHg1MjQ3LCAvLyDliYcsICM1MTEKKyAgICAweDUyNEQsIC8vIOWJjSwgIzgyCisgICAgMHg1Mjc1LCAvLyDlibUsICM0MDkKKyAgICAweDUyOUIsIC8vIOWKmywgIzE3NgorICAgIDB4NTI5RiwgLy8g5YqfLCAjNDMwCisgICAgMHg1MkEwLCAvLyDliqAsICM4NworICAgIDB4NTJBOSwgLy8g5YqpLCAjNDY1CisgICAgMHg1MkQ1LCAvLyDli5UsICM0OAorICAgIDB4NTJEOSwgLy8g5YuZLCAjMTAyCisgICAgMHg1MzA1LCAvLyDljIUsICMyNDgKKyAgICAweDUzMTYsIC8vIOWMliwgIzIyMworICAgIDB4NTMxNywgLy8g5YyXLCAjMTQ1CisgICAgMHg1MzQwLCAvLyDljYAsICM2MAorICAgIDB4NTM0MSwgLy8g5Y2BLCAjMjQyCisgICAgMHg1MzU3LCAvLyDljZcsICMyNjEKKyAgICAweDUzNUEsIC8vIOWNmiwgIzQ4NAorICAgIDB4NTM2MSwgLy8g5Y2hLCAjMzI3CisgICAgMHg1MzcwLCAvLyDljbAsICM0OTgKKyAgICAweDUzNzMsIC8vIOWNsywgIzM1MQorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMjM3CisgICAgMHg1M0JCLCAvLyDljrssICMxOTAKKyAgICAweDUzQzMsIC8vIOWPgywgIzQ0NAorICAgIDB4NTNDOCwgLy8g5Y+ILCAjNDI2CisgICAgMHg1M0NBLCAvLyDlj4osICMxMzYKKyAgICAweDUzQ0IsIC8vIOWPiywgIzE0MgorICAgIDB4NTNENiwgLy8g5Y+WLCAjNDIyCisgICAgMHg1M0Q3LCAvLyDlj5csICM0MTAKKyAgICAweDUzRTMsIC8vIOWPoywgIzM1NworICAgIDB4NTNFQSwgLy8g5Y+qLCAjMjUwCisgICAgMHg1M0VGLCAvLyDlj68sICMzNQorICAgIDB4NTNGMCwgLy8g5Y+wLCAjMzQKKyAgICAweDUzRjgsIC8vIOWPuCwgIzIyNgorICAgIDB4NTQwMywgLy8g5ZCDLCAjMzYyCisgICAgMHg1NDA0LCAvLyDlkIQsICM0NTQKKyAgICAweDU0MDgsIC8vIOWQiCwgIzE0NworICAgIDB4NTQwQywgLy8g5ZCMLCAjMTczCisgICAgMHg1NDBELCAvLyDlkI0sICMxMDgKKyAgICAweDU0NEEsIC8vIOWRiiwgIzE4NgorICAgIDB4NTQ4QywgLy8g5ZKMLCAjMTMwCisgICAgMHg1NEMxLCAvLyDlk4EsICMyMworICAgIDB4NTRFMSwgLy8g5ZOhLCAjMTUwCisgICAgMHg1NTQ2LCAvLyDllYYsICM3NQorICAgIDB4NTU0RiwgLy8g5ZWPLCAjMTIwCisgICAgMHg1NTlDLCAvLyDllpwsICM1MDIKKyAgICAweDU1QUUsIC8vIOWWriwgIzIxMAorICAgIDB4NTVDRSwgLy8g5ZeOLCAjNDQzCisgICAgMHg1NjY4LCAvLyDlmagsICMzMDUKKyAgICAweDU2REIsIC8vIOWbmywgIzMxOAorICAgIDB4NTZERSwgLy8g5ZueLCAjNTkKKyAgICAweDU2RTAsIC8vIOWboCwgIzI1MworICAgIDB4NTcwQiwgLy8g5ZyLLCAjMjEKKyAgICAweDU3MTIsIC8vIOWckiwgIzM0NQorICAgIDB4NTcxNiwgLy8g5ZyWLCAjNzMKKyAgICAweDU3MTgsIC8vIOWcmCwgIzMzOAorICAgIDB4NTcyOCwgLy8g5ZyoLCAjMTEKKyAgICAweDU3MzAsIC8vIOWcsCwgIzUwCisgICAgMHg1NzhCLCAvLyDlnossICMyNzAKKyAgICAweDU3Q0UsIC8vIOWfjiwgIzQ2NgorICAgIDB4NTdGQSwgLy8g5Z+6LCAjMzQ5CisgICAgMHg1ODMxLCAvLyDloLEsICMxMjcKKyAgICAweDU4MzQsIC8vIOWgtCwgIzE2NQorICAgIDB4NThFQiwgLy8g5aOrLCAjMzcyCisgICAgMHg1OTE2LCAvLyDlpJYsICMxNTIKKyAgICAweDU5MUEsIC8vIOWkmiwgIzU0CisgICAgMHg1OTI3LCAvLyDlpKcsICM4CisgICAgMHg1OTI5LCAvLyDlpKksICM0MworICAgIDB4NTkyQSwgLy8g5aSqLCAjMzQzCisgICAgMHg1OTQ3LCAvLyDlpYcsICMzMjUKKyAgICAweDU5NzMsIC8vIOWlsywgIzg1CisgICAgMHg1OTc5LCAvLyDlpbksICM0MjAKKyAgICAweDU5N0QsIC8vIOWlvSwgIzIyCisgICAgMHg1OTgyLCAvLyDlpoIsICMxNDQKKyAgICAweDVCNTAsIC8vIOWtkCwgIzQ2CisgICAgMHg1QjU3LCAvLyDlrZcsICMyNzUKKyAgICAweDVCNzgsIC8vIOWtuCwgIzQ5CisgICAgMHg1Qjg5LCAvLyDlroksICMyMzkKKyAgICAweDVCOEMsIC8vIOWujCwgIzMyMAorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTU5CisgICAgMHg1QkEyLCAvLyDlrqIsICMxODgKKyAgICAweDVCQjYsIC8vIOWutiwgIzMxCisgICAgMHg1QkI5LCAvLyDlrrksICMyNDQKKyAgICAweDVCRTYsIC8vIOWvpiwgIzE5OAorICAgIDB4NUJGNiwgLy8g5a+2LCAjMzY3CisgICAgMHg1QzA3LCAvLyDlsIcsICMyMzIKKyAgICAweDVDMDgsIC8vIOWwiCwgIzEzMworICAgIDB4NUMwQiwgLy8g5bCLLCAjMzUyCisgICAgMHg1QzBELCAvLyDlsI0sICMxMjYKKyAgICAweDVDMEUsIC8vIOWwjiwgIzQxOAorICAgIDB4NUMwRiwgLy8g5bCPLCAjMjAKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM2OAorICAgIDB4NUMzMSwgLy8g5bCxLCAjNjMKKyAgICAweDVDNTUsIC8vIOWxlSwgIzM0MQorICAgIDB4NUM3MSwgLy8g5bGxLCAjMjczCisgICAgMHg1REU1LCAvLyDlt6UsICMxMjEKKyAgICAweDVERjEsIC8vIOW3sSwgIzQwMgorICAgIDB4NURGMiwgLy8g5beyLCAjMjk5CisgICAgMHg1RTAyLCAvLyDluIIsICM4MQorICAgIDB4NUUyQiwgLy8g5birLCAjMjYyCisgICAgMHg1RTM2LCAvLyDluLYsICM0NzAKKyAgICAweDVFMzgsIC8vIOW4uCwgIzMwMworICAgIDB4NUU3MywgLy8g5bmzLCAjMjk3CisgICAgMHg1RTc0LCAvLyDlubQsICMzMAorICAgIDB4NUU5NywgLy8g5bqXLCAjMTcxCisgICAgMHg1RUE2LCAvLyDluqYsICMyMjAKKyAgICAweDVFQjcsIC8vIOW6tywgIzQ0MQorICAgIDB4NUVFMywgLy8g5bujLCAjMjc5CisgICAgMHg1RUZBLCAvLyDlu7osICMyNTQKKyAgICAweDVGMEYsIC8vIOW8jywgIzE1NQorICAgIDB4NUYxNSwgLy8g5byVLCAjMzQ2CisgICAgMHg1RjM1LCAvLyDlvLUsICMzNjYKKyAgICAweDVGMzcsIC8vIOW8tywgIzQzNworICAgIDB4NUY3MSwgLy8g5b2xLCAjOTQKKyAgICAweDVGODgsIC8vIOW+iCwgIzE3NworICAgIDB4NUY4QywgLy8g5b6MLCAjNjYKKyAgICAweDVGOTcsIC8vIOW+lywgIzExMworICAgIDB4NUY5RSwgLy8g5b6eLCAjNDM2CisgICAgMHg1RkMzLCAvLyDlv4MsICM1NworICAgIDB4NUZFQiwgLy8g5b+rLCAjMjkyCisgICAgMHg2MDI3LCAvLyDmgKcsICMxNzUKKyAgICAweDYwNkYsIC8vIOaBrywgIzM3OAorICAgIDB4NjBBOCwgLy8g5oKoLCAjMjUyCisgICAgMHg2MEM1LCAvLyDmg4UsICMxMjMKKyAgICAweDYwRjMsIC8vIOaDsywgIzE3OAorICAgIDB4NjEwRiwgLy8g5oSPLCAjMTY4CisgICAgMHg2MTFCLCAvLyDmhJssICMxMjUKKyAgICAweDYxMUYsIC8vIOaEnywgIzIxMQorICAgIDB4NjFDOSwgLy8g5oeJLCAjMTY0CisgICAgMHg2MjEwLCAvLyDmiJAsICM4NgorICAgIDB4NjIxMSwgLy8g5oiRLCAjNworICAgIDB4NjIxNiwgLy8g5oiWLCAjMTk5CisgICAgMHg2MjMwLCAvLyDmiLAsICM0MzgKKyAgICAweDYyMzIsIC8vIOaIsiwgIzMwOQorICAgIDB4NjIzNiwgLy8g5oi2LCAjNDk3CisgICAgMHg2MjNGLCAvLyDmiL8sICMyNzQKKyAgICAweDYyNDAsIC8vIOaJgCwgIzc5CisgICAgMHg2MjRCLCAvLyDmiYssICM2OAorICAgIDB4NjI0RCwgLy8g5omNLCAjNDAwCisgICAgMHg2MjUzLCAvLyDmiZMsICMyNzgKKyAgICAweDYyN0UsIC8vIOaJviwgIzQ0OQorICAgIDB4NjI4MCwgLy8g5oqALCAjMzMyCisgICAgMHg2Mjk1LCAvLyDmipUsICM0MjUKKyAgICAweDYyQzksIC8vIOaLiSwgIzUwMAorICAgIDB4NjJDRCwgLy8g5ouNLCAjMzk4CisgICAgMHg2MzA3LCAvLyDmjIcsICM0MDcKKyAgICAweDYzOTIsIC8vIOaOkiwgIzQ1OAorICAgIDB4NjNBNSwgLy8g5o6lLCAjMzI2CisgICAgMHg2M0E4LCAvLyDmjqgsICMxNTMKKyAgICAweDYzRDAsIC8vIOaPkCwgIzIzNQorICAgIDB4NjQxQywgLy8g5pCcLCAjMzE0CisgICAgMHg2NDY5LCAvLyDmkaksICM0NzIKKyAgICAweDY1MzYsIC8vIOaUtiwgIzI0OQorICAgIDB4NjUzOSwgLy8g5pS5LCAjNTA4CisgICAgMHg2NTNFLCAvLyDmlL4sICMzMzEKKyAgICAweDY1M0YsIC8vIOaUvywgIzI5NQorICAgIDB4NjU1OSwgLy8g5pWZLCAjMTg0CisgICAgMHg2NTc0LCAvLyDmlbQsICMzOTQKKyAgICAweDY1NzgsIC8vIOaVuCwgIzEzNAorICAgIDB4NjU4NywgLy8g5paHLCAjMTYKKyAgICAweDY1OTksIC8vIOaWmSwgIzE2NworICAgIDB4NjVBRiwgLy8g5pavLCAjNDc2CisgICAgMHg2NUIwLCAvLyDmlrAsICMxMAorICAgIDB4NjVCOSwgLy8g5pa5LCAjOTYKKyAgICAweDY1QkMsIC8vIOaWvCwgIzcwCisgICAgMHg2NUM1LCAvLyDml4UsICMyODkKKyAgICAweDY1RTUsIC8vIOaXpSwgIzE4CisgICAgMHg2NjBFLCAvLyDmmI4sICMxMTgKKyAgICAweDY2MTMsIC8vIOaYkywgIzQ4MgorICAgIDB4NjYxRiwgLy8g5pifLCAjMjA1CisgICAgMHg2NjJGLCAvLyDmmK8sICM1CisgICAgMHg2NjQyLCAvLyDmmYIsICMxMworICAgIDB4NjZGNCwgLy8g5pu0LCAjMTQ5CisgICAgMHg2NkY4LCAvLyDmm7gsICMyMDkKKyAgICAweDY3MDAsIC8vIOacgCwgIzUxCisgICAgMHg2NzAzLCAvLyDmnIMsICMxNAorICAgIDB4NjcwOCwgLy8g5pyILCAjMjUKKyAgICAweDY3MDksIC8vIOaciSwgIzQKKyAgICAweDY3MEQsIC8vIOacjSwgIzk5CisgICAgMHg2NzFGLCAvLyDmnJ8sICMxMzkKKyAgICAweDY3MkEsIC8vIOacqiwgIzQwNAorICAgIDB4NjcyQywgLy8g5pysLCAjNDUKKyAgICAweDY3NzEsIC8vIOadsSwgIzIyMQorICAgIDB4Njc3RiwgLy8g5p2/LCAjMzY0CisgICAgMHg2Nzk3LCAvLyDmnpcsICMzMzAKKyAgICAweDY3OUMsIC8vIOaenCwgIzE3OQorICAgIDB4NjdFNSwgLy8g5p+lLCAjMjgzCisgICAgMHg2ODNDLCAvLyDmoLwsICMxNTcKKyAgICAweDY4NDgsIC8vIOahiCwgIzM5MgorICAgIDB4Njg5RCwgLy8g5qKdLCAjNDA2CisgICAgMHg2OTZELCAvLyDmpa0sICMxMDMKKyAgICAweDZBMDIsIC8vIOaogiwgIzExNgorICAgIDB4NkExMywgLy8g5qiTLCAjNDExCisgICAgMHg2QTE5LCAvLyDmqJksICMzODQKKyAgICAweDZBMjMsIC8vIOaooywgIzMwNgorICAgIDB4NkE1RiwgLy8g5qmfLCAjNDAKKyAgICAweDZBQTIsIC8vIOaqoiwgIzM1OQorICAgIDB4NkIwQSwgLy8g5qyKLCAjMjI4CisgICAgMHg2QjIxLCAvLyDmrKEsICMyMjcKKyAgICAweDZCM0UsIC8vIOasviwgIzI3NgorICAgIDB4NkI0QywgLy8g5q2MLCAjNDk2CisgICAgMHg2QjYxLCAvLyDmraEsICM0MjcKKyAgICAweDZCNjMsIC8vIOatoywgIzIwNgorICAgIDB4NkI2NCwgLy8g5q2kLCAjMjQ3CisgICAgMHg2QkNGLCAvLyDmr48sICMzOTEKKyAgICAweDZCRDQsIC8vIOavlCwgIzI1NworICAgIDB4NkMxMSwgLy8g5rCRLCAjMjMwCisgICAgMHg2QzIzLCAvLyDmsKMsICMyMDAKKyAgICAweDZDMzQsIC8vIOawtCwgIzE0MAorICAgIDB4NkM0MiwgLy8g5rGCLCAjNTAxCisgICAgMHg2QzkyLCAvLyDmspIsICMxNjIKKyAgICAweDZDRDUsIC8vIOazlSwgIzg5CisgICAgMHg2RDNCLCAvLyDmtLssICMxMjQKKyAgICAweDZENDEsIC8vIOa1gSwgIzMxNQorICAgIDB4NkQ3NywgLy8g5rW3LCAjMjU4CisgICAgMHg2RDg4LCAvLyDmtogsICMzNDIKKyAgICAweDZFMDUsIC8vIOa4hSwgIzMyOQorICAgIDB4NkUyRiwgLy8g5rivLCAjMjkzCisgICAgMHg2RjE0LCAvLyDmvJQsICM0OTEKKyAgICAweDcwNjMsIC8vIOeBoywgIzE5NQorICAgIDB4NzBCQSwgLy8g54K6LCAjMzkKKyAgICAweDcxMjEsIC8vIOeEoSwgIzEwNworICAgIDB4NzEzNiwgLy8g54S2LCAjMjE1CisgICAgMHg3MTY3LCAvLyDnhacsICMzNzYKKyAgICAweDcxQjEsIC8vIOeGsSwgIzI0NQorICAgIDB4NzI0NywgLy8g54mHLCAjOTAKKyAgICAweDcyNDgsIC8vIOeJiCwgIzExMgorICAgIDB4NzI0QywgLy8g54mMLCAjNDY3CisgICAgMHg3MjY5LCAvLyDniaksICMxMTAKKyAgICAweDcyNzksIC8vIOeJuSwgIzE4MworICAgIDB4NzM4QiwgLy8g546LLCAjMjg3CisgICAgMHg3M0E5LCAvLyDnjqksICMzNTQKKyAgICAweDczRkUsIC8vIOePviwgIzE0MworICAgIDB4NzQwMywgLy8g55CDLCAjMzUwCisgICAgMHg3NDA2LCAvLyDnkIYsICMxMDUKKyAgICAweDc1MUYsIC8vIOeUnywgIzI0CisgICAgMHg3NTIyLCAvLyDnlKIsICMyMDEKKyAgICAweDc1MjgsIC8vIOeUqCwgIzE3CisgICAgMHg3NTMxLCAvLyDnlLEsICMyODgKKyAgICAweDc1MzcsIC8vIOeUtywgIzI5OAorICAgIDB4NzU0QywgLy8g55WMLCAjMzk5CisgICAgMHg3NTU5LCAvLyDnlZksICMyMTgKKyAgICAweDc1NkIsIC8vIOeVqywgIzQxMgorICAgIDB4NzU3NiwgLy8g55W2LCAjMTg1CisgICAgMHg3NjdCLCAvLyDnmbssICMxMzgKKyAgICAweDc2N0MsIC8vIOeZvCwgIzI4CisgICAgMHg3NjdELCAvLyDnmb0sICMzNzcKKyAgICAweDc2N0UsIC8vIOeZviwgIzM5MworICAgIDB4NzY4NCwgLy8g55qELCAjMQorICAgIDB4NzZFRSwgLy8g55uuLCAjMjcxCisgICAgMHg3NkY0LCAvLyDnm7QsICMzNzkKKyAgICAweDc2RjgsIC8vIOebuCwgIzk4CisgICAgMHg3NzBCLCAvLyDnnIssICM1MgorICAgIDB4NzcxRiwgLy8g55yfLCAjMTgwCisgICAgMHg3NzNDLCAvLyDnnLwsICM0MzMKKyAgICAweDc3RTUsIC8vIOefpSwgIzE3MAorICAgIDB4NzhCQywgLy8g56K8LCAjNDgxCisgICAgMHg3OTNBLCAvLyDnpLosICMzNTMKKyAgICAweDc5M0UsIC8vIOekviwgIzMzMworICAgIDB4Nzk1RSwgLy8g56WeLCAjMzA0CisgICAgMHg3OTY4LCAvLyDnpagsICM0NzcKKyAgICAweDc5OEYsIC8vIOemjywgIzQ5NAorICAgIDB4NzlDMSwgLy8g56eBLCAjNTA3CisgICAgMHg3OUQxLCAvLyDnp5EsICMyODAKKyAgICAweDdBMEIsIC8vIOeoiywgIzI3MgorICAgIDB4N0EyRSwgLy8g56iuLCAjMzM3CisgICAgMHg3QTRELCAvLyDnqY0sICMzODUKKyAgICAweDdBN0EsIC8vIOepuiwgIzMyNAorICAgIDB4N0FDQiwgLy8g56uLLCAjMjg2CisgICAgMHg3QUQ5LCAvLyDnq5ksICMxMTcKKyAgICAweDdBRTAsIC8vIOeroCwgIzE0MQorICAgIDB4N0IyQywgLy8g56ysLCAjMTM1CisgICAgMHg3QjQ5LCAvLyDnrYksICMyNDAKKyAgICAweDdCQTEsIC8vIOeuoSwgIzM0MAorICAgIDB4N0JDMCwgLy8g56+ALCAjNDMxCisgICAgMHg3QkM3LCAvLyDnr4csICM0NzkKKyAgICAweDdDMjEsIC8vIOewoSwgIzQ5OQorICAgIDB4N0NCRSwgLy8g57K+LCAjMjEzCisgICAgMHg3Q0ZCLCAvLyDns7ssICMyMTIKKyAgICAweDdEMDQsIC8vIOe0hCwgIzQ2MgorICAgIDB4N0QwNSwgLy8g57SFLCAjNDUyCisgICAgMHg3RDFBLCAvLyDntJosICMyNjcKKyAgICAweDdEMzAsIC8vIOe0sCwgIzQ4NgorICAgIDB4N0Q0NCwgLy8g57WELCAjMzM1CisgICAgMHg3RDUwLCAvLyDntZAsICMyNDMKKyAgICAweDdENjYsIC8vIOe1piwgIzM1NQorICAgIDB4N0Q3MSwgLy8g57WxLCAjMzc1CisgICAgMHg3RDkzLCAvLyDntpMsICMxMTEKKyAgICAweDdEQjIsIC8vIOe2siwgIzMyCisgICAgMHg3RERBLCAvLyDnt5osICMxNTEKKyAgICAweDdFMjMsIC8vIOe4oywgIzQzOQorICAgIDB4N0UzRCwgLy8g57i9LCAjMzcwCisgICAgMHg3RjhFLCAvLyDnvo4sICM0MQorICAgIDB4N0ZBOSwgLy8g576pLCAjNTA0CisgICAgMHg4MDAxLCAvLyDogIEsICMyOTAKKyAgICAweDgwMDMsIC8vIOiAgywgIzQyOAorICAgIDB4ODAwNSwgLy8g6ICFLCAjOTIKKyAgICAweDgwMEMsIC8vIOiAjCwgIzIxNworICAgIDB4ODA1RSwgLy8g6IGeLCAjMTgxCisgICAgMHg4MDZGLCAvLyDoga8sICMzMTAKKyAgICAweDgwNzIsIC8vIOiBsiwgIzQxMworICAgIDB4ODBBMSwgLy8g6IKhLCAjMzkwCisgICAgMHg4MEIyLCAvLyDogrIsICM0NTMKKyAgICAweDgwRkQsIC8vIOiDvSwgIzcxCisgICAgMHg4MTY2LCAvLyDohaYsICM0MDgKKyAgICAweDgxRUEsIC8vIOiHqiwgIzYxCisgICAgMHg4MUYzLCAvLyDoh7MsICMzNDQKKyAgICAweDgyMDcsIC8vIOiIhywgIzg0CisgICAgMHg4MjA5LCAvLyDoiIksICM0NjMKKyAgICAweDgyNzIsIC8vIOiJsiwgIzE5MgorICAgIDB4ODJCMSwgLy8g6IqxLCAjMjU1CisgICAgMHg4MkYxLCAvLyDoi7EsICMzNDgKKyAgICAweDgzRUYsIC8vIOiPrywgIzE5NgorICAgIDB4ODQyQywgLy8g6JCsLCAjMzE2CisgICAgMHg4NDNELCAvLyDokL0sICMzMDgKKyAgICAweDg0NTcsIC8vIOiRlywgIzIzMworICAgIDB4ODVBNiwgLy8g6JamLCAjNDAxCisgICAgMHg4NUNGLCAvLyDol48sICM1MDMKKyAgICAweDg1REQsIC8vIOiXnSwgIzQ4OAorICAgIDB4ODY1NSwgLy8g6JmVLCAjNDE5CisgICAgMHg4NjVGLCAvLyDomZ8sICMxOTEKKyAgICAweDg4NEMsIC8vIOihjCwgIzQ3CisgICAgMHg4ODUzLCAvLyDooZMsICMzOTUKKyAgICAweDg4NjgsIC8vIOihqCwgIzc3CisgICAgMHg4OEFCLCAvLyDooqssICMyOTEKKyAgICAweDg4REQsIC8vIOijnSwgIzI1NgorICAgIDB4ODhFMSwgLy8g6KOhLCAjMzY5CisgICAgMHg4OEZELCAvLyDoo70sICM1MTAKKyAgICAweDg5N0YsIC8vIOilvywgIzMwMAorICAgIDB4ODk4MSwgLy8g6KaBLCAjMzYKKyAgICAweDg5OEIsIC8vIOimiywgIzMwNworICAgIDB4ODk5NiwgLy8g6KaWLCAjMjA0CisgICAgMHg4OUJBLCAvLyDoprosICM0NTAKKyAgICAweDg5QkQsIC8vIOimvSwgIzM4NworICAgIDB4ODlDMCwgLy8g6KeALCAjMzY1CisgICAgMHg4OUUzLCAvLyDop6MsICMzMjMKKyAgICAweDhBMDAsIC8vIOiogCwgIzE2OQorICAgIDB4OEEwMiwgLy8g6KiCLCAjNDIzCisgICAgMHg4QTA4LCAvLyDoqIgsICMyMjUKKyAgICAweDhBMEEsIC8vIOioiiwgIzE1NgorICAgIDB4OEEwRSwgLy8g6KiOLCAjMzczCisgICAgMHg4QTE4LCAvLyDoqJgsICMyMjIKKyAgICAweDhBMkQsIC8vIOiorSwgIzE3NAorICAgIDB4OEEzQiwgLy8g6Ki7LCAjMzU2CisgICAgMHg4QTU1LCAvLyDoqZUsICMyNDYKKyAgICAweDhBNjYsIC8vIOippiwgIzQ0OAorICAgIDB4OEE3MSwgLy8g6KmxLCAjMjI5CisgICAgMHg4QTcyLCAvLyDoqbIsICM0NDYKKyAgICAweDhBOEQsIC8vIOiqjSwgIzQ2NAorICAgIDB4OEE5RSwgLy8g6KqeLCAjMzcxCisgICAgMHg4QUFBLCAvLyDoqqosICM5MQorICAgIDB4OEFCRiwgLy8g6Kq/LCAjNTA5CisgICAgMHg4QUNCLCAvLyDoq4ssICMxMTkKKyAgICAweDhBRDYsIC8vIOirliwgIzExNAorICAgIDB4OEIxRCwgLy8g6KydLCAjMzg5CisgICAgMHg4QjQ5LCAvLyDorYksICM0MjkKKyAgICAweDhCNTgsIC8vIOitmCwgIzQxNgorICAgIDB4OEI3MCwgLy8g6K2wLCAjNDg1CisgICAgMHg4Qjc3LCAvLyDorbcsICM0NzUKKyAgICAweDhCODAsIC8vIOiugCwgIzM4NgorICAgIDB4OEI4QSwgLy8g6K6KLCAjMzg4CisgICAgMHg4QjkzLCAvLyDorpMsICMzMzYKKyAgICAweDhDQTgsIC8vIOiyqCwgIzMxMworICAgIDB4OENCNywgLy8g6LK3LCAjMjYwCisgICAgMHg4Q0JCLCAvLyDosrssICMyMDMKKyAgICAweDhDQzcsIC8vIOizhywgIzYyCisgICAgMHg4Q0UzLCAvLyDos6MsICMyOTQKKyAgICAweDhDRUEsIC8vIOizqiwgIzQ1NworICAgIDB4OENGQywgLy8g6LO8LCAjMTg5CisgICAgMHg4RDc3LCAvLyDotbcsICMyMTQKKyAgICAweDhEODUsIC8vIOi2hSwgIzI5NgorICAgIDB4OERERiwgLy8g6LefLCAjNDg5CisgICAgMHg4REVGLCAvLyDot68sICMxMzcKKyAgICAweDhFQUIsIC8vIOi6qywgIzE5NworICAgIDB4OEVDQSwgLy8g6LuKLCAjNzYKKyAgICAweDhGMDksIC8vIOi8iSwgIzMwMQorICAgIDB4OEY0OSwgLy8g6L2JLCAjMjgyCisgICAgMHg4RkQxLCAvLyDov5EsICM0MTQKKyAgICAweDkwMDEsIC8vIOmAgSwgIzM2MworICAgIDB4OTAxOSwgLy8g6YCZLCAjNDIKKyAgICAweDkwMUEsIC8vIOmAmiwgIzIwNworICAgIDB4OTAxRiwgLy8g6YCfLCAjNDk1CisgICAgMHg5MDIwLCAvLyDpgKAsICM0NTUKKyAgICAweDkwMjMsIC8vIOmAoywgIzI4NQorICAgIDB4OTAzMiwgLy8g6YCyLCAjMjMxCisgICAgMHg5MDRBLCAvLyDpgYosICMxMzIKKyAgICAweDkwNEIsIC8vIOmBiywgIzIxOQorICAgIDB4OTA0RSwgLy8g6YGOLCAjMTAxCisgICAgMHg5MDUzLCAvLyDpgZMsICMxNDYKKyAgICAweDkwNTQsIC8vIOmBlCwgIzQxNworICAgIDB4OTA3OCwgLy8g6YG4LCAjMTgyCisgICAgMHg5MDg0LCAvLyDpgoQsICMxNTQKKyAgICAweDkwOEEsIC8vIOmCiiwgIzQ4NworICAgIDB4OTBBMywgLy8g6YKjLCAjMjY5CisgICAgMHg5MEU4LCAvLyDpg6gsICM3OAorICAgIDB4OTBGRCwgLy8g6YO9LCAjMTA0CisgICAgMHg5MTRELCAvLyDphY0sICM0MjEKKyAgICAweDkxNTIsIC8vIOmFkiwgIzUxMgorICAgIDB4OTFBQiwgLy8g6YarLCAjMzU4CisgICAgMHg5MUNELCAvLyDph40sICMyMjQKKyAgICAweDkxQ0YsIC8vIOmHjywgIzMxOQorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTE1CisgICAgMHg5MzA0LCAvLyDpjIQsICMzMDIKKyAgICAweDk1NzcsIC8vIOmVtywgIzE3MgorICAgIDB4OTU4MCwgLy8g6ZaALCAjMTkzCisgICAgMHg5NThCLCAvLyDplossICM3MgorICAgIDB4OTU5MywgLy8g6ZaTLCAjODAKKyAgICAweDk1QjEsIC8vIOmWsSwgIzQwNQorICAgIDB4OTVEQywgLy8g6ZecLCAjNzQKKyAgICAweDk2M0YsIC8vIOmYvywgIzQ2MAorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMjY1CisgICAgMHg5NjYyLCAvLyDpmaIsICM0NzQKKyAgICAweDk2NjQsIC8vIOmZpCwgIzQ3OAorICAgIDB4OTY5QiwgLy8g6ZqbLCAjNDU5CisgICAgMHg5NkM2LCAvLyDpm4YsICMzNDcKKyAgICAweDk2RTIsIC8vIOmboiwgIzQ0MgorICAgIDB4OTZGQiwgLy8g6Zu7LCAjMzMKKyAgICAweDk3MDAsIC8vIOmcgCwgIzQ0NQorICAgIDB4OTc1RSwgLy8g6Z2eLCAjNDUxCisgICAgMHg5NzYyLCAvLyDpnaIsICMxMjkKKyAgICAweDk3RjMsIC8vIOmfsywgIzE5NAorICAgIDB4OTgwMSwgLy8g6aCBLCAjODMKKyAgICAweDk4MkQsIC8vIOmgrSwgIzIzOAorICAgIDB4OTg0QywgLy8g6aGMLCAjMTIyCisgICAgMHg5ODVFLCAvLyDpoZ4sICMxNjMKKyAgICAweDk4QTgsIC8vIOmiqCwgIzI2NgorICAgIDB4OThERiwgLy8g6aOfLCAjMjA4CisgICAgMHg5OTEwLCAvLyDppJAsICM0NjkKKyAgICAweDk5MjgsIC8vIOmkqCwgIzQyNAorICAgIDB4OTk5NiwgLy8g6aaWLCAjMTY2CisgICAgMHg5OTk5LCAvLyDpppksICMyNjMKKyAgICAweDk5QUMsIC8vIOmmrCwgIzMxNworICAgIDB4OUE1NywgLy8g6amXLCAjNDkyCisgICAgMHg5QUQ0LCAvLyDpq5QsICMxMDAKKyAgICAweDlBRDgsIC8vIOmrmCwgIzg4CisgICAgMHg5RUJDLCAvLyDpurwsICMyNDEKKyAgICAweDlFQzMsIC8vIOm7gywgIzQ4MAorICAgIDB4OUVEMSwgLy8g6buRLCAjNDkwCisgICAgMHg5RURFLCAvLyDpu54sICM2OQorICAgIDB4OUY4RCwgLy8g6b6NLCAjNTA1Cit9OworLy8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNhbXBsZSBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjaGFyYWN0ZXJzCitzdGF0aWMgY29uc3QgZmxvYXQgZnJlcXVlbnRfemhUV19jb3ZlcmFnZT0wLjcwNDg0MTIwMDAyNjg3NzsKKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIGphIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X2phW10gPSB7CisgICAgMHgzMDA1LCAvLyDjgIUsICMzNTIKKyAgICAweDMwNDEsIC8vIOOBgSwgIzQ4NgorICAgIDB4MzA0MiwgLy8g44GCLCAjNTAKKyAgICAweDMwNDQsIC8vIOOBhCwgIzIKKyAgICAweDMwNDYsIC8vIOOBhiwgIzMzCisgICAgMHgzMDQ4LCAvLyDjgYgsICM4MworICAgIDB4MzA0QSwgLy8g44GKLCAjMzcKKyAgICAweDMwNEIsIC8vIOOBiywgIzIxCisgICAgMHgzMDRDLCAvLyDjgYwsICMxNworICAgIDB4MzA0RCwgLy8g44GNLCAjNTEKKyAgICAweDMwNEUsIC8vIOOBjiwgIzMyNAorICAgIDB4MzA0RiwgLy8g44GPLCAjMzgKKyAgICAweDMwNTAsIC8vIOOBkCwgIzMzNAorICAgIDB4MzA1MSwgLy8g44GRLCAjNjAKKyAgICAweDMwNTIsIC8vIOOBkiwgIzI5NgorICAgIDB4MzA1MywgLy8g44GTLCAjMzQKKyAgICAweDMwNTQsIC8vIOOBlCwgIzEwMAorICAgIDB4MzA1NSwgLy8g44GVLCAjMzEKKyAgICAweDMwNTYsIC8vIOOBliwgIzM3OAorICAgIDB4MzA1NywgLy8g44GXLCAjNAorICAgIDB4MzA1OCwgLy8g44GYLCAjMTIxCisgICAgMHgzMDU5LCAvLyDjgZksICMxMgorICAgIDB4MzA1QSwgLy8g44GaLCAjMjE1CisgICAgMHgzMDVCLCAvLyDjgZssICM4NgorICAgIDB4MzA1RCwgLy8g44GdLCAjNjgKKyAgICAweDMwNUYsIC8vIOOBnywgIzExCisgICAgMHgzMDYwLCAvLyDjgaAsICM0MgorICAgIDB4MzA2MSwgLy8g44GhLCAjNjcKKyAgICAweDMwNjMsIC8vIOOBoywgIzIzCisgICAgMHgzMDY0LCAvLyDjgaQsICM3MworICAgIDB4MzA2NiwgLy8g44GmLCAjNworICAgIDB4MzA2NywgLy8g44GnLCAjNgorICAgIDB4MzA2OCwgLy8g44GoLCAjMTQKKyAgICAweDMwNjksIC8vIOOBqSwgIzc1CisgICAgMHgzMDZBLCAvLyDjgaosICM4CisgICAgMHgzMDZCLCAvLyDjgassICM1CisgICAgMHgzMDZELCAvLyDjga0sICMxMjMKKyAgICAweDMwNkUsIC8vIOOBriwgIzEKKyAgICAweDMwNkYsIC8vIOOBrywgIzE2CisgICAgMHgzMDcwLCAvLyDjgbAsICMxNTAKKyAgICAweDMwNzEsIC8vIOOBsSwgIzI1OQorICAgIDB4MzA3MiwgLy8g44GyLCAjMzY0CisgICAgMHgzMDczLCAvLyDjgbMsICMyNjYKKyAgICAweDMwNzUsIC8vIOOBtSwgIzQ4NAorICAgIDB4MzA3NiwgLy8g44G2LCAjMzMwCisgICAgMHgzMDc4LCAvLyDjgbgsICMxNDYKKyAgICAweDMwNzksIC8vIOOBuSwgIzIwNworICAgIDB4MzA3QiwgLy8g44G7LCAjMjU0CisgICAgMHgzMDdFLCAvLyDjgb4sICMxOAorICAgIDB4MzA3RiwgLy8g44G/LCAjNzQKKyAgICAweDMwODAsIC8vIOOCgCwgIzI4NQorICAgIDB4MzA4MSwgLy8g44KBLCAjNzgKKyAgICAweDMwODIsIC8vIOOCgiwgIzMyCisgICAgMHgzMDgzLCAvLyDjgoMsICMxMTEKKyAgICAweDMwODQsIC8vIOOChCwgIzg1CisgICAgMHgzMDg2LCAvLyDjgoYsICMzOTIKKyAgICAweDMwODcsIC8vIOOChywgIzIyNAorICAgIDB4MzA4OCwgLy8g44KILCAjNjMKKyAgICAweDMwODksIC8vIOOCiSwgIzI5CisgICAgMHgzMDhBLCAvLyDjgoosICMyOAorICAgIDB4MzA4QiwgLy8g44KLLCAjOQorICAgIDB4MzA4QywgLy8g44KMLCAjMzUKKyAgICAweDMwOEQsIC8vIOOCjSwgIzEyNworICAgIDB4MzA4RiwgLy8g44KPLCAjODgKKyAgICAweDMwOTIsIC8vIOOCkiwgIzE5CisgICAgMHgzMDkzLCAvLyDjgpMsICMyMgorICAgIDB4MzBBMSwgLy8g44KhLCAjMTkzCisgICAgMHgzMEEyLCAvLyDjgqIsICMyNworICAgIDB4MzBBMywgLy8g44KjLCAjNzAKKyAgICAweDMwQTQsIC8vIOOCpCwgIzE1CisgICAgMHgzMEE2LCAvLyDjgqYsICM4OQorICAgIDB4MzBBNywgLy8g44KnLCAjMTM0CisgICAgMHgzMEE4LCAvLyDjgqgsICM4MQorICAgIDB4MzBBOSwgLy8g44KpLCAjMjI1CisgICAgMHgzMEFBLCAvLyDjgqosICM3NgorICAgIDB4MzBBQiwgLy8g44KrLCAjNTIKKyAgICAweDMwQUMsIC8vIOOCrCwgIzE0NworICAgIDB4MzBBRCwgLy8g44KtLCAjNjYKKyAgICAweDMwQUUsIC8vIOOCriwgIzI0NgorICAgIDB4MzBBRiwgLy8g44KvLCAjMjUKKyAgICAweDMwQjAsIC8vIOOCsCwgIzM5CisgICAgMHgzMEIxLCAvLyDjgrEsICMxMzcKKyAgICAweDMwQjIsIC8vIOOCsiwgIzIwMAorICAgIDB4MzBCMywgLy8g44KzLCAjNDYKKyAgICAweDMwQjQsIC8vIOOCtCwgIzE4MworICAgIDB4MzBCNSwgLy8g44K1LCAjNjQKKyAgICAweDMwQjYsIC8vIOOCtiwgIzIyMQorICAgIDB4MzBCNywgLy8g44K3LCAjNDgKKyAgICAweDMwQjgsIC8vIOOCuCwgIzU1CisgICAgMHgzMEI5LCAvLyDjgrksICMxMworICAgIDB4MzBCQSwgLy8g44K6LCAjMTAzCisgICAgMHgzMEJCLCAvLyDjgrssICMxMDkKKyAgICAweDMwQkMsIC8vIOOCvCwgIzQ5OQorICAgIDB4MzBCRCwgLy8g44K9LCAjMTc1CisgICAgMHgzMEJGLCAvLyDjgr8sICM0NQorICAgIDB4MzBDMCwgLy8g44OALCAjMTA0CisgICAgMHgzMEMxLCAvLyDjg4EsICM3MQorICAgIDB4MzBDMywgLy8g44ODLCAjMjAKKyAgICAweDMwQzQsIC8vIOODhCwgIzExOQorICAgIDB4MzBDNiwgLy8g44OGLCAjNTkKKyAgICAweDMwQzcsIC8vIOODhywgIzgyCisgICAgMHgzMEM4LCAvLyDjg4gsICMxMAorICAgIDB4MzBDOSwgLy8g44OJLCAjNDQKKyAgICAweDMwQ0EsIC8vIOODiiwgIzEwMgorICAgIDB4MzBDQiwgLy8g44OLLCAjNzIKKyAgICAweDMwQ0QsIC8vIOODjSwgIzExNworICAgIDB4MzBDRSwgLy8g44OOLCAjMTkyCisgICAgMHgzMENGLCAvLyDjg48sICMxNjQKKyAgICAweDMwRDAsIC8vIOODkCwgIzYyCisgICAgMHgzMEQxLCAvLyDjg5EsICM5MAorICAgIDB4MzBEMiwgLy8g44OSLCAjMzk4CisgICAgMHgzMEQzLCAvLyDjg5MsICM3NworICAgIDB4MzBENCwgLy8g44OULCAjMTM1CisgICAgMHgzMEQ1LCAvLyDjg5UsICM0NworICAgIDB4MzBENiwgLy8g44OWLCAjNTYKKyAgICAweDMwRDcsIC8vIOODlywgIzQzCisgICAgMHgzMEQ4LCAvLyDjg5gsICMyNjgKKyAgICAweDMwRDksIC8vIOODmSwgIzE1NworICAgIDB4MzBEQSwgLy8g44OaLCAjMTI1CisgICAgMHgzMERCLCAvLyDjg5ssICMxNTUKKyAgICAweDMwREMsIC8vIOODnCwgIzE2OAorICAgIDB4MzBERCwgLy8g44OdLCAjMTE0CisgICAgMHgzMERFLCAvLyDjg54sICM1NworICAgIDB4MzBERiwgLy8g44OfLCAjOTcKKyAgICAweDMwRTAsIC8vIOODoCwgIzY5CisgICAgMHgzMEUxLCAvLyDjg6EsICM1MworICAgIDB4MzBFMiwgLy8g44OiLCAjMTQyCisgICAgMHgzMEUzLCAvLyDjg6MsICM5MworICAgIDB4MzBFNCwgLy8g44OkLCAjMjU4CisgICAgMHgzMEU1LCAvLyDjg6UsICM3OQorICAgIDB4MzBFNiwgLy8g44OmLCAjNDA1CisgICAgMHgzMEU3LCAvLyDjg6csICM5OAorICAgIDB4MzBFOSwgLy8g44OpLCAjMjYKKyAgICAweDMwRUEsIC8vIOODqiwgIzMwCisgICAgMHgzMEVCLCAvLyDjg6ssICMyNAorICAgIDB4MzBFQywgLy8g44OsLCAjNDEKKyAgICAweDMwRUQsIC8vIOODrSwgIzQwCisgICAgMHgzMEVGLCAvLyDjg68sICMxNDQKKyAgICAweDMwRjMsIC8vIOODsywgIzMKKyAgICAweDMwRjQsIC8vIOODtCwgIzQ4MworICAgIDB4MzBGRCwgLy8g44O9LCAjNTAxCisgICAgMHg0RTAwLCAvLyDkuIAsICM4NAorICAgIDB4NEUwNywgLy8g5LiHLCAjMzM3CisgICAgMHg0RTA5LCAvLyDkuIksICMzMjMKKyAgICAweDRFMEEsIC8vIOS4iiwgIzEzMworICAgIDB4NEUwQiwgLy8g5LiLLCAjMTgwCisgICAgMHg0RTBELCAvLyDkuI0sICMyNzcKKyAgICAweDRFMTYsIC8vIOS4liwgIzM4NQorICAgIDB4NEUyRCwgLy8g5LitLCAjODcKKyAgICAweDRFM0IsIC8vIOS4uywgIzQzMgorICAgIDB4NEU4OCwgLy8g5LqILCAjMzI2CisgICAgMHg0RThCLCAvLyDkuossICM5NQorICAgIDB4NEU4QywgLy8g5LqMLCAjMzk0CisgICAgMHg0RTk1LCAvLyDkupUsICM0NjgKKyAgICAweDRFQTQsIC8vIOS6pCwgIzQxMAorICAgIDB4NEVBQywgLy8g5LqsLCAjMjYwCisgICAgMHg0RUJBLCAvLyDkurosICM2MQorICAgIDB4NEVDQSwgLy8g5LuKLCAjMTg0CisgICAgMHg0RUNCLCAvLyDku4ssICMzNTgKKyAgICAweDRFRDUsIC8vIOS7lSwgIzM5MQorICAgIDB4NEVENiwgLy8g5LuWLCAjMjU2CisgICAgMHg0RUQ4LCAvLyDku5gsICMyNDMKKyAgICAweDRFRTMsIC8vIOS7oywgIzI4MAorICAgIDB4NEVFNSwgLy8g5LulLCAjMjE2CisgICAgMHg0RUY2LCAvLyDku7YsICMxOTAKKyAgICAweDRGMUEsIC8vIOS8miwgIzEwNQorICAgIDB4NEY0RCwgLy8g5L2NLCAjMTc3CisgICAgMHg0RjRGLCAvLyDkvY8sICMzNzYKKyAgICAweDRGNTMsIC8vIOS9kywgIzIyMworICAgIDB4NEY1NSwgLy8g5L2VLCAjMjk0CisgICAgMHg0RjVDLCAvLyDkvZwsICMxNTQKKyAgICAweDRGN0YsIC8vIOS9vywgIzIzMworICAgIDB4NEY5QiwgLy8g5L6bLCAjNTAzCisgICAgMHg0RkExLCAvLyDkvqEsICMyMTcKKyAgICAweDRGQkYsIC8vIOS+vywgIzUxMQorICAgIDB4NEZERCwgLy8g5L+dLCAjMjc5CisgICAgMHg0RkUxLCAvLyDkv6EsICMyNzEKKyAgICAweDUwMEIsIC8vIOWAiywgIzQxNQorICAgIDB4NTBDRiwgLy8g5YOPLCAjMTc4CisgICAgMHg1MTJBLCAvLyDlhKosICM0MDMKKyAgICAweDUxNDMsIC8vIOWFgywgIzM4NAorICAgIDB4NTE0OCwgLy8g5YWILCAjMzExCisgICAgMHg1MTQ5LCAvLyDlhYksICM0ODgKKyAgICAweDUxNjUsIC8vIOWFpSwgIzExNQorICAgIDB4NTE2OCwgLy8g5YWoLCAjMTczCisgICAgMHg1MTZDLCAvLyDlhawsICMyODcKKyAgICAweDUxNzcsIC8vIOWFtywgIzQ0NworICAgIDB4NTE4NSwgLy8g5YaFLCAjMTY5CisgICAgMHg1MTg2LCAvLyDlhoYsICMxMzEKKyAgICAweDUxOTksIC8vIOWGmSwgIzI3NQorICAgIDB4NTFGQSwgLy8g5Ye6LCAjMTEwCisgICAgMHg1MjA2LCAvLyDliIYsICMxMzAKKyAgICAweDUyMDcsIC8vIOWIhywgIzQwMQorICAgIDB4NTIxRCwgLy8g5YidLCAjMzE5CisgICAgMHg1MjI1LCAvLyDliKUsICMyOTAKKyAgICAweDUyMjksIC8vIOWIqSwgIzIyNgorICAgIDB4NTIzNiwgLy8g5Yi2LCAjNTA3CisgICAgMHg1MjRELCAvLyDliY0sICMxMjQKKyAgICAweDUyOUIsIC8vIOWKmywgIzI3MgorICAgIDB4NTJBMCwgLy8g5YqgLCAjMjQ5CisgICAgMHg1MkQ1LCAvLyDli5UsICMxMjAKKyAgICAweDUyRDksIC8vIOWLmSwgIzQyMQorICAgIDB4NTJERiwgLy8g5YufLCAjNDc2CisgICAgMHg1MzE2LCAvLyDljJYsICMzMDgKKyAgICAweDUzMTcsIC8vIOWMlywgIzM0MQorICAgIDB4NTMzQSwgLy8g5Yy6LCAjMzQ4CisgICAgMHg1MzlGLCAvLyDljp8sICMzMjEKKyAgICAweDUzQzIsIC8vIOWPgiwgIzQ1MgorICAgIDB4NTNDQiwgLy8g5Y+LLCAjNDUxCisgICAgMHg1M0Q2LCAvLyDlj5YsICMyMzcKKyAgICAweDUzRDcsIC8vIOWPlywgIzM1NAorICAgIDB4NTNFMywgLy8g5Y+jLCAjMjg5CisgICAgMHg1M0U0LCAvLyDlj6QsICMzMzkKKyAgICAweDUzRUYsIC8vIOWPrywgIzI5OAorICAgIDB4NTNGMCwgLy8g5Y+wLCAjNDM5CisgICAgMHg1M0Y3LCAvLyDlj7csICMzNjEKKyAgICAweDU0MDgsIC8vIOWQiCwgIzExOAorICAgIDB4NTQwQywgLy8g5ZCMLCAjMjYzCisgICAgMHg1NDBELCAvLyDlkI0sICM2NQorICAgIDB4NTQxMSwgLy8g5ZCRLCAjNDM0CisgICAgMHg1NDRBLCAvLyDlkYosICMzODYKKyAgICAweDU0NjgsIC8vIOWRqCwgIzM5MworICAgIDB4NTQ3MywgLy8g5ZGzLCAjMjk5CisgICAgMHg1NDhDLCAvLyDlkowsICMzNTAKKyAgICAweDU0QzEsIC8vIOWTgSwgIzk2CisgICAgMHg1NEUxLCAvLyDlk6EsICMyOTMKKyAgICAweDU1NDYsIC8vIOWVhiwgIzE5OAorICAgIDB4NTU0RiwgLy8g5ZWPLCAjMTU4CisgICAgMHg1NUI2LCAvLyDllrYsICM0MzgKKyAgICAweDU2NjgsIC8vIOWZqCwgIzM2NgorICAgIDB4NTZERSwgLy8g5ZueLCAjMTQzCisgICAgMHg1NkYzLCAvLyDlm7MsICM0NDQKKyAgICAweDU2RkQsIC8vIOWbvSwgIzE1MworICAgIDB4NTcxMiwgLy8g5ZySLCAjNDM1CisgICAgMHg1NzFGLCAvLyDlnJ8sICMyMzkKKyAgICAweDU3MjgsIC8vIOWcqCwgIzM1MQorICAgIDB4NTczMCwgLy8g5ZywLCAjMTYzCisgICAgMHg1NzhCLCAvLyDlnossICM0MzAKKyAgICAweDU4MzEsIC8vIOWgsSwgIzExMgorICAgIDB4NTgzNCwgLy8g5aC0LCAjMTM5CisgICAgMHg1OEYyLCAvLyDlo7IsICMyMzIKKyAgICAweDU5MDksIC8vIOWkiSwgIzMwNgorICAgIDB4NTkxNiwgLy8g5aSWLCAjMjIyCisgICAgMHg1OTFBLCAvLyDlpJosICMzMzYKKyAgICAweDU5MjcsIC8vIOWkpywgIzgwCisgICAgMHg1OTI5LCAvLyDlpKksICMyNzgKKyAgICAweDU5NzMsIC8vIOWlsywgIzE2MQorICAgIDB4NTk3RCwgLy8g5aW9LCAjMzQ5CisgICAgMHg1QTVBLCAvLyDlqZosICM0NzkKKyAgICAweDVCNTAsIC8vIOWtkCwgIzExMworICAgIDB4NUI1NywgLy8g5a2XLCAjNDkyCisgICAgMHg1QjY2LCAvLyDlraYsICMxMzIKKyAgICAweDVCODksIC8vIOWuiSwgIzI5NQorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTQ1CisgICAgMHg1QjlGLCAvLyDlrp8sICMyMjAKKyAgICAweDVCQTQsIC8vIOWupCwgIzQ4MgorICAgIDB4NUJBRSwgLy8g5a6uLCAjNDg3CisgICAgMHg1QkI2LCAvLyDlrrYsICMyMTEKKyAgICAweDVCQjksIC8vIOWuuSwgIzMzMworICAgIDB4NUJGRSwgLy8g5a++LCAjMjUyCisgICAgMHg1QzAyLCAvLyDlsIIsICM0NzQKKyAgICAweDVDMEYsIC8vIOWwjywgIzIxMgorICAgIDB4NUMxMSwgLy8g5bCRLCAjMzc3CisgICAgMHg1QzRCLCAvLyDlsYssICMyODQKKyAgICAweDVDNzEsIC8vIOWxsSwgIzIwNgorICAgIDB4NUNBMSwgLy8g5bKhLCAjNDI5CisgICAgMHg1Q0Y2LCAvLyDls7YsICMyOTcKKyAgICAweDVEREQsIC8vIOW3nSwgIzI1MworICAgIDB4NURFNSwgLy8g5belLCAjMzc0CisgICAgMHg1RTAyLCAvLyDluIIsICMxNTkKKyAgICAweDVFMkYsIC8vIOW4rywgIzQxNgorICAgIDB4NUUzOCwgLy8g5bi4LCAjNDM3CisgICAgMHg1RTczLCAvLyDlubMsICMzOTAKKyAgICAweDVFNzQsIC8vIOW5tCwgIzU0CisgICAgMHg1RTgzLCAvLyDluoMsICMzNjcKKyAgICAweDVFOTcsIC8vIOW6lywgIzE0OQorICAgIDB4NUVBNiwgLy8g5bqmLCAjMjY5CisgICAgMHg1RUFCLCAvLyDluqssICMzODAKKyAgICAweDVGMEYsIC8vIOW8jywgIzI2NQorICAgIDB4NUYxNSwgLy8g5byVLCAjMzQ1CisgICAgMHg1RjM3LCAvLyDlvLcsICM0NDYKKyAgICAweDVGNTMsIC8vIOW9kywgIzI0MAorICAgIDB4NUY2MiwgLy8g5b2iLCAjNTAyCisgICAgMHg1RjhDLCAvLyDlvowsICMyMzAKKyAgICAweDVGOTcsIC8vIOW+lywgIzQ5MAorICAgIDB4NUZDMywgLy8g5b+DLCAjMzA3CisgICAgMHg1RkM1LCAvLyDlv4UsICM0MjIKKyAgICAweDVGREMsIC8vIOW/nCwgIzM1NgorICAgIDB4NjAxRCwgLy8g5oCdLCAjMTg5CisgICAgMHg2MDI3LCAvLyDmgKcsICMyMDEKKyAgICAweDYwNzUsIC8vIOaBtSwgIzQwMAorICAgIDB4NjBDNSwgLy8g5oOFLCAjMTQwCisgICAgMHg2MEYzLCAvLyDmg7MsICM0NzcKKyAgICAweDYxMEYsIC8vIOaEjywgIzMwNQorICAgIDB4NjExQiwgLy8g5oSbLCAjMjczCisgICAgMHg2MTFGLCAvLyDmhJ8sICMyNTcKKyAgICAweDYyMTAsIC8vIOaIkCwgIzI2MgorICAgIDB4NjIyNiwgLy8g5oimLCAjMzY1CisgICAgMHg2MjQwLCAvLyDmiYAsICMyMzYKKyAgICAweDYyNEIsIC8vIOaJiywgIzE2MAorICAgIDB4NjI5NSwgLy8g5oqVLCAjMTI5CisgICAgMHg2MzAxLCAvLyDmjIEsICMzNTUKKyAgICAweDYzMDcsIC8vIOaMhywgIzQyNQorICAgIDB4NjNBMiwgLy8g5o6iLCAjMzY5CisgICAgMHg2M0IyLCAvLyDmjrIsICMzOTkKKyAgICAweDY0M0EsIC8vIOaQuiwgIzQ1OQorICAgIDB4NjUyRiwgLy8g5pSvLCAjNTEyCisgICAgMHg2NTNFLCAvLyDmlL4sICM0NjkKKyAgICAweDY1NTksIC8vIOaVmSwgIzI3MAorICAgIDB4NjU3MCwgLy8g5pWwLCAjMTgxCisgICAgMHg2NTg3LCAvLyDmlocsICMyMDIKKyAgICAweDY1OTksIC8vIOaWmSwgIzEwNgorICAgIDB4NjVCMCwgLy8g5pawLCAjOTkKKyAgICAweDY1QjksIC8vIOaWuSwgIzEyNgorICAgIDB4NjVDNSwgLy8g5peFLCAjNDQ1CisgICAgMHg2NUU1LCAvLyDml6UsICMzNgorICAgIDB4NjYwRSwgLy8g5piOLCAjMzAwCisgICAgMHg2NjIwLCAvLyDmmKAsICM0MTgKKyAgICAweDY2NDIsIC8vIOaZgiwgIzEwNworICAgIDB4NjZGNCwgLy8g5pu0LCAjMzU5CisgICAgMHg2NkY4LCAvLyDmm7gsICMxNzQKKyAgICAweDY3MDAsIC8vIOacgCwgIzE1MgorICAgIDB4NjcwOCwgLy8g5pyILCAjNDkKKyAgICAweDY3MDksIC8vIOaciSwgIzMwMgorICAgIDB4NjcxRiwgLy8g5pyfLCAjMzMyCisgICAgMHg2NzI4LCAvLyDmnKgsICMyMDMKKyAgICAweDY3MkMsIC8vIOacrCwgIzkyCisgICAgMHg2NzUwLCAvLyDmnZAsICM0ODkKKyAgICAweDY3NTEsIC8vIOadkSwgIzQ2NgorICAgIDB4Njc2NSwgLy8g5p2lLCAjMjY3CisgICAgMHg2NzcxLCAvLyDmnbEsICMxOTEKKyAgICAweDY3N0YsIC8vIOadvywgIzQxMQorICAgIDB4Njc5QywgLy8g5p6cLCAjNDQxCisgICAgMHg2ODIxLCAvLyDmoKEsICMzMjcKKyAgICAweDY4MkEsIC8vIOagqiwgIzQxMgorICAgIDB4NjgzQywgLy8g5qC8LCAjMjI4CisgICAgMHg2OTFDLCAvLyDmpJwsICMxNzkKKyAgICAweDY5NkQsIC8vIOalrSwgIzE2NgorICAgIDB4Njk3RCwgLy8g5qW9LCAjMTcyCisgICAgMHg2OUQ4LCAvLyDmp5gsICMyNTUKKyAgICAweDZBNUYsIC8vIOapnywgIzIzNQorICAgIDB4NkIyMSwgLy8g5qyhLCAjMzE4CisgICAgMHg2QjYyLCAvLyDmraIsICM0NzUKKyAgICAweDZCNjMsIC8vIOatoywgIzMxMgorICAgIDB4NkMxNywgLy8g5rCXLCAjMTE2CisgICAgMHg2QzM0LCAvLyDmsLQsICMxNjUKKyAgICAweDZDNDIsIC8vIOaxgiwgIzQ2NQorICAgIDB4NkM3QSwgLy8g5rG6LCAjMzcwCisgICAgMHg2Q0JCLCAvLyDmsrssICM1MDUKKyAgICAweDZDQzEsIC8vIOazgSwgIzQ2MgorICAgIDB4NkNENSwgLy8g5rOVLCAjMjI3CisgICAgMHg2Q0U4LCAvLyDms6gsICMzNzIKKyAgICAweDZEM0IsIC8vIOa0uywgIzMwMworICAgIDB4NkQ0MSwgLy8g5rWBLCAjNDgwCisgICAgMHg2RDc3LCAvLyDmtbcsICMyNzQKKyAgICAweDZFMDgsIC8vIOa4iCwgIzQxNworICAgIDB4NkYxNCwgLy8g5ryULCAjNTA0CisgICAgMHg3MDZCLCAvLyDngassICMyNjQKKyAgICAweDcwQjksIC8vIOeCuSwgIzMzMQorICAgIDB4NzEyMSwgLy8g54ShLCAjNTgKKyAgICAweDcyNDgsIC8vIOeJiCwgIzQwOQorICAgIDB4NzI2OSwgLy8g54mpLCAjMTcwCisgICAgMHg3Mjc5LCAvLyDnibksICMyNDIKKyAgICAweDcyQjYsIC8vIOeKtiwgIzQ1OAorICAgIDB4NzNGRSwgLy8g54++LCAjMzIyCisgICAgMHg3NDA2LCAvLyDnkIYsICMxNjIKKyAgICAweDc1MUYsIC8vIOeUnywgIzEyMgorICAgIDB4NzUyMywgLy8g55SjLCAjMzIwCisgICAgMHg3NTI4LCAvLyDnlKgsICM5NAorICAgIDB4NzUzMCwgLy8g55SwLCAjMTk1CisgICAgMHg3NTM3LCAvLyDnlLcsICMzNzMKKyAgICAweDc1M0EsIC8vIOeUuiwgIzMxNAorICAgIDB4NzUzQiwgLy8g55S7LCAjOTEKKyAgICAweDc1NEMsIC8vIOeVjCwgIzQzNgorICAgIDB4NzU2QSwgLy8g55WqLCAjMjYxCisgICAgMHg3NUM1LCAvLyDnl4UsICM0MjgKKyAgICAweDc2N0EsIC8vIOeZuiwgIzE5NAorICAgIDB4NzY3QiwgLy8g55m7LCAjMjMxCisgICAgMHg3NjdELCAvLyDnmb0sICM0MTkKKyAgICAweDc2ODQsIC8vIOeahCwgIzI1MQorICAgIDB4NzZFRSwgLy8g55uuLCAjMTk3CisgICAgMHg3NkY0LCAvLyDnm7QsICM0OTcKKyAgICAweDc2RjgsIC8vIOebuCwgIzI4NgorICAgIDB4NzcwQywgLy8g55yMLCAjMTk5CisgICAgMHg3NzFGLCAvLyDnnJ8sICMyMTkKKyAgICAweDc3NDAsIC8vIOedgCwgIzI4MworICAgIDB4NzdFNSwgLy8g55+lLCAjMTg1CisgICAgMHg3N0YzLCAvLyDnn7MsICM1MDAKKyAgICAweDc4QkEsIC8vIOeiuiwgIzM4MworICAgIDB4NzkzQSwgLy8g56S6LCAjMjQxCisgICAgMHg3OTNFLCAvLyDnpL4sICMxNjcKKyAgICAweDc5NUUsIC8vIOelniwgIzMxNQorICAgIDB4Nzk4RiwgLy8g56aPLCAjNDIzCisgICAgMHg3OUMxLCAvLyDnp4EsICMzNDcKKyAgICAweDc5RDEsIC8vIOenkSwgIzQyMAorICAgIDB4N0EwRSwgLy8g56iOLCAjMzY4CisgICAgMHg3QTJFLCAvLyDnqK4sICM0NTUKKyAgICAweDdBM0YsIC8vIOeovywgIzE0OAorICAgIDB4N0E3QSwgLy8g56m6LCAjNDI3CisgICAgMHg3QUNCLCAvLyDnq4ssICMzMDkKKyAgICAweDdCMTEsIC8vIOeskSwgIzQ1NAorICAgIDB4N0IyQywgLy8g56ysLCAjMzE3CisgICAgMHg3QjQ5LCAvLyDnrYksICM0NTcKKyAgICAweDdCNTQsIC8vIOetlCwgIzQyNgorICAgIDB4N0JBMSwgLy8g566hLCAjNDgxCisgICAgMHg3Q0ZCLCAvLyDns7ssICM0MDgKKyAgICAweDdEMDQsIC8vIOe0hCwgIzI3NgorICAgIDB4N0QyMCwgLy8g57SgLCAjNDA3CisgICAgMHg3RDIyLCAvLyDntKIsICMyMTQKKyAgICAweDdEMzAsIC8vIOe0sCwgIzM4MQorICAgIDB4N0QzOSwgLy8g57S5LCAjNDcxCisgICAgMHg3RDQyLCAvLyDntYIsICM0NTYKKyAgICAweDdENDQsIC8vIOe1hCwgIzQyNAorICAgIDB4N0Q0QywgLy8g57WMLCAjMzYwCisgICAgMHg3RDUwLCAvLyDntZAsICMyOTEKKyAgICAweDdEOUEsIC8vIOe2miwgIzM1NworICAgIDB4N0RDRiwgLy8g57ePLCAjNDY3CisgICAgMHg3RERBLCAvLyDnt5osICMzMzgKKyAgICAweDdERTgsIC8vIOe3qCwgIzQ1MworICAgIDB4N0Y4RSwgLy8g576OLCAjMjA0CisgICAgMHg4MDAzLCAvLyDogIMsICMzODcKKyAgICAweDgwMDUsIC8vIOiAhSwgIzE1MQorICAgIDB4ODA1RSwgLy8g6IGeLCAjNDYzCisgICAgMHg4MDc3LCAvLyDogbcsICMzNjMKKyAgICAweDgwQjIsIC8vIOiCsiwgIzQzMworICAgIDB4ODBGRCwgLy8g6IO9LCAjMjUwCisgICAgMHg4MTc5LCAvLyDohbksICMzOTYKKyAgICAweDgxRUEsIC8vIOiHqiwgIzE1NgorICAgIDB4ODI2RiwgLy8g6ImvLCAjMzI5CisgICAgMHg4MjcyLCAvLyDoibIsICM0MDIKKyAgICAweDgyQjEsIC8vIOiKsSwgIzQ0MAorICAgIDB4ODJCOCwgLy8g6Iq4LCAjNDEzCisgICAgMHg4MkYxLCAvLyDoi7EsICM0ODUKKyAgICAweDg0NDksIC8vIOiRiSwgIzQ3MgorICAgIDB4ODg0QywgLy8g6KGMLCAjMTI4CisgICAgMHg4ODUzLCAvLyDooZMsICM0NjAKKyAgICAweDg4NjgsIC8vIOihqCwgIzIwOQorICAgIDB4ODhGRCwgLy8g6KO9LCAjNDMxCisgICAgMHg4OTdGLCAvLyDopb8sICM0MDYKKyAgICAweDg5ODEsIC8vIOimgSwgIzMxMworICAgIDB4ODk4QiwgLy8g6KaLLCAjMTAxCisgICAgMHg4OThGLCAvLyDopo8sICMzNzUKKyAgICAweDg5QTcsIC8vIOimpywgIzE3MQorICAgIDB4ODlFMywgLy8g6KejLCAjMzg4CisgICAgMHg4QTAwLCAvLyDoqIAsICMyMTAKKyAgICAweDhBMDgsIC8vIOioiCwgIzM0MworICAgIDB4OEExOCwgLy8g6KiYLCAjMTM2CisgICAgMHg4QTJELCAvLyDoqK0sICMyOTIKKyAgICAweDhBNzEsIC8vIOipsSwgIzIxMworICAgIDB4OEE3MywgLy8g6KmzLCAjMzcxCisgICAgMHg4QThELCAvLyDoqo0sICM0MDQKKyAgICAweDhBOUUsIC8vIOiqniwgIzIzNAorICAgIDB4OEFBQywgLy8g6KqsLCAjNDk0CisgICAgMHg4QUFELCAvLyDoqq0sICMzMDEKKyAgICAweDhBQkYsIC8vIOiqvywgIzQ0MworICAgIDB4OEFDNywgLy8g6KuHLCAjNDQ4CisgICAgMHg4Qjc3LCAvLyDorbcsICM1MDkKKyAgICAweDhDMzcsIC8vIOiwtywgIzUwNgorICAgIDB4OENBOSwgLy8g6LKpLCAjMzYyCisgICAgMHg4Q0I3LCAvLyDosrcsICMzNDYKKyAgICAweDhDQzcsIC8vIOizhywgIzQ3MworICAgIDB4OENFQSwgLy8g6LOqLCAjMjgxCisgICAgMHg4Q0ZDLCAvLyDos7wsICM0OTUKKyAgICAweDhFQUIsIC8vIOi6qywgIzQ3MAorICAgIDB4OEVDQSwgLy8g6LuKLCAjMjA1CisgICAgMHg4RUUyLCAvLyDou6IsICMzMzUKKyAgICAweDhGMDksIC8vIOi8iSwgIzM0MgorICAgIDB4OEZCQywgLy8g6L68LCAjMjI5CisgICAgMHg4RkQxLCAvLyDov5EsICMzMDQKKyAgICAweDhGRDQsIC8vIOi/lCwgIzQ2MQorICAgIDB4OEZGRCwgLy8g6L+9LCAjMzc5CisgICAgMHg5MDAxLCAvLyDpgIEsICMxODYKKyAgICAweDkwMUEsIC8vIOmAmiwgIzE4MgorICAgIDB4OTAxRiwgLy8g6YCfLCAjMzQwCisgICAgMHg5MDIzLCAvLyDpgKMsICMyNDQKKyAgICAweDkwNEIsIC8vIOmBiywgIzM4MgorICAgIDB4OTA0RSwgLy8g6YGOLCAjNDk4CisgICAgMHg5MDUzLCAvLyDpgZMsICMyODIKKyAgICAweDkwNTQsIC8vIOmBlCwgIzQ1MAorICAgIDB4OTA1NSwgLy8g6YGVLCAjNDE0CisgICAgMHg5MDc4LCAvLyDpgbgsICMyODgKKyAgICAweDkwRTgsIC8vIOmDqCwgIzIwOAorICAgIDB4OTBGRCwgLy8g6YO9LCAjMzQ0CisgICAgMHg5MTRELCAvLyDphY0sICMzODkKKyAgICAweDkxQ0QsIC8vIOmHjSwgIzQ3OAorICAgIDB4OTFDRSwgLy8g6YeOLCAjMjQ1CisgICAgMHg5MUQxLCAvLyDph5EsICMxMzgKKyAgICAweDkzMzIsIC8vIOmMsiwgIzIzOAorICAgIDB4OTU3NywgLy8g6ZW3LCAjMjQ3CisgICAgMHg5NTgwLCAvLyDploAsICM1MDgKKyAgICAweDk1OEIsIC8vIOmWiywgIzI0OAorICAgIDB4OTU5MywgLy8g6ZaTLCAjMTQxCisgICAgMHg5NUEyLCAvLyDplqIsICMxODgKKyAgICAweDk2MkEsIC8vIOmYqiwgIzQ5NgorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMzk1CisgICAgMHg5NjYyLCAvLyDpmaIsICM0NDkKKyAgICAweDk2NjQsIC8vIOmZpCwgIzUxMAorICAgIDB4OTY5QiwgLy8g6ZqbLCAjNDkzCisgICAgMHg5NkM2LCAvLyDpm4YsICMxOTYKKyAgICAweDk2RDEsIC8vIOmbkSwgIzQ0MgorICAgIDB4OTZGQiwgLy8g6Zu7LCAjMTg3CisgICAgMHg5NzYyLCAvLyDpnaIsICMzMjgKKyAgICAweDk3RjMsIC8vIOmfsywgIzMyNQorICAgIDB4OTg0QywgLy8g6aGMLCAjMzEwCisgICAgMHg5ODVFLCAvLyDpoZ4sICM0OTEKKyAgICAweDk4QTgsIC8vIOmiqCwgIzM1MworICAgIDB4OThERiwgLy8g6aOfLCAjMjE4CisgICAgMHg5OTI4LCAvLyDppKgsICM0NjQKKyAgICAweDk5QzUsIC8vIOmnhSwgIzMxNgorICAgIDB4OUExMywgLy8g6aiTLCAjMzk3CisgICAgMHg5QUQ4LCAvLyDpq5gsICMxNzYKKyAgICAweEZGNTcsIC8vIO+9lywgIzEwOAorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X2phX2NvdmVyYWdlPTAuODgwNTY5NTg5MTIwMTYyOworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUga28gbGFuZ3VhZ2UgaW4gYSBzYW1wbGUgb2YgdGhlIEludGVybmV0LgorLy8gT3JkZXJlZCBieSBjb2RlcG9pbnQsIGNvbW1lbnQgc2hvd3MgY2hhcmFjdGVyIGFuZCByYW5raW5nIGJ5IGZyZXF1ZW5jeQorY29uc3QgdWludDE2X3QgZnJlcXVlbnRfa29bXSA9IHsKKyAgICAweDMxNEIsIC8vIOOFiywgIzE0OAorICAgIDB4MzE0RSwgLy8g44WOLCAjMzkwCisgICAgMHgzMTYwLCAvLyDjhaAsICMzNTQKKyAgICAweDMxOEQsIC8vIOOGjSwgIzQzOQorICAgIDB4QUMwMCwgLy8g6rCALCAjNgorICAgIDB4QUMwMSwgLy8g6rCBLCAjMjMxCisgICAgMHhBQzA0LCAvLyDqsIQsICMxMDYKKyAgICAweEFDMDgsIC8vIOqwiCwgIzM2MgorICAgIDB4QUMxMCwgLy8g6rCQLCAjMTIyCisgICAgMHhBQzExLCAvLyDqsJEsICM0OTMKKyAgICAweEFDMTUsIC8vIOqwlSwgIzE1NQorICAgIDB4QUMxOSwgLy8g6rCZLCAjMjY0CisgICAgMHhBQzFDLCAvLyDqsJwsICM4NworICAgIDB4QUMxRCwgLy8g6rCdLCAjMTk4CisgICAgMHhBQzI0LCAvLyDqsKQsICM0NTcKKyAgICAweEFDNzAsIC8vIOqxsCwgIzkxCisgICAgMHhBQzc0LCAvLyDqsbQsICMxNjEKKyAgICAweEFDNzgsIC8vIOqxuCwgIzMzOAorICAgIDB4QUM4MCwgLy8g6rKALCAjMTg0CisgICAgMHhBQzgzLCAvLyDqsoMsICMxMTYKKyAgICAweEFDOEMsIC8vIOqyjCwgIzM2CisgICAgMHhBQ0EwLCAvLyDqsqAsICMyMzMKKyAgICAweEFDQTgsIC8vIOqyqCwgIzM0MQorICAgIDB4QUNBOSwgLy8g6rKpLCAjMjQ1CisgICAgMHhBQ0FDLCAvLyDqsqwsICM0MTMKKyAgICAweEFDQjAsIC8vIOqysCwgIzIwMgorICAgIDB4QUNCRCwgLy8g6rK9LCAjNjIKKyAgICAweEFDQzQsIC8vIOqzhCwgIzE0MgorICAgIDB4QUNFMCwgLy8g6rOgLCAjMTIKKyAgICAweEFDRTEsIC8vIOqzoSwgIzQ0NAorICAgIDB4QUNFOCwgLy8g6rOoLCAjMzc5CisgICAgMHhBQ0YzLCAvLyDqs7MsICMzODgKKyAgICAweEFDRjUsIC8vIOqztSwgIzU5CisgICAgMHhBQ0ZDLCAvLyDqs7wsICM2OQorICAgIDB4QUQwMCwgLy8g6rSALCAjOTUKKyAgICAweEFEMTEsIC8vIOq0kSwgIzIzNQorICAgIDB4QUQ1MCwgLy8g6rWQLCAjMTI4CisgICAgMHhBRDZDLCAvLyDqtawsICM1MgorICAgIDB4QUQ2RCwgLy8g6rWtLCAjODUKKyAgICAweEFENzAsIC8vIOq1sCwgIzI5MworICAgIDB4QUQ3NCwgLy8g6rW0LCAjNDg3CisgICAgMHhBRDgxLCAvLyDqtoEsICM0NDEKKyAgICAweEFEOEMsIC8vIOq2jCwgIzE5MgorICAgIDB4QURDMCwgLy8g6reALCAjMzg2CisgICAgMHhBRERDLCAvLyDqt5wsICMzNjcKKyAgICAweEFERjgsIC8vIOq3uCwgIzMwCisgICAgMHhBREY5LCAvLyDqt7ksICM0MjQKKyAgICAweEFERkMsIC8vIOq3vCwgIzI0MQorICAgIDB4QUUwMCwgLy8g6riALCAjNjEKKyAgICAweEFFMDgsIC8vIOq4iCwgIzEzOAorICAgIDB4QUUwOSwgLy8g6riJLCAjMjY5CisgICAgMHhBRTMwLCAvLyDquLAsICMzCisgICAgMHhBRTM0LCAvLyDquLQsICM0NjUKKyAgICAweEFFMzgsIC8vIOq4uCwgIzI5NworICAgIDB4QUU0MCwgLy8g6rmALCAjMjA1CisgICAgMHhBRTRDLCAvLyDquYwsICMxNzEKKyAgICAweEFFRDgsIC8vIOq7mCwgIzI3MworICAgIDB4QUY0MywgLy8g6r2DLCAjNDc1CisgICAgMHhCMDVELCAvLyDrgZ0sICM1MDUKKyAgICAweEIwN0MsIC8vIOuBvCwgIzQ5MAorICAgIDB4QjA5OCwgLy8g64KYLCAjMzkKKyAgICAweEIwOUMsIC8vIOuCnCwgIzI3NAorICAgIDB4QjBBMCwgLy8g64KgLCAjMjkyCisgICAgMHhCMEE4LCAvLyDrgqgsICMxMzkKKyAgICAweEIwQjQsIC8vIOuCtCwgIzU2CisgICAgMHhCMTA4LCAvLyDrhIgsICMyNzIKKyAgICAweEIxMTAsIC8vIOuEkCwgIzQ3NgorICAgIDB4QjExOCwgLy8g64SYLCAjNDkyCisgICAgMHhCMTI0LCAvLyDrhKQsICMxMDAKKyAgICAweEIxMzcsIC8vIOuEtywgIzMyOQorICAgIDB4QjE0MCwgLy8g64WALCAjMjg4CisgICAgMHhCMTQ0LCAvLyDrhYQsICMxNTEKKyAgICAweEIxNzgsIC8vIOuFuCwgIzE0OQorICAgIDB4QjE3QywgLy8g64W8LCAjNDkxCisgICAgMHhCMTgwLCAvLyDrhoAsICM0NjQKKyAgICAweEIxOEQsIC8vIOuGjSwgIzQ0MgorICAgIDB4QjIwNCwgLy8g64iELCAjMzE5CisgICAgMHhCMjA4LCAvLyDriIgsICMzODMKKyAgICAweEIyNzQsIC8vIOuJtCwgIzE3MworICAgIDB4QjI5MCwgLy8g64qQLCAjMzY4CisgICAgMHhCMjk0LCAvLyDripQsICM1CisgICAgMHhCMjk4LCAvLyDripgsICMzMjIKKyAgICAweEIyQTUsIC8vIOuKpSwgIzE5MAorICAgIDB4QjJDOCwgLy8g64uILCAjMTYKKyAgICAweEIyRDgsIC8vIOuLmCwgIzE1MworICAgIDB4QjJFNCwgLy8g64ukLCAjMgorICAgIDB4QjJFOCwgLy8g64uoLCAjMTM0CisgICAgMHhCMkVCLCAvLyDri6ssICMxOTUKKyAgICAweEIyRUMsIC8vIOuLrCwgIzI0MworICAgIDB4QjJGNCwgLy8g64u0LCAjMjU0CisgICAgMHhCMkY1LCAvLyDri7UsICMyODcKKyAgICAweEIyRjksIC8vIOuLuSwgIzE1OQorICAgIDB4QjMwMCwgLy8g64yALCAjMzMKKyAgICAweEIzMTMsIC8vIOuMkywgIzMwMworICAgIDB4QjM1NCwgLy8g642ULCAjMTQwCisgICAgMHhCMzU4LCAvLyDrjZgsICMyNTIKKyAgICAweEIzNjcsIC8vIOuNpywgIzQ2MworICAgIDB4QjM3MCwgLy8g642wLCAjMTA0CisgICAgMHhCMzc4LCAvLyDrjbgsICM0MjkKKyAgICAweEIzQzQsIC8vIOuPhCwgIzI1CisgICAgMHhCM0M1LCAvLyDrj4UsICMzMDEKKyAgICAweEIzQ0MsIC8vIOuPjCwgIzMwOQorICAgIDB4QjNEOSwgLy8g64+ZLCAjNTgKKyAgICAweEI0MTgsIC8vIOuQmCwgIzgyCisgICAgMHhCNDFDLCAvLyDrkJwsICMxODkKKyAgICAweEI0MjAsIC8vIOuQoCwgIzQwOAorICAgIDB4QjQyOSwgLy8g65CpLCAjMzMyCisgICAgMHhCNDUwLCAvLyDrkZAsICMxOTkKKyAgICAweEI0QTQsIC8vIOuSpCwgIzQ5NgorICAgIDB4QjREQywgLy8g65OcLCAjNDAKKyAgICAweEI0RTAsIC8vIOuToCwgIzI4MworICAgIDB4QjRFNCwgLy8g65OkLCAjNTQKKyAgICAweEI0RUYsIC8vIOuTrywgIzQ3OAorICAgIDB4QjRGMSwgLy8g65OxLCAjOTAKKyAgICAweEI1MTQsIC8vIOuUlCwgIzEzMworICAgIDB4QjUyOSwgLy8g65SpLCAjNDYyCisgICAgMHhCNTMwLCAvLyDrlLAsICMzMzMKKyAgICAweEI1NEMsIC8vIOuVjCwgIzI0MAorICAgIDB4QjYxMCwgLy8g65iQLCAjMzEzCisgICAgMHhCNzdDLCAvLyDrnbwsICM0MgorICAgIDB4Qjc3RCwgLy8g6529LCAjMzU1CisgICAgMHhCNzgwLCAvLyDrnoAsICMyOTAKKyAgICAweEI3OEMsIC8vIOuejCwgIzI0NgorICAgIDB4Qjc4RCwgLy8g656NLCAjNDIwCisgICAgMHhCNzkxLCAvLyDrnpEsICMyNzAKKyAgICAweEI3OTgsIC8vIOuemCwgIzE3NAorICAgIDB4Qjc5OSwgLy8g656ZLCAjMzgxCisgICAgMHhCNzlDLCAvLyDrnpwsICMzNTcKKyAgICAweEI3QTgsIC8vIOueqCwgIzM1OQorICAgIDB4QjdBOSwgLy8g656pLCAjNDAyCisgICAgMHhCN0M5LCAvLyDrn4ksICMzNDYKKyAgICAweEI3RUMsIC8vIOufrCwgIzEzMAorICAgIDB4QjdGMCwgLy8g65+wLCAjMzEyCisgICAgMHhCN0ZDLCAvLyDrn7wsICMzMjcKKyAgICAweEI3RkQsIC8vIOufvSwgIzQ0NworICAgIDB4QjgwNywgLy8g66CHLCAjNDEyCisgICAgMHhCODA4LCAvLyDroIgsICMxMTQKKyAgICAweEI4MEMsIC8vIOugjCwgIzM5NQorICAgIDB4QjgyNCwgLy8g66CkLCAjMTU4CisgICAgMHhCODI1LCAvLyDroKUsICMxOTQKKyAgICAweEI4MjgsIC8vIOugqCwgIzMyNgorICAgIDB4QjgzOSwgLy8g66C5LCAjMzg5CisgICAgMHhCODVDLCAvLyDroZwsICM0CisgICAgMHhCODVELCAvLyDroZ0sICM4NAorICAgIDB4Qjg2MCwgLy8g66GgLCAjMzY2CisgICAgMHhCOENDLCAvLyDro4wsICMxNTQKKyAgICAweEI4RTgsIC8vIOujqCwgIzIzNgorICAgIDB4Qjk1OCwgLy8g66WYLCAjMjY1CisgICAgMHhCOTc0LCAvLyDrpbQsICMyMTIKKyAgICAweEI5NzgsIC8vIOuluCwgIzI1MAorICAgIDB4Qjk3QywgLy8g66W8LCAjMzUKKyAgICAweEI5ODQsIC8vIOumhCwgIzI3NgorICAgIDB4QjlBQywgLy8g66asLCAjMTkKKyAgICAweEI5QUQsIC8vIOumrSwgIzM5NAorICAgIDB4QjlCMCwgLy8g66awLCAjMjU5CisgICAgMHhCOUI0LCAvLyDrprQsICM0ODUKKyAgICAweEI5QkMsIC8vIOumvCwgIzMwNQorICAgIDB4QjlCRCwgLy8g66a9LCAjMjE3CisgICAgMHhCOUMxLCAvLyDrp4EsICMzNTEKKyAgICAweEI5QzgsIC8vIOuniCwgIzY3CisgICAgMHhCOUM5LCAvLyDrp4ksICMzMTAKKyAgICAweEI5Q0MsIC8vIOunjCwgIzY1CisgICAgMHhCOUNFLCAvLyDrp44sICMyNTcKKyAgICAweEI5RDAsIC8vIOunkCwgIzE4OAorICAgIDB4QjlEQiwgLy8g66ebLCAjMzk3CisgICAgMHhCOURELCAvLyDrp50sICMzNzAKKyAgICAweEI5REUsIC8vIOunniwgIzM5OQorICAgIDB4QjlFNCwgLy8g66ekLCAjMTI1CisgICAgMHhCOUU4LCAvLyDrp6gsICM0MjIKKyAgICAweEJBMzgsIC8vIOuouCwgIzMxMQorICAgIDB4QkEzOSwgLy8g66i5LCAjMzc3CisgICAgMHhCQTNDLCAvLyDrqLwsICM0NjkKKyAgICAweEJBNTQsIC8vIOuplCwgIzE0NworICAgIDB4QkE3MCwgLy8g66mwLCAjMTkxCisgICAgMHhCQTc0LCAvLyDrqbQsICM3MgorICAgIDB4QkE4NSwgLy8g66qFLCAjMTMxCisgICAgMHhCQUE4LCAvLyDrqqgsICM3MworICAgIDB4QkFBOSwgLy8g66qpLCAjMTU3CisgICAgMHhCQUIwLCAvLyDrqrAsICM0MDEKKyAgICAweEJBQjgsIC8vIOuquCwgIzQzNworICAgIDB4QkFCQiwgLy8g66q7LCAjMzM2CisgICAgMHhCQjM0LCAvLyDrrLQsICM4MAorICAgIDB4QkIzOCwgLy8g66y4LCAjNTcKKyAgICAweEJCM0MsIC8vIOusvCwgIzk0CisgICAgMHhCQkE0LCAvLyDrrqQsICM0MzEKKyAgICAweEJCRjgsIC8vIOuvuCwgIzc2CisgICAgMHhCQkZDLCAvLyDrr7wsICMyMDAKKyAgICAweEJDMDAsIC8vIOuwgCwgIzMwOAorICAgIDB4QkMwRiwgLy8g67CPLCAjMjQ5CisgICAgMHhCQzE0LCAvLyDrsJQsICM4OQorICAgIDB4QkMxNSwgLy8g67CVLCAjMjI2CisgICAgMHhCQzE4LCAvLyDrsJgsICMxNzUKKyAgICAweEJDMUIsIC8vIOuwmywgIzI0OAorICAgIDB4QkMxQywgLy8g67CcLCAjMTY0CisgICAgMHhCQzI5LCAvLyDrsKksICM5MgorICAgIDB4QkMzMCwgLy8g67CwLCAjMTYyCisgICAgMHhCQzMxLCAvLyDrsLEsICMyNTYKKyAgICAweEJDODQsIC8vIOuyhCwgIzExMQorICAgIDB4QkM4OCwgLy8g67KILCAjMTY3CisgICAgMHhCQzhDLCAvLyDrsowsICM0MjMKKyAgICAweEJDOTQsIC8vIOuylCwgIzQyNworICAgIDB4QkM5NSwgLy8g67KVLCAjMjA3CisgICAgMHhCQ0EwLCAvLyDrsqAsICMyODEKKyAgICAweEJDQTQsIC8vIOuypCwgIzM3OAorICAgIDB4QkNBOCwgLy8g67KoLCAjMzg3CisgICAgMHhCQ0MwLCAvLyDrs4AsICMyNTMKKyAgICAweEJDQzQsIC8vIOuzhCwgIzI2MgorICAgIDB4QkNEMSwgLy8g67ORLCAjMzQwCisgICAgMHhCQ0Y0LCAvLyDrs7QsICMyMAorICAgIDB4QkNGNSwgLy8g67O1LCAjMjA0CisgICAgMHhCQ0Y4LCAvLyDrs7gsICMxODIKKyAgICAweEJDRkMsIC8vIOuzvCwgIzM4NQorICAgIDB4QkQwOSwgLy8g67SJLCAjNDA1CisgICAgMHhCRDgwLCAvLyDrtoAsICM0NgorICAgIDB4QkQ4MSwgLy8g67aBLCAjMjYxCisgICAgMHhCRDg0LCAvLyDrtoQsICMxMDUKKyAgICAweEJEODgsIC8vIOu2iCwgIzIyNQorICAgIDB4QkRGMCwgLy8g67ewLCAjMzUwCisgICAgMHhCRTBDLCAvLyDruIwsICMyMTQKKyAgICAweEJFMTQsIC8vIOu4lCwgIzk5CisgICAgMHhCRTQ0LCAvLyDruYQsICM1NQorICAgIDB4QkU0QywgLy8g67mMLCAjNTEwCisgICAgMHhCRTYwLCAvLyDruaAsICMzOTgKKyAgICAweEMwQUMsIC8vIOyCrCwgIzE0CisgICAgMHhDMEFELCAvLyDsgq0sICMzNDIKKyAgICAweEMwQjAsIC8vIOyCsCwgIzEyMQorICAgIDB4QzBCNCwgLy8g7IK0LCAjMjc5CisgICAgMHhDMEJDLCAvLyDsgrwsICMzNDgKKyAgICAweEMwQzEsIC8vIOyDgSwgIzQxCisgICAgMHhDMEM4LCAvLyDsg4gsICMyODIKKyAgICAweEMwQzksIC8vIOyDiSwgIzE4MQorICAgIDB4QzBERCwgLy8g7IOdLCAjMTA5CisgICAgMHhDMTFDLCAvLyDshJwsICMyMQorICAgIDB4QzExRCwgLy8g7ISdLCAjMjM0CisgICAgMHhDMTIwLCAvLyDshKAsICMxMDcKKyAgICAweEMxMjQsIC8vIOyEpCwgIzE3MAorICAgIDB4QzEzMSwgLy8g7ISxLCAjNTAKKyAgICAweEMxMzgsIC8vIOyEuCwgIzYwCisgICAgMHhDMTM5LCAvLyDshLksICM0NTYKKyAgICAweEMxM0MsIC8vIOyEvCwgIzI2NworICAgIDB4QzE1NCwgLy8g7IWULCAjNDU1CisgICAgMHhDMTU4LCAvLyDshZgsICMyMzcKKyAgICAweEMxNUMsIC8vIOyFnCwgIzQ0OAorICAgIDB4QzE2OCwgLy8g7IWoLCAjNDIxCisgICAgMHhDMThDLCAvLyDshowsICM1MQorICAgIDB4QzE4RCwgLy8g7IaNLCAjMjE5CisgICAgMHhDMTkwLCAvLyDshpAsICMzMjMKKyAgICAweEMxQTEsIC8vIOyGoSwgIzIwMworICAgIDB4QzFDNCwgLy8g7IeELCAjNTAxCisgICAgMHhDMUZDLCAvLyDsh7wsICMzNjQKKyAgICAweEMyMTgsIC8vIOyImCwgIzI3CisgICAgMHhDMjE5LCAvLyDsiJksICM0NjcKKyAgICAweEMyMUMsIC8vIOyInCwgIzI1OAorICAgIDB4QzIyMCwgLy8g7IigLCAjMzAyCisgICAgMHhDMjZDLCAvLyDsiawsICM1MTEKKyAgICAweEMyODgsIC8vIOyKiCwgIzM4NAorICAgIDB4QzJBNCwgLy8g7IqkLCAjMTEKKyAgICAweEMyQUMsIC8vIOyKrCwgIzQzOAorICAgIDB4QzJCNCwgLy8g7Iq0LCAjNTA0CisgICAgMHhDMkI1LCAvLyDsirUsICM3NworICAgIDB4QzJCOSwgLy8g7Iq5LCAjMjk5CisgICAgMHhDMkRDLCAvLyDsi5wsICMxMworICAgIDB4QzJERCwgLy8g7IudLCAjMTM3CisgICAgMHhDMkUwLCAvLyDsi6AsICM0NworICAgIDB4QzJFNCwgLy8g7IukLCAjMTMyCisgICAgMHhDMkVDLCAvLyDsi6wsICMxOTYKKyAgICAweEMyRUQsIC8vIOyLrSwgIzQ4MgorICAgIDB4QzJGNiwgLy8g7Iu2LCAjMzUyCisgICAgMHhDMkY4LCAvLyDsi7gsICM0MTkKKyAgICAweEM0RjAsIC8vIOyTsCwgIzI3OAorICAgIDB4QzUyOCwgLy8g7JSoLCAjMzYwCisgICAgMHhDNTQ0LCAvLyDslYQsICMyMworICAgIDB4QzU0NSwgLy8g7JWFLCAjMjk2CisgICAgMHhDNTQ4LCAvLyDslYgsICM3MQorICAgIDB4QzU0QSwgLy8g7JWKLCAjMjA5CisgICAgMHhDNTRDLCAvLyDslYwsICMyMjIKKyAgICAweEM1NTQsIC8vIOyVlCwgIzQ2MAorICAgIDB4QzU1OCwgLy8g7JWYLCAjMzQ5CisgICAgMHhDNTU5LCAvLyDslZksICM0NzMKKyAgICAweEM1NUUsIC8vIOyVniwgIzQzNAorICAgIDB4QzU2MCwgLy8g7JWgLCAjMjcxCisgICAgMHhDNTYxLCAvLyDslaEsICM0MTUKKyAgICAweEM1NzEsIC8vIOyVsSwgIzQ3NworICAgIDB4QzU3QywgLy8g7JW8LCAjMTI0CisgICAgMHhDNTdELCAvLyDslb0sICMyMjkKKyAgICAweEM1OTEsIC8vIOyWkSwgIzE3NworICAgIDB4QzVCNCwgLy8g7Ja0LCAjMjQKKyAgICAweEM1QjUsIC8vIOyWtSwgIzQwNworICAgIDB4QzVCOCwgLy8g7Ja4LCAjMjk0CisgICAgMHhDNUJDLCAvLyDslrwsICMzNTYKKyAgICAweEM1QzQsIC8vIOyXhCwgIzQyNgorICAgIDB4QzVDNSwgLy8g7JeFLCAjMTE4CisgICAgMHhDNUM2LCAvLyDsl4YsICMxNzgKKyAgICAweEM1QzgsIC8vIOyXiCwgIzE2NQorICAgIDB4QzVEMCwgLy8g7JeQLCAjOQorICAgIDB4QzVENCwgLy8g7JeULCAjMzc1CisgICAgMHhDNUQ4LCAvLyDsl5gsICM1MDYKKyAgICAweEM1RUMsIC8vIOyXrCwgIzY2CisgICAgMHhDNUVELCAvLyDsl60sICMxODYKKyAgICAweEM1RUUsIC8vIOyXriwgIzQ4OAorICAgIDB4QzVGMCwgLy8g7JewLCAjOTYKKyAgICAweEM1RjQsIC8vIOyXtCwgIzI2NgorICAgIDB4QzVGQywgLy8g7Je8LCAjNDQ5CisgICAgMHhDNjAwLCAvLyDsmIAsICMzNzQKKyAgICAweEM2MDEsIC8vIOyYgSwgIzgzCisgICAgMHhDNjA4LCAvLyDsmIgsICMxNjgKKyAgICAweEM2MjQsIC8vIOyYpCwgIzc1CisgICAgMHhDNjI4LCAvLyDsmKgsICMzMDAKKyAgICAweEM2MkMsIC8vIOyYrCwgIzMwNgorICAgIDB4QzY0MCwgLy8g7JmALCAjMTE5CisgICAgMHhDNjQ0LCAvLyDsmYQsICMzNjEKKyAgICAweEM2NTQsIC8vIOyZlCwgIzQ4OQorICAgIDB4QzY1NSwgLy8g7JmVLCAjNDE4CisgICAgMHhDNjc4LCAvLyDsmbgsICMyMTgKKyAgICAweEM2OTQsIC8vIOyalCwgIzQzCisgICAgMHhDNjk1LCAvLyDsmpUsICM0NzkKKyAgICAweEM2QTksIC8vIOyaqSwgIzQ4CisgICAgMHhDNkIwLCAvLyDsmrAsICM2NAorICAgIDB4QzZCMSwgLy8g7JqxLCAjNTAzCisgICAgMHhDNkI0LCAvLyDsmrQsICMxMDgKKyAgICAweEM2QjgsIC8vIOyauCwgIzIyMworICAgIDB4QzZDMCwgLy8g7JuALCAjMzE3CisgICAgMHhDNkMzLCAvLyDsm4MsICM0MDQKKyAgICAweEM2Q0MsIC8vIOybjCwgIzI4MAorICAgIDB4QzZEMCwgLy8g7JuQLCAjNDUKKyAgICAweEM2RDQsIC8vIOyblCwgIzE1MAorICAgIDB4QzZFOCwgLy8g7JuoLCAjNDQ2CisgICAgMHhDNkY5LCAvLyDsm7ksICM1MDAKKyAgICAweEM3MDQsIC8vIOychCwgIzc4CisgICAgMHhDNzIwLCAvLyDsnKAsICM4MQorICAgIDB4QzcyMSwgLy8g7JyhLCAjMzIxCisgICAgMHhDNzI0LCAvLyDsnKQsICM0MTYKKyAgICAweEM3M0MsIC8vIOycvCwgIzQ5CisgICAgMHhDNzQwLCAvLyDsnYAsICMzMQorICAgIDB4Qzc0NCwgLy8g7J2ELCAjMTcKKyAgICAweEM3NEMsIC8vIOydjCwgIzExMgorICAgIDB4Qzc1MSwgLy8g7J2RLCAjNDYxCisgICAgMHhDNzU4LCAvLyDsnZgsICM4CisgICAgMHhDNzc0LCAvLyDsnbQsICMxCisgICAgMHhDNzc1LCAvLyDsnbUsICM0MDMKKyAgICAweEM3NzgsIC8vIOyduCwgIzE4CisgICAgMHhDNzdDLCAvLyDsnbwsICMyOAorICAgIDB4Qzc4NCwgLy8g7J6ELCAjMTYwCisgICAgMHhDNzg1LCAvLyDsnoUsICM5MworICAgIDB4Qzc4OCwgLy8g7J6ILCAjNDQKKyAgICAweEM3OTAsIC8vIOyekCwgIzIyCisgICAgMHhDNzkxLCAvLyDsnpEsICM4OAorICAgIDB4Qzc5OCwgLy8g7J6YLCAjMzQ3CisgICAgMHhDN0ExLCAvLyDsnqEsICMzNzIKKyAgICAweEM3QTUsIC8vIOyepSwgIzUzCisgICAgMHhDN0FDLCAvLyDsnqwsICMxMjAKKyAgICAweEM3QzEsIC8vIOyfgSwgIzQ4MworICAgIDB4QzgwMCwgLy8g7KCALCAjOTgKKyAgICAweEM4MDEsIC8vIOyggSwgIzk3CisgICAgMHhDODA0LCAvLyDsoIQsICMzNAorICAgIDB4QzgwOCwgLy8g7KCILCAjMzIwCisgICAgMHhDODEwLCAvLyDsoJAsICMyMDEKKyAgICAweEM4MTEsIC8vIOygkSwgIzMzMQorICAgIDB4QzgxNSwgLy8g7KCVLCAjMjYKKyAgICAweEM4MUMsIC8vIOygnCwgIzI5CisgICAgMHhDODM4LCAvLyDsoLgsICM0MTQKKyAgICAweEM4NzAsIC8vIOyhsCwgIzg2CisgICAgMHhDODcxLCAvLyDsobEsICMzNzMKKyAgICAweEM4NzQsIC8vIOyhtCwgIzQzMgorICAgIDB4Qzg4MCwgLy8g7KKALCAjNDcwCisgICAgMHhDODg1LCAvLyDsooUsICMyMDgKKyAgICAweEM4OEIsIC8vIOyiiywgIzIzOQorICAgIDB4QzhFMCwgLy8g7KOgLCAjNDUxCisgICAgMHhDOEZDLCAvLyDso7wsICMzOAorICAgIDB4QzhGRCwgLy8g7KO9LCAjNDcxCisgICAgMHhDOTAwLCAvLyDspIAsICMyODYKKyAgICAweEM5MDQsIC8vIOykhCwgIzM5MgorICAgIDB4QzkxMSwgLy8g7KSRLCAjMTAzCisgICAgMHhDOTg4LCAvLyDspogsICMyNTUKKyAgICAweEM5OEMsIC8vIOymjCwgIzUwNworICAgIDB4Qzk5MCwgLy8g7KaQLCAjMzcxCisgICAgMHhDOTlELCAvLyDspp0sICMyNjAKKyAgICAweEM5QzAsIC8vIOyngCwgIzEwCisgICAgMHhDOUMxLCAvLyDsp4EsICMyMTYKKyAgICAweEM5QzQsIC8vIOynhCwgIzc5CisgICAgMHhDOUM4LCAvLyDsp4gsICMyMzgKKyAgICAweEM5RDEsIC8vIOynkSwgIzIwNgorICAgIDB4QzlEQywgLy8g7KecLCAjNDExCisgICAgMHhDOUY4LCAvLyDsp7gsICM0OTQKKyAgICAweENBQkQsIC8vIOyqvSwgIzQzNQorICAgIDB4Q0MyOCwgLy8g7LCoLCAjMTQ2CisgICAgMHhDQzI5LCAvLyDssKksICM0NDMKKyAgICAweENDMkMsIC8vIOywrCwgIzQ4MQorICAgIDB4Q0MzMCwgLy8g7LCwLCAjNDQwCisgICAgMHhDQzM4LCAvLyDssLgsICMzNDMKKyAgICAweENDM0QsIC8vIOywvSwgIzMwNAorICAgIDB4Q0MzRSwgLy8g7LC+LCAjMzM1CisgICAgMHhDQzQ0LCAvLyDssYQsICMyODQKKyAgICAweENDNDUsIC8vIOyxhSwgIzI5OAorICAgIDB4Q0M5OCwgLy8g7LKYLCAjMjQyCisgICAgMHhDQzlDLCAvLyDsspwsICMxNDMKKyAgICAweENDQTAsIC8vIOyyoCwgIzM4MAorICAgIDB4Q0NBOCwgLy8g7LKoLCAjNDUyCisgICAgMHhDQ0FCLCAvLyDssqssICM0ODQKKyAgICAweENDQUQsIC8vIOyyrSwgIzE5NworICAgIDB4Q0NCNCwgLy8g7LK0LCAjMTI2CisgICAgMHhDQ0QwLCAvLyDss5AsICM0NzIKKyAgICAweENEMDgsIC8vIOy0iCwgIzIyMAorICAgIDB4Q0QxRCwgLy8g7LSdLCAjNDA2CisgICAgMHhDRDVDLCAvLyDstZwsICMxNzkKKyAgICAweENEOTQsIC8vIOy2lCwgIzEzNgorICAgIDB4Q0Q5NSwgLy8g7LaVLCAjMzM3CisgICAgMHhDRDlDLCAvLyDstpwsICMxNjYKKyAgICAweENEQTksIC8vIOy2qSwgIzM2OQorICAgIDB4Q0RFOCwgLy8g7LeoLCAjMjEwCisgICAgMHhDRTIwLCAvLyDsuKAsICMyMTUKKyAgICAweENFMjEsIC8vIOy4oSwgIzQ2OAorICAgIDB4Q0UzNSwgLy8g7Li1LCAjNTEyCisgICAgMHhDRTU4LCAvLyDsuZgsICMxMDIKKyAgICAweENFNUMsIC8vIOy5nCwgIzMyNQorICAgIDB4Q0U2OCwgLy8g7LmoLCAjMjYzCisgICAgMHhDRTc0LCAvLyDsubQsICMxMTUKKyAgICAweENFN0MsIC8vIOy5vCwgIzQ2NgorICAgIDB4Q0U5MCwgLy8g7LqQLCAjNDU0CisgICAgMHhDRUU0LCAvLyDsu6QsICMyODUKKyAgICAweENFRTgsIC8vIOy7qCwgIzMyOAorICAgIDB4Q0VGNCwgLy8g7Lu0LCAjNDE3CisgICAgMHhDRjAwLCAvLyDsvIAsICMzMzkKKyAgICAweENGMTMsIC8vIOy8kywgIzUwOQorICAgIDB4Q0YxQywgLy8g7LycLCAjNTA4CisgICAgMHhDRjU0LCAvLyDsvZQsICMxOTMKKyAgICAweENGNTgsIC8vIOy9mCwgIzM5MQorICAgIDB4Q0ZFMCwgLy8g7L+gLCAjMzkzCisgICAgMHhEMDM1LCAvLyDtgLUsICM0NTMKKyAgICAweEQwNkMsIC8vIO2BrCwgIzEwMQorICAgIDB4RDA3MCwgLy8g7YGwLCAjNDk1CisgICAgMHhEMDc0LCAvLyDtgbQsICMyODkKKyAgICAweEQwQTQsIC8vIO2CpCwgIzIzMAorICAgIDB4RDBDMCwgLy8g7YOALCAjMTI3CisgICAgMHhEMEMxLCAvLyDtg4EsICMzMTQKKyAgICAweEQwQzQsIC8vIO2DhCwgIzQ1MAorICAgIDB4RDBDOCwgLy8g7YOILCAjNDM2CisgICAgMHhEMERDLCAvLyDtg5wsICMyMjEKKyAgICAweEQwREQsIC8vIO2DnSwgIzI3NQorICAgIDB4RDEzMCwgLy8g7YSwLCAjNzAKKyAgICAweEQxNEMsIC8vIO2FjCwgIzIxMworICAgIDB4RDE1MCwgLy8g7YWQLCAjMzI0CisgICAgMHhEMTU0LCAvLyDthZQsICM0MzAKKyAgICAweEQxNUMsIC8vIO2FnCwgIzM4MgorICAgIDB4RDFBMCwgLy8g7YagLCAjMTQ1CisgICAgMHhEMUI1LCAvLyDthrUsICMxNTYKKyAgICAweEQyMkMsIC8vIO2IrCwgIzIyNworICAgIDB4RDJCOCwgLy8g7Yq4LCAjMzcKKyAgICAweEQyQjksIC8vIO2KuSwgIzI0NworICAgIDB4RDJGMCwgLy8g7YuwLCAjMTg3CisgICAgMHhEMzA1LCAvLyDtjIUsICM0MTAKKyAgICAweEQzMEMsIC8vIO2MjCwgIzE0MQorICAgIDB4RDMxMCwgLy8g7YyQLCAjMTYzCisgICAgMHhEMzE0LCAvLyDtjJQsICM0OTkKKyAgICAweEQzMjgsIC8vIO2MqCwgIzMwNworICAgIDB4RDMyQywgLy8g7YysLCAjNDU5CisgICAgMHhEMzM4LCAvLyDtjLgsICM0MzMKKyAgICAweEQzN0MsIC8vIO2NvCwgIzM0NAorICAgIDB4RDM5OCwgLy8g7Y6YLCAjMTcyCisgICAgMHhEM0I4LCAvLyDtjrgsICMyNTEKKyAgICAweEQzQzksIC8vIO2PiSwgIzI5MQorICAgIDB4RDNFQywgLy8g7Y+sLCAjNjgKKyAgICAweEQzRUQsIC8vIO2PrSwgIzQ0NQorICAgIDB4RDNGMCwgLy8g7Y+wLCAjMzE4CisgICAgMHhENDVDLCAvLyDtkZwsICMyMzIKKyAgICAweEQ0ODAsIC8vIO2SgCwgIzQ5NworICAgIDB4RDQ4OCwgLy8g7ZKILCAjMTEzCisgICAgMHhENDhELCAvLyDtko0sICM0MjUKKyAgICAweEQ1MDQsIC8vIO2UhCwgIzExMAorICAgIDB4RDUwOCwgLy8g7ZSILCAjNDk4CisgICAgMHhENTBDLCAvLyDtlIwsICMyMTEKKyAgICAweEQ1M0MsIC8vIO2UvCwgIzE2OQorICAgIDB4RDU0NCwgLy8g7ZWELCAjMjk1CisgICAgMHhENTUxLCAvLyDtlZEsICMzNzYKKyAgICAweEQ1NTgsIC8vIO2VmCwgIzcKKyAgICAweEQ1NTksIC8vIO2VmSwgIzEyOQorICAgIDB4RDU1QywgLy8g7ZWcLCAjMTUKKyAgICAweEQ1NjAsIC8vIO2VoCwgIzE0NAorICAgIDB4RDU2OCwgLy8g7ZWoLCAjMTUyCisgICAgMHhENTY5LCAvLyDtlaksICMxMjMKKyAgICAweEQ1NkQsIC8vIO2VrSwgIzI2OAorICAgIDB4RDU3NCwgLy8g7ZW0LCAjMzIKKyAgICAweEQ1ODgsIC8vIO2WiCwgIzE4MAorICAgIDB4RDU4OSwgLy8g7ZaJLCAjMTM1CisgICAgMHhENUE1LCAvLyDtlqUsICMzNDUKKyAgICAweEQ1QzgsIC8vIO2XiCwgIzM5NgorICAgIDB4RDVEOCwgLy8g7ZeYLCAjMzE2CisgICAgMHhENUU0LCAvLyDtl6QsICM0NzQKKyAgICAweEQ2MDQsIC8vIO2YhCwgIzE4NQorICAgIDB4RDYxMSwgLy8g7ZiRLCAjMzE1CisgICAgMHhENjE1LCAvLyDtmJUsICMyNDQKKyAgICAweEQ2MUMsIC8vIO2YnCwgIzQyOAorICAgIDB4RDYzOCwgLy8g7Zi4LCAjMTE3CisgICAgMHhENjNDLCAvLyDtmLwsICMzNTgKKyAgICAweEQ2NDgsIC8vIO2ZiCwgIzMzMAorICAgIDB4RDY0RCwgLy8g7ZmNLCAjMzYzCisgICAgMHhENjU0LCAvLyDtmZQsICM2MworICAgIDB4RDY1NSwgLy8g7ZmVLCAjMTgzCisgICAgMHhENjU4LCAvLyDtmZgsICMyMjQKKyAgICAweEQ2NUMsIC8vIO2ZnCwgIzI3NworICAgIDB4RDY2OSwgLy8g7ZmpLCAjMzUzCisgICAgMHhENjhDLCAvLyDtmowsICM3NAorICAgIDB4RDY4RCwgLy8g7ZqNLCAjNDU4CisgICAgMHhENjlGLCAvLyDtmp8sICM0MDkKKyAgICAweEQ2QTgsIC8vIO2aqCwgIzQwMAorICAgIDB4RDZDNCwgLy8g7ZuELCAjMTc2CisgICAgMHhENkM4LCAvLyDtm4gsICM0ODYKKyAgICAweEQ3MzQsIC8vIO2ctCwgIzM2NQorICAgIDB4RDc1NCwgLy8g7Z2ULCAjNDgwCisgICAgMHhENzZDLCAvLyDtnawsICMzMzQKKyAgICAweEQ3ODgsIC8vIO2eiCwgIzIyOAorICAgIDB4RDc5OCwgLy8g7Z6YLCAjNTAyCit9OworLy8gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNhbXBsZSBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjaGFyYWN0ZXJzCitzdGF0aWMgY29uc3QgZmxvYXQgZnJlcXVlbnRfa29fY292ZXJhZ2U9MC45NDgxNTcwMjE0NjQxODQ7CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggZTAyMTA3Zi4uMzQ2YTE5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBSRVNUT1JFX09VVFBVVCwKICAgICBPUEVOX0lOUFVULAogICAgIENMT1NFX0lOUFVULAotICAgIFNFVF9TVFJFQU1fT1VUUFVULAorICAgIElOVkFMSURBVEVfU1RSRUFNLAogICAgIFNFVF9WT0lDRV9WT0xVTUUsCiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKICAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCkBAIC03NCw2ICs3NCwxMyBAQAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFLAogICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwKICAgICBTRVRfTE9XX1JBTV9ERVZJQ0UsCisgICAgTElTVF9BVURJT19QT1JUUywKKyAgICBHRVRfQVVESU9fUE9SVCwKKyAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCisgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICBMSVNUX0FVRElPX1BBVENIRVMsCisgICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAorICAgIEdFVF9BVURJT19IV19TWU5DCiB9OwogCiBjbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgpAQCAtODksMTMgKzk2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKQEAgLTEwNiw5ICsxMTIsMTEgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBwRnJhbWVDb3VudCAhPSBOVUxMID8gKnBGcmFtZUNvdW50IDogMDsKICAgICAgICAgZGF0YS53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICB0cmFja19mbGFnc190IGxGbGFncyA9IGZsYWdzICE9IE5VTEwgPyAqZmxhZ3MgOiAodHJhY2tfZmxhZ3NfdCkgVFJBQ0tfREVGQVVMVDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7CisgICAgICAgIC8vIGhhdmVTaGFyZWRCdWZmZXIKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodHJ1ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZEJ1ZmZlci0+YXNCaW5kZXIoKSk7CkBAIC0xMTcsNyArMTI1LDcgQEAKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0KQEAgLTEyNyw2ICsxMzUsMTAgQEAKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlcGx5LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaWYgKHBGcmFtZUNvdW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgfQogICAgICAgICAgICAgbEZsYWdzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKQEAgLTEzNSwxMSArMTQ3LDIxIEBACiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSByZXBseS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdHJhY2sgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9UcmFjaz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIik7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRyYWNrOwpAQCAtMTUwLDEwICsxNzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTYzLDE5ICsxODgsMjcgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBwRnJhbWVDb3VudCAhPSBOVUxMID8gKnBGcmFtZUNvdW50IDogMDsKICAgICAgICAgZGF0YS53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICB0cmFja19mbGFnc190IGxGbGFncyA9IGZsYWdzICE9IE5VTEwgPyAqZmxhZ3MgOiAodHJhY2tfZmxhZ3NfdCkgVFJBQ0tfREVGQVVMVDsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzICE9IE5VTEwgPyAqbm90aWZpY2F0aW9uRnJhbWVzIDogMCk7CisgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgYnVmZmVycy5jbGVhcigpOwogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fUkVDT1JELCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChwRnJhbWVDb3VudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxGbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGZsYWdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAqZmxhZ3MgPSBsRmxhZ3M7CkBAIC0xODQsMjEgKzIxNyw0MiBAQAogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgbE5vdGlmaWNhdGlvbkZyYW1lcyA9IChzaXplX3QpIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IGxOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9SZWNvcmQ+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJzID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJzICE9IDAgJiYgYnVmZmVycy0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBJQXVkaW9SZWNvcmQiKTsKICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBjYmxrIik7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgaXMgcGVybWl0dGVkIHRvIGJlIDAKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSAwIHx8IGNibGsgIT0gMCB8fCBidWZmZXJzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkLCBjYmxrLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBidWZmZXJzIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlY29yZDsKQEAgLTM4MSw1MCArNDM1LDQwIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2VzID09IE5VTEwgfHwgbGF0ZW5jeU1zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gcExhdGVuY3lNcyAhPSBOVUxMID8gKnBMYXRlbmN5TXMgOiAwOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZHVsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobGF0ZW5jeSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2VzKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgZmxhZ3MpOwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZShvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBsYXRlbmN5ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwTGF0ZW5jeU1zICE9IE5VTEwpICpwTGF0ZW5jeU1zID0gbGF0ZW5jeTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsICpvdXRwdXQpOworICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICpkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKmxhdGVuY3lNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC00NjUsMzYgKzUwOSw0MCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKKyAgICAgICAgaWYgKGlucHV0ID09IE5VTEwgfHwgY29uZmlnID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqZGV2aWNlKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICppbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChpbnQgaW5wdXQpCkBAIC01MDYsMTMgKzU1NCwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TVFJFQU1fT1VUUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU5WQUxJREFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTUzNSwxMSArNTgyLDExIEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICB1aW50MzJfdCB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChoYWxGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChoYWxGcmFtZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpoYWxGcmFtZXMgPSB0bXA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChkc3BGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChkc3BGcmFtZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSB0bXA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU1MSwzNSArNTk4LDQwIEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodWludDMyX3QpIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE5FV19BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpbnQgaWQgPSAwOworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlkID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIGludCBwaWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY1Nyw3ICs3MDksNyBAQAogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwotICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjc1LDcgKzcyNyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmlkID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC02ODUsNyArNzM3LDcgQEAKICAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogCkBAIC03MzcsNyArNzg5LDExMiBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xPV19SQU1fREVWSUNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQotCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykKKyAgICB7CisgICAgICAgIGlmIChudW1fcG9ydHMgPT0gTlVMTCB8fCAqbnVtX3BvcnRzID09IDAgfHwgcG9ydHMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKm51bV9wb3J0cyk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BPUlRTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKm51bV9wb3J0cyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJlcGx5LnJlYWQocG9ydHMsICpudW1fcG9ydHMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCisgICAgeworICAgICAgICBpZiAocG9ydCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fUE9SVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIGlmIChwYXRjaCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgZGF0YS53cml0ZShoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0FVRElPX1BBVENILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX0FVRElPX1BBVENILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKKyAgICB7CisgICAgICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICpudW1fcGF0Y2hlcyA9PSAwIHx8IHBhdGNoZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKm51bV9wYXRjaGVzKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUEFUQ0hFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpudW1fcGF0Y2hlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJlcGx5LnJlYWQocGF0Y2hlcywgKm51bV9wYXRjaGVzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKKyAgICB7CisgICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ09ORklHLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBhdWRpb19od19zeW5jX3QgZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BVURJT19IV19TWU5DLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYXVkaW9faHdfc3luY190KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXIsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXIiKTsKQEAgLTc2NSw3ICs5MjIsNiBAQAogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzggbmFtZTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKICAgICAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKICAgICAgICAgICAgIGlmICgoaGF2ZVNoYXJlZEJ1ZmZlciAmJiAoYnVmZmVyID09IDApKSB8fApAQCAtNzc1LDEyICs5MzEsMTMgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHJhY2sgPSBjcmVhdGVUcmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgJmZsYWdzLCBidWZmZXIsIG91dHB1dCwgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb25JZCwgbmFtZSwgY2xpZW50VWlkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAmZnJhbWVDb3VudCwgJmZsYWdzLCBidWZmZXIsIG91dHB1dCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb25JZCwgY2xpZW50VWlkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCh0cmFjayAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KG5hbWUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcih0cmFjay0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03OTUsMTQgKzk1MiwyMyBAQAogICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCBmbGFncyA9ICh0cmFja19mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgICAgICAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBvcGVuUmVjb3JkKGlucHV0LAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgY2JsaywgYnVmZmVycywgJnN0YXR1cyk7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChyZWNvcmQgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmVjb3JkLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYmxrLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTQU1QTEVfUkFURTogewpAQCAtOTIyLDMyICsxMDg4LDIzIEBACiAgICAgICAgIGNhc2UgT1BFTl9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzKGRhdGEucmVhZFN0cmluZzgoKSk7CiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgaGFzT2ZmbG9hZEluZm8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgIGlmIChoYXNPZmZsb2FkSW5mbykgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmb2ZmbG9hZEluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3Blbk91dHB1dChtb2R1bGUsICZvdXRwdXQsICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLCBhZGRyZXNzLCAmbGF0ZW5jeU1zLCBmbGFncyk7CisgICAgICAgICAgICBBTE9HVigiT1BFTl9PVVRQVVQgb3V0cHV0LCAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW91dHB1dCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3lNcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBvcGVuT3V0cHV0KG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09mZmxvYWRJbmZvID8gJm9mZmxvYWRJbmZvIDogTlVMTCk7Ci0gICAgICAgICAgICBBTE9HVigiT1BFTl9PVVRQVVQgb3V0cHV0LCAlcCIsIG91dHB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsYXRlbmN5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBPUEVOX0RVUExJQ0FURV9PVVRQVVQ6IHsKQEAgLTk3NSwyMSArMTEzMiwyMiBAQAogICAgICAgICBjYXNlIE9QRU5fSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlID0gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBvcGVuSW5wdXQobW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgaW5wdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9wZW5JbnB1dChtb2R1bGUsICZpbnB1dCwgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBpbnB1dCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0xPU0VfSU5QVVQ6IHsKQEAgLTk5NywxMSArMTE1NSwxMCBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2xvc2VJbnB1dCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfU1RSRUFNX09VVFBVVDogeworICAgICAgICBjYXNlIElOVkFMSURBVEVfU1RSRUFNOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFN0cmVhbU91dHB1dCgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtLCBvdXRwdXQpKTsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6IHsKQEAgLTEwMjYsMjQgKzExODMsMjYgQEAKICAgICAgICAgY2FzZSBHRVRfSU5QVVRfRlJBTUVTX0xPU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE5FV19BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9TZXNzaW9uSWQoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1VuaXF1ZUlkKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFDUVVJUkVfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIGludCBwaWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBRVUVSWV9OVU1fRUZGRUNUUzogewpAQCAtMTEyOCw2ICsxMjg3LDgxIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRMb3dSYW1EZXZpY2UoaXNMb3dSYW1EZXZpY2UpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9wb3J0cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BvcnQgKiljYWxsb2MobnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BvcnRzKCZudW1fcG9ydHMsIHBvcnRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtX3BvcnRzKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBvcnRzLCBudW1fcG9ydHMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvcnQoJnBvcnQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3BhdGNoZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzID0KKyAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBhdWRpb19wYXRjaCAqKWNhbGxvYyhudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bV9wYXRjaGVzKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJnBhdGNoZXMsIG51bV9wYXRjaGVzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX0hXX1NZTkM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggNGJlM2MwOS4uMjU2Y2IzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTU3LDcgKzU3LDE4IEBACiAgICAgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORywKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKLSAgICBJU19PRkZMT0FEX1NVUFBPUlRFRAorICAgIElTX09GRkxPQURfU1VQUE9SVEVELAorICAgIExJU1RfQVVESU9fUE9SVFMsCisgICAgR0VUX0FVRElPX1BPUlQsCisgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgTElTVF9BVURJT19QQVRDSEVTLAorICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgICBSRUdJU1RFUl9DTElFTlQsCisgICAgR0VUX09VVFBVVF9GT1JfQVRUUiwKKyAgICBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICAgIFJFTEVBU0VfU09VTkRUUklHR0VSX1NFU1NJT04sCisgICAgR0VUX1BIT05FX1NUQVRFCiB9OwogCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgpAQCAtMTM3LDYgKzE0OCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOworICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwogICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ3LDYgKzE1OSwzNiBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJXcml0aW5nIE5VTEwgYXVkaW8gYXR0cmlidXRlcyAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGF1ZGlvX2lvX2hhbmRsZV90KSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZShhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlKG9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1VUUFVUX0ZPUl9BVFRSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtMTg2LDcgKzIyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xOTUsMzMgKzIzOCw0MCBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMzg5LDcgKzQzOSwxODYgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoJmluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfT0ZGTE9BRF9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gKHBvcnRzID09IE5VTEwpID8gMCA6ICpudW1fcG9ydHM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyb2xlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHR5cGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUG9ydHNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bV9wb3J0cyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gKm51bV9wb3J0cykgeworICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gKm51bV9wb3J0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIGlmIChwYXRjaCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgZGF0YS53cml0ZShoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0FVRElPX1BBVENILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gKHBhdGNoZXMgPT0gTlVMTCkgPyAwIDogKm51bV9wYXRjaGVzOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUGF0Y2hlc1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICpudW1fcGF0Y2hlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAqbnVtX3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gKm51bV9wYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCB8fCBpb0hhbmRsZSA9PSBOVUxMIHx8IGRldmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QSE9ORV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGF1ZGlvX21vZGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC00NzMsMTMgKzcwMiwzOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGRhdGEucmVhZChhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGhhc09mZmxvYWRJbmZvID8gJm9mZmxvYWRJbmZvIDogTlVMTCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBjYXNlIFNUQVJUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00ODcsMTAgKzc0MSwxMSBAQAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNTA5LDExICs3NjQsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBnZXRJbnB1dChpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KGlucHV0KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MjEsMjEgKzc3OCwyNCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0KSkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCkpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3Nlc3Npb25fdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTYzMyw3ICs4OTMsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIGluUGFzdE1zKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTY0MSw3ICs5MDEsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgaW5QYXN0TXMpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC02ODQsNiArOTQ0LDEzNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSA9IChhdWRpb19wb3J0X3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Qb3J0cyA9IG51bVBvcnRzUmVxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BvcnQgKiljYWxsb2MobnVtUG9ydHNSZXEsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBvcnRzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQ7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgZGF0YS5yZWFkKCZwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19QQVRDSEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXMgPSBudW1QYXRjaGVzUmVxOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BhdGNoICopY2FsbG9jKG51bVBhdGNoZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUGF0Y2hlcygmbnVtUGF0Y2hlcywgcGF0Y2hlcywgJmdlbmVyYXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBhdGNoZXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gbnVtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gbnVtUGF0Y2hlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2VuZXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBhdGNoZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFR0lTVEVSX0NMSUVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZWdpc3RlckNsaWVudChjbGllbnQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZzZXNzaW9uLCAmaW9IYW5kbGUsICZkZXZpY2UpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFJFTEVBU0VfU09VTkRUUklHR0VSX1NFU1NJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PigKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfUEhPTkVfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClnZXRQaG9uZVN0YXRlKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMjI3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIFBPUlRfTElTVF9VUERBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIFBBVENIX0xJU1RfVVBEQVRFCit9OworCitjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgoreworcHVibGljOgorICAgIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQT1JUX0xJU1RfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CisKKyAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBBVENIX0xJU1RfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Iik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICBjYXNlIFBPUlRfTElTVF9VUERBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIFBBVENIX0xJU1RfVVBEQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAppbmRleCA0YTdkZTY1Li44YTRhMzgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7Ci0gICAgR0VUX0NCTEsgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIFVOVVNFRF9XQVNfR0VUX0NCTEsgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFNUQVJULAogICAgIFNUT1AKIH07CkBAIC00MiwxOCArNDIsNiBAQAogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUmVjb3JkOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYmxrOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LCBpbnQgdHJpZ2dlclNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC04NiwxMSArNzQsNiBAQAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9SZWNvcmQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihnZXRDYmxrKCktPmFzQmluZGVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVJUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUmVjb3JkLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQgPSBkYXRhLnJlYWRJbnQzMigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCmluZGV4IGU5ZGY3MDQuLjI2NWJiMWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKQEAgLTYwLDYgKzYwLDkgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNibGs7CiAgICAgfQpAQCAtMTIyLDYgKzEyNSw5IEBACiAgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlciAhPSAwICYmICgqYnVmZmVyKS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCmluZGV4IGYxYTZhOWYuLjE5MDQ4MzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgU0lHTiwKICAgICBTSUdOX1JTQSwKICAgICBWRVJJRlksCi0gICAgU0VUX0xJU1RFTkVSCisgICAgU0VUX0xJU1RFTkVSLAorICAgIFVOUFJPVklTSU9OX0RFVklDRQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTIyOSw2ICsyMzAsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUFJPVklTSU9OX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNjE5LDYgKzYyOSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBVTlBST1ZJU0lPTl9ERVZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB1bnByb3Zpc2lvbkRldmljZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1NFQ1VSRV9TVE9QUzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKaW5kZXggYTMwM2E4Zi4uYjk0MDEyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKQEAgLTExNyw2ICsxMTcsOSBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDUkVBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIENPVU5UX0NPREVDUywKKyAgICBHRVRfQ09ERUNfSU5GTywKKyAgICBGSU5EX0NPREVDX0JZX1RZUEUsCisgICAgRklORF9DT0RFQ19CWV9OQU1FLAorfTsKKworY2xhc3MgQnBNZWRpYUNvZGVjTGlzdDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4KK3sKK3B1YmxpYzoKKyAgICBCcE1lZGlhQ29kZWNMaXN0KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09VTlRfQ09ERUNTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT0RFQ19JTkZPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmNvZGVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXJ0SW5kZXgpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRklORF9DT0RFQ19CWV9UWVBFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5EX0NPREVDX0JZX05BTUUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhQ29kZWNMaXN0LCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFDb2RlY0xpc3QiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbk1lZGlhQ29kZWNMaXN0OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgQ09VTlRfQ09ERUNTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBjb3VudENvZGVjcygpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfQ09ERUNfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjTGlzdCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gZ2V0Q29kZWNJbmZvKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihPSyk7CisgICAgICAgICAgICAgICAgaW5mby0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKC1FUkFOR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydEluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBmaW5kQ29kZWNCeVR5cGUodHlwZSwgaXNFbmNvZGVyLCBzdGFydEluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9OQU1FOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmRDb2RlY0J5TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAppbmRleCA5ZGI1YjFiLi4xMGI0OTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcApAQCAtNzUsNyArNzUsNyBAQAogfQogCiB2b2lkCi1JTWVkaWFEZWF0aE5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKK0lNZWRpYURlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIEFMT0dXKCJtZWRpYSBzZXJ2ZXIgZGllZCIpOwogCiAgICAgLy8gTmVlZCB0byBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklNZWRpYUhUVFBDb25uZWN0aW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIENPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIERJU0NPTk5FQ1QsCisgICAgUkVBRF9BVCwKKyAgICBHRVRfU0laRSwKKyAgICBHRVRfTUlNRV9UWVBFLAorICAgIEdFVF9VUkkKK307CisKK3N0cnVjdCBCcE1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhSFRUUENvbm5lY3Rpb24+IHsKKyAgICBCcE1lZGlhSFRUUENvbm5lY3Rpb24oY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SU1lZGlhSFRUUENvbm5lY3Rpb24+KGltcGwpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgU3RyaW5nMTYgdG1wKHVyaSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNih0bXApOworCisgICAgICAgIHRtcCA9IFN0cmluZzE2KCIiKTsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFkZXJzLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIFN0cmluZzE2IGtleShoZWFkZXJzLT5rZXlBdChpKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nMTYgdmFsKGhlYWRlcnMtPnZhbHVlQXQoaSkuc3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChrZXkpOworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nMTYoIjogIikpOworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQodmFsKTsKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzE2KCJcclxuIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNih0bXApOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05ORUNULCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpOworICAgICAgICBtTWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oYmluZGVyKTsKKworICAgICAgICByZXR1cm4gbU1lbW9yeSAhPSBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChvZmZzZXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFQURfQVQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZW1vdGUgcmVhZEF0IGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgbGVuID0gcmVwbHkucmVhZEludDMyKCk7CisKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXIsIG1NZW1vcnktPnBvaW50ZXIoKSwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0laRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoIiIpOworCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlNRV9UWVBFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgICAgICAqdXJpID0gU3RyaW5nOCgiIik7CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9VUkksIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqdXJpID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAorICAgICAgICBNZWRpYUhUVFBDb25uZWN0aW9uLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQQ29ubmVjdGlvbiIpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MDU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJTWVkaWFIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBNQUtFX0hUVFAgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworc3RydWN0IEJwTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4geworICAgIEJwTWVkaWFIVFRQU2VydmljZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4oaW1wbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUFNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1BS0VfSFRUUCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCisgICAgICAgIE1lZGlhSFRUUFNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBTZXJ2aWNlIik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBhOTFhZDQ5Li4zOGY3MTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xNSw5ICsxNSwxMiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC04NCwxMCArODcsMTYgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhzcmNVcmwpOwogCiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKQEAgLTExOCw3ICsxMjcsNyBAQAogCiAgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiAgICAgewotICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglbGxkIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVVcyk7CkBAIC0xOTUsNiArMjA0LDEzIEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX1VSTDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjb25zdCBjaGFyKiBzcmNVcmwgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAKICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CkBAIC0yMDYsNyArMjIyLDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoCi0gICAgICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2Uoc3JjVXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOworICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UsIHNyY1VybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMjIyLDcgKzIzOSw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGludCBvcHRpb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJWxsZCB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglIiBQUklkNjQgIiB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CiAjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSwogICAgICAgICAgICAgc2V0U2NoZWRQb2xpY3koZGF0YSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGU3OWJjZDIuLmQ3NzhkMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAKQEAgLTc1LDExICs3NiwxNyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIqIHVybCwKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+KiBoZWFkZXJzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyh1cmwpOwogICAgICAgICBpZiAoaGVhZGVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CkBAIC0zNTUsNiArMzYyLDEzIEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RBVEFfU09VUkNFX1VSTDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY29uc3QgY2hhciogdXJsID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKICAgICAgICAgICAgIGludDMyX3QgbnVtSGVhZGVycyA9IGRhdGEucmVhZEludDMyKCk7CkBAIC0zNjMsNyArMzc3LDggQEAKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZSh1cmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UsIHVybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfRkQ6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggM2MyMmI0Yy4uMmUwMmQxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURybS5oPgogI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CkBAIC00OCw3ICs1MCw3IEBACiAgICAgQUREX0JBVFRFUllfREFUQSwKICAgICBQVUxMX0JBVFRFUllfREFUQSwKICAgICBMSVNURU5fRk9SX1JFTU9URV9ESVNQTEFZLAotICAgIFVQREFURV9QUk9YWV9DT05GSUcsCisgICAgR0VUX0NPREVDX0xJU1QsCiB9OwogCiBjbGFzcyBCcE1lZGlhUGxheWVyU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllclNlcnZpY2U+CkBAIC04NiwxMiArODgsMjEgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVJlY29yZGVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgIHNpemVfdCAqcFNpemUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyh1cmwpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGhlYXAtPmFzQmluZGVyKCkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVDT0RFX1VSTCwgZGF0YSwgJnJlcGx5KTsKQEAgLTE4MywyMyArMTk0LDExIEBACiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJUmVtb3RlRGlzcGxheT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7CisgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0IHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoaG9zdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhob3N0KTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0KTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGV4Y2x1c2lvbkxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVQREFURV9QUk9YWV9DT05GSUcsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPREVDX0xJU1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDb2RlY0xpc3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogfTsKIApAQCAtMjIyLDEzICsyMjEsMjUgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBERUNPREVfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOwogICAgICAgICAgICAgaW50IG51bUNoYW5uZWxzOwogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OwogICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZWNvZGUodXJsLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LCBoZWFwLCAmc2l6ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIGRlY29kZShodHRwU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWFwLAorICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsZVJhdGUpOwpAQCAtMzE2LDI0ICszMjcsMTIgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihkaXNwbGF5LT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBVUERBVEVfUFJPWFlfQ09ORklHOgotICAgICAgICB7CisgICAgICAgIGNhc2UgR0VUX0NPREVDX0xJU1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBOVUxMOwotICAgICAgICAgICAgaW50MzJfdCBwb3J0ID0gMDsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZXhjbHVzaW9uTGlzdCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCkpOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gZ2V0Q29kZWNMaXN0KCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIobWNsLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IDhlNTgxNjIuLjk1YWYwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTE3LDYgKzE3LDEwIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhUmVjb3JkZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CkBAIC0yNCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNjcsNyArMTY5LDcgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDVkZjIzMmYuLmM1ODNkMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC01NCw2ICs1NCw3IEBACiAgICAgR0VUX0dSQVBISUNfQlVGRkVSX1VTQUdFLAogICAgIFNFVF9JTlRFUk5BTF9PUFRJT04sCiAgICAgVVBEQVRFX0dSQVBISUNfQlVGRkVSX0lOX01FVEEsCisgICAgQ09ORklHVVJFX1ZJREVPX1RVTk5FTF9NT0RFLAogfTsKIAogY2xhc3MgQnBPTVggOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWD4gewpAQCAtMzY4LDYgKzM2OSwyNSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSApIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydEluZGV4KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXR1bm5lbGVkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvSHdTeW5jKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTkZJR1VSRV9WSURFT19UVU5ORUxfTU9ERSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHNpZGViYW5kSGFuZGxlKSB7CisgICAgICAgICAgICAqc2lkZWJhbmRIYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90ICopcmVwbHkucmVhZE5hdGl2ZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisKICAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSkgewpAQCAtODA0LDYgKzgyNCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9CT09MIHR1bm5lbGVkID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvX2h3X3N5bmMgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnNpZGViYW5kX2hhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgdHVubmVsZWQsIGF1ZGlvX2h3X3N5bmMsICZzaWRlYmFuZF9oYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5hdGl2ZUhhbmRsZShzaWRlYmFuZF9oYW5kbGUpOworCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFMTE9DX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAppbmRleCBlOTE0YjM0Li5mMGYxODMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIHBMaWJDb25maWctPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChwTGliQ29uZmlnLT5udW1DaGFubmVscyksCi0gICAgICAgICAgICBtVHJhY2tCdWZmZXJTaXplLAorICAgICAgICAgICAgKHNpemVfdCkgbVRyYWNrQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwogCiAgICAgLy8gY3JlYXRlIHJlbmRlciBhbmQgcGxheWJhY2sgdGhyZWFkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0YzRlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjSW5mbyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKKyAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOworICAgIHByb2ZpbGVMZXZlbHMtPmFwcGVuZFZlY3RvcihtUHJvZmlsZUxldmVscyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0IHsKKyAgICBjb2xvckZvcm1hdHMtPmNsZWFyKCk7CisgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7Cit9CisKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBtRmxhZ3M7Cit9CisKK2NvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgeworICAgIHJldHVybiBtRGV0YWlsczsKK30KKworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKKyAgOiBtRmxhZ3MoMCkgeworICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwoCisgICAgICAgIGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IG5ldyBDYXBhYmlsaXRpZXMoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYXBzLT5tUHJvZmlsZUxldmVscy5wdXNoX2JhY2socHJvZmlsZUxldmVsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IGNvbG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChjYXBzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOworICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CisgICAgfQorICAgIHJldHVybiBjYXBzOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgQ0hFQ0tfTEUobVByb2ZpbGVMZXZlbHMuc2l6ZSgpLCBJTlQzMl9NQVgpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKS5tUHJvZmlsZSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5pdGVtQXQoaSkubUxldmVsKTsKKyAgICB9CisgICAgQ0hFQ0tfTEUobUNvbG9yRm9ybWF0cy5zaXplKCksIElOVDMyX01BWCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1GbGFncyk7CisgICAgbURldGFpbHMtPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlzRW5jb2RlcjsKK30KKworYm9vbCBNZWRpYUNvZGVjSW5mbzo6aGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtUXVpcmtzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobVF1aXJrcy5pdGVtQXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgeworICAgIG1pbWVzLT5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgbWltZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOworICAgIH0KK30KKworY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KK01lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgcmV0dXJuIG1DYXBzLnZhbHVlQXQoaXgpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqTWVkaWFDb2RlY0luZm86OmdldENvZGVjTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWUuY19zdHIoKTsKK30KKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjSW5mbz4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBBU3RyaW5nIG5hbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGlzRW5jb2RlciwgTlVMTCk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBxdWlyayA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bVF1aXJrcy5wdXNoX2JhY2socXVpcmspOworICAgICAgICB9CisgICAgfQorICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBzcDxDYXBhYmlsaXRpZXM+IGNhcHMgPSBDYXBhYmlsaXRpZXM6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmZvOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1RdWlya3Muc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1RdWlya3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVF1aXJrcy5pdGVtQXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbUNhcHMudmFsdWVBdChpKS0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgeworICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpNZWRpYUNvZGVjSW5mbyhBU3RyaW5nIG5hbWUsIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbWltZSkKKyAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgbUlzRW5jb2RlcihlbmNvZGVyKSwKKyAgICAgIG1IYXNTb2xlTWltZShmYWxzZSkgeworICAgIGlmIChtaW1lICE9IE5VTEwpIHsKKyAgICAgICAgYWRkTWltZShtaW1lKTsKKyAgICAgICAgbUhhc1NvbGVNaW1lID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAobUhhc1NvbGVNaW1lKSB7CisgICAgICAgIEFMT0dFKCJDb2RlYyAnJXMnIGFscmVhZHkgaGFkIGl0cyB0eXBlIHNwZWNpZmllZCIsIG1OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgc3NpemVfdCBpeCA9IGdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKKyAgICBpZiAoaXggPj0gMCkgeworICAgICAgICBtQ3VycmVudENhcHMgPSBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ3VycmVudENhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7CisgICAgICAgIG1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBtQ3VycmVudENhcHMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OnJlbW92ZU1pbWUoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgbUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7CisgICAgICAgIC8vIG1DdXJyZW50Q2FwcyB3aWxsIGJlIHJlbW92ZWQgd2hlbiBjb21wbGV0ZWQKKyAgICB9Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNJbmZvOjppbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKSB7CisgICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5jbGVhcigpOworICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5jbGVhcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZzcmMgPSBjYXBzLm1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKTsKKworICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOworICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzcmMubVByb2ZpbGU7CisgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzcmMubUxldmVsOworICAgICAgICBtQ3VycmVudENhcHMtPm1Qcm9maWxlTGV2ZWxzLnB1c2hfYmFjayhwcm9maWxlTGV2ZWwpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tQ29sb3JGb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG1DdXJyZW50Q2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoX2JhY2soY2Fwcy5tQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CisgICAgfQorCisgICAgbUN1cnJlbnRDYXBzLT5tRmxhZ3MgPSBjYXBzLm1GbGFnczsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKCFoYXNRdWlyayhuYW1lKSkgeworICAgICAgICBtUXVpcmtzLnB1c2gobmFtZSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpjb21wbGV0ZSgpIHsKKyAgICBtQ3VycmVudENhcHMgPSBOVUxMOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSkgeworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyhrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKSB7CisgICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOworICAgIHRhZy5hcHBlbmQoa2V5KTsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRJbnQzMih0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBBU3RyaW5nIHRhZyA9ICJmZWF0dXJlLSI7CisgICAgdGFnLmFwcGVuZChrZXkpOworICAgIG1DdXJyZW50Q2Fwcy0+bURldGFpbHMtPnNldFN0cmluZyh0YWcuY19zdHIoKSwgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCA4MzE5Y2Q3Li5lMmU2MDQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNjksNiArNjksNyBAQAogICAgIHsiNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzQ4MFB9LAogICAgIHsiNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzcyMFB9LAogICAgIHsiMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV8xMDgwUH0sCisgICAgeyIyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQfSwKICAgICB7InF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9RVkdBfSwKIAogICAgIHsidGltZWxhcHNlbG93IiwgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XfSwKQEAgLTc4LDExICs3OSwyNSBAQAogICAgIHsidGltZWxhcHNlNDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNDgwUH0sCiAgICAgeyJ0aW1lbGFwc2U3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV83MjBQfSwKICAgICB7InRpbWVsYXBzZTEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUH0sCisgICAgeyJ0aW1lbGFwc2UyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMjE2MFB9LAogICAgIHsidGltZWxhcHNlcXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUVZHQX0sCisKKyAgICB7ImhpZ2hzcGVlZGxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPV30sCisgICAgeyJoaWdoc3BlZWRoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIfSwKKyAgICB7ImhpZ2hzcGVlZDQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzQ4MFB9LAorICAgIHsiaGlnaHNwZWVkNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUH0sCisgICAgeyJoaWdoc3BlZWQxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFB9LAorICAgIHsiaGlnaHNwZWVkMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQfSwKIH07CiAKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRCBfX3VudXNlZAorI2Vsc2UKKyNkZWZpbmUgVU5VU0VECisjZW5kaWYKKwogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMmIGNvZGVjKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYyBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGNvZGVjOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY29kZWMubUNvZGVjKTsKQEAgLTkzLDcgKzEwOCw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjJiBjb2RlYykKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYzoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNvZGVjLm1Db2RlYyk7CkBAIC0xMDMsNyArMTE4LDcgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VuY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlbyBlbmNvZGVyIGNhcDoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNhcC5tQ29kZWMpOwpAQCAtMTE0LDcgKzEyOSw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTEyNCwyMSArMTM5LDIxIEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZGVjb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXApCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJhdWRpbyBjb2RlYyBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKIH0KIAogLypzdGF0aWMqLyB2b2lkCi1NZWRpYVByb2ZpbGVzOjpsb2dWaWRlb0VkaXRvckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0VkaXRvckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvZWRpdG9yIGNhcDoiKTsKICAgICBBTE9HVigibU1heElucHV0RnJhbWVXaWR0aCA9ICVkIiwgY2FwLm1NYXhJbnB1dEZyYW1lV2lkdGgpOwpAQCAtNDY2LDggKzQ4MSwxMyBAQAogICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQ7CiB9CiAKK3N0YXRpYyBib29sIGlzSGlnaFNwZWVkUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSB7CisgICAgcmV0dXJuIHF1YWxpdHkgPj0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX1NUQVJUICYmCisgICAgICAgICAgIHF1YWxpdHkgPD0gQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORDsKK30KKwogdm9pZCBNZWRpYVByb2ZpbGVzOjppbml0UmVxdWlyZWRQcm9maWxlUmVmcyhjb25zdCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKSB7Ci0gICAgQUxPR1YoIk51bWJlciBvZiBjYW1lcmEgaWRzOiAlZCIsIGNhbWVyYUlkcy5zaXplKCkpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgY2FtZXJhIGlkczogJXp1IiwgY2FtZXJhSWRzLnNpemUoKSk7CiAgICAgQ0hFQ0soY2FtZXJhSWRzLnNpemUoKSA+IDApOwogICAgIG1SZXF1aXJlZFByb2ZpbGVSZWZzID0gbmV3IFJlcXVpcmVkUHJvZmlsZXNbY2FtZXJhSWRzLnNpemUoKV07CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBjYW1lcmFJZHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CkBAIC01MTMsMTQgKzUzMywxNyBAQAogICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSByZWZRdWFsaXR5OwogICAgICAgICBWaWRlb0NvZGVjICpjb2RlYyA9IE5VTEw7CiAKLSAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlIG9yIHRpbWVsYXBzZSBwcm9maWxlCi0gICAgICAgIC8vIGJ1dCBub3QgYm90aC4gRGVmYXVsdCwgY2hlY2sgY2FtY29yZGVyIHByb2ZpbGUKKyAgICAgICAgLy8gQ2hlY2sgaGlnaCBhbmQgbG93IGZyb20gZWl0aGVyIGNhbWNvcmRlciBwcm9maWxlLCB0aW1lbGFwc2UgcHJvZmlsZQorICAgICAgICAvLyBvciBoaWdoIHNwZWVkIHByb2ZpbGUsIGJ1dCBub3QgYWxsIG9mIHRoZW0uIERlZmF1bHQsIGNoZWNrIGNhbWNvcmRlciBwcm9maWxlCiAgICAgICAgIHNpemVfdCBqID0gMDsKICAgICAgICAgc2l6ZV90IG8gPSAyOwogICAgICAgICBpZiAoaXNUaW1lbGFwc2VQcm9maWxlKHF1YWxpdHkpKSB7CiAgICAgICAgICAgICAvLyBDaGVjayB0aW1lbGFwc2UgcHJvZmlsZSBpbnN0ZWFkLgogICAgICAgICAgICAgaiA9IDI7CiAgICAgICAgICAgICBvID0ga051bVJlcXVpcmVkUHJvZmlsZXM7CisgICAgICAgIH0gZWxzZSBpZiAoaXNIaWdoU3BlZWRQcm9maWxlKHF1YWxpdHkpKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBjaGVjayBmb3IgaGlnaCBzcGVlZCBwcm9maWxlLgorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNhbWNvcmRlciBwcm9maWxlLgogICAgICAgICAgICAgQ0hFQ0soaXNDYW1jb3JkZXJQcm9maWxlKHF1YWxpdHkpKTsKQEAgLTU5NCwxNCArNjE3LDE0IEBACiAKICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRDYW1jb3JkZXJQcm9maWxlSW5kZXgoY2FtZXJhSWQsIHByb2ZpbGUtPm1RdWFsaXR5KTsKICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICVkIGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlByb2ZpbGUgcXVhbGl0eSAlZCBmb3IgY2FtZXJhICV6dSBhbHJlYWR5IGV4aXN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhpbmRleCA9PSByZWZJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbmV3IHByb2ZpbGUKLSAgICAgICAgICAgICAgICBBTE9HVigiQWRkIGEgcHJvZmlsZTogcXVhbGl0eSAlZD0+JWQgZm9yIGNhbWVyYSAlZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkFkZCBhIHByb2ZpbGU6IHF1YWxpdHkgJWQ9PiVkIGZvciBjYW1lcmEgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpbmZvLT5tUmVmUHJvZmlsZUluZGV4XS0+bVF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tUXVhbGl0eSwgY2FtZXJhSWQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAppbmRleCA5M2E0YTRjLi45ZjgwM2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKQEAgLTE0LDIxNyArMTQsMzggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTY2FubmVyQ2xpZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAKKyNpbmNsdWRlICJDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgiCiAjaW5jbHVkZSAiU3RyaW5nQXJyYXkuaCIKIAotI2luY2x1ZGUgImF1dG9kZXRlY3QuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKLSNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpCi0gICAgOiAgIG1OYW1lcyhOVUxMKSwKLSAgICAgICAgbVZhbHVlcyhOVUxMKSwKLSAgICAgICAgbUxvY2FsZUVuY29kaW5nKGtFbmNvZGluZ05vbmUpCi17CitNZWRpYVNjYW5uZXJDbGllbnQ6Ok1lZGlhU2Nhbm5lckNsaWVudCgpIHsKIH0KIAotTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkKLXsKLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOworTWVkaWFTY2FubmVyQ2xpZW50Ojp+TWVkaWFTY2FubmVyQ2xpZW50KCkgewogfQogCiB2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6c2V0TG9jYWxlKGNvbnN0IGNoYXIqIGxvY2FsZSkKIHsKLSAgICBpZiAoIWxvY2FsZSkgcmV0dXJuOwotCi0gICAgaWYgKCFzdHJuY21wKGxvY2FsZSwgImphIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ1NoaWZ0SklTOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgImtvIiwgMikpCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0VVQ0tSOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZSwgInpoIiwgMikpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAobG9jYWxlLCAiemhfQ04iKSkgewotICAgICAgICAgICAgLy8gc2ltcGxpZmllZCBjaGluZXNlIGZvciBtYWlubGFuZCBDaGluYQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nR0JLOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXNzdW1lIHRyYWRpdGlvbmFsIGZvciBub24tbWFpbmxhbmQgQ2hpbmVzZSBsb2NhbGVzIChUYWl3YW4sIEhvbmcgS29uZywgU2luZ2Fwb3JlKQotICAgICAgICAgICAgbUxvY2FsZUVuY29kaW5nID0ga0VuY29kaW5nQmlnNTsKLSAgICAgICAgfQotICAgIH0KKyAgICBtTG9jYWxlID0gbG9jYWxlOyAvLyBub3QgY3VycmVudGx5IHVzZWQKIH0KIAotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmJlZ2luRmlsZSgpCi17Ci0gICAgbU5hbWVzID0gbmV3IFN0cmluZ0FycmF5OwotICAgIG1WYWx1ZXMgPSBuZXcgU3RyaW5nQXJyYXk7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6YmVnaW5GaWxlKCkgewogfQogCiBzdGF0dXNfdCBNZWRpYVNjYW5uZXJDbGllbnQ6OmFkZFN0cmluZ1RhZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBpZiAobUxvY2FsZUVuY29kaW5nICE9IGtFbmNvZGluZ05vbmUpIHsKLSAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGNhY2hpbmcgc3RyaW5ncyB0aGF0IGFyZSBhbGwgQVNDSUkuCi0gICAgICAgIC8vIGNhbGwgaGFuZGxlU3RyaW5nVGFnIGRpcmVjdGx5IGluc3RlYWQuCi0gICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB2YWx1ZSAod2hpY2ggc2hvdWxkIGJlIHV0ZjgpIGhhcyBhbnkgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKLSAgICAgICAgYm9vbCBub25Bc2NpaSA9IGZhbHNlOwotICAgICAgICBjb25zdCBjaGFyKiBjaHAgPSB2YWx1ZTsKLSAgICAgICAgY2hhciBjaDsKLSAgICAgICAgd2hpbGUgKChjaCA9ICpjaHArKykpIHsKLSAgICAgICAgICAgIGlmIChjaCAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICBub25Bc2NpaSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobm9uQXNjaWkpIHsKLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIHN0cmluZ3MgZm9yIGxhdGVyIHNvIHRoZXkgY2FuIGJlIHVzZWQgZm9yIG5hdGl2ZSBlbmNvZGluZyBkZXRlY3Rpb24KLSAgICAgICAgICAgIG1OYW1lcy0+cHVzaF9iYWNrKG5hbWUpOwotICAgICAgICAgICAgbVZhbHVlcy0+cHVzaF9iYWNrKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGZhbGwgdGhyb3VnaAotICAgIH0KLQotICAgIC8vIGF1dG9kZXRlY3Rpb24gaXMgbm90IG5lY2Vzc2FyeSwgc28gbm8gbmVlZCB0byBjYWNoZSB0aGUgdmFsdWVzCi0gICAgLy8gcGFzcyBkaXJlY3RseSB0byB0aGUgY2xpZW50IGluc3RlYWQKLSAgICByZXR1cm4gaGFuZGxlU3RyaW5nVGFnKG5hbWUsIHZhbHVlKTsKKyAgICBoYW5kbGVTdHJpbmdUYWcobmFtZSwgdmFsdWUpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIHVpbnQzMl90IHBvc3NpYmxlRW5jb2RpbmdzKGNvbnN0IGNoYXIqIHMpCi17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0ga0VuY29kaW5nQWxsOwotICAgIC8vIGlmIHMgY29udGFpbnMgYSBuYXRpdmUgZW5jb2RpbmcsIHRoZW4gaXQgd2FzIG1pc3Rha2VubHkgZW5jb2RlZCBpbiB1dGY4IGFzIGlmIGl0IHdlcmUgbGF0aW4tMQotICAgIC8vIHNvIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgbGF0aW4tMSAtPiB1dGY4IGNvbnZlcnNpb24gdG8gZ2V0IHRoZSBuYXRpdmUgY2hhcnMgYmFjawotICAgIHVpbnQ4X3QgY2gxLCBjaDI7Ci0gICAgdWludDhfdCogY2hwID0gKHVpbnQ4X3QgKilzOwotCi0gICAgd2hpbGUgKChjaDEgPSAqY2hwKyspKSB7Ci0gICAgICAgIGlmIChjaDEgJiAweDgwKSB7Ci0gICAgICAgICAgICBjaDIgPSAqY2hwKys7Ci0gICAgICAgICAgICBjaDEgPSAoKGNoMSA8PCA2KSAmIDB4QzApIHwgKGNoMiAmIDB4M0YpOwotICAgICAgICAgICAgLy8gY2gxIGlzIG5vdyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0KLSAgICAgICAgICAgIGNoMiA9ICpjaHArKzsKLSAgICAgICAgICAgIGlmIChjaDIgJiAweDgwKQotICAgICAgICAgICAgICAgIGNoMiA9ICgoY2gyIDw8IDYpICYgMHhDMCkgfCAoKmNocCsrICYgMHgzRik7Ci0gICAgICAgICAgICAvLyBjaDIgaXMgbm93IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgcG90ZW50aWFsIG5hdGl2ZSBjaGFyCi0gICAgICAgICAgICBpbnQgY2ggPSAoaW50KWNoMSA8PCA4IHwgKGludCljaDI7Ci0gICAgICAgICAgICByZXN1bHQgJj0gZmluZFBvc3NpYmxlRW5jb2RpbmdzKGNoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIEFTQ0lJIGNoYXJhY3Rlciwgd2hpY2ggY291bGQgYmUgYW55dGhpbmcKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6Y29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZykKLXsKLSAgICBjb25zdCBjaGFyKiBlbmMgPSBOVUxMOwotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdTaGlmdEpJUzoKLSAgICAgICAgICAgIGVuYyA9ICJzaGlmdC1qaXMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nR0JLOgotICAgICAgICAgICAgZW5jID0gImdiayI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBrRW5jb2RpbmdCaWc1OgotICAgICAgICAgICAgZW5jID0gIkJpZzUiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nRVVDS1I6Ci0gICAgICAgICAgICBlbmMgPSAiRVVDLUtSIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChlbmMpIHsKLSAgICAgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7Ci0KLSAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmMsICZzdGF0dXMpOwotICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yICVzIiwgZW5jKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBVQ29udmVydGVyICp1dGY4Q29udiA9IHVjbnZfb3BlbigiVVRGLTgiLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBVVEYtOCIpOwotICAgICAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvciBlYWNoIHZhbHVlIHN0cmluZywgY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IHdlIG5lZWQgdG8gdW50YW5nbGUgdGhlIHV0ZjggYW5kIGNvbnZlcnQgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgYnl0ZXMKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSByZWR1Y2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIHdlIGNhbiBkbyB0aGlzIGluIHBsYWNlCi0gICAgICAgICAgICB1aW50OF90KiBzcmMgPSAodWludDhfdCAqKW1WYWx1ZXMtPmdldEVudHJ5KGkpOwotICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOwotCi0gICAgICAgICAgICB1aW50OF90IHVjaDsKLSAgICAgICAgICAgIHdoaWxlICgodWNoID0gKnNyYysrKSkgewotICAgICAgICAgICAgICAgIGlmICh1Y2ggJiAweDgwKQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKCh1Y2ggPDwgNikgJiAweEMwKSB8ICgqc3JjKysgJiAweDNGKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSB1Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBzb3VyY2UgPSBtVmFsdWVzLT5nZXRFbnRyeShpKTsKLSAgICAgICAgICAgIGludCB0YXJnZXRMZW5ndGggPSBsZW4gKiAzICsgMTsKLSAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciA9IG5ldyBjaGFyW3RhcmdldExlbmd0aF07Ci0gICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjaGVjayBmb3IgTlVMTCwgYnV0IGluIHRoaXMgY2FzZSB0YXJnZXRMZW5ndGggbWF5IGJlIGxhcmdlCi0gICAgICAgICAgICBpZiAoIWJ1ZmZlcikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKLQotICAgICAgICAgICAgdWNudl9jb252ZXJ0RXgodXRmOENvbnYsIGNvbnYsICZ0YXJnZXQsIHRhcmdldCArIHRhcmdldExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgKGNvbnN0IGNoYXIgKilkZXN0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBtVmFsdWVzLT5zZXRFbnRyeShpLCAiPz8/Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHplcm8gdGVybWluYXRlCi0gICAgICAgICAgICAgICAgKnRhcmdldCA9IDA7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcy0+c2V0RW50cnkoaSwgYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWNudl9jbG9zZShjb252KTsKLSAgICAgICAgdWNudl9jbG9zZSh1dGY4Q29udik7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpCi17Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIGludCBzaXplID0gbU5hbWVzLT5zaXplKCk7Ci0gICAgICAgIHVpbnQzMl90IGVuY29kaW5nID0ga0VuY29kaW5nQWxsOwotCi0gICAgICAgIC8vIGNvbXB1dGUgYSBiaXQgbWFzayBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBlbmNvZGluZ3MKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKQotICAgICAgICAgICAgZW5jb2RpbmcgJj0gcG9zc2libGVFbmNvZGluZ3MobVZhbHVlcy0+Z2V0RW50cnkoaSkpOwotCi0gICAgICAgIC8vIGlmIHRoZSBsb2NhbGUgZW5jb2RpbmcgbWF0Y2hlcywgdGhlbiBhc3N1bWUgd2UgaGF2ZSBhIG5hdGl2ZSBlbmNvZGluZy4KLSAgICAgICAgaWYgKGVuY29kaW5nICYgbUxvY2FsZUVuY29kaW5nKQotICAgICAgICAgICAgY29udmVydFZhbHVlcyhtTG9jYWxlRW5jb2RpbmcpOwotCi0gICAgICAgIC8vIGZpbmFsbHksIHB1c2ggYWxsIG5hbWUvdmFsdWUgcGFpcnMgdG8gdGhlIGNsaWVudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OYW1lcy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbmRsZVN0cmluZ1RhZyhtTmFtZXMtPmdldEVudHJ5KGkpLCBtVmFsdWVzLT5nZXRFbnRyeShpKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBhZGRTdHJpbmdUYWcoKSBoYXMgZG9uZSBhbGwgdGhlIHdvcmsgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvCi0KLSAgICBkZWxldGUgbU5hbWVzOwotICAgIGRlbGV0ZSBtVmFsdWVzOwotICAgIG1OYW1lcyA9IE5VTEw7Ci0gICAgbVZhbHVlcyA9IE5VTEw7Cit2b2lkIE1lZGlhU2Nhbm5lckNsaWVudDo6ZW5kRmlsZSgpIHsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAgYi9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCmluZGV4IDIyZTlmYWQuLmQyZTM4MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcApAQCAtMTYsMTQgKzE2LDE5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU291bmRQb29sIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjZGVmaW5lIFVTRV9TSEFSRURfTUVNX0JVRkZFUgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9Tb3VuZFBvb2wuaD4KICNpbmNsdWRlICJTb3VuZFBvb2xUaHJlYWQuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZAogewpAQCAtMzUsMTAgKzQwLDEwIEBACiBzaXplX3Qga0RlZmF1bHRIZWFwU2l6ZSA9IDEwMjQgKiAxMDI0OyAvLyAxTUIKIAogCi1Tb3VuZFBvb2w6OlNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgaW50IHNyY1F1YWxpdHkpCitTb3VuZFBvb2w6OlNvdW5kUG9vbChpbnQgbWF4Q2hhbm5lbHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpCiB7Ci0gICAgQUxPR1YoIlNvdW5kUG9vbCBjb25zdHJ1Y3RvcjogbWF4Q2hhbm5lbHM9JWQsIHN0cmVhbVR5cGU9JWQsIHNyY1F1YWxpdHk9JWQiLAotICAgICAgICAgICAgbWF4Q2hhbm5lbHMsIHN0cmVhbVR5cGUsIHNyY1F1YWxpdHkpOworICAgIEFMT0dWKCJTb3VuZFBvb2wgY29uc3RydWN0b3I6IG1heENoYW5uZWxzPSVkLCBhdHRyLnVzYWdlPSVkLCBhdHRyLmZsYWdzPTB4JXgsIGF0dHIudGFncz0lcyIsCisgICAgICAgICAgICBtYXhDaGFubmVscywgcEF0dHJpYnV0ZXMtPnVzYWdlLCBwQXR0cmlidXRlcy0+ZmxhZ3MsIHBBdHRyaWJ1dGVzLT50YWdzKTsKIAogICAgIC8vIGNoZWNrIGxpbWl0cwogICAgIG1NYXhDaGFubmVscyA9IG1heENoYW5uZWxzOwpAQCAtNTIsOCArNTcsNyBAQAogCiAgICAgbVF1aXQgPSBmYWxzZTsKICAgICBtRGVjb2RlVGhyZWFkID0gMDsKLSAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgbVNyY1F1YWxpdHkgPSBzcmNRdWFsaXR5OworICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgbUFsbG9jYXRlZCA9IDA7CiAgICAgbU5leHRTYW1wbGVJRCA9IDA7CiAgICAgbU5leHRDaGFubmVsSUQgPSAwOwpAQCAtMTk5LDcgKzIwMyw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWludCBTb3VuZFBvb2w6OmxvYWQoY29uc3QgY2hhciogcGF0aCwgaW50IHByaW9yaXR5KQoraW50IFNvdW5kUG9vbDo6bG9hZChjb25zdCBjaGFyKiBwYXRoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCiB7CiAgICAgQUxPR1YoImxvYWQ6IHBhdGg9JXMsIHByaW9yaXR5PSVkIiwgcGF0aCwgcHJpb3JpdHkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKCZtTG9jayk7CkBAIC0yMDksOSArMjEzLDkgQEAKICAgICByZXR1cm4gc2FtcGxlLT5zYW1wbGVJRCgpOwogfQogCi1pbnQgU291bmRQb29sOjpsb2FkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgcHJpb3JpdHkpCitpbnQgU291bmRQb29sOjpsb2FkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgcHJpb3JpdHkgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxvYWQ6IGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQsIHByaW9yaXR5PSVkIiwKKyAgICBBTE9HVigibG9hZDogZmQ9JWQsIG9mZnNldD0lIiBQUklkNjQgIiwgbGVuZ3RoPSUiIFBSSWQ2NCAiLCBwcmlvcml0eT0lZCIsCiAgICAgICAgICAgICBmZCwgb2Zmc2V0LCBsZW5ndGgsIHByaW9yaXR5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbUxvY2spOwogICAgIHNwPFNhbXBsZT4gc2FtcGxlID0gbmV3IFNhbXBsZSgrK21OZXh0U2FtcGxlSUQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CkBAIC00NjEsNyArNDY1LDggQEAKICAgICBtRmQgPSBkdXAoZmQpOwogICAgIG1PZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUxlbmd0aCA9IGxlbmd0aDsKLSAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwgbVNhbXBsZUlELCBtRmQsIG1MZW5ndGgsIG1PZmZzZXQpOworICAgIEFMT0dWKCJjcmVhdGUgc2FtcGxlSUQ9JWQsIGZkPSVkLCBvZmZzZXQ9JSIgUFJJZDY0ICIgbGVuZ3RoPSUiIFBSSWQ2NCwKKyAgICAgICAgbVNhbXBsZUlELCBtRmQsIG1MZW5ndGgsIG1PZmZzZXQpOwogfQogCiB2b2lkIFNhbXBsZTo6aW5pdCgpCkBAIC00OTYsNyArNTAxLDE0IEBACiAKICAgICBBTE9HVigiU3RhcnQgZGVjb2RlIik7CiAgICAgaWYgKG1VcmwpIHsKLSAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZShtVXJsLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LCBtSGVhcCwgJm1TaXplKTsKKyAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZSgKKyAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLAorICAgICAgICAgICAgICAgIG1VcmwsCisgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICZmb3JtYXQsCisgICAgICAgICAgICAgICAgbUhlYXAsCisgICAgICAgICAgICAgICAgJm1TaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhcCwgJm1TaXplKTsKQEAgLTUwOCw3ICs1MjAsNyBAQAogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGxvYWQgc2FtcGxlOiAlcyIsIG1VcmwpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBBTE9HVigicG9pbnRlciA9ICVwLCBzaXplID0gJXUsIHNhbXBsZVJhdGUgPSAldSwgbnVtQ2hhbm5lbHMgPSAlZCIsCisgICAgQUxPR1YoInBvaW50ZXIgPSAlcCwgc2l6ZSA9ICV6dSwgc2FtcGxlUmF0ZSA9ICV1LCBudW1DaGFubmVscyA9ICVkIiwKICAgICAgICAgICBtSGVhcC0+Z2V0QmFzZSgpLCBtU2l6ZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogCiAgICAgaWYgKHNhbXBsZVJhdGUgPiBrTWF4U2FtcGxlUmF0ZSkgewpAQCAtNTY4LDcgKzU4MCw3IEBACiAgICAgICAgIC8vIGluaXRpYWxpemUgdHJhY2sKICAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU291bmRQb29sLT5zdHJlYW1UeXBlKCk7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUobVNvdW5kUG9vbC0+YXR0cmlidXRlcygpKTsKICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBhZkZyYW1lQ291bnQgPSBrRGVmYXVsdEZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTU3OSw3ICs1OTEsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gdWludDMyX3QoZmxvYXQoc2FtcGxlLT5zYW1wbGVSYXRlKCkpICogcmF0ZSArIDAuNSk7CiAgICAgICAgIHVpbnQzMl90IHRvdGFsRnJhbWVzID0gKGtEZWZhdWx0QnVmZmVyQ291bnQgKiBhZkZyYW1lQ291bnQgKiBzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKICAgICAgICAgdWludDMyX3QgYnVmZmVyRnJhbWVzID0gKHRvdGFsRnJhbWVzICsgKGtEZWZhdWx0QnVmZmVyQ291bnQgLSAxKSkgLyBrRGVmYXVsdEJ1ZmZlckNvdW50OwotICAgICAgICB1aW50MzJfdCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOwogCiAgICAgICAgIGlmIChsb29wKSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gc2FtcGxlLT5zaXplKCkvbnVtQ2hhbm5lbHMvCkBAIC02MDAsMTYgKzYxMiwxNSBAQAogICAgICAgICAvLyB3cm9uZyBhdWRpbyBhdWRpbyBidWZmZXIgc2l6ZSAgKG1BdWRpb0J1ZmZlclNpemUpCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgdG9nZ2xlID0gbVRvZ2dsZSBeIDE7CiAgICAgICAgIHZvaWQgKnVzZXJEYXRhID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGhpcyB8IHRvZ2dsZSk7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gKG51bUNoYW5uZWxzID09IDIpID8KLSAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChudW1DaGFubmVscyk7CiAKICAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBhdWRpbyB0cmFjayBpZiBjdXJyZW50IHRyYWNrIGlzIGNvbXBhdGlibGUgd2l0aCBzYW1wbGUgcGFyYW1ldGVycwogI2lmZGVmIFVTRV9TSEFSRURfTUVNX0JVRkZFUgogICAgICAgICBuZXdUcmFjayA9IG5ldyBBdWRpb1RyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIHNhbXBsZS0+Zm9ybWF0KCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbHMsIHNhbXBsZS0+Z2V0SU1lbW9yeSgpLCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGUtPmdldElNZW1vcnkoKSwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhKTsKICNlbHNlCiAgICAgICAgIG5ld1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgc2FtcGxlLT5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBjaGFubmVscywgZnJhbWVDb3VudCwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVzKTsKICNlbmRpZgogICAgICAgICBvbGRUcmFjayA9IG1BdWRpb1RyYWNrOwpAQCAtNzMwLDcgKzc0MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gYi0+c2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHAsIGNvdW50KTsKLS8vICAgICAgICAgICAgICBBTE9HVigiZmlsbDogcT0lcCwgcD0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBwLCBtUG9zLCBiLT5zaXplLCBjb3VudCk7CisvLyAgICAgICAgICAgICAgQUxPR1YoImZpbGw6IHE9JXAsIHA9JXAsIG1Qb3M9JXUsIGItPnNpemU9JXUsIGNvdW50PSVkIiwgcSwgcCwgbVBvcywgYi0+c2l6ZSwKKy8vICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBvcyA8IG1BdWRpb0J1ZmZlclNpemUpIHsKICAgICAgICAgICAgICAgICBjb3VudCA9IG1BdWRpb0J1ZmZlclNpemUgLSBtUG9zOwogICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IGItPnNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggYWRlZjNiZS4uNjFiNmQzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gbm90aWZpY2F0aW9uRnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gc2hhcmVkQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhLAotICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIHNlc3Npb25JZAorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0spOwogCiAgICAgaWYgKG1wQXVkaW9UcmFjay0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWMzYjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhdXRvZGV0ZWN0LmgiCi0KLXN0cnVjdCBDaGFyUmFuZ2UgewotICAgIHVpbnQxNl90IGZpcnN0OwotICAgIHVpbnQxNl90IGxhc3Q7Ci19OwotCi0jZGVmaW5lIEFSUkFZX1NJWkUoeCkgICAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCp4KSkKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTMyLlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrU2hpZnRKSVNSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MCwgMHg4MTdFIH0sCi0gICAgeyAweDgxODAsIDB4ODFBQyB9LAotICAgIHsgMHg4MUI4LCAweDgxQkYgfSwKLSAgICB7IDB4ODFDOCwgMHg4MUNFIH0sCi0gICAgeyAweDgxREEsIDB4ODFFOCB9LAotICAgIHsgMHg4MUYwLCAweDgxRjcgfSwKLSAgICB7IDB4ODFGQywgMHg4MUZDIH0sCi0gICAgeyAweDgyNEYsIDB4ODI1OCB9LAotICAgIHsgMHg4MjYwLCAweDgyNzkgfSwKLSAgICB7IDB4ODI4MSwgMHg4MjlBIH0sCi0gICAgeyAweDgyOUYsIDB4ODJGMSB9LAotICAgIHsgMHg4MzQwLCAweDgzN0UgfSwKLSAgICB7IDB4ODM4MCwgMHg4Mzk2IH0sCi0gICAgeyAweDgzOUYsIDB4ODNCNiB9LAotICAgIHsgMHg4M0JGLCAweDgzRDYgfSwKLSAgICB7IDB4ODQ0MCwgMHg4NDYwIH0sCi0gICAgeyAweDg0NzAsIDB4ODQ3RSB9LAotICAgIHsgMHg4NDgwLCAweDg0OTEgfSwKLSAgICB7IDB4ODQ5RiwgMHg4NEJFIH0sCi0gICAgeyAweDg3NDAsIDB4ODc1RCB9LAotICAgIHsgMHg4NzVGLCAweDg3NzUgfSwKLSAgICB7IDB4ODc3RSwgMHg4NzdFIH0sCi0gICAgeyAweDg3ODAsIDB4ODc5QyB9LAotICAgIHsgMHg4ODlGLCAweDg4RkMgfSwKLSAgICB7IDB4ODk0MCwgMHg4OTdFIH0sCi0gICAgeyAweDg5ODAsIDB4ODlGQyB9LAotICAgIHsgMHg4QTQwLCAweDhBN0UgfSwKLSAgICB7IDB4OEE4MCwgMHg4QUZDIH0sCi0gICAgeyAweDhCNDAsIDB4OEI3RSB9LAotICAgIHsgMHg4QjgwLCAweDhCRkMgfSwKLSAgICB7IDB4OEM0MCwgMHg4QzdFIH0sCi0gICAgeyAweDhDODAsIDB4OENGQyB9LAotICAgIHsgMHg4RDQwLCAweDhEN0UgfSwKLSAgICB7IDB4OEQ4MCwgMHg4REZDIH0sCi0gICAgeyAweDhFNDAsIDB4OEU3RSB9LAotICAgIHsgMHg4RTgwLCAweDhFRkMgfSwKLSAgICB7IDB4OEY0MCwgMHg4RjdFIH0sCi0gICAgeyAweDhGODAsIDB4OEZGQyB9LAotICAgIHsgMHg5MDQwLCAweDkwN0UgfSwKLSAgICB7IDB4OTA4MCwgMHg5MEZDIH0sCi0gICAgeyAweDkxNDAsIDB4OTE3RSB9LAotICAgIHsgMHg5MTgwLCAweDkxRkMgfSwKLSAgICB7IDB4OTI0MCwgMHg5MjdFIH0sCi0gICAgeyAweDkyODAsIDB4OTJGQyB9LAotICAgIHsgMHg5MzQwLCAweDkzN0UgfSwKLSAgICB7IDB4OTM4MCwgMHg5M0ZDIH0sCi0gICAgeyAweDk0NDAsIDB4OTQ3RSB9LAotICAgIHsgMHg5NDgwLCAweDk0RkMgfSwKLSAgICB7IDB4OTU0MCwgMHg5NTdFIH0sCi0gICAgeyAweDk1ODAsIDB4OTVGQyB9LAotICAgIHsgMHg5NjQwLCAweDk2N0UgfSwKLSAgICB7IDB4OTY4MCwgMHg5NkZDIH0sCi0gICAgeyAweDk3NDAsIDB4OTc3RSB9LAotICAgIHsgMHg5NzgwLCAweDk3RkMgfSwKLSAgICB7IDB4OTg0MCwgMHg5ODcyIH0sCi0gICAgeyAweDk4OUYsIDB4OThGQyB9LAotICAgIHsgMHg5OTQwLCAweDk5N0UgfSwKLSAgICB7IDB4OTk4MCwgMHg5OUZDIH0sCi0gICAgeyAweDlBNDAsIDB4OUE3RSB9LAotICAgIHsgMHg5QTgwLCAweDlBRkMgfSwKLSAgICB7IDB4OUI0MCwgMHg5QjdFIH0sCi0gICAgeyAweDlCODAsIDB4OUJGQyB9LAotICAgIHsgMHg5QzQwLCAweDlDN0UgfSwKLSAgICB7IDB4OUM4MCwgMHg5Q0ZDIH0sCi0gICAgeyAweDlENDAsIDB4OUQ3RSB9LAotICAgIHsgMHg5RDgwLCAweDlERkMgfSwKLSAgICB7IDB4OUU0MCwgMHg5RTdFIH0sCi0gICAgeyAweDlFODAsIDB4OUVGQyB9LAotICAgIHsgMHg5RjQwLCAweDlGN0UgfSwKLSAgICB7IDB4OUY4MCwgMHg5RkZDIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMDgwLCAweEUwRkMgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxODAsIDB4RTFGQyB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTI4MCwgMHhFMkZDIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFMzgwLCAweEUzRkMgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0ODAsIDB4RTRGQyB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTU4MCwgMHhFNUZDIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNjgwLCAweEU2RkMgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3ODAsIDB4RTdGQyB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RTg4MCwgMHhFOEZDIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOTgwLCAweEU5RkMgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBODAsIDB4RUFBNCB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RUQ4MCwgMHhFREZDIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRTgwLCAweEVFRUMgfSwKLSAgICB7IDB4RUVFRiwgMHhFRUZDIH0sCi0gICAgeyAweEZBNDAsIDB4RkE3RSB9LAotICAgIHsgMHhGQTgwLCAweEZBRkMgfSwKLSAgICB7IDB4RkI0MCwgMHhGQjdFIH0sCi0gICAgeyAweEZCODAsIDB4RkJGQyB9LAotICAgIHsgMHhGQzQwLCAweEZDNEIgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDkzNi5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0dCS1Jhbmdlc1tdID0gewotICAgIHsgMHg4MTQwLCAweDgxN0UgfSwKLSAgICB7IDB4ODE4MCwgMHg4MUZFIH0sCi0gICAgeyAweDgyNDAsIDB4ODI3RSB9LAotICAgIHsgMHg4MjgwLCAweDgyRkUgfSwKLSAgICB7IDB4ODM0MCwgMHg4MzdFIH0sCi0gICAgeyAweDgzODAsIDB4ODNGRSB9LAotICAgIHsgMHg4NDQwLCAweDg0N0UgfSwKLSAgICB7IDB4ODQ4MCwgMHg4NEZFIH0sCi0gICAgeyAweDg1NDAsIDB4ODU3RSB9LAotICAgIHsgMHg4NTgwLCAweDg1RkUgfSwKLSAgICB7IDB4ODY0MCwgMHg4NjdFIH0sCi0gICAgeyAweDg2ODAsIDB4ODZGRSB9LAotICAgIHsgMHg4NzQwLCAweDg3N0UgfSwKLSAgICB7IDB4ODc4MCwgMHg4N0ZFIH0sCi0gICAgeyAweDg4NDAsIDB4ODg3RSB9LAotICAgIHsgMHg4ODgwLCAweDg4RkUgfSwKLSAgICB7IDB4ODk0MCwgMHg4OTdFIH0sCi0gICAgeyAweDg5ODAsIDB4ODlGRSB9LAotICAgIHsgMHg4QTQwLCAweDhBN0UgfSwKLSAgICB7IDB4OEE4MCwgMHg4QUZFIH0sCi0gICAgeyAweDhCNDAsIDB4OEI3RSB9LAotICAgIHsgMHg4QjgwLCAweDhCRkUgfSwKLSAgICB7IDB4OEM0MCwgMHg4QzdFIH0sCi0gICAgeyAweDhDODAsIDB4OENGRSB9LAotICAgIHsgMHg4RDQwLCAweDhEN0UgfSwKLSAgICB7IDB4OEQ4MCwgMHg4REZFIH0sCi0gICAgeyAweDhFNDAsIDB4OEU3RSB9LAotICAgIHsgMHg4RTgwLCAweDhFRkUgfSwKLSAgICB7IDB4OEY0MCwgMHg4RjdFIH0sCi0gICAgeyAweDhGODAsIDB4OEZGRSB9LAotICAgIHsgMHg5MDQwLCAweDkwN0UgfSwKLSAgICB7IDB4OTA4MCwgMHg5MEZFIH0sCi0gICAgeyAweDkxNDAsIDB4OTE3RSB9LAotICAgIHsgMHg5MTgwLCAweDkxRkUgfSwKLSAgICB7IDB4OTI0MCwgMHg5MjdFIH0sCi0gICAgeyAweDkyODAsIDB4OTJGRSB9LAotICAgIHsgMHg5MzQwLCAweDkzN0UgfSwKLSAgICB7IDB4OTM4MCwgMHg5M0ZFIH0sCi0gICAgeyAweDk0NDAsIDB4OTQ3RSB9LAotICAgIHsgMHg5NDgwLCAweDk0RkUgfSwKLSAgICB7IDB4OTU0MCwgMHg5NTdFIH0sCi0gICAgeyAweDk1ODAsIDB4OTVGRSB9LAotICAgIHsgMHg5NjQwLCAweDk2N0UgfSwKLSAgICB7IDB4OTY4MCwgMHg5NkZFIH0sCi0gICAgeyAweDk3NDAsIDB4OTc3RSB9LAotICAgIHsgMHg5NzgwLCAweDk3RkUgfSwKLSAgICB7IDB4OTg0MCwgMHg5ODdFIH0sCi0gICAgeyAweDk4ODAsIDB4OThGRSB9LAotICAgIHsgMHg5OTQwLCAweDk5N0UgfSwKLSAgICB7IDB4OTk4MCwgMHg5OUZFIH0sCi0gICAgeyAweDlBNDAsIDB4OUE3RSB9LAotICAgIHsgMHg5QTgwLCAweDlBRkUgfSwKLSAgICB7IDB4OUI0MCwgMHg5QjdFIH0sCi0gICAgeyAweDlCODAsIDB4OUJGRSB9LAotICAgIHsgMHg5QzQwLCAweDlDN0UgfSwKLSAgICB7IDB4OUM4MCwgMHg5Q0ZFIH0sCi0gICAgeyAweDlENDAsIDB4OUQ3RSB9LAotICAgIHsgMHg5RDgwLCAweDlERkUgfSwKLSAgICB7IDB4OUU0MCwgMHg5RTdFIH0sCi0gICAgeyAweDlFODAsIDB4OUVGRSB9LAotICAgIHsgMHg5RjQwLCAweDlGN0UgfSwKLSAgICB7IDB4OUY4MCwgMHg5RkZFIH0sCi0gICAgeyAweEEwNDAsIDB4QTA3RSB9LAotICAgIHsgMHhBMDgwLCAweEEwRkUgfSwKLSAgICB7IDB4QTFBMSwgMHhBMUZFIH0sCi0gICAgeyAweEEyQTEsIDB4QTJBQSB9LAotICAgIHsgMHhBMkIxLCAweEEyRTIgfSwKLSAgICB7IDB4QTJFNSwgMHhBMkVFIH0sCi0gICAgeyAweEEyRjEsIDB4QTJGQyB9LAotICAgIHsgMHhBM0ExLCAweEEzRkUgfSwKLSAgICB7IDB4QTRBMSwgMHhBNEYzIH0sCi0gICAgeyAweEE1QTEsIDB4QTVGNiB9LAotICAgIHsgMHhBNkExLCAweEE2QjggfSwKLSAgICB7IDB4QTZDMSwgMHhBNkQ4IH0sCi0gICAgeyAweEE2RTAsIDB4QTZFQiB9LAotICAgIHsgMHhBNkVFLCAweEE2RjIgfSwKLSAgICB7IDB4QTZGNCwgMHhBNkY1IH0sCi0gICAgeyAweEE3QTEsIDB4QTdDMSB9LAotICAgIHsgMHhBN0QxLCAweEE3RjEgfSwKLSAgICB7IDB4QTg0MCwgMHhBODdFIH0sCi0gICAgeyAweEE4ODAsIDB4QTg5NSB9LAotICAgIHsgMHhBOEExLCAweEE4QkIgfSwKLSAgICB7IDB4QThCRCwgMHhBOEJFIH0sCi0gICAgeyAweEE4QzAsIDB4QThDMCB9LAotICAgIHsgMHhBOEM1LCAweEE4RTkgfSwKLSAgICB7IDB4QTk0MCwgMHhBOTU3IH0sCi0gICAgeyAweEE5NTksIDB4QTk1QSB9LAotICAgIHsgMHhBOTVDLCAweEE5NUMgfSwKLSAgICB7IDB4QTk2MCwgMHhBOTdFIH0sCi0gICAgeyAweEE5ODAsIDB4QTk4OCB9LAotICAgIHsgMHhBOTk2LCAweEE5OTYgfSwKLSAgICB7IDB4QTlBNCwgMHhBOUVGIH0sCi0gICAgeyAweEFBNDAsIDB4QUE3RSB9LAotICAgIHsgMHhBQTgwLCAweEFBQTAgfSwKLSAgICB7IDB4QUI0MCwgMHhBQjdFIH0sCi0gICAgeyAweEFCODAsIDB4QUJBMCB9LAotICAgIHsgMHhBQzQwLCAweEFDN0UgfSwKLSAgICB7IDB4QUM4MCwgMHhBQ0EwIH0sCi0gICAgeyAweEFENDAsIDB4QUQ3RSB9LAotICAgIHsgMHhBRDgwLCAweEFEQTAgfSwKLSAgICB7IDB4QUU0MCwgMHhBRTdFIH0sCi0gICAgeyAweEFFODAsIDB4QUVBMCB9LAotICAgIHsgMHhBRjQwLCAweEFGN0UgfSwKLSAgICB7IDB4QUY4MCwgMHhBRkEwIH0sCi0gICAgeyAweEIwNDAsIDB4QjA3RSB9LAotICAgIHsgMHhCMDgwLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MCwgMHhCMTdFIH0sCi0gICAgeyAweEIxODAsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQwLCAweEIyN0UgfSwKLSAgICB7IDB4QjI4MCwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDAsIDB4QjM3RSB9LAotICAgIHsgMHhCMzgwLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MCwgMHhCNDdFIH0sCi0gICAgeyAweEI0ODAsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQwLCAweEI1N0UgfSwKLSAgICB7IDB4QjU4MCwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDAsIDB4QjY3RSB9LAotICAgIHsgMHhCNjgwLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MCwgMHhCNzdFIH0sCi0gICAgeyAweEI3ODAsIDB4QjdGRSB9LAotICAgIHsgMHhCODQwLCAweEI4N0UgfSwKLSAgICB7IDB4Qjg4MCwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDAsIDB4Qjk3RSB9LAotICAgIHsgMHhCOTgwLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MCwgMHhCQTdFIH0sCi0gICAgeyAweEJBODAsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQwLCAweEJCN0UgfSwKLSAgICB7IDB4QkI4MCwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDAsIDB4QkM3RSB9LAotICAgIHsgMHhCQzgwLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MCwgMHhCRDdFIH0sCi0gICAgeyAweEJEODAsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQwLCAweEJFN0UgfSwKLSAgICB7IDB4QkU4MCwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDAsIDB4QkY3RSB9LAotICAgIHsgMHhCRjgwLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MCwgMHhDMDdFIH0sCi0gICAgeyAweEMwODAsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQwLCAweEMxN0UgfSwKLSAgICB7IDB4QzE4MCwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDAsIDB4QzI3RSB9LAotICAgIHsgMHhDMjgwLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MCwgMHhDMzdFIH0sCi0gICAgeyAweEMzODAsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQwLCAweEM0N0UgfSwKLSAgICB7IDB4QzQ4MCwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDAsIDB4QzU3RSB9LAotICAgIHsgMHhDNTgwLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MCwgMHhDNjdFIH0sCi0gICAgeyAweEM2ODAsIDB4QzZGRSB9LAotICAgIHsgMHhDNzQwLCAweEM3N0UgfSwKLSAgICB7IDB4Qzc4MCwgMHhDN0ZFIH0sCi0gICAgeyAweEM4NDAsIDB4Qzg3RSB9LAotICAgIHsgMHhDODgwLCAweEM4RkUgfSwKLSAgICB7IDB4Qzk0MCwgMHhDOTdFIH0sCi0gICAgeyAweEM5ODAsIDB4QzlGRSB9LAotICAgIHsgMHhDQTQwLCAweENBN0UgfSwKLSAgICB7IDB4Q0E4MCwgMHhDQUZFIH0sCi0gICAgeyAweENCNDAsIDB4Q0I3RSB9LAotICAgIHsgMHhDQjgwLCAweENCRkUgfSwKLSAgICB7IDB4Q0M0MCwgMHhDQzdFIH0sCi0gICAgeyAweENDODAsIDB4Q0NGRSB9LAotICAgIHsgMHhDRDQwLCAweENEN0UgfSwKLSAgICB7IDB4Q0Q4MCwgMHhDREZFIH0sCi0gICAgeyAweENFNDAsIDB4Q0U3RSB9LAotICAgIHsgMHhDRTgwLCAweENFRkUgfSwKLSAgICB7IDB4Q0Y0MCwgMHhDRjdFIH0sCi0gICAgeyAweENGODAsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMDQwLCAweEQwN0UgfSwKLSAgICB7IDB4RDA4MCwgMHhEMEZFIH0sCi0gICAgeyAweEQxNDAsIDB4RDE3RSB9LAotICAgIHsgMHhEMTgwLCAweEQxRkUgfSwKLSAgICB7IDB4RDI0MCwgMHhEMjdFIH0sCi0gICAgeyAweEQyODAsIDB4RDJGRSB9LAotICAgIHsgMHhEMzQwLCAweEQzN0UgfSwKLSAgICB7IDB4RDM4MCwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0NDAsIDB4RDQ3RSB9LAotICAgIHsgMHhENDgwLCAweEQ0RkUgfSwKLSAgICB7IDB4RDU0MCwgMHhENTdFIH0sCi0gICAgeyAweEQ1ODAsIDB4RDVGRSB9LAotICAgIHsgMHhENjQwLCAweEQ2N0UgfSwKLSAgICB7IDB4RDY4MCwgMHhENkZFIH0sCi0gICAgeyAweEQ3NDAsIDB4RDc3RSB9LAotICAgIHsgMHhENzgwLCAweEQ3RjkgfSwKLSAgICB7IDB4RDg0MCwgMHhEODdFIH0sCi0gICAgeyAweEQ4ODAsIDB4RDhGRSB9LAotICAgIHsgMHhEOTQwLCAweEQ5N0UgfSwKLSAgICB7IDB4RDk4MCwgMHhEOUZFIH0sCi0gICAgeyAweERBNDAsIDB4REE3RSB9LAotICAgIHsgMHhEQTgwLCAweERBRkUgfSwKLSAgICB7IDB4REI0MCwgMHhEQjdFIH0sCi0gICAgeyAweERCODAsIDB4REJGRSB9LAotICAgIHsgMHhEQzQwLCAweERDN0UgfSwKLSAgICB7IDB4REM4MCwgMHhEQ0ZFIH0sCi0gICAgeyAweERENDAsIDB4REQ3RSB9LAotICAgIHsgMHhERDgwLCAweERERkUgfSwKLSAgICB7IDB4REU0MCwgMHhERTdFIH0sCi0gICAgeyAweERFODAsIDB4REVGRSB9LAotICAgIHsgMHhERjQwLCAweERGN0UgfSwKLSAgICB7IDB4REY4MCwgMHhERkZFIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMDgwLCAweEUwRkUgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxODAsIDB4RTFGRSB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTI4MCwgMHhFMkZFIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFMzgwLCAweEUzRkUgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0ODAsIDB4RTRGRSB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTU4MCwgMHhFNUZFIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNjgwLCAweEU2RkUgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3ODAsIDB4RTdGRSB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RTg4MCwgMHhFOEZFIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOTgwLCAweEU5RkUgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBODAsIDB4RUFGRSB9LAotICAgIHsgMHhFQjQwLCAweEVCN0UgfSwKLSAgICB7IDB4RUI4MCwgMHhFQkZFIH0sCi0gICAgeyAweEVDNDAsIDB4RUM3RSB9LAotICAgIHsgMHhFQzgwLCAweEVDRkUgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEODAsIDB4RURGRSB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUU4MCwgMHhFRUZFIH0sCi0gICAgeyAweEVGNDAsIDB4RUY3RSB9LAotICAgIHsgMHhFRjgwLCAweEVGRkUgfSwKLSAgICB7IDB4RjA0MCwgMHhGMDdFIH0sCi0gICAgeyAweEYwODAsIDB4RjBGRSB9LAotICAgIHsgMHhGMTQwLCAweEYxN0UgfSwKLSAgICB7IDB4RjE4MCwgMHhGMUZFIH0sCi0gICAgeyAweEYyNDAsIDB4RjI3RSB9LAotICAgIHsgMHhGMjgwLCAweEYyRkUgfSwKLSAgICB7IDB4RjM0MCwgMHhGMzdFIH0sCi0gICAgeyAweEYzODAsIDB4RjNGRSB9LAotICAgIHsgMHhGNDQwLCAweEY0N0UgfSwKLSAgICB7IDB4RjQ4MCwgMHhGNEZFIH0sCi0gICAgeyAweEY1NDAsIDB4RjU3RSB9LAotICAgIHsgMHhGNTgwLCAweEY1RkUgfSwKLSAgICB7IDB4RjY0MCwgMHhGNjdFIH0sCi0gICAgeyAweEY2ODAsIDB4RjZGRSB9LAotICAgIHsgMHhGNzQwLCAweEY3N0UgfSwKLSAgICB7IDB4Rjc4MCwgMHhGN0ZFIH0sCi0gICAgeyAweEY4NDAsIDB4Rjg3RSB9LAotICAgIHsgMHhGODgwLCAweEY4QTAgfSwKLSAgICB7IDB4Rjk0MCwgMHhGOTdFIH0sCi0gICAgeyAweEY5ODAsIDB4RjlBMCB9LAotICAgIHsgMHhGQTQwLCAweEZBN0UgfSwKLSAgICB7IDB4RkE4MCwgMHhGQUEwIH0sCi0gICAgeyAweEZCNDAsIDB4RkI3RSB9LAotICAgIHsgMHhGQjgwLCAweEZCQTAgfSwKLSAgICB7IDB4RkM0MCwgMHhGQzdFIH0sCi0gICAgeyAweEZDODAsIDB4RkNBMCB9LAotICAgIHsgMHhGRDQwLCAweEZEN0UgfSwKLSAgICB7IDB4RkQ4MCwgMHhGREEwIH0sCi0gICAgeyAweEZFNDAsIDB4RkU0RiB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTQ5LlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrRVVDS1JSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MSwgMHg4MTVBIH0sCi0gICAgeyAweDgxNjEsIDB4ODE3QSB9LAotICAgIHsgMHg4MTgxLCAweDgxRkUgfSwKLSAgICB7IDB4ODI0MSwgMHg4MjVBIH0sCi0gICAgeyAweDgyNjEsIDB4ODI3QSB9LAotICAgIHsgMHg4MjgxLCAweDgyRkUgfSwKLSAgICB7IDB4ODM0MSwgMHg4MzVBIH0sCi0gICAgeyAweDgzNjEsIDB4ODM3QSB9LAotICAgIHsgMHg4MzgxLCAweDgzRkUgfSwKLSAgICB7IDB4ODQ0MSwgMHg4NDVBIH0sCi0gICAgeyAweDg0NjEsIDB4ODQ3QSB9LAotICAgIHsgMHg4NDgxLCAweDg0RkUgfSwKLSAgICB7IDB4ODU0MSwgMHg4NTVBIH0sCi0gICAgeyAweDg1NjEsIDB4ODU3QSB9LAotICAgIHsgMHg4NTgxLCAweDg1RkUgfSwKLSAgICB7IDB4ODY0MSwgMHg4NjVBIH0sCi0gICAgeyAweDg2NjEsIDB4ODY3QSB9LAotICAgIHsgMHg4NjgxLCAweDg2RkUgfSwKLSAgICB7IDB4ODc0MSwgMHg4NzVBIH0sCi0gICAgeyAweDg3NjEsIDB4ODc3QSB9LAotICAgIHsgMHg4NzgxLCAweDg3RkUgfSwKLSAgICB7IDB4ODg0MSwgMHg4ODVBIH0sCi0gICAgeyAweDg4NjEsIDB4ODg3QSB9LAotICAgIHsgMHg4ODgxLCAweDg4RkUgfSwKLSAgICB7IDB4ODk0MSwgMHg4OTVBIH0sCi0gICAgeyAweDg5NjEsIDB4ODk3QSB9LAotICAgIHsgMHg4OTgxLCAweDg5RkUgfSwKLSAgICB7IDB4OEE0MSwgMHg4QTVBIH0sCi0gICAgeyAweDhBNjEsIDB4OEE3QSB9LAotICAgIHsgMHg4QTgxLCAweDhBRkUgfSwKLSAgICB7IDB4OEI0MSwgMHg4QjVBIH0sCi0gICAgeyAweDhCNjEsIDB4OEI3QSB9LAotICAgIHsgMHg4QjgxLCAweDhCRkUgfSwKLSAgICB7IDB4OEM0MSwgMHg4QzVBIH0sCi0gICAgeyAweDhDNjEsIDB4OEM3QSB9LAotICAgIHsgMHg4QzgxLCAweDhDRkUgfSwKLSAgICB7IDB4OEQ0MSwgMHg4RDVBIH0sCi0gICAgeyAweDhENjEsIDB4OEQ3QSB9LAotICAgIHsgMHg4RDgxLCAweDhERkUgfSwKLSAgICB7IDB4OEU0MSwgMHg4RTVBIH0sCi0gICAgeyAweDhFNjEsIDB4OEU3QSB9LAotICAgIHsgMHg4RTgxLCAweDhFRkUgfSwKLSAgICB7IDB4OEY0MSwgMHg4RjVBIH0sCi0gICAgeyAweDhGNjEsIDB4OEY3QSB9LAotICAgIHsgMHg4RjgxLCAweDhGRkUgfSwKLSAgICB7IDB4OTA0MSwgMHg5MDVBIH0sCi0gICAgeyAweDkwNjEsIDB4OTA3QSB9LAotICAgIHsgMHg5MDgxLCAweDkwRkUgfSwKLSAgICB7IDB4OTE0MSwgMHg5MTVBIH0sCi0gICAgeyAweDkxNjEsIDB4OTE3QSB9LAotICAgIHsgMHg5MTgxLCAweDkxRkUgfSwKLSAgICB7IDB4OTI0MSwgMHg5MjVBIH0sCi0gICAgeyAweDkyNjEsIDB4OTI3QSB9LAotICAgIHsgMHg5MjgxLCAweDkyRkUgfSwKLSAgICB7IDB4OTM0MSwgMHg5MzVBIH0sCi0gICAgeyAweDkzNjEsIDB4OTM3QSB9LAotICAgIHsgMHg5MzgxLCAweDkzRkUgfSwKLSAgICB7IDB4OTQ0MSwgMHg5NDVBIH0sCi0gICAgeyAweDk0NjEsIDB4OTQ3QSB9LAotICAgIHsgMHg5NDgxLCAweDk0RkUgfSwKLSAgICB7IDB4OTU0MSwgMHg5NTVBIH0sCi0gICAgeyAweDk1NjEsIDB4OTU3QSB9LAotICAgIHsgMHg5NTgxLCAweDk1RkUgfSwKLSAgICB7IDB4OTY0MSwgMHg5NjVBIH0sCi0gICAgeyAweDk2NjEsIDB4OTY3QSB9LAotICAgIHsgMHg5NjgxLCAweDk2RkUgfSwKLSAgICB7IDB4OTc0MSwgMHg5NzVBIH0sCi0gICAgeyAweDk3NjEsIDB4OTc3QSB9LAotICAgIHsgMHg5NzgxLCAweDk3RkUgfSwKLSAgICB7IDB4OTg0MSwgMHg5ODVBIH0sCi0gICAgeyAweDk4NjEsIDB4OTg3QSB9LAotICAgIHsgMHg5ODgxLCAweDk4RkUgfSwKLSAgICB7IDB4OTk0MSwgMHg5OTVBIH0sCi0gICAgeyAweDk5NjEsIDB4OTk3QSB9LAotICAgIHsgMHg5OTgxLCAweDk5RkUgfSwKLSAgICB7IDB4OUE0MSwgMHg5QTVBIH0sCi0gICAgeyAweDlBNjEsIDB4OUE3QSB9LAotICAgIHsgMHg5QTgxLCAweDlBRkUgfSwKLSAgICB7IDB4OUI0MSwgMHg5QjVBIH0sCi0gICAgeyAweDlCNjEsIDB4OUI3QSB9LAotICAgIHsgMHg5QjgxLCAweDlCRkUgfSwKLSAgICB7IDB4OUM0MSwgMHg5QzVBIH0sCi0gICAgeyAweDlDNjEsIDB4OUM3QSB9LAotICAgIHsgMHg5QzgxLCAweDlDRkUgfSwKLSAgICB7IDB4OUQ0MSwgMHg5RDVBIH0sCi0gICAgeyAweDlENjEsIDB4OUQ3QSB9LAotICAgIHsgMHg5RDgxLCAweDlERkUgfSwKLSAgICB7IDB4OUU0MSwgMHg5RTVBIH0sCi0gICAgeyAweDlFNjEsIDB4OUU3QSB9LAotICAgIHsgMHg5RTgxLCAweDlFRkUgfSwKLSAgICB7IDB4OUY0MSwgMHg5RjVBIH0sCi0gICAgeyAweDlGNjEsIDB4OUY3QSB9LAotICAgIHsgMHg5RjgxLCAweDlGRkUgfSwKLSAgICB7IDB4QTA0MSwgMHhBMDVBIH0sCi0gICAgeyAweEEwNjEsIDB4QTA3QSB9LAotICAgIHsgMHhBMDgxLCAweEEwRkUgfSwKLSAgICB7IDB4QTE0MSwgMHhBMTVBIH0sCi0gICAgeyAweEExNjEsIDB4QTE3QSB9LAotICAgIHsgMHhBMTgxLCAweEExRkUgfSwKLSAgICB7IDB4QTI0MSwgMHhBMjVBIH0sCi0gICAgeyAweEEyNjEsIDB4QTI3QSB9LAotICAgIHsgMHhBMjgxLCAweEEyRTcgfSwKLSAgICB7IDB4QTM0MSwgMHhBMzVBIH0sCi0gICAgeyAweEEzNjEsIDB4QTM3QSB9LAotICAgIHsgMHhBMzgxLCAweEEzRkUgfSwKLSAgICB7IDB4QTQ0MSwgMHhBNDVBIH0sCi0gICAgeyAweEE0NjEsIDB4QTQ3QSB9LAotICAgIHsgMHhBNDgxLCAweEE0RkUgfSwKLSAgICB7IDB4QTU0MSwgMHhBNTVBIH0sCi0gICAgeyAweEE1NjEsIDB4QTU3QSB9LAotICAgIHsgMHhBNTgxLCAweEE1QUEgfSwKLSAgICB7IDB4QTVCMCwgMHhBNUI5IH0sCi0gICAgeyAweEE1QzEsIDB4QTVEOCB9LAotICAgIHsgMHhBNUUxLCAweEE1RjggfSwKLSAgICB7IDB4QTY0MSwgMHhBNjVBIH0sCi0gICAgeyAweEE2NjEsIDB4QTY3QSB9LAotICAgIHsgMHhBNjgxLCAweEE2RTQgfSwKLSAgICB7IDB4QTc0MSwgMHhBNzVBIH0sCi0gICAgeyAweEE3NjEsIDB4QTc3QSB9LAotICAgIHsgMHhBNzgxLCAweEE3RUYgfSwKLSAgICB7IDB4QTg0MSwgMHhBODVBIH0sCi0gICAgeyAweEE4NjEsIDB4QTg3QSB9LAotICAgIHsgMHhBODgxLCAweEE4QTQgfSwKLSAgICB7IDB4QThBNiwgMHhBOEE2IH0sCi0gICAgeyAweEE4QTgsIDB4QThBRiB9LAotICAgIHsgMHhBOEIxLCAweEE4RkUgfSwKLSAgICB7IDB4QTk0MSwgMHhBOTVBIH0sCi0gICAgeyAweEE5NjEsIDB4QTk3QSB9LAotICAgIHsgMHhBOTgxLCAweEE5RkUgfSwKLSAgICB7IDB4QUE0MSwgMHhBQTVBIH0sCi0gICAgeyAweEFBNjEsIDB4QUE3QSB9LAotICAgIHsgMHhBQTgxLCAweEFBRjMgfSwKLSAgICB7IDB4QUI0MSwgMHhBQjVBIH0sCi0gICAgeyAweEFCNjEsIDB4QUI3QSB9LAotICAgIHsgMHhBQjgxLCAweEFCRjYgfSwKLSAgICB7IDB4QUM0MSwgMHhBQzVBIH0sCi0gICAgeyAweEFDNjEsIDB4QUM3QSB9LAotICAgIHsgMHhBQzgxLCAweEFDQzEgfSwKLSAgICB7IDB4QUNEMSwgMHhBQ0YxIH0sCi0gICAgeyAweEFENDEsIDB4QUQ1QSB9LAotICAgIHsgMHhBRDYxLCAweEFEN0EgfSwKLSAgICB7IDB4QUQ4MSwgMHhBREEwIH0sCi0gICAgeyAweEFFNDEsIDB4QUU1QSB9LAotICAgIHsgMHhBRTYxLCAweEFFN0EgfSwKLSAgICB7IDB4QUU4MSwgMHhBRUEwIH0sCi0gICAgeyAweEFGNDEsIDB4QUY1QSB9LAotICAgIHsgMHhBRjYxLCAweEFGN0EgfSwKLSAgICB7IDB4QUY4MSwgMHhBRkEwIH0sCi0gICAgeyAweEIwNDEsIDB4QjA1QSB9LAotICAgIHsgMHhCMDYxLCAweEIwN0EgfSwKLSAgICB7IDB4QjA4MSwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDEsIDB4QjE1QSB9LAotICAgIHsgMHhCMTYxLCAweEIxN0EgfSwKLSAgICB7IDB4QjE4MSwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDEsIDB4QjI1QSB9LAotICAgIHsgMHhCMjYxLCAweEIyN0EgfSwKLSAgICB7IDB4QjI4MSwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDEsIDB4QjM1QSB9LAotICAgIHsgMHhCMzYxLCAweEIzN0EgfSwKLSAgICB7IDB4QjM4MSwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDEsIDB4QjQ1QSB9LAotICAgIHsgMHhCNDYxLCAweEI0N0EgfSwKLSAgICB7IDB4QjQ4MSwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDEsIDB4QjU1QSB9LAotICAgIHsgMHhCNTYxLCAweEI1N0EgfSwKLSAgICB7IDB4QjU4MSwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDEsIDB4QjY1QSB9LAotICAgIHsgMHhCNjYxLCAweEI2N0EgfSwKLSAgICB7IDB4QjY4MSwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDEsIDB4Qjc1QSB9LAotICAgIHsgMHhCNzYxLCAweEI3N0EgfSwKLSAgICB7IDB4Qjc4MSwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDEsIDB4Qjg1QSB9LAotICAgIHsgMHhCODYxLCAweEI4N0EgfSwKLSAgICB7IDB4Qjg4MSwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDEsIDB4Qjk1QSB9LAotICAgIHsgMHhCOTYxLCAweEI5N0EgfSwKLSAgICB7IDB4Qjk4MSwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDEsIDB4QkE1QSB9LAotICAgIHsgMHhCQTYxLCAweEJBN0EgfSwKLSAgICB7IDB4QkE4MSwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDEsIDB4QkI1QSB9LAotICAgIHsgMHhCQjYxLCAweEJCN0EgfSwKLSAgICB7IDB4QkI4MSwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDEsIDB4QkM1QSB9LAotICAgIHsgMHhCQzYxLCAweEJDN0EgfSwKLSAgICB7IDB4QkM4MSwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDEsIDB4QkQ1QSB9LAotICAgIHsgMHhCRDYxLCAweEJEN0EgfSwKLSAgICB7IDB4QkQ4MSwgMHhCREZFIH0sCi0gICAgeyAweEJFNDEsIDB4QkU1QSB9LAotICAgIHsgMHhCRTYxLCAweEJFN0EgfSwKLSAgICB7IDB4QkU4MSwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDEsIDB4QkY1QSB9LAotICAgIHsgMHhCRjYxLCAweEJGN0EgfSwKLSAgICB7IDB4QkY4MSwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDEsIDB4QzA1QSB9LAotICAgIHsgMHhDMDYxLCAweEMwN0EgfSwKLSAgICB7IDB4QzA4MSwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDEsIDB4QzE1QSB9LAotICAgIHsgMHhDMTYxLCAweEMxN0EgfSwKLSAgICB7IDB4QzE4MSwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDEsIDB4QzI1QSB9LAotICAgIHsgMHhDMjYxLCAweEMyN0EgfSwKLSAgICB7IDB4QzI4MSwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDEsIDB4QzM1QSB9LAotICAgIHsgMHhDMzYxLCAweEMzN0EgfSwKLSAgICB7IDB4QzM4MSwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDEsIDB4QzQ1QSB9LAotICAgIHsgMHhDNDYxLCAweEM0N0EgfSwKLSAgICB7IDB4QzQ4MSwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDEsIDB4QzU1QSB9LAotICAgIHsgMHhDNTYxLCAweEM1N0EgfSwKLSAgICB7IDB4QzU4MSwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDEsIDB4QzY1MiB9LAotICAgIHsgMHhDNkExLCAweEM2RkUgfSwKLSAgICB7IDB4QzdBMSwgMHhDN0ZFIH0sCi0gICAgeyAweEM4QTEsIDB4QzhGRSB9LAotICAgIHsgMHhDQUExLCAweENBRkUgfSwKLSAgICB7IDB4Q0JBMSwgMHhDQkZFIH0sCi0gICAgeyAweENDQTEsIDB4Q0NGRSB9LAotICAgIHsgMHhDREExLCAweENERkUgfSwKLSAgICB7IDB4Q0VBMSwgMHhDRUZFIH0sCi0gICAgeyAweENGQTEsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMEExLCAweEQwRkUgfSwKLSAgICB7IDB4RDFBMSwgMHhEMUZFIH0sCi0gICAgeyAweEQyQTEsIDB4RDJGRSB9LAotICAgIHsgMHhEM0ExLCAweEQzRkUgfSwKLSAgICB7IDB4RDRBMSwgMHhENEZFIH0sCi0gICAgeyAweEQ1QTEsIDB4RDVGRSB9LAotICAgIHsgMHhENkExLCAweEQ2RkUgfSwKLSAgICB7IDB4RDdBMSwgMHhEN0ZFIH0sCi0gICAgeyAweEQ4QTEsIDB4RDhGRSB9LAotICAgIHsgMHhEOUExLCAweEQ5RkUgfSwKLSAgICB7IDB4REFBMSwgMHhEQUZFIH0sCi0gICAgeyAweERCQTEsIDB4REJGRSB9LAotICAgIHsgMHhEQ0ExLCAweERDRkUgfSwKLSAgICB7IDB4RERBMSwgMHhEREZFIH0sCi0gICAgeyAweERFQTEsIDB4REVGRSB9LAotICAgIHsgMHhERkExLCAweERGRkUgfSwKLSAgICB7IDB4RTBBMSwgMHhFMEZFIH0sCi0gICAgeyAweEUxQTEsIDB4RTFGRSB9LAotICAgIHsgMHhFMkExLCAweEUyRkUgfSwKLSAgICB7IDB4RTNBMSwgMHhFM0ZFIH0sCi0gICAgeyAweEU0QTEsIDB4RTRGRSB9LAotICAgIHsgMHhFNUExLCAweEU1RkUgfSwKLSAgICB7IDB4RTZBMSwgMHhFNkZFIH0sCi0gICAgeyAweEU3QTEsIDB4RTdGRSB9LAotICAgIHsgMHhFOEExLCAweEU4RkUgfSwKLSAgICB7IDB4RTlBMSwgMHhFOUZFIH0sCi0gICAgeyAweEVBQTEsIDB4RUFGRSB9LAotICAgIHsgMHhFQkExLCAweEVCRkUgfSwKLSAgICB7IDB4RUNBMSwgMHhFQ0ZFIH0sCi0gICAgeyAweEVEQTEsIDB4RURGRSB9LAotICAgIHsgMHhFRUExLCAweEVFRkUgfSwKLSAgICB7IDB4RUZBMSwgMHhFRkZFIH0sCi0gICAgeyAweEYwQTEsIDB4RjBGRSB9LAotICAgIHsgMHhGMUExLCAweEYxRkUgfSwKLSAgICB7IDB4RjJBMSwgMHhGMkZFIH0sCi0gICAgeyAweEYzQTEsIDB4RjNGRSB9LAotICAgIHsgMHhGNEExLCAweEY0RkUgfSwKLSAgICB7IDB4RjVBMSwgMHhGNUZFIH0sCi0gICAgeyAweEY2QTEsIDB4RjZGRSB9LAotICAgIHsgMHhGN0ExLCAweEY3RkUgfSwKLSAgICB7IDB4RjhBMSwgMHhGOEZFIH0sCi0gICAgeyAweEY5QTEsIDB4RjlGRSB9LAotICAgIHsgMHhGQUExLCAweEZBRkUgfSwKLSAgICB7IDB4RkJBMSwgMHhGQkZFIH0sCi0gICAgeyAweEZDQTEsIDB4RkNGRSB9LAotICAgIHsgMHhGREExLCAweEZERkUgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDk1MC5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0JpZzVSYW5nZXNbXSA9IHsKLSAgICB7IDB4QTE0MCwgMHhBMTdFIH0sCi0gICAgeyAweEExQTEsIDB4QTFGRSB9LAotICAgIHsgMHhBMjQwLCAweEEyN0UgfSwKLSAgICB7IDB4QTJBMSwgMHhBMkZFIH0sCi0gICAgeyAweEEzNDAsIDB4QTM3RSB9LAotICAgIHsgMHhBM0ExLCAweEEzQkYgfSwKLSAgICB7IDB4QTNFMSwgMHhBM0UxIH0sCi0gICAgeyAweEE0NDAsIDB4QTQ3RSB9LAotICAgIHsgMHhBNEExLCAweEE0RkUgfSwKLSAgICB7IDB4QTU0MCwgMHhBNTdFIH0sCi0gICAgeyAweEE1QTEsIDB4QTVGRSB9LAotICAgIHsgMHhBNjQwLCAweEE2N0UgfSwKLSAgICB7IDB4QTZBMSwgMHhBNkZFIH0sCi0gICAgeyAweEE3NDAsIDB4QTc3RSB9LAotICAgIHsgMHhBN0ExLCAweEE3RkUgfSwKLSAgICB7IDB4QTg0MCwgMHhBODdFIH0sCi0gICAgeyAweEE4QTEsIDB4QThGRSB9LAotICAgIHsgMHhBOTQwLCAweEE5N0UgfSwKLSAgICB7IDB4QTlBMSwgMHhBOUZFIH0sCi0gICAgeyAweEFBNDAsIDB4QUE3RSB9LAotICAgIHsgMHhBQUExLCAweEFBRkUgfSwKLSAgICB7IDB4QUI0MCwgMHhBQjdFIH0sCi0gICAgeyAweEFCQTEsIDB4QUJGRSB9LAotICAgIHsgMHhBQzQwLCAweEFDN0UgfSwKLSAgICB7IDB4QUNBMSwgMHhBQ0ZFIH0sCi0gICAgeyAweEFENDAsIDB4QUQ3RSB9LAotICAgIHsgMHhBREExLCAweEFERkUgfSwKLSAgICB7IDB4QUU0MCwgMHhBRTdFIH0sCi0gICAgeyAweEFFQTEsIDB4QUVGRSB9LAotICAgIHsgMHhBRjQwLCAweEFGN0UgfSwKLSAgICB7IDB4QUZBMSwgMHhBRkZFIH0sCi0gICAgeyAweEIwNDAsIDB4QjA3RSB9LAotICAgIHsgMHhCMEExLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MCwgMHhCMTdFIH0sCi0gICAgeyAweEIxQTEsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQwLCAweEIyN0UgfSwKLSAgICB7IDB4QjJBMSwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDAsIDB4QjM3RSB9LAotICAgIHsgMHhCM0ExLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MCwgMHhCNDdFIH0sCi0gICAgeyAweEI0QTEsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQwLCAweEI1N0UgfSwKLSAgICB7IDB4QjVBMSwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDAsIDB4QjY3RSB9LAotICAgIHsgMHhCNkExLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MCwgMHhCNzdFIH0sCi0gICAgeyAweEI3QTEsIDB4QjdGRSB9LAotICAgIHsgMHhCODQwLCAweEI4N0UgfSwKLSAgICB7IDB4QjhBMSwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDAsIDB4Qjk3RSB9LAotICAgIHsgMHhCOUExLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MCwgMHhCQTdFIH0sCi0gICAgeyAweEJBQTEsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQwLCAweEJCN0UgfSwKLSAgICB7IDB4QkJBMSwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDAsIDB4QkM3RSB9LAotICAgIHsgMHhCQ0ExLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MCwgMHhCRDdFIH0sCi0gICAgeyAweEJEQTEsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQwLCAweEJFN0UgfSwKLSAgICB7IDB4QkVBMSwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDAsIDB4QkY3RSB9LAotICAgIHsgMHhCRkExLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MCwgMHhDMDdFIH0sCi0gICAgeyAweEMwQTEsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQwLCAweEMxN0UgfSwKLSAgICB7IDB4QzFBMSwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDAsIDB4QzI3RSB9LAotICAgIHsgMHhDMkExLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MCwgMHhDMzdFIH0sCi0gICAgeyAweEMzQTEsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQwLCAweEM0N0UgfSwKLSAgICB7IDB4QzRBMSwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDAsIDB4QzU3RSB9LAotICAgIHsgMHhDNUExLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MCwgMHhDNjdFIH0sCi0gICAgeyAweEM5NDAsIDB4Qzk3RSB9LAotICAgIHsgMHhDOUExLCAweEM5RkUgfSwKLSAgICB7IDB4Q0E0MCwgMHhDQTdFIH0sCi0gICAgeyAweENBQTEsIDB4Q0FGRSB9LAotICAgIHsgMHhDQjQwLCAweENCN0UgfSwKLSAgICB7IDB4Q0JBMSwgMHhDQkZFIH0sCi0gICAgeyAweENDNDAsIDB4Q0M3RSB9LAotICAgIHsgMHhDQ0ExLCAweENDRkUgfSwKLSAgICB7IDB4Q0Q0MCwgMHhDRDdFIH0sCi0gICAgeyAweENEQTEsIDB4Q0RGRSB9LAotICAgIHsgMHhDRTQwLCAweENFN0UgfSwKLSAgICB7IDB4Q0VBMSwgMHhDRUZFIH0sCi0gICAgeyAweENGNDAsIDB4Q0Y3RSB9LAotICAgIHsgMHhDRkExLCAweENGRkUgfSwKLSAgICB7IDB4RDA0MCwgMHhEMDdFIH0sCi0gICAgeyAweEQwQTEsIDB4RDBGRSB9LAotICAgIHsgMHhEMTQwLCAweEQxN0UgfSwKLSAgICB7IDB4RDFBMSwgMHhEMUZFIH0sCi0gICAgeyAweEQyNDAsIDB4RDI3RSB9LAotICAgIHsgMHhEMkExLCAweEQyRkUgfSwKLSAgICB7IDB4RDM0MCwgMHhEMzdFIH0sCi0gICAgeyAweEQzQTEsIDB4RDNGRSB9LAotICAgIHsgMHhENDQwLCAweEQ0N0UgfSwKLSAgICB7IDB4RDRBMSwgMHhENEZFIH0sCi0gICAgeyAweEQ1NDAsIDB4RDU3RSB9LAotICAgIHsgMHhENUExLCAweEQ1RkUgfSwKLSAgICB7IDB4RDY0MCwgMHhENjdFIH0sCi0gICAgeyAweEQ2QTEsIDB4RDZGRSB9LAotICAgIHsgMHhENzQwLCAweEQ3N0UgfSwKLSAgICB7IDB4RDdBMSwgMHhEN0ZFIH0sCi0gICAgeyAweEQ4NDAsIDB4RDg3RSB9LAotICAgIHsgMHhEOEExLCAweEQ4RkUgfSwKLSAgICB7IDB4RDk0MCwgMHhEOTdFIH0sCi0gICAgeyAweEQ5QTEsIDB4RDlGRSB9LAotICAgIHsgMHhEQTQwLCAweERBN0UgfSwKLSAgICB7IDB4REFBMSwgMHhEQUZFIH0sCi0gICAgeyAweERCNDAsIDB4REI3RSB9LAotICAgIHsgMHhEQkExLCAweERCRkUgfSwKLSAgICB7IDB4REM0MCwgMHhEQzdFIH0sCi0gICAgeyAweERDQTEsIDB4RENGRSB9LAotICAgIHsgMHhERDQwLCAweEREN0UgfSwKLSAgICB7IDB4RERBMSwgMHhEREZFIH0sCi0gICAgeyAweERFNDAsIDB4REU3RSB9LAotICAgIHsgMHhERUExLCAweERFRkUgfSwKLSAgICB7IDB4REY0MCwgMHhERjdFIH0sCi0gICAgeyAweERGQTEsIDB4REZGRSB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTBBMSwgMHhFMEZFIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMUExLCAweEUxRkUgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyQTEsIDB4RTJGRSB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTNBMSwgMHhFM0ZFIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNEExLCAweEU0RkUgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1QTEsIDB4RTVGRSB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTZBMSwgMHhFNkZFIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFN0ExLCAweEU3RkUgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4QTEsIDB4RThGRSB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTlBMSwgMHhFOUZFIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQUExLCAweEVBRkUgfSwKLSAgICB7IDB4RUI0MCwgMHhFQjdFIH0sCi0gICAgeyAweEVCQTEsIDB4RUJGRSB9LAotICAgIHsgMHhFQzQwLCAweEVDN0UgfSwKLSAgICB7IDB4RUNBMSwgMHhFQ0ZFIH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFREExLCAweEVERkUgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFQTEsIDB4RUVGRSB9LAotICAgIHsgMHhFRjQwLCAweEVGN0UgfSwKLSAgICB7IDB4RUZBMSwgMHhFRkZFIH0sCi0gICAgeyAweEYwNDAsIDB4RjA3RSB9LAotICAgIHsgMHhGMEExLCAweEYwRkUgfSwKLSAgICB7IDB4RjE0MCwgMHhGMTdFIH0sCi0gICAgeyAweEYxQTEsIDB4RjFGRSB9LAotICAgIHsgMHhGMjQwLCAweEYyN0UgfSwKLSAgICB7IDB4RjJBMSwgMHhGMkZFIH0sCi0gICAgeyAweEYzNDAsIDB4RjM3RSB9LAotICAgIHsgMHhGM0ExLCAweEYzRkUgfSwKLSAgICB7IDB4RjQ0MCwgMHhGNDdFIH0sCi0gICAgeyAweEY0QTEsIDB4RjRGRSB9LAotICAgIHsgMHhGNTQwLCAweEY1N0UgfSwKLSAgICB7IDB4RjVBMSwgMHhGNUZFIH0sCi0gICAgeyAweEY2NDAsIDB4RjY3RSB9LAotICAgIHsgMHhGNkExLCAweEY2RkUgfSwKLSAgICB7IDB4Rjc0MCwgMHhGNzdFIH0sCi0gICAgeyAweEY3QTEsIDB4RjdGRSB9LAotICAgIHsgMHhGODQwLCAweEY4N0UgfSwKLSAgICB7IDB4RjhBMSwgMHhGOEZFIH0sCi0gICAgeyAweEY5NDAsIDB4Rjk3RSB9LAotICAgIHsgMHhGOUExLCAweEY5RkUgfSwKLX07Ci0KLXN0YXRpYyBib29sIGNoYXJNYXRjaGVzRW5jb2RpbmcoaW50IGNoLCBjb25zdCBDaGFyUmFuZ2UqIGVuY29kaW5nUmFuZ2VzLCBpbnQgcmFuZ2VDb3VudCkgewotICAgIC8vIFVzZSBiaW5hcnkgc2VhcmNoIHRvIHNlZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGNvbnRhaW5lZCBpbiB0aGUgZW5jb2RpbmcKLSAgICBpbnQgbG93ID0gMDsKLSAgICBpbnQgaGlnaCA9IHJhbmdlQ291bnQ7Ci0KLSAgICB3aGlsZSAobG93IDwgaGlnaCkgewotICAgICAgICBpbnQgaSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICAgIGNvbnN0IENoYXJSYW5nZSogcmFuZ2UgPSAmZW5jb2RpbmdSYW5nZXNbaV07Ci0gICAgICAgIGlmIChjaCA+PSByYW5nZS0+Zmlyc3QgJiYgY2ggPD0gcmFuZ2UtPmxhc3QpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoID4gcmFuZ2UtPmxhc3QpCi0gICAgICAgICAgICBsb3cgPSBpICsgMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGlnaCA9IGk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1leHRlcm4gdWludDMyX3QgZmluZFBvc3NpYmxlRW5jb2RpbmdzKGludCBjaCkKLXsKLSAgICAvLyBBU0NJSSBtYXRjaGVzIGV2ZXJ5dGhpbmcKLSAgICBpZiAoY2ggPCAyNTYpIHJldHVybiBrRW5jb2RpbmdBbGw7Ci0KLSAgICBpbnQgcmVzdWx0ID0ga0VuY29kaW5nTm9uZTsKLQotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrU2hpZnRKSVNSYW5nZXMsIEFSUkFZX1NJWkUoa1NoaWZ0SklTUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdTaGlmdEpJUzsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0dCS1JhbmdlcywgQVJSQVlfU0laRShrR0JLUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdHQks7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtCaWc1UmFuZ2VzLCBBUlJBWV9TSVpFKGtCaWc1UmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdCaWc1OwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrRVVDS1JSYW5nZXMsIEFSUkFZX1NJWkUoa0VVQ0tSUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdFVUNLUjsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmggYi9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzVkYjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVVUT0RFVEVDVF9ICi0jZGVmaW5lIEFVVE9ERVRFQ1RfSAotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotLy8gZmxhZ3MgdXNlZCBmb3IgbmF0aXZlIGVuY29kaW5nIGRldGVjdGlvbgotZW51bSB7Ci0gICAga0VuY29kaW5nTm9uZSAgICAgICAgICAgICAgID0gMCwKLSAgICBrRW5jb2RpbmdTaGlmdEpJUyAgICAgICAgICAgPSAoMSA8PCAwKSwKLSAgICBrRW5jb2RpbmdHQksgICAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKLSAgICBrRW5jb2RpbmdCaWc1ICAgICAgICAgICAgICAgPSAoMSA8PCAyKSwKLSAgICBrRW5jb2RpbmdFVUNLUiAgICAgICAgICAgICAgPSAoMSA8PCAzKSwKLQotICAgIGtFbmNvZGluZ0FsbCAgICAgICAgICAgICAgICA9IChrRW5jb2RpbmdTaGlmdEpJUyB8IGtFbmNvZGluZ0dCSyB8IGtFbmNvZGluZ0JpZzUgfCBrRW5jb2RpbmdFVUNLUiksCi19OwotCi0KLS8vIHJldHVybnMgYSBiaXRmaWVsZCBjb250YWluaW5nIHRoZSBwb3NzaWJsZSBuYXRpdmUgZW5jb2RpbmdzIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi1leHRlcm4gdWludDMyX3QgZmluZFBvc3NpYmxlRW5jb2RpbmdzKGludCBjaCk7Ci0KLSNlbmRpZiAvLyBBVVRPREVURUNUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggMTEwYjk0Yy4uMzlhMjM5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTE4LDkgKzE4LDEyIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpAQCAtOTMsNyArOTYsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEwNiwxMiArMTExLDEyIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBBTE9HVigiZGF0YSBzb3VyY2UgKCVzKSIsIHNyY1VybCk7Ci0gICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2Uoc3JjVXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgc3JjVXJsLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKQEAgLTEyNiw3ICsxMzEsNyBAQAogCiBzcDxJTWVtb3J5PiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKIHsKLSAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJWxsZCB1cykgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CkBAIC0xNTcsNyArMTYyLDcgQEAKICAgICByZXR1cm4gbVJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiB9CiAKLXZvaWQgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNTZXJ2aWNlTG9jayk7CiAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c1NlcnZpY2UuY2xlYXIoKTsKICAgICBBTE9HVygiTWVkaWFNZXRhZGF0YVJldHJpZXZlciBzZXJ2ZXIgZGllZCEiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCA3YTZmMzFkLi45NjExYWM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC0xNywxMiArMTcsMTQgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1Db29raWUgPSBOVUxMOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9JRExFOwpAQCAtNTcsOCArNjAsOCBAQAogICAgIG1MZWZ0Vm9sdW1lID0gbVJpZ2h0Vm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7CisgICAgbUF1ZGlvU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIG1TZW5kTGV2ZWwgPSAwOwogICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCA9IGZhbHNlOwogfQpAQCAtNjYsNyArNjksMTEgQEAKIE1lZGlhUGxheWVyOjp+TWVkaWFQbGF5ZXIoKQogewogICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CkBAIC0xMzYsNiArMTQzLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJsKTsKQEAgLTE0NSw3ICsxNTMsNyBAQAogICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CiAgICAgICAgICAgICBpZiAoKE5PX0VSUk9SICE9IGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KHBsYXllcikpIHx8Ci0gICAgICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKSkgeworICAgICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpKSB7CiAgICAgICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBhdHRhY2hOZXdQbGF5ZXIocGxheWVyKTsKQEAgLTE1Niw3ICsxNjQsNyBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7CkBAIC0xOTMsNyArMjAxLDcgQEAKICAgICAgICAgICAgIChtQ3VycmVudFN0YXRlICE9IE1FRElBX1BMQVlFUl9TVEFURV9FUlJPUikgJiYKICAgICAgICAgICAgICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9JRExFKSAhPSBNRURJQV9QTEFZRVJfSURMRSk7CiAgICAgaWYgKChtUGxheWVyICE9IE5VTEwpICYmIGhhc0JlZW5Jbml0aWFsaXplZCkgewotICAgICAgICBBTE9HVigiaW52b2tlICVkIiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOwogICAgICAgICByZXR1cm4gIG1QbGF5ZXItPmludm9rZShyZXF1ZXN0LCByZXBseSk7CiAgICAgfQogICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCIsIG1DdXJyZW50U3RhdGUpOwpAQCAtMjM0LDYgKzI0Miw5IEBACiB7CiAgICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUl9TVE9QUEVEKSApICkgewogICAgICAgICBtUGxheWVyLT5zZXRBdWRpb1N0cmVhbVR5cGUobVN0cmVhbVR5cGUpOworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTLCAqbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCk7CisgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9QUkVQQVJJTkc7CiAgICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKICAgICB9CkBAIC0yODAsMTYgKzI5MSwyMSBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnN0YXJ0KCkKIHsKICAgICBBTE9HVigic3RhcnQiKTsKKworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVJfU1RBUlRFRCkKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfUFJFUEFSRUQgfAorCisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CisKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgIHJldCA9IE5PX0VSUk9SOworICAgIH0gZWxzZSBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1BSRVBBUkVEIHwKICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSX1BMQVlCQUNLX0NPTVBMRVRFIHwgTUVESUFfUExBWUVSX1BBVVNFRCApICkgKSB7CiAgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOwogICAgICAgICBtUGxheWVyLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CiAgICAgICAgIG1QbGF5ZXItPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFSVEVEOwotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdGFydCgpOworICAgICAgICByZXQgPSBtUGxheWVyLT5zdGFydCgpOwogICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SOwogICAgICAgICB9IGVsc2UgewpAQCAtMjk3LDEwICszMTMsMTQgQEAKICAgICAgICAgICAgICAgICBBTE9HVigicGxheWJhY2sgY29tcGxldGVkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBzdGFydCgpIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgic3RhcnQgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBBTE9HRSgic3RhcnQgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c3RvcCgpCkBAIC01MzAsNiArNTUwLDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgKnR5cGUpCit7CisgICAgQUxPR1YoImdldEF1ZGlvU3RyZWFtVHlwZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKnR5cGUgPSBtU3RyZWFtVHlwZTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRMb29waW5nKGludCBsb29wKQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0TG9vcGluZyIpOwpAQCAtNTc1LDggKzYwMyw4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKHNlc3Npb25JZCwgLTEpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgICAgICBtQXVkaW9TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTYxMywxNSArNjQxLDQ2IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CiB9CiAKKy8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6Y2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpCit7CisgICAgc3dpdGNoKGtleSkgeworICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgorICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSX1NUQVJURUQgfAorICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QQVVTRUQgfCBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKKyAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpCiB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuICBtUGxheWVyLT5zZXRQYXJhbWV0ZXIoa2V5LCByZXF1ZXN0KTsKICAgICB9Ci0gICAgQUxPR1YoInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgorICAgICAgICAvLyBubyBwbGF5ZXIsIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7IGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOyB9OworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOworICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpCkBAIC02NzMsOCArNzMyLDggQEAKICAgICAvLyBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIG1lZGlhIHNlcnZlci4gSW4gdGhhdCBjYXNlLAogICAgIC8vIHRoaXMgd2lsbCBkZWFkbG9jay4KICAgICAvLwotICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlCi0gICAgLy8gYW5kIHNlZWtUbyB3aXRoaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAvLyBUaGUgdGhyZWFkSWQgaGFjayBiZWxvdyB3b3JrcyBhcm91bmQgdGhpcyBmb3IgdGhlIGNhcmUgb2YgcHJlcGFyZSwKKyAgICAvLyBzZWVrVG8gYW5kIHN0YXJ0IHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgogICAgIC8vIEZJWE1FOiBSZW1lbWJlciwgdGhpcyBpcyBhIGhhY2ssIGl0J3Mgbm90IGV2ZW4gYSBoYWNrIHRoYXQgaXMgYXBwbGllZAogICAgIC8vIGNvbnNpc3RlbnRseSBmb3IgYWxsIHVzZS1jYXNlcywgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQuCiAgICAgaWYgKG1Mb2NrVGhyZWFkSWQgIT0gZ2V0VGhyZWFkSWQoKSkgewpAQCAtNzc2LDE1ICs4MzUsMjAgQEAKICAgICB9CiB9CiAKLS8qc3RhdGljKi8gc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgIHNpemVfdCAqcFNpemUpCiB7CiAgICAgQUxPR1YoImRlY29kZSglcykiLCB1cmwpOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc3RhdHVzID0gc2VydmljZS0+ZGVjb2RlKHVybCwgcFNhbXBsZVJhdGUsIHBOdW1DaGFubmVscywgcEZvcm1hdCwgaGVhcCwgcFNpemUpOworICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUoaHR0cFNlcnZpY2UsIHVybCwgcFNhbXBsZVJhdGUsIHBOdW1DaGFubmVscywgcEZvcm1hdCwgaGVhcCwgcFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9jYXRlIG1lZGlhIHNlcnZpY2UiKTsKICAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7CkBAIC04MDQsNyArODY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpCiB7Ci0gICAgQUxPR1YoImRlY29kZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJkZWNvZGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSA9IGdldE1lZGlhUGxheWVyU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKQEAgLTgzMiwxNSArODk2LDQgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0TmV4dFBsYXllcihuZXh0ID09IE5VTEwgPyBOVUxMIDogbmV4dC0+bVBsYXllcik7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyOjp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKLQotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotICAgIH0KLQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggMzcxMGU0Ni4uMTk1MmI4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTE3LDYgKzE3LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVJlY29yZGVyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0xODMsOCArMTg2LDExIEBACiAgICAgICAgIEFMT0dFKCJzZXRPdXRwdXRGb3JtYXQgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1Jc1ZpZGVvU291cmNlU2V0ICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX1JUUF9BVlAgJiYgb2YgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKSB7IC8vZmlyc3Qgbm9uLXZpZGVvIG91dHB1dCBmb3JtYXQKLSAgICAgICAgQUxPR0UoIm91dHB1dCBmb3JtYXQgKCVkKSBpcyBtZWFudCBmb3IgYXVkaW8gcmVjb3JkaW5nIG9ubHkgYW5kIGluY29tcGF0aWJsZSB3aXRoIHZpZGVvIHJlY29yZGluZyIsIG9mKTsKKyAgICBpZiAobUlzVmlkZW9Tb3VyY2VTZXQKKyAgICAgICAgICAgICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCAvL2ZpcnN0IG5vbi12aWRlbyBvdXRwdXQgZm9ybWF0CisgICAgICAgICAgICAmJiBvZiA8IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9FTkQpIHsKKyAgICAgICAgQUxPR0UoIm91dHB1dCBmb3JtYXQgKCVkKSBpcyBtZWFudCBmb3IgYXVkaW8gcmVjb3JkaW5nIG9ubHkiCisgICAgICAgICAgICAgICIgYW5kIGluY29tcGF0aWJsZSB3aXRoIHZpZGVvIHJlY29yZGluZyIsIG9mKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMjg2LDcgKzI5Miw3IEBACiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBhNjQ1ZjEzLi4yY2Y1NzEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjIsMTIgKzIyLDE0IEBACiAgICAgU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwICAgICAgIFwKICAgICBTdGFnZWZyaWdodFJlY29yZGVyLmNwcCAgICAgXAogICAgIFRlc3RQbGF5ZXJTdHViLmNwcCAgICAgICAgICBcCisgICAgVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgICAgIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCiAgICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJjYW1lcmFfY2xpZW50ICAgICAgICAgICAgXAogICAgIGxpYmNyeXB0byAgICAgICAgICAgICAgICAgICBcCiAgICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaWJkcm1mcmFtZXdvcmsgICAgICAgICAgICAgXAogICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbGliZGwgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDYsMTAgKzQ4LDEwIEBACiAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5ICAgICAgICAgIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmNwcAppbmRleCBkNTAwMzdmLi5kMjIyMzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmNwcApAQCAtNDE3LDYgKzQxNywyMyBAQAogICAgIHJldHVybiBtUGx1Z2luLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UocmVzcG9uc2UsIGNlcnRpZmljYXRlLCB3cmFwcGVkS2V5KTsKIH0KIAorc3RhdHVzX3QgRHJtOjp1bnByb3Zpc2lvbkRldmljZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLlJFTU9WRV9EUk1fQ0VSVElGSUNBVEVTIikpIHsKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsdWdpbi0+dW5wcm92aXNpb25EZXZpY2UoKTsKK30KIAogc3RhdHVzX3QgRHJtOjpnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKaW5kZXggM2Q0YjBmYy4uOWUyM2UyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaApAQCAtNzUsNiArNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCmluZGV4IGMyYWMxYTMuLmFmZTM5MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKQEAgLTEwNywxMSArMTA3LDcgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgLy8gVE8tRE86Ci0gICAgLy8gT25seSBzdXBwb3J0IEhEQ1BfQ0FQU19FTkNSWVBUIChieXRlLWFycmF5IHRvIGJ5dGUtYXJyYXkpIGZvciBub3cuCi0gICAgLy8gdXNlIG1IRENQTW9kdWxlLT5nZXRDYXBzKCkgd2hlbiB0aGUgSERDUCBsaWJyYXJpZXMgZ2V0IHVwZGF0ZWQuCi0gICAgLy9yZXR1cm4gbUhEQ1BNb2R1bGUtPmdldENhcHMoKTsKLSAgICByZXR1cm4gSERDUE1vZHVsZTo6SERDUF9DQVBTX0VOQ1JZUFQ7CisgICAgcmV0dXJuIG1IRENQTW9kdWxlLT5nZXRDYXBzKCk7CiB9CiAKIHN0YXR1c190IEhEQ1A6OmVuY3J5cHQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IDA5ZTY5NzYuLjNlMGZjMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC02MCwxNCArNjAsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXBsYXllcl90eXBlIE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0RGVmYXVsdFBsYXllclR5cGUoKSB7CitzdGF0aWMgcGxheWVyX3R5cGUgZ2V0RGVmYXVsdFBsYXllclR5cGUoKSB7CiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnVzZS1udXBsYXllciIsIHZhbHVlLCBOVUxMKQorICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnVzZS1hd2Vzb21lIiwgdmFsdWUsIE5VTEwpCiAgICAgICAgICAgICAmJiAoIXN0cmNtcCgiMSIsIHZhbHVlKSB8fCAhc3RyY2FzZWNtcCgidHJ1ZSIsIHZhbHVlKSkpIHsKLSAgICAgICAgcmV0dXJuIE5VX1BMQVlFUjsKKyAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKICAgICB9CiAKLSAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOworICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIEVYUEVSSU1FTlRBTCBkZXZlbG9wZXIgc2V0dGluZ3MgcHJvcGVydHkKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5tZWRpYS51c2UtYXdlc29tZSIsIHZhbHVlLCBOVUxMKQorICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVfUExBWUVSOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllckZhY3Rvcnk6OnJlZ2lzdGVyRmFjdG9yeShJRmFjdG9yeSogZmFjdG9yeSwKQEAgLTE3NSwxNiArMTgxLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgewotICAgICAgICBjaGFyIGJ1ZlsyMF07Ci0gICAgICAgIGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgIGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKGdldERlZmF1bHRQbGF5ZXJUeXBlKCkKKyAgICAgICAgICAgICAgICA9PSBTVEFHRUZSSUdIVF9QTEFZRVIpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzIwXTsKKyAgICAgICAgICAgIGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOwogCi0gICAgICAgIGxvbmcgaWRlbnQgPSAqKChsb25nKilidWYpOworICAgICAgICAgICAgdWludDMyX3QgaWRlbnQgPSAqKCh1aW50MzJfdCopYnVmKTsKIAotICAgICAgICAvLyBPZ2cgdm9yYmlzPwotICAgICAgICBpZiAoaWRlbnQgPT0gMHg1MzY3Njc0ZikgLy8gJ09nZ1MnCi0gICAgICAgICAgICByZXR1cm4gMS4wOworICAgICAgICAgICAgLy8gT2dnIHZvcmJpcz8KKyAgICAgICAgICAgIGlmIChpZGVudCA9PSAweDUzNjc2NzRmKSAvLyAnT2dnUycKKyAgICAgICAgICAgICAgICByZXR1cm4gMS4wOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKaW5kZXggNWRkZGUxOS4uNTVmZjkxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaApAQCAtNzEsNyArNzEsNiBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHJlZ2lzdGVyRmFjdG9yeV9sKElGYWN0b3J5KiBmYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJfdHlwZSB0eXBlKTsKLSAgICBzdGF0aWMgcGxheWVyX3R5cGUgZ2V0RGVmYXVsdFBsYXllclR5cGUoKTsKIAogICAgIHN0YXRpYyBNdXRleCAgICAgICBzTG9jazsKICAgICBzdGF0aWMgdEZhY3RvcnlNYXAgc0ZhY3RvcnlNYXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGEzOTJiNzYuLjhlYjEyNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTQyLDggKzQzLDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CkBAIC01Miw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0xODUsNiArMTg5LDYzIEBACiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIAorbmFtZXNwYWNlIHsKK3VzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OworCisvLyBtYXJzaGFsbGluZyB0YWcgaW5kaWNhdGluZyBmbGF0dGVuZWQgdXRmMTYgdGFncworLy8ga2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuamF2YQorY29uc3QgaW50MzJfdCBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyA9IDE7CisKKy8vIEF1ZGlvIGF0dHJpYnV0ZXMgZm9ybWF0IGluIGEgcGFyY2VsOgorLy8KKy8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzICB8IC8vIGlnbm9yZSB0YWdzIGlmIG5vdCBmb3VuZAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZCB0YWdzIGluIFVURjE2ICAgICAgICAgICAgICAgICB8CisvLyB8ICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vCisvLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBjb250YWlucyBhdWRpbyBhdHRyaWJ1dGVzLgorLy8gQHBhcmFtW291dF0gYXR0cmlidXRlcyBPbiBleGl0IHBvaW50cyB0byBhbiBpbml0aWFsaXplZCBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RydWN0dXJlCisvLyBAcGFyYW1bb3V0XSBzdGF0dXMgT24gZXhpdCBjb250YWlucyB0aGUgc3RhdHVzIGNvZGUgdG8gYmUgcmV0dXJuZWQuCit2b2lkIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcykKK3sKKyAgICBhdHRyaWJ1dGVzLT51c2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgYXR0cmlidXRlcy0+Y29udGVudF90eXBlID0gKGF1ZGlvX2NvbnRlbnRfdHlwZV90KSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgYXR0cmlidXRlcy0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgYXR0cmlidXRlcy0+ZmxhZ3MgPSAoYXVkaW9fZmxhZ3NfbWFza190KSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLnJlYWRJbnQzMigpID09IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzKTsKKyAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7CisgICAgICAgIC8vIHRoZSB0YWdzIGFyZSBVVEYxNiwgY29udmVydCB0byBVVEY4CisgICAgICAgIFN0cmluZzE2IHRhZ3MgPSBwYXJjZWwucmVhZFN0cmluZzE2KCk7CisgICAgICAgIHNzaXplX3QgcmVhbFRhZ1NpemUgPSB1dGYxNl90b191dGY4X2xlbmd0aCh0YWdzLnN0cmluZygpLCB0YWdzLnNpemUoKSk7CisgICAgICAgIGlmIChyZWFsVGFnU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY29weSB0aGUgZmxhdHRlbmVkIHN0cmluZyBpbnRvIHRoZSBhdHRyaWJ1dGVzIGFzIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbnZlcnNpb246CisgICAgICAgICAgICAvLyBjb3B5aW5nIGFycmF5IHNpemUgLTEsIGFycmF5IGZvciB0YWdzIHdhcyBjYWxsb2MnZCwgbm8gbmVlZCB0byBOVUxMLXRlcm1pbmF0ZSBpdAorICAgICAgICAgICAgc2l6ZV90IHRhZ1NpemUgPSByZWFsVGFnU2l6ZSA+IEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgPworICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxIDogcmVhbFRhZ1NpemU7CisgICAgICAgICAgICB1dGYxNl90b191dGY4KHRhZ3Muc3RyaW5nKCksIHRhZ1NpemUsIGF0dHJpYnV0ZXMtPnRhZ3MpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7CisgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgfQorfQorfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgY2hhciogcGVybWlzc2lvblN0cmluZykgewpAQCAtMjIwLDYgKzI4MSwyMCBAQAogICAgIC8vIHNwZWFrZXIgaXMgb24gYnkgZGVmYXVsdAogICAgIG1CYXR0ZXJ5QXVkaW8uZGV2aWNlT25bU1BFQUtFUl0gPSAxOwogCisgICAgLy8gcmVzZXQgYmF0dGVyeSBzdGF0cworICAgIC8vIGlmIHRoZSBtZWRpYXNlcnZlciBoYXMgY3Jhc2hlZCwgYmF0dGVyeSBzdGF0cyBjb3VsZCBiZSBsZWZ0CisgICAgLy8gaW4gYmFkIHN0YXRlLCByZXNldCB0aGUgc3RhdGUgdXBvbiBzZXJ2aWNlIHN0YXJ0LgorICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOworICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOworICAgICAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U3RhdHMgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldFZpZGVvKCk7CisgICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldEF1ZGlvKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBNZWRpYVBsYXllckZhY3Rvcnk6OnJlZ2lzdGVyQnVpbHRpbkZhY3RvcmllcygpOwogfQogCkBAIC0yNzUsNiArMzUwLDEwIEBACiAgICAgcmV0dXJuIGM7CiB9CiAKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRDb2RlY0xpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCk7Cit9CisKIHNwPElPTVg+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0T01YKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMwNiwxMiArMzg1LDcgQEAKICAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkoY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIHJldHVybiBIVFRQQmFzZTo6VXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9DYWNoZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3QKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTUxMiw2ICs1ODYsNyBAQAogICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOwogICAgIG1VSUQgPSB1aWQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgIEFMT0dEKCJjcmVhdGUgQW50YWdvbml6ZXIiKTsKQEAgLTUyNiw2ICs2MDEsOSBAQAogICAgIHdwPENsaWVudD4gY2xpZW50KHRoaXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGNsaWVudCk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpCkBAIC01OTAsNyArNjY4LDggQEAKICAgICB9CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKICAgICB9CiAKQEAgLTYyMiw3ICs3MDEsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIGlmICh1cmwgPT0gTlVMTCkKQEAgLTY1Nyw3ICs3MzgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KIAotICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKTsKKyAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpOwogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiB9CkBAIC02NzQsOCArNzU1LDggQEAKIAogICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwotICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc2Iuc3RfdWlkKTsKLSAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHNiLnN0X2dpZCk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwogICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHNiLnN0X3NpemUpOwogCiAgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CkBAIC04MDQsNyArODg1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldE1ldGFkYXRhKAotICAgICAgICBib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICpyZXBseSkKKyAgICAgICAgYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKmFwcGx5X2ZpbHRlciovLCBQYXJjZWwgKnJlcGx5KQogewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcGxheWVyID0gZ2V0UGxheWVyKCk7CiAgICAgaWYgKHBsYXllciA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTk2OSw2ICsxMDUwLDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpCit7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeyBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOyB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRMb29waW5nKGludCBsb29wKQogewogICAgIEFMT0dWKCJbJWRdIHNldExvb3BpbmcoJWQpIiwgbUNvbm5JZCwgbG9vcCk7CkBAIC0xMDE3LDkgKzExMTQsMTcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKICAgICBBTE9HVigiWyVkXSBzZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICAgICAgaWYgKHAgPT0gMCkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgICAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKQEAgLTExNzYsOSArMTI4MSwxNCBAQAogfQogI2VuZGlmCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7CkBAIC0xMjA2LDcgKzEzMTYsNyBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKIAogICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OworICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCkgIT0gTk9fRVJST1IpIGdvdG8gRXhpdDsKIAogICAgIEFMT0dWKCJwcmVwYXJlIik7CiAgICAgcGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTEyOTYsMTMgKzE0MDYsMTUgQEAKIAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAogICAgICAgbVVpZCh1aWQpLAorICAgICAgbVBpZChwaWQpLAogICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKQEAgLTEzMTQsNiArMTQyNiw3IEBACiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtU2VuZExldmVsID0gMC4wOwogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbUF0dHJpYnV0ZXMgPSBhdHRyOwogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQpAQCAtMTM4NCw2ICsxNDk3LDEyIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdAoreworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QKIHsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwpAQCAtMTQwMyw2ICsxNTIyLDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgeworICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKK30KKwogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrKCkKIHsKICAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFjayIpOwpAQCAtMTQ1MCw3ICsxNTczLDcgQEAKICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgdWludDMyX3QgZnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CkBAIC0xNTUxLDcgKzE2NzQsOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgICAgIG1VaWQpOworICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLApAQCAtMTU2NiwxMyArMTY5MSwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAorICAgICAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NzIsMTIgKzE4MDMsMTQgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKICAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTc3Nyw3ICsxOTEwLDggQEAKICAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKLSAgICAgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKKyAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKICAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCkBAIC0xODIzLDcgKzE5NTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgogICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQorICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQogewogfQogCkBAIC0xODQwLDE0ICsxOTc0LDIzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKIHsKICAgICBpZiAocG9zaXRpb24gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqcG9zaXRpb24gPSBtU2l6ZTsKKyAgICAqcG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgdHMubVBvc2l0aW9uID0gbVNpemUgLyBtRnJhbWVTaXplOworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHRzLm1UaW1lLnR2X3NlYyA9IG5vdyAvIDEwMDAwMDAwMDBMTDsKKyAgICB0cy5tVGltZS50dl9uc2VjID0gbm93IC0gKDEwMDAwMDAwMDBMTCAqIHRzLm1UaW1lLnR2X3NlYyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0CiB7CiAgICAgaWYgKHdyaXR0ZW4gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqd3JpdHRlbiA9IG1TaXplOworICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTkwOSw2ICsyMDUyLDggQEAKIAogICAgIGlmIChhY3R1YWxTaXplID4gMCkgewogICAgICAgICBzaW5rLT53cml0ZShtQnVmZmVyLCBhY3R1YWxTaXplKTsKKyAgICAgICAgLy8gQ291bGQgcmV0dXJuIGZhbHNlIG9uIHNpbmstPndyaXRlKCkgZXJyb3Igb3Igc2hvcnQgY291bnQuCisgICAgICAgIC8vIE5vdCBuZWNlc3NhcmlseSBhcHByb3ByaWF0ZSBidXQgd291bGQgd29yayBmb3IgQXVkaW9DYWNoZSBiZWhhdmlvci4KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5MTksOCArMjA2NCw4IEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKIHsKICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewpAQCAtMTkzMSw2ICsyMDc2LDkgQEAKICAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KWNoYW5uZWxDb3VudDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKKyAgICBtRnJhbWVTaXplID0gIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgID8gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCkgOiAxOworICAgIG1GcmFtZUNvdW50ID0gbUhlYXAtPmdldFNpemUoKSAvIG1GcmFtZVNpemU7CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewogICAgICAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcywgY2IsIGNvb2tpZSk7CkBAIC0xOTYwLDEyICsyMTA4LDI2IEBACiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcCArPSBtU2l6ZTsKICAgICBBTE9HVigibWVtY3B5KCVwLCAlcCwgJXUpIiwgcCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVNpemUgKyBzaXplID4gbUhlYXAtPmdldFNpemUoKSkgeworCisgICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7CisgICAgaWYgKG92ZXJmbG93KSB7CiAgICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwogICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwogICAgIH0KKyAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCiAgICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgIGlmIChvdmVyZmxvdykgeworICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KKyAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQorICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5CisgICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgorICAgICAgICBtQ29tbWFuZENvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbC5zaWduYWwoKTsKKyAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTE5ODcsNyArMjE0OSw3IEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkoCi0gICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKKyAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCogLypvYmoqLykKIHsKICAgICBBTE9HVigibm90aWZ5KCVwLCAlZCwgJWQsICVkKSIsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKICAgICBBdWRpb0NhY2hlKiBwID0gc3RhdGljX2Nhc3Q8QXVkaW9DYWNoZSo+KGNvb2tpZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggOWMwODRlMS4uM2I5NmU4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCwgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtODQsNiArODUsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMTA0LDYgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKTsKQEAgLTEzMyw2ICsxMzYsNyBAQAogICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICptQXR0cmlidXRlczsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZVBlcm1pbGxlOwpAQCAtMTQwLDYgKzE0NCw3IEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CkBAIC0xOTAsMTAgKzE5NSwxMSBAQAogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gZnJhbWVTaXplKCkgKiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUNoYW5uZWxDb3VudDsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzc2l6ZV90KG1DaGFubmVsQ291bnQgKiAoKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpP3NpemVvZihpbnQxNl90KTpzaXplb2YodV9pbnQ4X3QpKSk7IH0KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMjExLDEyICsyMTcsMTIgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZmx1c2goKSB7fQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCkge30KLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkge30KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gdHlwZSBpcyBub3QgdXNlZCBmb3IgQXVkaW9DYWNoZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7IH0KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHt9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIHt9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlIF9fdW51c2VkKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TaXplOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUVycm9yOwogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1Db21tYW5kQ29tcGxldGU7CiAKQEAgLTI1NiwxMyArMjYzLDIwIEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCk7CkBAIC0yNzIsOSArMjg2LDYgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGlmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZUNsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAKICAgICAvLyBGb3IgYmF0dGVyeSB1c2FnZSB0cmFja2luZyBwdXJwb3NlCkBAIC0zNTYsNiArMzY3LDcgQEAKICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiAgICAgY3JlYXRlUGxheWVyKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC00MDUsNiArNDE3LDggQEAKICAgICAgICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCiAgICAgICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvdygpOwogCisgICAgICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisKICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICAgICAgbVBsYXllcjsKICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiAgICAgIG1TZXJ2aWNlOwpAQCAtNDE1LDYgKzQyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1Db25uSWQ7CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVJRDsKICAgICAgICAgICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkV2luZG93QmluZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IGE5ODIwZTAuLjE5NGFiYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTk1LDcgKzk1LDggQEAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldFZpZGVvU291cmNlKGludCB2cykKIHsKICAgICBBTE9HVigic2V0VmlkZW9Tb3VyY2UoJWQpIiwgdnMpOwotICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKGNhbWVyYVBlcm1pc3Npb24pKSB7CisgICAgLy8gQ2hlY2sgY2FtZXJhIHBlcm1pc3Npb24gZm9yIHNvdXJjZXMgb3RoZXIgdGhhbiBTVVJGQUNFCisgICAgaWYgKHZzICE9IFZJREVPX1NPVVJDRV9TVVJGQUNFICYmICFjaGVja1Blcm1pc3Npb24oY2FtZXJhUGVybWlzc2lvbikpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCAwNjNlYjk0Li5mYTI4NDUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KQEAgLTEwNiw3ICsxMDcsOSBAQAogfQogCiBzdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTEyNyw3ICsxMzAsNyBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgbVJldHJpZXZlciA9IHA7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTE0NCw4ICsxNDcsOCBAQAogICAgIH0KICAgICBBTE9HVigic3RfZGV2ICA9ICVsbHUiLCBzYi5zdF9kZXYpOwogICAgIEFMT0dWKCJzdF9tb2RlID0gJXUiLCBzYi5zdF9tb2RlKTsKLSAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHNiLnN0X3VpZCk7Ci0gICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzYi5zdF9naWQpOworICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfdWlkKSk7CisgICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF9naWQpKTsKICAgICBBTE9HVigic3Rfc2l6ZSA9ICVsbHUiLCBzYi5zdF9zaXplKTsKIAogICAgIGlmIChvZmZzZXQgPj0gc2Iuc3Rfc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBmMDhmOTMzLi45ZDNmYmU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtMzAsNiArMzAsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBNZW1vcnlEZWFsZXI7CiAKQEAgLTQzLDcgKzQ0LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAppbmRleCAwYTZhYTkwLi43NDllZjk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKQEAgLTExNCw3ICsxMTQsOSBAQAogfQogCiBzdGF0dXNfdCBNaWRpRmlsZTo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciogcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKikgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJiAvKmh0dHBTZXJ2aWNlKi8sCisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKICAgICBBTE9HVigiTWlkaUZpbGU6OnNldERhdGFTb3VyY2UgdXJsPSVzIiwgcGF0aCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAppbmRleCAxNjc5MmFiLi44MmU0ZTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaApAQCAtMzIsNyArMzIsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA0NjUyMDlmLi5mM2NmNmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgIk1pZGlNZXRhZGF0YVJldHJpZXZlci5oIgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9PUEVOID0gLTE7CkBAIC0zNiw3ICszOCw5IEBACiB9CiAKIHN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZTogJXMiLCB1cmw/IHVybDogIk5VTEwgcG9pbnRlciIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTQ0LDcgKzQ4LDcgQEAKICAgICBpZiAobU1pZGlQbGF5ZXIgPT0gMCkgewogICAgICAgICBtTWlkaVBsYXllciA9IG5ldyBNaWRpRmlsZSgpOwogICAgIH0KLSAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA0Y2VlNDJkLi5iODIxNGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMiw3ICszMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5NaWRpTWV0YWRhdGFSZXRyaWV2ZXIoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCA0MmI3NzY2Li5iMzdhZWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTU0LDggKzU0LDEwIEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogfQogCiAvLyBXYXJuaW5nOiBUaGUgZmlsZWRlc2NyaXB0b3IgcGFzc2VkIGludG8gdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIHZhbGlkIHVudGlsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IDYwMDk0NWUuLmU2YzMwZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC0zNCw3ICszNCw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCA0ZGE3NGUxLi5jYWRkNjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0xOSwxNCArMTksMTggQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiV2VibVdyaXRlci5oIgogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CkBAIC0zNiwxMyArNDAsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC03Miw4ICs3NSw3IEBACiAgICAgICBtQXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0NOVCksCiAgICAgICBtVmlkZW9Tb3VyY2UoVklERU9fU09VUkNFX0xJU1RfRU5EKSwKICAgICAgIG1DYXB0dXJlVGltZUxhcHNlKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogICAgIHJlc2V0KCk7CkBAIC04MiwxMCArODQsMTkgQEAKIFN0YWdlZnJpZ2h0UmVjb3JkZXI6On5TdGFnZWZyaWdodFJlY29yZGVyKCkgewogICAgIEFMT0dWKCJEZXN0cnVjdG9yIik7CiAgICAgc3RvcCgpOworCisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjppbml0KCkgewogICAgIEFMT0dWKCJpbml0Iik7CisKKyAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUxvb3Blci0+c2V0TmFtZSgicmVjb3JkZXJfbG9vcGVyIik7CisgICAgbUxvb3Blci0+c3RhcnQoKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtOTQsNyArMTA1LDcgQEAKIC8vIHdoaWxlIGVuY29kaW5nIEdMIEZyYW1lcwogc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdCB7CiAgICAgQUxPR1YoIkdldCBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICByZXR1cm4gbVN1cmZhY2VNZWRpYVNvdXJjZS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlX3QgYXMpIHsKQEAgLTE3MywxMSArMTg0LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAodmUgPT0gVklERU9fRU5DT0RFUl9ERUZBVUxUKSB7Ci0gICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX0gyNjM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVZpZGVvRW5jb2RlciA9IHZlOwotICAgIH0KKyAgICBtVmlkZW9FbmNvZGVyID0gdmU7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMzQsNyArMjQxLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICogLyogcGF0aCAqLykgewogICAgIEFMT0dFKCJzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqKSBtdXN0IG5vdCBiZSBjYWxsZWQiKTsKICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHRoaXMgYXQgYWxsLCBhcyB0aGUgbWVkaWFfc2VydmVyIHByb2Nlc3MKICAgICAvLyBubyBsb25nZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBmaWxlcy4KQEAgLTY4MSwxMCArNjg4LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUodGltZUxhcHNlRW5hYmxlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWJldHdlZW4tdGltZS1sYXBzZS1mcmFtZS1jYXB0dXJlIikgewotICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXM7Ci0gICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcykpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgMTAwMExMICogdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcjogZmFpbGVkIHRvIGZpbmQga2V5ICVzIiwga2V5LnN0cmluZygpKTsKQEAgLTczOSwxOSArNzQ2LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlKCkgewotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnQoKSB7Ci0gICAgQ0hFQ0tfR0UobU91dHB1dEZkLCAwKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnByZXBhcmVJbnRlcm5hbCgpIHsKKyAgICBBTE9HVigicHJlcGFyZSIpOworICAgIGlmIChtT3V0cHV0RmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIC8vIEdldCBVSUQgaGVyZSBmb3IgcGVybWlzc2lvbiBjaGVja2luZwogICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKIApAQCAtNzU5LDI1ICs3NjIsMjYgQEAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0RFRkFVTFQ6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHXzQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9XRUJNOgorICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9OQjoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9XQjoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0QU1SUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cEFNUlJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydEFBQ1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBBQUNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRSVFBSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNzg2LDYgKzc5MCw3NyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKKyAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIHJldHVybiBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKKworICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgc3RhdHVzID0gcHJlcGFyZUludGVybmFsKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVdyaXRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dEZvcm1hdCkgeworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUdfNDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1dFQk06CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNNUEVHNCA9IHRydWU7CisgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBpc01QRUc0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgIHNldHVwTVBFRzRvcldFQk1NZXRhRGF0YSgmbWV0YSk7CisgICAgICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9OQjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9XQjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgbVdyaXRlci5jbGVhcigpOworICAgICAgICBtV3JpdGVyID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAoKHN0YXR1cyA9PSBPSykgJiYgKCFtU3RhcnRlZCkpIHsKICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCkBAIC04MTcsNTggKzg5Miw1OCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gZW5jTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgc3dpdGNoIChtQXVkaW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfTkI6CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9ERUZBVUxUOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX1dCOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0TEMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0TEMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9IRV9BQUM6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUFBQ1Byb2ZpbGUsIE9NWF9BVURJT19BQUNPYmplY3RIRSk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RIRSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUFBQ1Byb2ZpbGUsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGVuY01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIENIRUNLKGF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgIGtLZXlNYXhJbnB1dFNpemUsICZtYXhJbnB1dFNpemUpKTsKIAotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7Ci0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUF1ZGlvQ2hhbm5lbHMpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1BdWRpb0JpdFJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbUF1ZGlvQ2hhbm5lbHMpOworICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgbVNhbXBsZVJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtQXVkaW9CaXRSYXRlKTsKICAgICBpZiAobUF1ZGlvVGltZVNjYWxlID4gMCkgewotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtQXVkaW9UaW1lU2NhbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0aW1lLXNjYWxlIiwgbUF1ZGlvVGltZVNjYWxlKTsKICAgICB9CiAKLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlciA9Ci0gICAgICAgIE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBlbmNNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgYXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKG1Mb29wZXIsIGZvcm1hdCwgYXVkaW9Tb3VyY2UpOwogICAgIG1BdWRpb1NvdXJjZU5vZGUgPSBhdWRpb1NvdXJjZTsKIAorICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBhdWRpbyBlbmNvZGVyIik7CisgICAgfQorCiAgICAgcmV0dXJuIGF1ZGlvRW5jb2RlcjsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBQUNSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFBQ1JlY29yZGluZygpIHsKICAgICAvLyBGSVhNRToKICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRgogICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMpOwpAQCAtODc5LDE2ICs5NTQsMTAgQEAKICAgICBDSEVDSyhtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCk7CiAKICAgICBtV3JpdGVyID0gbmV3IEFBQ1dyaXRlcihtT3V0cHV0RmQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgbVdyaXRlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFNUlJlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQU1SUmVjb3JkaW5nKCkgewogICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIgfHwKICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX1dCKTsKIApAQCAtOTA4LDE1ICs5NzcsMTAgQEAKICAgICB9CiAKICAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihtT3V0cHV0RmQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgbVdyaXRlciA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSYXdBdWRpb1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKSB7CiAgICAgaWYgKG1BdWRpb1NvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTQyLDEyICsxMDA2LDExIEBACiAgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9CiAgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKLSAgICBtV3JpdGVyLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJUUFJlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwUlRQUmVjb3JkaW5nKCkgewogICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCk7CiAKICAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UCkBAIC05NjcsNiArMTAzMCw3IEBACiAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1lZGlhU291cmNlKCZtZWRpYVNvdXJjZSk7CkBAIC05NzQsNyArMTAzOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIG1WaWRlb0JpdFJhdGUsICZzb3VyY2UpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJnNvdXJjZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KQEAgLTk4NCwxMCArMTA0OCwxMCBAQAogICAgIG1Xcml0ZXItPmFkZFNvdXJjZShzb3VyY2UpOwogICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CiAKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzJUU1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzJUU1JlY29yZGluZygpIHsKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX01QRUcyVFMpOwogCiAgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHMlRTV3JpdGVyKG1PdXRwdXRGZCk7CkBAIC0xMDA4LDYgKzEwNzIsNyBAQAogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSA8IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewogICAgICAgICBpZiAobVZpZGVvRW5jb2RlciAhPSBWSURFT19FTkNPREVSX0gyNjQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNUEVHMlRTIHJlY29yZGluZyBvbmx5IHN1cHBvcnRzIEguMjY0IGVuY29kaW5nISIpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKQEAgLTEwMTgsNyArMTA4Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIG1WaWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZlbmNvZGVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTAzNywxMSArMTEwMiwxNyBAQAogCiAgICAgbVdyaXRlciA9IHdyaXRlcjsKIAotICAgIHJldHVybiBtV3JpdGVyLT5zdGFydCgpOworICAgIHJldHVybiBPSzsKIH0KIAogdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZVJhdGUoKSB7CiAgICAgQUxPR1YoImNsaXBWaWRlb0ZyYW1lUmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtRnJhbWVSYXRlID09IC0xKSB7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgInZpZC5mcHMiLCBtQ2FtZXJhSWQsIENBTUNPUkRFUl9RVUFMSVRZX0xPVyk7CisgICAgICAgIEFMT0dXKCJVc2luZyBkZWZhdWx0IHZpZGVvIGZwcyAlZCIsIG1GcmFtZVJhdGUpOworICAgIH0KKwogICAgIGludCBtaW5GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmZwcy5taW4iLCBtVmlkZW9FbmNvZGVyKTsKICAgICBpbnQgbWF4RnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCkBAIC0xMTAxLDYgKzExNzIsNyBAQAogICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLAogICAgICAgICAgICAgKG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9IMjYzID8gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MyA6CiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX01QRUdfNF9TUCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0IDoKKyAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDoKICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfSDI2NCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA6ICIiKSwKICAgICAgICAgICAgIGZhbHNlIC8qIGRlY29kZXIgKi8sIHRydWUgLyogaHdDb2RlYyAqLywgJmNvZGVjcyk7CiAgICAgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlID0gY29kZWNzLnNpemUoKSA+IDA7CkBAIC0xMTczLDYgKzEyNDUsMzEgQEAKICAgICAgICAgaWYgKHZpZGVvQ29kZWMgPT0gVklERU9fRU5DT0RFUl9IMjY0KSB7CiAgICAgICAgICAgICBBTE9HSSgiRm9yY2UgdG8gdXNlIEFWQyBiYXNlbGluZSBwcm9maWxlIik7CiAgICAgICAgICAgICBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSk7CisgICAgICAgICAgICAvLyBzZXQgMCBmb3IgaW52YWxpZCBsZXZlbHMgLSB0aGlzIHdpbGwgYmUgcmVqZWN0ZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb2RlYyBpZiBpdCBjYW5ub3QgaGFuZGxlIGl0IGR1cmluZyBjb25maWd1cmUKKyAgICAgICAgICAgIHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoQUNvZGVjOjpnZXRBVkNMZXZlbEZvcigKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZVdpZHRoLCB2aWRlb0ZyYW1lSGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSwgdmlkZW9CaXRSYXRlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCkgeworICAgIGlmIChtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfREVGQVVMVCkgeworICAgICAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gVlA4IGZvciBXRUJNIHJlY29yZGluZworICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfVlA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcGljayB0aGUgZGVmYXVsdCBlbmNvZGVyIGZvciBDQU1DT1JERVJfUVVBTElUWV9MT1cKKyAgICAgICAgICAgIGludCB2aWRlb0NvZGVjID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAidmlkLmNvZGVjIiwgbUNhbWVyYUlkLCBDQU1DT1JERVJfUVVBTElUWV9MT1cpOworCisgICAgICAgICAgICBpZiAodmlkZW9Db2RlYyA+IFZJREVPX0VOQ09ERVJfREVGQVVMVCAmJgorICAgICAgICAgICAgICAgIHZpZGVvQ29kZWMgPCBWSURFT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9ICh2aWRlb19lbmNvZGVyKXZpZGVvQ29kZWM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gSC4yNjQgaWYgY2FtY29yZGVyIHByb2ZpbGUgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX0gyNjQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMjc4LDQ5ICsxMzc1LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgICptZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKLSAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIpIHsKLSAgICAgICAgLy8gSWYgdXNpbmcgR1JBbGxvYyBidWZmZXJzLCBzZXR1cCBzdXJmYWNlbWVkaWFzb3VyY2UuCi0gICAgICAgIC8vIExhdGVyIGEgaGFuZGxlIHRvIHRoYXQgd2lsbCBiZSBwYXNzZWQKLSAgICAgICAgLy8gdG8gdGhlIGNsaWVudCBzaWRlIHdoZW4gcXVlcmllZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICptZWRpYVNvdXJjZSA9IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgKm1lZGlhU291cmNlID0gTlVMTDsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotLy8gc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UgY3JlYXRlcyBhIHNvdXJjZSB3aXRoIHRoZSBnaXZlbgotLy8gd2lkdGggYW5kIGhlaWdodCBhbmQgZnJhbWVyYXRlLgotLy8gVE9ETzogVGhpcyBjb3VsZCBnbyBpbiBhIHN0YXRpYyBmdW5jdGlvbiBpbnNpZGUgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBzaW1pbGFyIHRvIHRoYXQgaW4gQ2FtZXJhU291cmNlCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBtU3VyZmFjZU1lZGlhU291cmNlID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICBpZiAobVN1cmZhY2VNZWRpYVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGlmIChtRnJhbWVSYXRlID09IC0xKSB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gMDsKLSAgICAgICAgQ0hFQ0sgKG1TdXJmYWNlTWVkaWFTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleUZyYW1lUmF0ZSwgJmZyYW1lUmF0ZSkpOwotICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBpcyBub3QgZXhwbGljaXRseSBzZXQuIFVzZSB0aGUgY3VycmVudCBmcmFtZSAiCi0gICAgICAgICAgICAgInJhdGUgKCVkIGZwcykiLCBmcmFtZVJhdGUpOwotICAgICAgICBtRnJhbWVSYXRlID0gZnJhbWVSYXRlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1TdXJmYWNlTWVkaWFTb3VyY2UtPnNldEZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKLSAgICB9Ci0gICAgQ0hFQ0sobUZyYW1lUmF0ZSAhPSAtMSk7Ci0KLSAgICBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0KLSAgICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZS0+aXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2UoCiAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgewogICAgIHN0YXR1c190IGVyciA9IE9LOwpAQCAtMTM4NCwyNSArMTQ0NiwyNiBAQAogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7CiAgICAgc291cmNlLT5jbGVhcigpOwogCi0gICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdmlkZW9CaXRSYXRlKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwogCiAgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfTVBFR180X1NQOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX1ZQODoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDEwLDU5ICsxNDczLDgwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKGNhbWVyYVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJnNsaWNlSGVpZ2h0KSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOwogCi0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgc3RyaWRlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0Iiwgc2xpY2VIZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBjb2xvckZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CisKKyAgICAgICAgLy8gc2V0IHVwIHRpbWUgbGFwc2Uvc2xvdyBtb3Rpb24gZm9yIHN1cmZhY2Ugc291cmNlCisgICAgICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAgICAgaWYgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyB2YWx1ZTogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgidGltZS1sYXBzZSIsCisgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmcmFtZS1yYXRlIiwgbUZyYW1lUmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOworCiAgICAgaWYgKG1WaWRlb1RpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1WaWRlb1RpbWVTY2FsZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInRpbWUtc2NhbGUiLCBtVmlkZW9UaW1lU2NhbGUpOwogICAgIH0KICAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgbVZpZGVvRW5jb2RlckxldmVsKTsKICAgICB9CiAKLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMpIHsKLSAgICAgICAgZW5jb2Rlcl9mbGFncyB8PSBPTVhDb2RlYzo6a1N0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVyczsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY1NvdXJjZTo6RkxBR19VU0VfTUVUQURBVEFfSU5QVVQ7CiAgICAgfQogCi0gICAgLy8gRG8gbm90IHdhaXQgZm9yIGFsbCB0aGUgaW5wdXQgYnVmZmVycyB0byBiZWNvbWUgYXZhaWxhYmxlLgotICAgIC8vIFRoaXMgZ2l2ZSB0aW1lbGFwc2UgdmlkZW8gcmVjb3JkaW5nIGZhc3RlciByZXNwb25zZSBpbgotICAgIC8vIHJlY2VpdmluZyBvdXRwdXQgZnJvbSB2aWRlbyBlbmNvZGVyIGNvbXBvbmVudC4KLSAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKLSAgICAgICAgZW5jb2Rlcl9mbGFncyB8PSBPTVhDb2RlYzo6a09ubHlTdWJtaXRPbmVJbnB1dEJ1ZmZlckF0T25lVGltZTsKKyAgICBpZiAoY2FtZXJhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY1NvdXJjZTo6RkxBR19VU0VfU1VSRkFDRV9JTlBVVDsKICAgICB9CiAKLSAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAotICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UsCi0gICAgICAgICAgICBOVUxMLCBlbmNvZGVyX2ZsYWdzKTsKKyAgICBzcDxNZWRpYUNvZGVjU291cmNlPiBlbmNvZGVyID0KKyAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGNhbWVyYVNvdXJjZSwgZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgdmlkZW8gZW5jb2RlciIpOwogICAgICAgICAvLyBXaGVuIHRoZSBlbmNvZGVyIGZhaWxzIHRvIGJlIGNyZWF0ZWQsIHdlIG5lZWQKICAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2FtZXJhIHNvdXJjZSBkdWUgdG8gdGhlIGNhbWVyYSdzIGxvY2sKICAgICAgICAgLy8gYW5kIHVubG9jayBtZWNoYW5pc20uCi0gICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChjYW1lcmFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gZW5jb2Rlci0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfQorCiAgICAgKnNvdXJjZSA9IGVuY29kZXI7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNDk2LDE4ICsxNTgwLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICBpbnQgb3V0cHV0RmQsCi0gICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcikgewotICAgIG1lZGlhV3JpdGVyLT5jbGVhcigpOwotICAgICp0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpIHsKKyAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgbVRvdGFsQml0UmF0ZSA9IDA7CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG91dHB1dEZkKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyOworICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICB3cml0ZXIgPSBuZXcgV2VibVdyaXRlcihtT3V0cHV0RmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihtT3V0cHV0RmQpOworICAgIH0KIAogICAgIGlmIChtVmlkZW9Tb3VyY2UgPCBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogICAgICAgICBlcnIgPSBzZXR1cE1lZGlhU291cmNlKCZtZWRpYVNvdXJjZSk7CkBAIC0xNTE2LDMxICsxNjAyLDM0IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIHZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJmVuY29kZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKICAgICAgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7Ci0gICAgICAgICp0b3RhbEJpdFJhdGUgKz0gdmlkZW9CaXRSYXRlOworICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1WaWRlb0JpdFJhdGU7CiAgICAgfQogCi0gICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgotICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgotICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSkgewotICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7Ci0gICAgfQorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCisgICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KKyAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgorICAgICAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgICAgICB9CiAKLSAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgewotICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgotICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7Ci0gICAgfQotICAgIGlmIChtTG9uZ2l0dWRleDEwMDAwID4gLTM2MDAwMDAgJiYgbUxhdGl0dWRleDEwMDAwID4gLTM2MDAwMDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldEdlb0RhdGEobUxhdGl0dWRleDEwMDAwLCBtTG9uZ2l0dWRleDEwMDAwKTsKKyAgICAgICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb25naXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCAmJiBtTGF0aXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCkgeworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KKyAgICAgICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25VcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CkBAIC0xNTQ4LDU0ICsxNjM3LDM5IEBACiAgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQotCi0gICAgbVN0YXJ0VGltZU9mZnNldE1zID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMobUNhbWVyYUlkKTsKKyAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCisgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgeworICAgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRTdGFydFRpbWVPZmZzZXRNcyhtQ2FtZXJhSWQpOworICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIC8vIHN1cmZhY2Ugc291cmNlIGRvZXNuJ3QgbmVlZCBsYXJnZSBpbml0aWFsIGRlbGF5CisgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IDIwMDsKKyAgICB9CiAgICAgaWYgKG1TdGFydFRpbWVPZmZzZXRNcyA+IDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldFN0YXJ0VGltZU9mZnNldE1zKG1TdGFydFRpbWVPZmZzZXRNcyk7CisgICAgICAgIHdyaXRlci0+c2V0U3RhcnRUaW1lT2Zmc2V0TXMobVN0YXJ0VGltZU9mZnNldE1zKTsKICAgICB9CiAKICAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOworICAgIG1Xcml0ZXIgPSB3cml0ZXI7CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKSB7Cit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRvcldFQk1NZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpIHsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwogICAgICgqbWV0YSktPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7Ci0gICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7Ci0gICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1Ub3RhbEJpdFJhdGUpOwogICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7CiAgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CiAgICAgfQotICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgewotICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisgICAgICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAobVJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgewotICAgIGludDMyX3QgdG90YWxCaXRSYXRlOwotICAgIHN0YXR1c190IGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgICAgICBtT3V0cHV0RmQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICBtVmlkZW9CaXRSYXRlLCAmdG90YWxCaXRSYXRlLCAmbVdyaXRlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRSYXRlLCAmbWV0YSk7Ci0KLSAgICBlcnIgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwYXVzZSgpIHsKQEAgLTE2MzcsNiArMTcxMSw4IEBACiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICB9CiAKKyAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNsZWFyKCk7CisKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgICAgICBtT3V0cHV0RmQgPSAtMTsKQEAgLTE2NTYsNyArMTczMiw2IEBACiAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CiAgICAgfQogCi0KICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xNjc4LDcgKzE3NTMsNyBAQAogICAgIC8vIERlZmF1bHQgcGFyYW1ldGVycwogICAgIG1PdXRwdXRGb3JtYXQgID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgbUF1ZGlvRW5jb2RlciAgPSBBVURJT19FTkNPREVSX0FNUl9OQjsKLSAgICBtVmlkZW9FbmNvZGVyICA9IFZJREVPX0VOQ09ERVJfSDI2MzsKKyAgICBtVmlkZW9FbmNvZGVyICA9IFZJREVPX0VOQ09ERVJfREVGQVVMVDsKICAgICBtVmlkZW9XaWR0aCAgICA9IDE3NjsKICAgICBtVmlkZW9IZWlnaHQgICA9IDE0NDsKICAgICBtRnJhbWVSYXRlICAgICA9IC0xOwpAQCAtMTcwOCw2ICsxNzgzLDcgQEAKICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKICAgICBtTGF0aXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKICAgICBtTG9uZ2l0dWRleDEwMDAwID0gLTM2MDAwMDA7CisgICAgbVRvdGFsQml0UmF0ZSA9IDA7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMzFmMDllMC4uNTRjMzhkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0zNyw2ICszNyw3IEBACiBjbGFzcyBNZWRpYVByb2ZpbGVzOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIGNsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZTsKK2NsYXNzIEFMb29wZXI7CiAKIHN0cnVjdCBTdGFnZWZyaWdodFJlY29yZGVyIDogcHVibGljIE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBTdGFnZWZyaWdodFJlY29yZGVyKCk7CkBAIC0xMDYsNiArMTA3LDcgQEAKICAgICBpbnQzMl90IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQzMl90IG1Mb25naXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CisgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOwogCiAgICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKICAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOwpAQCAtMTIyLDIyICsxMjQsMTcgQEAKICAgICAvLyBBbiA8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcG9pbnRlcgogICAgIC8vIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHNpZGUgdXNpbmcgd2hpY2ggdGhlCiAgICAgLy8gZnJhbWUgYnVmZmVycyB3aWxsIGJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQKLSAgICBzcDxTdXJmYWNlTWVkaWFTb3VyY2U+IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogCi0gICAgc3RhdHVzX3Qgc2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgaW50IG91dHB1dEZkLAotICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpOwotICAgIHZvaWQgc2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpOwotICAgIHN0YXR1c190IHN0YXJ0TVBFRzRSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydEFNUlJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0QUFDUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRNUEVHMlRTUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUludGVybmFsKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpOworICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CisgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cFJUUFJlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIHN0YXR1c190IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgYm9vbCAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpOwpAQCAtMTQ3LDE0ICsxNDQsOCBAQAogICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdmlkZW9zb3VyY2UgdHlwZQogICAgIHN0YXR1c190IHNldHVwTWVkaWFTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+ICptZWRpYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2Uoc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKTsKLSAgICAvLyBzZXR1cCB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGZvciB0aGUgZW5jb2RlcgotICAgIHN0YXR1c190IHNldHVwU3VyZmFjZU1lZGlhU291cmNlKCk7Ci0KICAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7Ci0gICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLAotICAgICAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOwogCiAgICAgLy8gRW5jb2RpbmcgcGFyYW1ldGVyIGhhbmRsaW5nIHV0aWxpdGllcwogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKQEAgLTE4Nyw2ICsxNzgsNyBAQAogICAgIHZvaWQgY2xpcEF1ZGlvU2FtcGxlUmF0ZSgpOwogICAgIHZvaWQgY2xpcE51bWJlck9mQXVkaW9DaGFubmVscygpOwogICAgIHZvaWQgc2V0RGVmYXVsdFByb2ZpbGVJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKIAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RhZ2VmcmlnaHRSZWNvcmRlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCmluZGV4IDVkOTcyOGEuLjU3OTU3NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcApAQCAtMTEzLDcgKzExMyw5IEBACiAvLyBDcmVhdGUgdGhlIHRlc3QgcGxheWVyLgogLy8gQ2FsbCBzZXREYXRhU291cmNlIG9uIHRoZSB0ZXN0IHBsYXllciB3aXRoIHRoZSB1cmwgaW4gcGFyYW0uCiBzdGF0dXNfdCBUZXN0UGxheWVyU3R1Yjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgaWYgKCFpc1Rlc3RVcmwodXJsKSB8fCBOVUxMICE9IG1IYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIH0KIAogICAgIG1QbGF5ZXIgPSAoKm1OZXdQbGF5ZXIpKCk7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UobUNvbnRlbnRVcmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBtQ29udGVudFVybCwgaGVhZGVycyk7CiB9CiAKIC8vIEludGVybmFsIGNsZWFudXAuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCmluZGV4IGEzODAyZWIuLjU1YmYyYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCkBAIC02Niw3ICs2Niw5IEBACiAKICAgICAvLyBAcGFyYW0gdXJsIFNob3VsZCBiZSBhIHRlc3QgdXJsLiBTZWUgY2xhc3MgY29tbWVudC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICAvLyBUZXN0IHBsYXllciBmb3IgYSBmaWxlIGRlc2NyaXB0b3Igc291cmNlIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCwgaW50NjRfdCwgaW50NjRfdCkgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgorI2luY2x1ZGUgPHVpL0Rpc3BsYXlTdGF0SW5mby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSAiVmlkZW9GcmFtZVNjaGVkdWxlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7CisgICAgaWYgKCpsaHMgPCAqcmhzKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgLy8gMSUKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0ga05hbm9zSW4xczsgICAgIC8vIDEgc2VjCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluUGVyaW9kID0ga05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICoga05hbm9zSW4xczsgLy8gMTAgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6UExMKCkKKyAgICA6IG1QZXJpb2QoLTEpLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVByaW1lZChmYWxzZSksCisgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nKDApLAorICAgICAgbUxhc3RUaW1lKC0xKSwKKyAgICAgIG1OdW1TYW1wbGVzKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXN0YXJ0KCkgeworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtUGhhc2UgPSAtMTsKK30KKworI2lmIDAKKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnRlc3QoKSB7CisgICAgbnNlY3NfdCBwZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmZpdCgKKyAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1bVggPSAwOworICAgIGludDY0X3Qgc3VtWFggPSAwOworICAgIGludDY0X3Qgc3VtWFkgPSAwOworICAgIGludDY0X3Qgc3VtWVkgPSAwOworICAgIGludDY0X3Qgc3VtWSA9IDA7CisKKyAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKKyAgICBuc2Vjc190IGxhc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCisgICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKKyAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKKyAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KKyAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7CisgICAgICAgIHN1bVggKz0geDsKKyAgICAgICAgc3VtWSArPSB5OworICAgICAgICBzdW1YWCArPSB4ICogeDsKKyAgICAgICAgc3VtWFkgKz0geCAqIHk7CisgICAgICAgIHN1bVlZICs9IHkgKiB5OworICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorCisgICAgaW50NjRfdCBkaXYgICA9IG51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7CisgICAgaWYgKGRpdiA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGFfbm9tID0gbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKKyAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7CisgICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKKyAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOworICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAorICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7CisgICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgbnVtU2FtcGxlc1RvVXNlLCBtUGhhc2UsIG1QZXJpb2QpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6dXBkYXRlVnN5bmMoKSB7CisgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKKyAgICBtVnN5bmNQZXJpb2QgPSAwOworICAgIG1Wc3luY1RpbWUgPSAwOworCisgICAgLy8gVE9ETzogc2NoZWR1bGUgZnJhbWVzIGZvciB0aGUgZGVzdGluYXRpb24gc3VyZmFjZQorICAgIC8vIEZvciBub3csIHN1cmZhY2UgZmxpbmdlciBvbmx5IHNjaGVkdWxlcyBmcmFtZXMgb24gdGhlIHByaW1hcnkgZGlzcGxheQorICAgIGlmIChtQ29tcG9zZXIgPT0gTlVMTCkgeworICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIG1Db21wb3NlciA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlQ29tcG9zZXI+KHNtLT5jaGVja1NlcnZpY2UobmFtZSkpOworICAgIH0KKyAgICBpZiAobUNvbXBvc2VyICE9IE5VTEwpIHsKKyAgICAgICAgRGlzcGxheVN0YXRJbmZvIHN0YXRzOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtQ29tcG9zZXItPmdldERpc3BsYXlTdGF0cyhOVUxMIC8qIGRpc3BsYXkgKi8sICZzdGF0cyk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJ2c3luYyB0aW1lOiVsbGQgcGVyaW9kOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRzLnZzeW5jVGltZSwgKGxvbmcgbG9uZylzdGF0cy52c3luY1BlcmlvZCk7CisgICAgICAgICAgICBtVnN5bmNUaW1lID0gc3RhdHMudnN5bmNUaW1lOworICAgICAgICAgICAgbVZzeW5jUGVyaW9kID0gc3RhdHMudnN5bmNQZXJpb2Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheVN0YXRzIHJldHVybmVkICVkIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHN1cmZhY2UgbUNvbXBvc2VyIHNlcnZpY2UiKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6aW5pdChmbG9hdCB2aWRlb0ZwcykgeworICAgIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZXN0YXJ0KCkgeworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzdGFydCgpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgeworICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOworCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKKyAgICAgICAgdXBkYXRlVnN5bmMoKTsKKyAgICB9CisKKyAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKyAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgICAgIHJldHVybiByZW5kZXJUaW1lOworICAgIH0KKworICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCisgICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgeworICAgICAgICBtVnN5bmNUaW1lIC09CisgICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOworICAgIH0KKworICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKKyAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQorICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKworICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZworICAgICAgICBzaXplX3QgTiA9IDEyOworICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9CisgICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKKyAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKKyAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KKyAgICAgICAgICAgIE4gPSAyMDsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0KKyAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgfQorICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIE47CisgICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOworICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OworICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyBOIC0gbVZzeW5jUGVyaW9kIC8gMik7CisgICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKKyAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQorICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQorICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9CisgICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKKworICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgeworICAgIG1Db21wb3Nlci5jbGVhcigpOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjp+VmlkZW9GcmFtZVNjaGVkdWxlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMjdiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElTdXJmYWNlQ29tcG9zZXI7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKworICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgorICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKKyAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKKyAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKKyAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7CisKKyAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisKKyAgICB2b2lkIHJlbGVhc2UoKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUExMIHsKKyAgICAgICAgUExMKCk7CisKKyAgICAgICAgLy8gcmVzZXQgUExMIHRvIG5ldyBQTEwKKyAgICAgICAgdm9pZCByZXNldChmbG9hdCBmcHMgPSAtMSk7CisgICAgICAgIC8vIGtlZXAgY3VycmVudCBlc3RpbWF0ZSwgYnV0IHJlc3RhcnQgcGhhc2UKKyAgICAgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgICAgIC8vIHJldHVybnMgcGVyaW9kCisgICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgICAgIG5zZWNzX3QgbVBoYXNlOworCisgICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKKyAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOworCisgICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQorICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0CisKKyAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCisgICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07CisKKyAgICAgICAgdm9pZCB0ZXN0KCk7CisgICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7CisgICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOworICAgIH07CisKKyAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5CisgICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7CisgICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KKworICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCisgICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50CisKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawppbmRleCBmOTQ2YzFjLi42NzZjMGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawpAQCAtNiwxOCArNiwyMCBAQAogICAgICAgICBIVFRQTGl2ZVNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyRGVjb2Rlci5jcHAgICAgICAgICAgICAgXAorICAgICAgICBOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAgIFwKICAgICAgICAgTnVQbGF5ZXJEcml2ZXIuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyUmVuZGVyZXIuY3BwICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcCAgICAgIFwKICAgICAgICAgUlRTUFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFN0cmVhbWluZ1NvdXJjZS5jcHAgICAgICAgICAgICAgXAotICAgICAgICBtcDQvTVA0U291cmNlLmNwcCAgICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0ICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlICAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9udXBsYXllcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IGIwNGU3YTYuLjY4NTlhMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJHZW5lcmljU291cmNlIgorCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI4LDU3ICszMiwxNTggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6R2VuZXJpY1NvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgIGJvb2wgdWlkVmFsaWQsCiAgICAgICAgIHVpZF90IHVpZCkKICAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKDApLAogICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKLSAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSB7CisgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCisgICAgICBtSXNXaWRldmluZShmYWxzZSksCisgICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCisgICAgICBtTWV0YURhdGFTaXplKC0xbGwpLAorICAgICAgbUJpdHJhdGUoLTFsbCksCisgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCisgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVybCwgaGVhZGVycyk7Ci0gICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKLQotICAgIGluaXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlKTsKIH0KIAotTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkdlbmVyaWNTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLSAgICA6IFNvdXJjZShub3RpZnkpLAotICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKLSAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSB7Ci0gICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCBvZmZzZXQsIGxlbmd0aCk7Ci0KLSAgICBpbml0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZSk7Cit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZXNldERhdGFTb3VyY2UoKSB7CisgICAgbUF1ZGlvVGltZVVzID0gMDsKKyAgICBtVmlkZW9UaW1lVXMgPSAwOworICAgIG1IVFRQU2VydmljZS5jbGVhcigpOworICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgbVVyaS5jbGVhcigpOworICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CisgICAgbUZkID0gLTE7CisgICAgbU9mZnNldCA9IDA7CisgICAgbUxlbmd0aCA9IDA7CisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1TdG9wUmVhZCA9IHRydWU7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmluaXRGcm9tRGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpIHsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CiAKLSAgICBDSEVDSyhleHRyYWN0b3IgIT0gTlVMTCk7CisgICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CisgICAgbVVyaSA9IHVybDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICBpZiAoaGVhZGVycykgeworICAgICAgICBtVXJpSGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIC8vIGRlbGF5IGRhdGEgc291cmNlIGNyZWF0aW9uIHRvIHByZXBhcmVBc3luYygpIHRvIGF2b2lkIGJsb2NraW5nCisgICAgLy8gdGhlIGNhbGxpbmcgdGhyZWFkIGluIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CisKKyAgICBtRmQgPSBkdXAoZmQpOworICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgbUxlbmd0aCA9IGxlbmd0aDsKKworICAgIC8vIGRlbGF5IGRhdGEgc291cmNlIGNyZWF0aW9uIHRvIHByZXBhcmVBc3luYygpIHRvIGF2b2lkIGJsb2NraW5nCisgICAgLy8gdGhlIGNhbGxpbmcgdGhyZWFkIGluIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgorICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVNZXRhOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgeworICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7CisKKyAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKKworICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgICAgICBmbG9hdCBjb25maWRlbmNlOworICAgICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CisgICAgICAgIGJvb2wgc3VjY2VzczsKKworICAgICAgICBzdWNjZXNzID0gU25pZmZXVk0obURhdGFTb3VyY2UsICZtaW1lVHlwZSwgJmNvbmZpZGVuY2UsICZkdW1teSk7CisgICAgICAgIGlmICghc3VjY2VzcworICAgICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoCisgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHdpZGV2aW5lIG1pbWU6ICVzIiwgbWltZVR5cGUuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtV1ZNRXh0cmFjdG9yID0gbmV3IFdWTUV4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldEFkYXB0aXZlU3RyZWFtaW5nTW9kZSh0cnVlKTsKKyAgICAgICAgaWYgKG1VSURWYWxpZCkgeworICAgICAgICAgICAgbVdWTUV4dHJhY3Rvci0+c2V0VUlEKG1VSUQpOworICAgICAgICB9CisgICAgICAgIGV4dHJhY3RvciA9IG1XVk1FeHRyYWN0b3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShtRGF0YVNvdXJjZSwKKyAgICAgICAgICAgICAgICBtU25pZmZlZE1JTUUuZW1wdHkoKSA/IE5VTEw6IG1TbmlmZmVkTUlNRS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGV4dHJhY3Rvci0+Z2V0RHJtRmxhZygpKSB7CisgICAgICAgIGNoZWNrRHJtU3RhdHVzKG1EYXRhU291cmNlKTsKKyAgICB9CisKKyAgICBtRmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHRvdGFsQml0cmF0ZSA9IDA7CisKKyAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIGlmIChudW10cmFja3MgPT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiB0cmFjayA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisKICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiB0cmFjazsKLQorICAgICAgICAvLyBEbyB0aGUgc3RyaW5nIGNvbXBhcmUgaW1tZWRpYXRlbHkgd2l0aCAibWltZSIsCisgICAgICAgIC8vIHdlIGNhbid0IGFzc3VtZSAibWltZSIgd291bGQgc3RheSB2YWxpZCBhZnRlciBhbm90aGVyCisgICAgICAgIC8vIGV4dHJhY3RvciBvcGVyYXRpb24sIHNvbWUgZXh0cmFjdG9ycyBtaWdodCBtb2RpZnkgbWV0YQorICAgICAgICAvLyBkdXJpbmcgZ2V0VHJhY2soKSBhbmQgbWFrZSBpdCBpbnZhbGlkLgogICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1Tb3VyY2UgPSB0cmFjayA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tU291cmNlID0gdHJhY2s7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVBhY2tldHMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtQXVkaW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewogICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IHRydWU7CkBAIC04OCwzNyArMTkzLDE3NSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tU291cmNlID0gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNvdXJjZSByZXF1aXJlcyBzZWN1cmUgYnVmZmVycworICAgICAgICAgICAgICAgIGludDMyX3Qgc2VjdXJlOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycywgJnNlY3VyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlY3VyZSkgeworICAgICAgICAgICAgICAgICAgICBtSXNXaWRldmluZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci0+c2V0VUlEKG1VSUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Tb3VyY2VzLnB1c2godHJhY2spOwogICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbUR1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICAgICAgaWYgKHRvdGFsQml0cmF0ZSA+PSAwICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgdG90YWxCaXRyYXRlICs9IGJpdHJhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvdGFsQml0cmF0ZSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbUJpdHJhdGUgPSB0b3RhbEJpdHJhdGU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmNoZWNrRHJtU3RhdHVzKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKSB7CisgICAgZGF0YVNvdXJjZS0+Z2V0RHJtSW5mbyhtRGVjcnlwdEhhbmRsZSwgJm1Ecm1NYW5hZ2VyQ2xpZW50KTsKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7CisgICAgICAgIGlmIChSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXREcm1Ob0xpY2Vuc2UpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK2ludDY0X3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldExhc3RSZWFkUG9zaXRpb24oKSB7CisgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVGltZVVzOworICAgIH0gZWxzZSBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtVmlkZW9UaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0QnVmZmVycygKKyAgICAgICAgYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKSB7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmICFhdWRpbykgeworICAgICAgICByZXR1cm4gbVZpZGVvVHJhY2subVNvdXJjZS0+c2V0QnVmZmVycyhidWZmZXJzKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6fkdlbmVyaWNTb3VyY2UoKSB7CisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cHJlcGFyZUFzeW5jKCkgeworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIGlkKCkpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblByZXBhcmVBc3luYygpIHsKKyAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCisgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFtVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgICAgIG1Jc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKHVyaSwgIndpZGV2aW5lOi8vIiwgMTEpOworCisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KQorICAgICAgICAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KQorICAgICAgICAgICAgICAgICAgICB8fCBtSXNXaWRldmluZSkgeworICAgICAgICAgICAgICAgIG1IdHRwU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1IdHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaHR0cCBzb3VyY2UhIik7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZtQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNldCB0byBmYWxzZSBmaXJzdCwgaWYgdGhlIGV4dHJhY3RvcgorICAgICAgICAgICAgLy8gY29tZXMgYmFjayBhcyBzZWN1cmUsIHNldCBpdCB0byB0cnVlIHRoZW4uCisgICAgICAgICAgICBtSXNXaWRldmluZSA9IGZhbHNlOworCisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzV2lkZXZpbmUgfHwgbUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIGluaXRpYWwgY2FjaGluZyBzdGF0dXMKKyAgICBzdGF0dXNfdCBlcnIgPSBwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKSktPnBvc3QoMjAwMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJlZmlsbCBkYXRhIGNhY2hlISIpOworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpbml0IGV4dHJhdG9yIGZyb20gZGF0YSBzb3VyY2UKKyAgICBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IGZyb20gZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1WaWRlb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBkb0dldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgICAgICBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZyk7CisgICAgICAgIGlmKGVyciAhPSBPSykgeworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChtc2cpOwogICAgIH0KIAogICAgIG5vdGlmeUZsYWdzQ2hhbmdlZCgKLSAgICAgICAgICAgIEZMQUdfQ0FOX1BBVVNFCisgICAgICAgICAgICAobUlzV2lkZXZpbmUgPyBGTEFHX1NFQ1VSRSA6IDApCisgICAgICAgICAgICB8IEZMQUdfQ0FOX1BBVVNFCiAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQKICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFS19GT1JXQVJECiAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUspOwpAQCAtMTI2LDMzICszNjksNDU1IEBACiAgICAgbm90aWZ5UHJlcGFyZWQoKTsKIH0KIAordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbU1ldGFEYXRhU2l6ZSA9IC0xbGw7CisgICAgICAgIG1Db250ZW50VHlwZSA9ICIiOworICAgICAgICBtU25pZmZlZE1JTUUgPSAiIjsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworCisgICAgICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICB9CisgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZWZpbGxDYWNoZUlmTmVjZXNzYXJ5KCkgeworICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAvLyBubyBwcmVmaWxsIGlmIHRoZSBkYXRhIHNvdXJjZSBpcyBub3QgY2FjaGVkCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBXZSdyZSBub3QgZG9pbmcgdGhpcyBmb3Igc3RyZWFtcyB0aGF0IGFwcGVhciB0byBiZSBhdWRpby1vbmx5CisgICAgLy8gc3RyZWFtcyB0byBlbnN1cmUgdGhhdCBldmVuIGxvdyBiYW5kd2lkdGggc3RyZWFtcyBzdGFydAorICAgIC8vIHBsYXlpbmcgYmFjayBmYWlybHkgaW5zdGFudGx5LgorICAgIGlmICghc3RybmNhc2VjbXAobUNvbnRlbnRUeXBlLnN0cmluZygpLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHByZWZpbGwgdGhlIGNhY2hlIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFudGlhdGUKKyAgICAvLyB0aGUgZXh0cmFjdG9yIGJlbG93LCBhcyB0aGUgbGF0dGVyIGlzIGFuIG9wZXJhdGlvbiB0aGF0IG90aGVyd2lzZQorICAgIC8vIGNvdWxkIGJsb2NrIG9uIHRoZSBkYXRhc291cmNlIGZvciBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lLgorICAgIC8vIER1cmluZyB0aGF0IHRpbWUgd2UnZCBiZSB1bmFibGUgdG8gYWJvcnQgdGhlIHByZXBhcmF0aW9uIHBoYXNlCisgICAgLy8gd2l0aG91dCB0aGlzIHByZWZpbGwuCisKKyAgICAvLyBJbml0aWFsbHkgbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgMTkyIEtCIGZvciB0aGUgc25pZmYKKyAgICAvLyB0byBjb21wbGV0ZSB3aXRob3V0IGJsb2NraW5nLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01pbkJ5dGVzRm9yU25pZmZpbmcgPSAxOTIgKiAxMDI0OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRNZXRhU2l6ZSA9IDIwMDAwMDsKKworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworCisgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQorICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworCisgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LIHx8IChtTWV0YURhdGFTaXplID49IDAKKyAgICAgICAgICAgICYmIChvZmY2NF90KWNhY2hlZERhdGFSZW1haW5pbmcgPj0gbU1ldGFEYXRhU2l6ZSkpIHsKKyAgICAgICAgQUxPR1YoInN0b3AgY2FjaGluZywgc3RhdHVzICVkLCAiCisgICAgICAgICAgICAgICAgIm1ldGFEYXRhU2l6ZSAlbGxkLCBjYWNoZWREYXRhUmVtYWluaW5nICV6dSIsCisgICAgICAgICAgICAgICAgZmluYWxTdGF0dXMsIG1NZXRhRGF0YVNpemUsIGNhY2hlZERhdGFSZW1haW5pbmcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQUxPR1YoIm5vdyBjYWNoZWQgJXp1IGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKworICAgIGlmIChtTWV0YURhdGFTaXplIDwgMAorICAgICAgICAgICAgJiYgY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBrTWluQnl0ZXNGb3JTbmlmZmluZykgeworICAgICAgICBTdHJpbmc4IHRtcDsKKyAgICAgICAgZmxvYXQgY29uZmlkZW5jZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgIGlmICghbUNhY2hlZFNvdXJjZS0+c25pZmYoJnRtcCwgJmNvbmZpZGVuY2UsICZtZXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzdWNjZXNzZnVsbHkgaWRlbnRpZmllZCB0aGUgZmlsZSdzIGV4dHJhY3RvciB0bworICAgICAgICAvLyBiZSwgcmVtZW1iZXIgdGhpcyBtaW1lIHR5cGUgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAgICAgICAvLyBzbmlmZiBpdCBhZ2FpbiB3aGVuIHdlIGNhbGwgTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgpCisgICAgICAgIG1TbmlmZmVkTUlNRSA9IHRtcC5zdHJpbmcoKTsKKworICAgICAgICBpZiAobWV0YSA9PSBOVUxMCisgICAgICAgICAgICAgICAgfHwgIW1ldGEtPmZpbmRJbnQ2NCgibWV0YS1kYXRhLXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oJm1NZXRhRGF0YVNpemUpKSkgeworICAgICAgICAgICAgbU1ldGFEYXRhU2l6ZSA9IGtEZWZhdWx0TWV0YVNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1ldGFEYXRhU2l6ZSA8IDBsbCkgeworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgbWV0YURhdGFTaXplID0gJWxsZCBieXRlcyIsIG1NZXRhRGF0YVNpemUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLUVBR0FJTjsKK30KKwogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQUxPR0koInN0YXJ0Iik7CiAKKyAgICBtU3RvcFJlYWQgPSBmYWxzZTsKICAgICBpZiAobUF1ZGlvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLX0VRKG1BdWRpb1RyYWNrLm1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgbUF1ZGlvVHJhY2subVBhY2tldHMgPQotICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobUF1ZGlvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotCi0gICAgICAgIHJlYWRCdWZmZXIodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8pOwogICAgIH0KIAogICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgQ0hFQ0tfRVEobVZpZGVvVHJhY2subVNvdXJjZS0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cyA9Ci0gICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtVmlkZW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgcmVhZEJ1ZmZlcihmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOwogICAgIH0KKworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUQVJULCBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgLyAxMDAwKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0b3AoKSB7CisgICAgLy8gbm90aGluZyB0byBkbywganVzdCBhY2NvdW50IGZvciBEUk0gcGxheWJhY2sgc3RhdHVzCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgLy8gRm9yIGEgd2lkZXZpbmUgc291cmNlIHdlIG5lZWQgdG8gcHJldmVudCBhbnkgZnVydGhlciByZWFkcy4KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3BXaWRldmluZSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICAgICAgKHZvaWQpIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnBhdXNlKCkgeworICAgIC8vIG5vdGhpbmcgdG8gZG8sIGp1c3QgYWNjb3VudCBmb3IgRFJNIHBsYXliYWNrIHN0YXR1cworICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZXN1bWUoKSB7CisgICAgLy8gbm90aGluZyB0byBkbywganVzdCBhY2NvdW50IGZvciBEUk0gcGxheWJhY2sgc3RhdHVzCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIGdldExhc3RSZWFkUG9zaXRpb24oKSAvIDEwMDApOworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IdHRwU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICB9CisgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKTsKKyAgICBtVGltZWRUZXh0VHJhY2subVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmZlZWRNb3JlVFNEYXRhKCkgewogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKKyAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludCBwZXJjZW50YWdlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGR1cE5vdGlmeSgpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7CisgICAgbXNnLT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IDBsbDsKKworICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPQorICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKKworICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKKyAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBiaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1XVk1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBjYWNoZWREdXJhdGlvblVzCisgICAgICAgICAgICA9IG1XVk1FeHRyYWN0b3ItPmdldENhY2hlZER1cmF0aW9uVXMoJmZpbmFsU3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAoZmluYWxTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICAgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChjYWNoZWREdXJhdGlvblVzID4gMGxsICYmIG1EdXJhdGlvblVzID4gMGxsKSB7CisgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWREdXJhdGlvblVzIC8gbUR1cmF0aW9uVXM7CisgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CisgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgICAgICB9CisKKyAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOworICAgIH0KKworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworfQorCisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgY2FzZSBrV2hhdFByZXBhcmVBc3luYzoKKyAgICAgIHsKKyAgICAgICAgICBvblByZXBhcmVBc3luYygpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBrV2hhdEZldGNoU3VidGl0bGVEYXRhOgorICAgICAgeworICAgICAgICAgIGZldGNoVGV4dERhdGEoa1doYXRTZW5kU3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRGZXRjaFRpbWVkVGV4dERhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kU3VidGl0bGVEYXRhOgorICAgICAgeworICAgICAgICAgIHNlbmRUZXh0RGF0YShrV2hhdFN1YnRpdGxlRGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VuZFRpbWVkVGV4dERhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0VGltZWRUZXh0RGF0YSwgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLCBtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0Q2hhbmdlQVZTb3VyY2U6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCB0cmFja0luZGV4OworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgICAgVHJhY2sqIHRyYWNrOworICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGNvdW50ZXJwYXJ0VHlwZTsKKyAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpOworICAgICAgICAgICAgICB0cmFjayA9ICZtVmlkZW9UcmFjazsKKyAgICAgICAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgY291bnRlcnBhcnRUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzs7CisgICAgICAgICAgfQorCisKKyAgICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICB0cmFjay0+bVNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKworICAgICAgICAgIHN0YXR1c190IGF2YWlsOworICAgICAgICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmF2YWlsKSkgeworICAgICAgICAgICAgICAvLyBzeW5jIGZyb20gb3RoZXIgc291cmNlCisgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGludDY0X3QgdGltZVVzLCBhY3R1YWxUaW1lVXM7CisgICAgICAgICAgY29uc3QgYm9vbCBmb3JtYXRDaGFuZ2UgPSB0cnVlOworICAgICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gdHJhY2stPm1QYWNrZXRzLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgICBDSEVDSyhsYXRlc3RNZXRhICE9IE5VTEwgJiYgbGF0ZXN0TWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgICAgcmVhZEJ1ZmZlcih0cmFja1R5cGUsIHRpbWVVcywgJmFjdHVhbFRpbWVVcywgZm9ybWF0Q2hhbmdlKTsKKyAgICAgICAgICByZWFkQnVmZmVyKGNvdW50ZXJwYXJ0VHlwZSwgLTEsIE5VTEwsIGZvcm1hdENoYW5nZSk7CisgICAgICAgICAgQUxPR1YoInRpbWVVcyAlbGxkIGFjdHVhbFRpbWVVcyAlbGxkIiwgdGltZVVzLCBhY3R1YWxUaW1lVXMpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0UG9sbEJ1ZmZlcmluZzoKKyAgICAgIHsKKyAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRHZXRGb3JtYXQ6CisgICAgICB7CisgICAgICAgICAgb25HZXRGb3JtYXRNZXRhKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgorICAgICAgeworICAgICAgICAgIG9uR2V0U2VsZWN0ZWRUcmFjayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VsZWN0VHJhY2s6CisgICAgICB7CisgICAgICAgICAgb25TZWxlY3RUcmFjayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0U2VlazoKKyAgICAgIHsKKyAgICAgICAgICBvblNlZWsobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFJlYWRCdWZmZXI6CisgICAgICB7CisgICAgICAgICAgb25SZWFkQnVmZmVyKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTdG9wV2lkZXZpbmU6CisgICAgICB7CisgICAgICAgICAgLy8gbVN0b3BSZWFkIGlzIG9ubHkgdXNlZCBmb3IgV2lkZXZpbmUgdG8gcHJldmVudCB0aGUgdmlkZW8gc291cmNlCisgICAgICAgICAgLy8gZnJvbSBiZWluZyByZWFkIHdoaWxlIHRoZSBhc3NvY2lhdGVkIHZpZGVvIGRlY29kZXIgaXMgc2h1dHRpbmcgZG93bi4KKyAgICAgICAgICBtU3RvcFJlYWQgPSB0cnVlOworICAgICAgICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpmZXRjaFRleHREYXRhKAorICAgICAgICB1aW50MzJfdCBzZW5kV2hhdCwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICBpbnQzMl90IGN1ckdlbiwKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGF2YWlsOworICAgIGlmIChwYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmF2YWlsKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGludDY0X3Qgc3ViVGltZVVzOworICAgIHJlYWRCdWZmZXIodHlwZSwgdGltZVVzLCAmc3ViVGltZVVzKTsKKworICAgIGludDY0X3QgZGVsYXlVcyA9IHN1YlRpbWVVcyAtIHRpbWVVczsKKyAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRGZXRjaFN1YnRpdGxlRGF0YSkgeworICAgICAgICBjb25zdCBpbnQ2NF90IG9uZVNlY1VzID0gMTAwMDAwMGxsOworICAgICAgICBkZWxheVVzIC09IG9uZVNlY1VzOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgaWQoKSk7CisgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKKyAgICBtc2cyLT5wb3N0KGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZW5kVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHdoYXQsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgaW50MzJfdCBjdXJHZW4sCisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IG1zZ0dlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmbXNnR2VuZXJhdGlvbikpOworICAgIGlmIChtc2dHZW5lcmF0aW9uICE9IGN1ckdlbikgeworICAgICAgICAvLyBzdGFsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgaWYgKHBhY2tldHMtPm5leHRCdWZmZXJUaW1lKCZzdWJUaW1lVXMpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5leHRTdWJUaW1lVXM7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCAtMSwgJm5leHRTdWJUaW1lVXMpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIHN0YXR1c190IGRlcXVldWVTdGF0dXMgPSBwYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICBpZiAoZGVxdWV1ZVN0YXR1cyA9PSBPSykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCB3aGF0KTsKKyAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgIGNvbnN0IGludDY0X3QgZGVsYXlVcyA9IG5leHRTdWJUaW1lVXMgLSBzdWJUaW1lVXM7CisgICAgICAgIG1zZy0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKKyAgICB9Cit9CisKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEZvcm1hdCwgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgdm9pZCAqZm9ybWF0OworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRQb2ludGVyKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgIHJldHVybiAoTWV0YURhdGEgKilmb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldEZvcm1hdE1ldGEoc3A8QU1lc3NhZ2U+IG1zZykgY29uc3QgeworICAgIGludDMyX3QgYXVkaW87CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGRvR2V0Rm9ybWF0TWV0YShhdWRpbyk7CisgICAgcmVzcG9uc2UtPnNldFBvaW50ZXIoImZvcm1hdCIsIGZvcm1hdC5nZXQoKSk7CisKKyAgICB1aW50MzJfdCByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSBjb25zdCB7CiAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subVNvdXJjZSA6IG1WaWRlb1RyYWNrLm1Tb3VyY2U7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKQEAgLTE3MCwxNCArODM1LDUzIEBACiAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgfQogCisgICAgaWYgKG1Jc1dpZGV2aW5lICYmICFhdWRpbykgeworICAgICAgICAvLyB0cnkgdG8gcmVhZCBhIGJ1ZmZlciBhcyB3ZSBtYXkgbm90IGhhdmUgYmVlbiBhYmxlIHRvIHRoZSBsYXN0IHRpbWUKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CiAgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdCA9PSBPSyA/IC1FV09VTERCTE9DSyA6IGZpbmFsUmVzdWx0OworICAgICAgICByZXR1cm4gKGZpbmFsUmVzdWx0ID09IE9LID8gLUVXT1VMREJMT0NLIDogZmluYWxSZXN1bHQpOwogICAgIH0KIAogICAgIHN0YXR1c190IHJlc3VsdCA9IHRyYWNrLT5tUGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAKLSAgICByZWFkQnVmZmVyKGF1ZGlvLCAtMWxsKTsKKyAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCisgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtU3VidGl0bGVUcmFjay5tU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICYmICFtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFN1YnRpdGxlRGF0YSwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCisgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwKKyAgICAgICAgICAgICYmICFtVGltZWRUZXh0VHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4NywyNSArODkxLDM4NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtU291cmNlcy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtU291cmNlcy5zaXplKCk7CisgICAgaWYgKHRyYWNrSW5kZXggPj0gdHJhY2tDb3VudCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCktPmdldEZvcm1hdCgpOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1VOS05PV047CisgICAgfQorICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCB0cmFja1R5cGUpOworCisgICAgY29uc3QgY2hhciAqbGFuZzsKKyAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCAmbGFuZykpIHsKKyAgICAgICAgbGFuZyA9ICJ1bmQiOworICAgIH0KKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCBsYW5nKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIG1pbWUpOworCisgICAgICAgIGludDMyX3QgaXNBdXRvc2VsZWN0ID0gMSwgaXNEZWZhdWx0ID0gMCwgaXNGb3JjZWQgPSAwOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNBdXRvc2VsZWN0LCAmaXNBdXRvc2VsZWN0KTsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzRGVmYXVsdCk7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0ZvcmNlZCwgJmlzRm9yY2VkKTsKKworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISFpc0F1dG9zZWxlY3QpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgISFpc0RlZmF1bHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAhIWlzRm9yY2VkKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldFNlbGVjdGVkVHJhY2soc3A8QU1lc3NhZ2U+IG1zZykgY29uc3QgeworICAgIGludDMyX3QgdG1wVHlwZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0bXBUeXBlKSk7CisgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdG1wVHlwZTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzc2l6ZV90IGluZGV4ID0gZG9HZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisKKyAgICB1aW50MzJfdCByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb0dldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgY29uc3QgVHJhY2sgKnRyYWNrID0gTlVMTDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVklERU86CisgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0cmFjayAhPSBOVUxMICYmIHRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRyYWNrLT5tSW5kZXg7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgQUxPR1YoIiVzIHRyYWNrOiAlenUiLCBzZWxlY3QgPyAic2VsZWN0IiA6ICJkZXNlbGVjdCIsIHRyYWNrSW5kZXgpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOworICAgIG1zZy0+c2V0SW50MzIoInNlbGVjdCIsIHNlbGVjdCk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25TZWxlY3RUcmFjayhzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCB0cmFja0luZGV4LCBzZWxlY3Q7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gZG9TZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb1NlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCkgeworICAgIGlmICh0cmFja0luZGV4ID49IG1Tb3VyY2VzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGlmICghc2VsZWN0KSB7CisgICAgICAgIFRyYWNrKiB0cmFjayA9IE5VTEw7CisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tU291cmNlICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtU3VidGl0bGVUcmFjay5tSW5kZXgpIHsKKyAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9IGVsc2UgaWYgKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtVGltZWRUZXh0VHJhY2subUluZGV4KSB7CisgICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgdHJhY2stPm1Tb3VyY2UgPSBOVUxMOworICAgICAgICB0cmFjay0+bVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ0ZXh0LyIsIDUpKSB7CisgICAgICAgIGJvb2wgaXNTdWJ0aXRsZSA9IHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gaXNTdWJ0aXRsZSA/ICZtU3VidGl0bGVUcmFjayA6ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bVNvdXJjZSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgdHJhY2stPm1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMgPT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UodHJhY2stPm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2V0Rm9ybWF0KHRyYWNrLT5tU291cmNlLT5nZXRGb3JtYXQoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N1YnRpdGxlKSB7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSB8fCAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGJvb2wgYXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworICAgICAgICBUcmFjayAqdHJhY2sgPSBhdWRpbyA/ICZtQXVkaW9UcmFjayA6ICZtVmlkZW9UcmFjazsKKyAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwgJiYgdHJhY2stPm1JbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQVZTb3VyY2UsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25TZWVrKHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZWtUaW1lVXMiLCAmc2Vla1RpbWVVcykpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHN0YXR1c190IGVyciA9IGRvU2VlayhzZWVrVGltZVVzKTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICB1aW50MzJfdCByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIC8vIElmIHRoZSBXaWRldmluZSBzb3VyY2UgaXMgc3RvcHBlZCwgZG8gbm90IGF0dGVtcHQgdG8gcmVhZCBhbnkKKyAgICAvLyBtb3JlIGJ1ZmZlcnMuCisgICAgaWYgKG1TdG9wUmVhZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIGlmIChtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgaW50NjRfdCBhY3R1YWxUaW1lVXM7Ci0gICAgICAgIHJlYWRCdWZmZXIoZmFsc2UgLyogYXVkaW8gKi8sIHNlZWtUaW1lVXMsICZhY3R1YWxUaW1lVXMpOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsICZhY3R1YWxUaW1lVXMpOwogCiAgICAgICAgIHNlZWtUaW1lVXMgPSBhY3R1YWxUaW1lVXM7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICByZWFkQnVmZmVyKHRydWUgLyogYXVkaW8gKi8sIHNlZWtUaW1lVXMpOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8sIHNlZWtUaW1lVXMpOwogICAgIH0KIAorICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUQVJULCBzZWVrVGltZVVzIC8gMTAwMCk7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpQQVVTRSwgMCk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAorc3A8QUJ1ZmZlcj4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om1lZGlhQnVmZmVyVG9BQnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlciogbWIsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAorICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMpIHsKKyAgICBib29sIGF1ZGlvID0gdHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgc2l6ZV90IG91dExlbmd0aCA9IG1iLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBvdXRMZW5ndGggKz0gc2l6ZW9mKGludDMyX3QpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFiOworICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8pIHsKKyAgICAgICAgLy8gZGF0YSBpcyBhbHJlYWR5IHByb3ZpZGVkIGluIHRoZSBidWZmZXIKKyAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihOVUxMLCBtYi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBtYi0+YWRkX3JlZigpOworICAgICAgICBhYi0+c2V0TWVkaWFCdWZmZXJCYXNlKG1iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhYiA9IG5ldyBBQnVmZmVyKG91dExlbmd0aCk7CisgICAgICAgIG1lbWNweShhYi0+ZGF0YSgpLAorICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltYi0+ZGF0YSgpICsgbWItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgbWItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICB9CisKKyAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKKyAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKKyAgICAgICAgaWYgKCFtYi0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CisgICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogYWJFbmQgPSBhYi0+ZGF0YSgpICsgbWItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBtZW1jcHkoYWJFbmQsICZudW1QYWdlU2FtcGxlcywgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBhYi0+bWV0YSgpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBtZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIG1UaW1lZFRleHRUcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKCJ0cmFja0luZGV4IiwgbVN1YnRpdGxlVHJhY2subUluZGV4KTsKKyAgICB9CisKKyAgICBpZiAoYWN0dWFsVGltZVVzKSB7CisgICAgICAgICphY3R1YWxUaW1lVXMgPSB0aW1lVXM7CisgICAgfQorCisgICAgbWItPnJlbGVhc2UoKTsKKyAgICBtYiA9IE5VTEw7CisKKyAgICByZXR1cm4gYWI7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnBvc3RSZWFkQnVmZmVyKG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1SZWFkQnVmZmVyTG9jayk7CisKKyAgICBpZiAoKG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICYgKDEgPDwgdHJhY2tUeXBlKSkgPT0gMCkgeworICAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyB8PSAoMSA8PCB0cmFja1R5cGUpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZEJ1ZmZlciwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrVHlwZSIsIHRyYWNrVHlwZSk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25SZWFkQnVmZmVyKHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IHRtcFR5cGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrVHlwZSIsICZ0bXBUeXBlKSk7CisgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworICAgIHsKKyAgICAgICAgLy8gb25seSBwcm90ZWN0IHRoZSB2YXJpYWJsZSBjaGFuZ2UsIGFzIHJlYWRCdWZmZXIgbWF5CisgICAgICAgIC8vIHRha2UgY29uc2lkZXJhYmxlIHRpbWUuICBUaGlzIG1heSByZXN1bHQgaW4gb25lIGV4dHJhCisgICAgICAgIC8vIHJlYWQgYmVpbmcgcHJvY2Vzc2VkLCBidXQgdGhhdCBpcyBiZW5pZ24uCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtUmVhZEJ1ZmZlckxvY2spOworICAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcyAmPSB+KDEgPDwgdHJhY2tUeXBlKTsKKyAgICB9CisgICAgcmVhZEJ1ZmZlcih0cmFja1R5cGUpOworfQorCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZWFkQnVmZmVyKAotICAgICAgICBib29sIGF1ZGlvLCBpbnQ2NF90IHNlZWtUaW1lVXMsIGludDY0X3QgKmFjdHVhbFRpbWVVcykgewotICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOwotICAgIENIRUNLKHRyYWNrLT5tU291cmNlICE9IE5VTEwpOworICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMsIGJvb2wgZm9ybWF0Q2hhbmdlKSB7CisgICAgLy8gRG8gbm90IHJlYWQgZGF0YSBpZiBXaWRldmluZSBzb3VyY2UgaXMgc3RvcHBlZAorICAgIGlmIChtU3RvcFJlYWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUcmFjayAqdHJhY2s7CisgICAgc2l6ZV90IG1heEJ1ZmZlcnMgPSAxOworICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICAgICAgaWYgKG1Jc1dpZGV2aW5lKSB7CisgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgorICAgICAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgICAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDY0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKICAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHNlZWtUaW1lVXM7CkBAIC0yMTYsNjQgKzEyODIsNTYgQEAKICAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKIAogICAgIGlmIChzZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oc2Vla1RpbWVVcyk7CisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKTsKICAgICAgICAgc2Vla2luZyA9IHRydWU7CiAgICAgfQogCi0gICAgZm9yICg7OykgeworICAgIGlmIChtSXNXaWRldmluZSAmJiB0cmFja1R5cGUgIT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgeworICAgICAgICBvcHRpb25zLnNldE5vbkJsb2NraW5nKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgbnVtQnVmZmVycyA9IDA7IG51bUJ1ZmZlcnMgPCBtYXhCdWZmZXJzOyApIHsKICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHRyYWNrLT5tU291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CiAKICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHNpemVfdCBvdXRMZW5ndGggPSBtYnVmLT5yYW5nZV9sZW5ndGgoKTsKLQotICAgICAgICAgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7Ci0gICAgICAgICAgICAgICAgb3V0TGVuZ3RoICs9IHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuZ3RoKTsKLQotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOwotICAgICAgICAgICAgICAgIGlmICghbWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICZudW1QYWdlU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbWJ1ZiA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChzZWVraW5nKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgTlVMTCk7CisgICAgICAgICAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gZm9ybWF0Q2hhbmdlICYmICFzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgbm90IGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gIWZvcm1hdENoYW5nZTogbm9ybWFsIHNlZWsKKyAgICAgICAgICAgIGlmICgoc2Vla2luZyB8fCBmb3JtYXRDaGFuZ2UpCisgICAgICAgICAgICAgICAgICAgICYmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykpIHsKKyAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUgPSBmb3JtYXRDaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgID8gKHNlZWtpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLOworICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KCB0eXBlLCBOVUxMLCB0cnVlIC8qIGRpc2NhcmQgKi8pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcihtYnVmLCB0cmFja1R5cGUsIGFjdHVhbFRpbWVVcyk7CiAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlQWNjZXNzVW5pdChidWZmZXIpOworICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgICBzZWVraW5nID0gZmFsc2U7CisgICAgICAgICAgICArK251bUJ1ZmZlcnM7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewogI2lmIDAKICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZGlzY2FyZCAqLyk7CiAjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAppbmRleCAyZGE2ODBjLi5mODYwMWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKQEAgLTIzLDU4ICsyMywxNzUgQEAKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBEZWNyeXB0SGFuZGxlOworY2xhc3MgRHJtTWFuYWdlckNsaWVudDsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKIHN0cnVjdCBEYXRhU291cmNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IE1lZGlhU291cmNlOworY2xhc3MgTWVkaWFCdWZmZXI7CitzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOworc3RydWN0IFdWTUV4dHJhY3RvcjsKIAogc3RydWN0IE51UGxheWVyOjpHZW5lcmljU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewotICAgIEdlbmVyaWNTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLAotICAgICAgICAgICAgdWlkX3QgdWlkID0gMCk7CisgICAgR2VuZXJpY1NvdXJjZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKTsKIAotICAgIEdlbmVyaWNTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCiAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOwogCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGJvb2wgYXVkaW8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5HZW5lcmljU291cmNlKCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKIAogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRQcmVwYXJlQXN5bmMsCisgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLAorICAgICAgICBrV2hhdFNlbmRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKKyAgICAgICAga1doYXRHZXRGb3JtYXQsCisgICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywKKyAgICAgICAga1doYXRTZWxlY3RUcmFjaywKKyAgICAgICAga1doYXRTZWVrLAorICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCisgICAgICAgIGtXaGF0U3RvcFdpZGV2aW5lLAorICAgIH07CisKKyAgICBWZWN0b3I8c3A8TWVkaWFTb3VyY2U+ID4gbVNvdXJjZXM7CisKICAgICBzdHJ1Y3QgVHJhY2sgeworICAgICAgICBzaXplX3QgbUluZGV4OwogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVBhY2tldHM7CiAgICAgfTsKIAogICAgIFRyYWNrIG1BdWRpb1RyYWNrOworICAgIGludDY0X3QgbUF1ZGlvVGltZVVzOwogICAgIFRyYWNrIG1WaWRlb1RyYWNrOworICAgIGludDY0X3QgbVZpZGVvVGltZVVzOworICAgIFRyYWNrIG1TdWJ0aXRsZVRyYWNrOworICAgIFRyYWNrIG1UaW1lZFRleHRUcmFjazsKIAorICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uOwogICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CiAgICAgYm9vbCBtQXVkaW9Jc1ZvcmJpczsKKyAgICBib29sIG1Jc1dpZGV2aW5lOworICAgIGJvb2wgbVVJRFZhbGlkOworICAgIHVpZF90IG1VSUQ7CisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1Vcmk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOwogCi0gICAgdm9pZCBpbml0RnJvbURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSHR0cFNvdXJjZTsKKyAgICBzcDxXVk1FeHRyYWN0b3I+IG1XVk1FeHRyYWN0b3I7CisgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKKyAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVN0b3BSZWFkOworICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOworICAgIEFTdHJpbmcgbVNuaWZmZWRNSU1FOworICAgIG9mZjY0X3QgbU1ldGFEYXRhU2l6ZTsKKyAgICBpbnQ2NF90IG1CaXRyYXRlOworICAgIGludDMyX3QgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIHVpbnQzMl90IG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzOworICAgIG11dGFibGUgTXV0ZXggbVJlYWRCdWZmZXJMb2NrOwogCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIHZvaWQgcmVzZXREYXRhU291cmNlKCk7CisKKyAgICBzdGF0dXNfdCBpbml0RnJvbURhdGFTb3VyY2UoKTsKKyAgICB2b2lkIGNoZWNrRHJtU3RhdHVzKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBkYXRhU291cmNlKTsKKyAgICBpbnQ2NF90IGdldExhc3RSZWFkUG9zaXRpb24oKTsKKyAgICB2b2lkIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKworICAgIHN0YXR1c190IHByZWZpbGxDYWNoZUlmTmVjZXNzYXJ5KCk7CisKKyAgICB2b2lkIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpOworCisgICAgdm9pZCBvbkdldEZvcm1hdE1ldGEoc3A8QU1lc3NhZ2U+IG1zZykgY29uc3Q7CisgICAgc3A8TWV0YURhdGE+IGRvR2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSBjb25zdDsKKworICAgIHZvaWQgb25HZXRTZWxlY3RlZFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpIGNvbnN0OworICAgIHNzaXplX3QgZG9HZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CisKKyAgICB2b2lkIG9uU2VsZWN0VHJhY2soc3A8QU1lc3NhZ2U+IG1zZyk7CisgICAgc3RhdHVzX3QgZG9TZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpOworCisgICAgdm9pZCBvblNlZWsoc3A8QU1lc3NhZ2U+IG1zZyk7CisgICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisKKyAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7CisKKyAgICB2b2lkIGZldGNoVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywgc3A8QU1lc3NhZ2U+IG1zZyk7CisKKyAgICB2b2lkIHNlbmRUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLCBzcDxBTWVzc2FnZT4gbXNnKTsKKworICAgIHNwPEFCdWZmZXI+IG1lZGlhQnVmZmVyVG9BQnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYsCisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwpOworCisgICAgdm9pZCBwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSk7CisgICAgdm9pZCBvblJlYWRCdWZmZXIoc3A8QU1lc3NhZ2U+IG1zZyk7CiAgICAgdm9pZCByZWFkQnVmZmVyKAotICAgICAgICAgICAgYm9vbCBhdWRpbywKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwpOworICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLCBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMLCBib29sIGZvcm1hdENoYW5nZSA9IGZhbHNlKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQgcGVyY2VudGFnZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmljU291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAppbmRleCA1MTBkY2M5Li5hMDAzYzgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJMaXZlRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMzQsMTMgKzM1LDEyIEBACiAKIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6SFRUUExpdmVTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVVSTCh1cmwpLAotICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKLSAgICAgIG1VSUQodWlkKSwKICAgICAgIG1GbGFncygwKSwKICAgICAgIG1GaW5hbFJlc3VsdChPSyksCiAgICAgICBtT2Zmc2V0KDApLApAQCAtNjIsMjUgKzYyLDMxIEBACiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6On5IVFRQTGl2ZVNvdXJjZSgpIHsKICAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKICAgICAgICAgbUxpdmVTZXNzaW9uLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIG1MaXZlU2Vzc2lvbi5jbGVhcigpOwogCisgICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24tPmlkKCkpOworICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CiAgICAgICAgIG1MaXZlTG9vcGVyLT5zdG9wKCk7CisKKyAgICAgICAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7CiAgICAgICAgIG1MaXZlTG9vcGVyLmNsZWFyKCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewotICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOwotICAgIG1MaXZlTG9vcGVyLT5zdGFydCgpOworICAgIGlmIChtTGl2ZUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvbk5vdGlmeSwgaWQoKSk7CiAKICAgICBtTGl2ZVNlc3Npb24gPSBuZXcgTGl2ZVNlc3Npb24oCiAgICAgICAgICAgICBub3RpZnksCiAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gTGl2ZVNlc3Npb246OmtGbGFnSW5jb2duaXRvIDogMCwKLSAgICAgICAgICAgIG1VSURWYWxpZCwKLSAgICAgICAgICAgIG1VSUQpOworICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKIAogICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uKTsKIApAQCAtMTIxLDggKzEyNywxMiBAQAogICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldER1cmF0aW9uKGR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKK3NpemVfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CkBAIC0yMDcsOSArMjE3LDkgQEAKICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0OwogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMICYmCiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGZvcm1hdCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7CisgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IEZMQUdfQ0FOX1BBVVNFOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAppbmRleCBiY2MzZjhiLi42YjVmNmFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApAQCAtMjgsMTAgKzI4LDkgQEAKIHN0cnVjdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7CiAgICAgSFRUUExpdmVTb3VyY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwKLSAgICAgICAgICAgIHVpZF90IHVpZCA9IDApOworICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwpAQCAtNDEsNyArNDAsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKQEAgLTYxLDEwICs2MSw5IEBACiAgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCiAgICAgfTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVVJMOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIG9mZjY0X3QgbU9mZnNldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IDI1ZDU1YTMuLmE2M2E5NDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtMjIsMjQgKzIyLDIyIEBACiAKICNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZS5oIgogI2luY2x1ZGUgIk51UGxheWVyRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJEcml2ZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKICNpbmNsdWRlICJSVFNQU291cmNlLmgiCiAjaW5jbHVkZSAiU3RyZWFtaW5nU291cmNlLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgotI2luY2x1ZGUgIm1wNC9NUDRTb3VyY2UuaCIKKyNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAotI2luY2x1ZGUgIlNvZnR3YXJlUmVuZGVyZXIuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KQEAgLTUyLDYgKzUwLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVE9ETyBvcHRpbWl6ZSBidWZmZXIgc2l6ZSBmb3IgcG93ZXIgY29uc3VtcHRpb24KKy8vIFRoZSBvZmZsb2FkIHJlYWQgYnVmZmVyIHNpemUgaXMgMzIgS0IgYnV0IDI0IEtCIHVzZXMgbGVzcyBwb3dlci4KK2NvbnN0IHNpemVfdCBOdVBsYXllcjo6a0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyA9IDI0ICogMTAyNDsKKwogc3RydWN0IE51UGxheWVyOjpBY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQWN0aW9uKCkge30KIApAQCAtNjIsMTYgKzY0LDE4IEBACiB9OwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNlZWtBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKLSAgICBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcykKLSAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSB7CisgICAgU2Vla0FjdGlvbihpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkKKyAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSwKKyAgICAgICAgICBtTmVlZE5vdGlmeShuZWVkTm90aWZ5KSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIgKnBsYXllcikgewotICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZWVrKG1TZWVrVGltZVVzKTsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcywgbU5lZWROb3RpZnkpOwogICAgIH0KIAogcHJpdmF0ZToKICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgIGJvb2wgbU5lZWROb3RpZnk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZWVrQWN0aW9uKTsKIH07CkBAIC0xNDgsMjIgKzE1MiwyNiBAQAogICAgIDogbVVJRFZhbGlkKGZhbHNlKSwKICAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1WaWRlb0lzQVZDKGZhbHNlKSwKLSAgICAgIG1OZWVkc1N3UmVuZGVyZXIoZmFsc2UpLAorICAgICAgbU9mZmxvYWRBdWRpbyhmYWxzZSksCisgICAgICBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVJlbmRlcmVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCiAgICAgICBtVmlkZW9FT1MoZmFsc2UpLAogICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyhmYWxzZSksCiAgICAgICBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKDApLAogICAgICAgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24oMCksCisgICAgICBtVGltZWRUZXh0R2VuZXJhdGlvbigwKSwKICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcoZmFsc2UpLAogICAgICAgbUZsdXNoaW5nQXVkaW8oTk9ORSksCiAgICAgICBtRmx1c2hpbmdWaWRlbyhOT05FKSwKICAgICAgIG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzKC0xbGwpLAogICAgICAgbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCi0gICAgICBtVmlkZW9MYXRlQnlVcygwbGwpLAogICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCiAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCgwbGwpLAogICAgICAgbVZpZGVvU2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CiB9CiAKIE51UGxheWVyOjp+TnVQbGF5ZXIoKSB7CkBAIC0xODMsMTQgKzE5MSw3IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBpZCgpKTsKIAotICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnVzZS1tcDRzb3VyY2UiLCBwcm9wLCBOVUxMKQotICAgICAgICAgICAgJiYgKCFzdHJjbXAocHJvcCwgIjEiKSB8fCAhc3RyY2FzZWNtcChwcm9wLCAidHJ1ZSIpKSkgewotICAgICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IE1QNFNvdXJjZShub3RpZnksIHNvdXJjZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgU3RyZWFtaW5nU291cmNlKG5vdGlmeSwgc291cmNlKSk7Ci0gICAgfQotCisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMjEyLDcgKzIxMywxMCBAQAogfQogCiB2b2lkIE51UGxheWVyOjpzZXREYXRhU291cmNlQXN5bmMoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIGlkKCkpOwogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKIApAQCAtMjIwLDE4ICsyMjQsMzEgQEAKIAogICAgIHNwPFNvdXJjZT4gc291cmNlOwogICAgIGlmIChJc0hUVFBMaXZlVVJMKHVybCkpIHsKLSAgICAgICAgc291cmNlID0gbmV3IEhUVFBMaXZlU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICBzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2Uobm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJydHNwOi8vIiwgNykpIHsKLSAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKICAgICB9IGVsc2UgaWYgKCghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCiAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpCiAgICAgICAgICAgICAgICAgICAgICYmICgobGVuID49IDQgJiYgIXN0cmNhc2VjbXAoIi5zZHAiLCAmdXJsW2xlbiAtIDRdKSkKICAgICAgICAgICAgICAgICAgICAgfHwgc3Ryc3RyKHVybCwgIi5zZHA/IikpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKG5vdGlmeSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQsIHRydWUpOworICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZSgKKyAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCwgdHJ1ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc291cmNlID0gbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7Ci0gICAgfQorICAgICAgICBzcDxHZW5lcmljU291cmNlPiBnZW5lcmljU291cmNlID0KKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIC8vIERvbid0IHNldCBGTEFHX1NFQ1VSRSBvbiBtU291cmNlRmxhZ3MgaGVyZSBmb3Igd2lkZXZpbmUuCisgICAgICAgIC8vIFRoZSBjb3JyZWN0IGZsYWdzIHdpbGwgYmUgdXBkYXRlZCBpbiBTb3VyY2U6OmtXaGF0RmxhZ3NDaGFuZ2VkCisgICAgICAgIC8vIGhhbmRsZXIgd2hlbiAgR2VuZXJpY1NvdXJjZSBpcyBwcmVwYXJlZC4KIAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTI0MSw3ICsyNTgsMTYgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIGlkKCkpOwogCi0gICAgc3A8U291cmNlPiBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgc3A8R2VuZXJpY1NvdXJjZT4gc291cmNlID0KKyAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKworICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgc291cmNlID0gTlVMTDsKKyAgICB9CisKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KQEAgLTI2MCw3ICsyODYsNyBAQAogICAgICAgICBtc2ctPnNldE9iamVjdCgKICAgICAgICAgICAgICAgICAibmF0aXZlLXdpbmRvdyIsCiAgICAgICAgICAgICAgICAgbmV3IE5hdGl2ZVdpbmRvd1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKSkpOworICAgICAgICAgICAgICAgICAgICBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdHJ1ZSAvKiBjb250cm9sbGVkQnlBcHAgKi8pKSk7CiAgICAgfQogCiAgICAgbXNnLT5wb3N0KCk7CkBAIC0yODUsMzIgKzMxMSw1MiBAQAogfQogCiB2b2lkIE51UGxheWVyOjpyZXNldEFzeW5jKCkgeworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gRHVyaW5nIGEgcmVzZXQsIHRoZSBkYXRhIHNvdXJjZSBtaWdodCBiZSB1bnJlc3BvbnNpdmUgYWxyZWFkeSwgd2UgbmVlZCB0bworICAgICAgICAvLyBkaXNjb25uZWN0IGV4cGxpY2l0bHkgc28gdGhhdCByZWFkcyBleGl0IHByb21wdGx5LgorICAgICAgICAvLyBXZSBjYW4ndCBxdWV1ZSB0aGUgZGlzY29ubmVjdCByZXF1ZXN0IHRvIHRoZSBsb29wZXIsIGFzIGl0IG1pZ2h0IGJlCisgICAgICAgIC8vIHF1ZXVlZCBiZWhpbmQgYSBzdHVjayByZWFkIGFuZCBuZXZlciBnZXRzIHByb2Nlc3NlZC4KKyAgICAgICAgLy8gRG9pbmcgYSBkaXNjb25uZWN0IG91dHNpZGUgdGhlIGxvb3BlciB0byBhbGxvd3MgdGhlIHBlbmRpbmcgcmVhZHMgdG8gZXhpdAorICAgICAgICAvLyAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGVycm9yKS4KKyAgICAgICAgbVNvdXJjZS0+ZGlzY29ubmVjdCgpOworICAgIH0KKwogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXNldCwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcykgewordm9pZCBOdVBsYXllcjo6c2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOworICAgIG1zZy0+c2V0SW50MzIoIm5lZWROb3RpZnkiLCBuZWVkTm90aWZ5KTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAotLy8gc3RhdGljCi1ib29sIE51UGxheWVyOjpJc0ZsdXNoaW5nU3RhdGUoRmx1c2hTdGF0dXMgc3RhdGUsIGJvb2wgKm5lZWRTaHV0ZG93bikgewotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSOgotICAgICAgICAgICAgaWYgKG5lZWRTaHV0ZG93biAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm5lZWRTaHV0ZG93biA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgotICAgICAgICAgICAgaWYgKG5lZWRTaHV0ZG93biAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm5lZWRTaHV0ZG93biA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKK3ZvaWQgTnVQbGF5ZXI6OndyaXRlVHJhY2tJbmZvKAorICAgICAgICBQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4gZm9ybWF0KSBjb25zdCB7CisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInR5cGUiLCAmdHJhY2tUeXBlKSk7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBU3RyaW5nIGxhbmc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJsYW5ndWFnZSIsICZsYW5nKSk7CisKKyAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gd3JpdGUgc29tZXRoaW5nIG5vbi16ZXJvCisgICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tUeXBlKTsKKyAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nLmNfc3RyKCkpKTsKKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICAgICAgaW50MzJfdCBpc0F1dG8sIGlzRGVmYXVsdCwgaXNGb3JjZWQ7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJhdXRvIiwgJmlzQXV0bykpOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZGVmYXVsdCIsICZpc0RlZmF1bHQpKTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImZvcmNlZCIsICZpc0ZvcmNlZCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0F1dG8pOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RlZmF1bHQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0ZvcmNlZCk7CiAgICAgfQogfQogCkBAIC0zMjIsMTcgKzM2OCwxOSBAQAogCiAgICAgICAgICAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOwogCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwotCi0gICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7Ci0KLSAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVNvdXJjZSk7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1Ecml2ZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoT0spOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChlcnIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM0OCwxNiArMzk2LDU4IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRvdGFsIHRyYWNrIGNvdW50CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CisKKyAgICAgICAgICAgIC8vIHdyaXRlIGluYmFuZCB0cmFja3MKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5iYW5kVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd3JpdGUgQ0MgdHJhY2sKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NUcmFja3M7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtQ0NEZWNvZGVyLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKKyAgICAgICAgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisKICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5nZXRUcmFja0luZm8ocmVwbHkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM2NywxMyArNDU3LDQwIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNjVHJhY2tzID0gbUNDRGVjb2Rlci0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGluYmFuZFRyYWNrcykgewogICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdCAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZm8tPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggLT0gaW5iYW5kVHJhY2tzOworCisgICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBjY1RyYWNrcykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ0NEZWNvZGVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwpAQCAtNDIxLDYgKzUzOCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKSk7CiAKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgYSBzZWVrIHRvIHJlZnJlc2ggdGhlIHZpZGVvIHNjcmVlbiBvbmx5IGlmIHN0YXJ0ZWQgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0b3IgbWF5IG5vdCB5ZXQgYmUgc3RhcnRlZCBhbmQgd2lsbCBhc3NlcnQuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2aWRlbyBkZWNvZGVyIGlzIG5vdCBzZXQgKHBlcmhhcHMgYXVkaW8gb25seSBpbiB0aGlzIGNhc2UpCisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwZXJmb3JtIGEgc2VlayBhcyBpdCBpcyBub3QgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oY3VycmVudFBvc2l0aW9uVXMsIGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV3IHN1cmZhY2UgdGV4dHVyZSwgaW5zdGFudGlhdGUgZGVjb2RlcnMKICAgICAgICAgICAgICAgICAvLyBhZ2FpbiBpZiBwb3NzaWJsZS4KICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKQEAgLTQ0NywxNiArNTc2LDI2IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRTdGFydCIpOwogCiAgICAgICAgICAgICBtVmlkZW9Jc0FWQyA9IGZhbHNlOwotICAgICAgICAgICAgbU5lZWRzU3dSZW5kZXJlciA9IGZhbHNlOworICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwogICAgICAgICAgICAgbUF1ZGlvRU9TID0gZmFsc2U7CiAgICAgICAgICAgICBtVmlkZW9FT1MgPSBmYWxzZTsKICAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzID0gLTE7CiAgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVcyA9IC0xOwotICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOwogICAgICAgICAgICAgbU51bUZyYW1lc1RvdGFsID0gMDsKICAgICAgICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkID0gMDsKICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKIAorICAgICAgICAgICAgLyogaW5zdGFudGlhdGUgZGVjb2RlcnMgbm93IGZvciBzZWN1cmUgcGxheWJhY2sgKi8KKyAgICAgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlLCAmbUF1ZGlvRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOwogCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CkBAIC00NjUsMTIgKzYwNCwzNyBAQAogICAgICAgICAgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLAotICAgICAgICAgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgaWQoKSksCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKworICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9CisgICAgICAgICAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsICh2aWRlb0Zvcm1hdCAhPSBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNfc3RyZWFtaW5nICovLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfT0ZGTE9BRF9BVURJTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBub3RpZnksIGZsYWdzKTsKKworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyUmVuZGVyZXIiKTsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CisKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0RmlsZU1ldGEoKTsKKyAgICAgICAgICAgIGludDMyX3QgcmF0ZTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZyYXRlKSAmJiByYXRlID4gMCkgeworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2V0VmlkZW9GcmFtZVJhdGUocmF0ZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBvc3RTY2FuU291cmNlcygpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00OTMsMTEgKzY1NywxOCBAQAogICAgICAgICAgICAgYm9vbCBtSGFkQW55U291cmNlc0JlZm9yZSA9CiAgICAgICAgICAgICAgICAgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7CiAKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdmlkZW8gYmVmb3JlIGF1ZGlvIGJlY2F1c2Ugc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiBvZgorICAgICAgICAgICAgLy8gdmlkZW8gbWF5IGNoYW5nZSBkZWVwIGJ1ZmZlciBtb2RlIG9mIGF1ZGlvLgogICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhdWRpbyBzaW5rIGVhcmx5IHVuZGVyIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qYXVkaW8qLyk7CisgICAgICAgICAgICAgICAgICAgIG9wZW5BdWRpb1NpbmsoZm9ybWF0LCB0cnVlIC8qb2ZmbG9hZE9ubHkqLyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlLCAmbUF1ZGlvRGVjb2Rlcik7CiAgICAgICAgICAgICB9CiAKQEAgLTUzOCwyNCArNzA5LDQwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2wgYXVkaW8gPSBtc2ctPndoYXQoKSA9PSBrV2hhdEF1ZGlvTm90aWZ5OwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gY29kZWNSZXF1ZXN0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsICZjb2RlY1JlcXVlc3QpKTsKKyAgICAgICAgICAgIGludDMyX3QgY3VycmVudERlY29kZXJHZW5lcmF0aW9uID0KKyAgICAgICAgICAgICAgICAoYXVkaW8/IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uIDogbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOworICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZXJHZW5lcmF0aW9uID0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uIC0gMTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBtZXNzYWdlIGZyb20gb2xkICVzIGRlY29kZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIHJlcXVlc3RlckdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgICAgICAgICBpZiAoIShtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIElORk9fRElTQ09OVElOVUlUWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKSB7CisgICAgICAgICAgICBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEZpbGxUaGlzQnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVlZERlY29kZXJJbnB1dERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgY29kZWNSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBtc2cpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBsbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUykgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RU9TKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgJXMgZGVjb2RlciBFT1MiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKQEAgLTU2NiwxNzAgKzc1Myw5MSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MoYXVkaW8sIGVycik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBuZWVkU2h1dGRvd247Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ0F1ZGlvLCAmbmVlZFNodXRkb3duKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nVmlkZW8sICZuZWVkU2h1dGRvd24pKTsKLSAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBGTFVTSEVEOwotCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEZsdXNoQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImRlY29kZXIgJXMgZmx1c2ggY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKLSAgICAgICAgICAgICAgICBpZiAobmVlZFNodXRkb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJpbml0aWF0aW5nICVzIGRlY29kZXIgc2h1dGRvd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotCi0gICAgICAgICAgICAgICAgICAgIChhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyKS0+aW5pdGlhdGVTaHV0ZG93bigpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIHRydWUgLyogaXNEZWNvZGVyICovKTsKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCkgeworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKLQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW8gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVkIEh6LCAlZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZpZGVvIGRlY29kZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gaXMgY3JlYXRlZCBhZnRlciB3ZSByZWNlaXZlIHRoZSBmb3JtYXQgY2hhbmdlIGluZGljYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY29kZSB3aWxsIGp1c3QgbWFrZSB0aGF0IHdlIHNlbGVjdCBkZWVwIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHZpZGVvIHdoaWNoIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGFzIGl0IHNob3VsZAotICAgICAgICAgICAgICAgICAgICAvLyBub3QgcHJldmVudCBmcm9tIGtlZXBpbmcgQS9WIHN5bmMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyID09IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0sgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxBdWRpb1NpbmtDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgIG9wZW5BdWRpb1NpbmsoZm9ybWF0LCBmYWxzZSAvKm9mZmxvYWRPbmx5Ki8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKIAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcGxheVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCB4ICVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiKGNyb3A6ICVkIHggJWQgQCAoJWQsICVkKSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3ApOwotCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB2aWRlb0lucHV0Rm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgc2FtcGxlIGFzcGVjdCByYXRpbyBpZiBuZWNlc3Nhcnk6Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZGVvSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhci1oZWlnaHQiLCAmc2FySGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNhbXBsZSBhc3BlY3QgcmF0aW8gJWQgOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXJXaWR0aCwgc2FySGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRpc3BsYXkgZGltZW5zaW9ucyAlZCB4ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU5lZWRzU3dSZW5kZXJlciAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2V0U29mdFJlbmRlcmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29mdHdhcmVSZW5kZXJlcihtTmF0aXZlV2luZG93LT5nZXROYXRpdmVXaW5kb3coKSwgbWV0YSkpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShpbnB1dEZvcm1hdCwgZm9ybWF0KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBzaHV0ZG93biBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nVmlkZW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBTSFVUX0RPV047CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlJlY2VpdmVkIGVycm9yIGZyb20gJXMgZGVjb2RlciwgYWJvcnRpbmcgcGxheWJhY2suIiwKLSAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotCi0gICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhhdWRpbywgVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewotICAgICAgICAgICAgICAgIHJlbmRlckJ1ZmZlcihhdWRpbywgY29kZWNSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1OZWVkc1N3UmVuZGVyZXIgPSBuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRFcnJvcikgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSB8fCBlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgIT0gQUNvZGVjOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgd2hhdCAhPSBBQ29kZWM6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJVbmhhbmRsZWQgY29kZWMgbm90aWZpY2F0aW9uICVkICclYyVjJWMlYycuIiwKKworICAgICAgICAgICAgICAgIC8vIERlY29kZXIgZXJyb3JzIGNhbiBiZSBkdWUgdG8gU291cmNlIChlLmcuIGZyb20gc3RyZWFtaW5nKSwKKyAgICAgICAgICAgICAgICAvLyBvciBmcm9tIGRlY29kaW5nIGNvcnJ1cHRlZCBiaXRzdHJlYW1zLCBvciBmcm9tIG90aGVyIGRlY29kZXIKKyAgICAgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG9wZXJhdGlvbnMgKGUuZy4gZnJvbSBhbiBvbmdvaW5nIHJlc2V0IG9yIHNlZWspLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBhZmZlY3RlZCBkZWNvZGVyIGlmIHBvc3NpYmxlLAorICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBmb3JjZSB0aGUgc2h1dGRvd24gd2l0aCBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIHBlcmZvcm1SZXNldCgpLiBUaGlzIG1ldGhvZCBjYW4gbGVhZCB0byBhIGhhbmcKKyAgICAgICAgICAgICAgICAvLyBpZiBNZWRpYUNvZGVjIGZ1bmN0aW9ucyBibG9jayBhZnRlciBhbiBlcnJvciwgYnV0IHRoZXkgc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gdHlwaWNhbGx5IHJldHVybiBJTlZBTElEX09QRVJBVElPTiBpbnN0ZWFkIG9mIGJsb2NraW5nLgorCisgICAgICAgICAgICAgICAgRmx1c2hTdGF0dXMgKmZsdXNoaW5nID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87CisgICAgICAgICAgICAgICAgQUxPR0UoInJlY2VpdmVkIGVycm9yKCUjeCkgZnJvbSAlcyBkZWNvZGVyLCBmbHVzaGluZyglZCksIG5vdyBzaHV0dGluZyBkb3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgKmZsdXNoaW5nKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoKmZsdXNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2h1dGRvd25EZWNvZGVyQWN0aW9uKGF1ZGlvLCAhYXVkaW8gLyogdmlkZW8gKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOyAvLyBpbml0aWF0ZSBzaHV0ZG93biBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRUSU5HX0RPV05fREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBzaHV0ZG93biB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lkZXZpbmUgc291cmNlIHJlYWRzIG11c3Qgc3RvcCBiZWZvcmUgcmVsZWFzaW5nIHRoZSB2aWRlbyBkZWNvZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdWRpbyAmJiBtU291cmNlICE9IE5VTEwgJiYgbVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY29kZXIoYXVkaW8pLT5pbml0aWF0ZVNodXRkb3duKCk7IC8vIEluIHRoZSBtaWRkbGUgb2YgYSBzZWVrLgorICAgICAgICAgICAgICAgICAgICAgICAgKmZsdXNoaW5nID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOyAgICAgLy8gU2h1dCBkb3duLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0hVVF9ET1dOOgorICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7ICAvLyBTaG91bGQgbm90IG9jY3VyLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvLyBGaW5pc2ggYW55d2F5cy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZW5kZXJCdWZmZXIoYXVkaW8sIG1zZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJVbmhhbmRsZWQgZGVjb2RlciBub3RpZmljYXRpb24gJWQgJyVjJWMlYyVjJy4iLAogICAgICAgICAgICAgICAgICAgICAgIHdoYXQsCiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAod2hhdCA+PiAxNikgJiAweGZmLApAQCAtNzQyLDYgKzg1MCwxNCBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZW5kZXJlck5vdGlmeToKICAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZXJHZW5lcmF0aW9uID0gbVJlbmRlcmVyR2VuZXJhdGlvbiAtIDE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZyZXF1ZXN0ZXJHZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBtUmVuZGVyZXJHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBtZXNzYWdlIGZyb20gb2xkIHJlbmRlcmVyLCBnZW5lcmF0aW9uKCVkOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXJHZW5lcmF0aW9uLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIApAQCAtNzcyLDMxICs4ODgsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtVmlkZW9FT1MgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewogICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ2aWRlb0xhdGVCeVVzIiwgJm1WaWRlb0xhdGVCeVVzKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVBvc2l0aW9uKHBvc2l0aW9uVXMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZyYW1lU3RhdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNUb3RhbCwgbU51bUZyYW1lc0Ryb3BwZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEZsdXNoQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCiAgICAgICAgICAgICAgICAgQUxPR1YoInJlbmRlcmVyICVzIGZsdXNoIGNvbXBsZXRlZC4iLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9JTkZPLCBNRURJQV9JTkZPX1JFTkRFUklOR19TVEFSVCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJtZWRpYSByZW5kZXJpbmcgc3RhcnRlZCIpOwogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyBvZmZsb2FkLCBmYWxsIGJhY2sgdG8gcy93IHBhdGgiKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpOworICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisgICAgICAgICAgICAgICAgY2xvc2VBdWRpb1NpbmsoKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPmZsdXNoKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5mbHVzaChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHBvc2l0aW9uVXMsIGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pOworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb0Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTgyNCwxNCArOTQ3LDE4IEBACiAgICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG5lZWROb3RpZnk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibmVlZE5vdGlmeSIsICZuZWVkTm90aWZ5KSk7CiAKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzIiwgc2Vla1RpbWVVcyk7CisgICAgICAgICAgICBBTE9HVigia1doYXRTZWVrIHNlZWtUaW1lVXM9JWxsZCB1cywgbmVlZE5vdGlmeT0lZCIsCisgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIG5lZWROb3RpZnkpOwogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXI6OnBlcmZvcm1EZWNvZGVyRmx1c2gpKTsKIAotICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcykpOworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIG5lZWROb3RpZnkpKTsKIAogICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04MzksMTcgKzk2NiwzNiBAQAogCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0sobVJlbmRlcmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKLSAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5wYXVzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1SZW5kZXJlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOwotICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB8bUF1ZGlvRGVjb2RlcnwgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBkdWUgdG8gdGhlIHBhdXNlIHRpbWVvdXQsIHNvIHJlLWNyZWF0ZSBpdCBpZgorICAgICAgICAgICAgLy8gbmVlZGVkLgorICAgICAgICAgICAgaWYgKGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgJiYgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC04NTksMzkgKzEwMDUsOTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6ZmluaXNoRmx1c2hJZlBvc3NpYmxlKCkgewotICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBGTFVTSEVEICYmIG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgeworYm9vbCBOdVBsYXllcjo6YXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSB7CisgICAgLy8gQXVkaW8gZGVjb2RlciBpcyBubyBsb25nZXIgbmVlZGVkIGlmIGl0J3MgaW4gc2h1dC9zaHV0dGluZyBkb3duIHN0YXR1cy4KKyAgICByZXR1cm4gKChtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pICYmIChtRmx1c2hpbmdBdWRpbyAhPSBTSFVUVElOR19ET1dOX0RFQ09ERVIpKTsKK30KKwordm9pZCBOdVBsYXllcjo6aGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2RlcikgeworICAgIC8vIFdlIHdhaXQgZm9yIGJvdGggdGhlIGRlY29kZXIgZmx1c2ggYW5kIHRoZSByZW5kZXJlciBmbHVzaCB0byBjb21wbGV0ZQorICAgIC8vIGJlZm9yZSBlbnRlcmluZyBlaXRoZXIgdGhlIEZMVVNIRUQgb3IgdGhlIFNIVVRUSU5HX0RPV05fREVDT0RFUiBzdGF0ZS4KKworICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVtpc0RlY29kZXJdID0gdHJ1ZTsKKyAgICBpZiAoIW1GbHVzaENvbXBsZXRlW2F1ZGlvXVshaXNEZWNvZGVyXSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKG1GbHVzaGluZ1ZpZGVvICE9IEZMVVNIRUQgJiYgbUZsdXNoaW5nVmlkZW8gIT0gU0hVVF9ET1dOKSB7CisgICAgRmx1c2hTdGF0dXMgKnN0YXRlID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87CisgICAgc3dpdGNoICgqc3RhdGUpIHsKKyAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSOgorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBGTFVTSEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046CisgICAgICAgIHsKKyAgICAgICAgICAgICpzdGF0ZSA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsKKworICAgICAgICAgICAgQUxPR1YoImluaXRpYXRpbmcgJXMgZGVjb2RlciBzaHV0ZG93biIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgaWYgKCFhdWRpbykgeworICAgICAgICAgICAgICAgIC8vIFdpZGV2aW5lIHNvdXJjZSByZWFkcyBtdXN0IHN0b3AgYmVmb3JlIHJlbGVhc2luZyB0aGUgdmlkZW8gZGVjb2Rlci4KKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMICYmIG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldERlY29kZXIoYXVkaW8pLT5pbml0aWF0ZVNodXRkb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBkZWNvZGVyIGZsdXNoIGNvbXBsZXRlcyBvbmx5IG9jY3VyIGluIGEgZmx1c2hpbmcgc3RhdGUuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlzRGVjb2RlciwgImRlY29kZXIgZmx1c2ggaW4gaW52YWxpZCBzdGF0ZSAlZCIsICpzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpIHsKKyAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSAmJiBtRmx1c2hpbmdBdWRpbyAhPSBGTFVTSEVECisgICAgICAgICAgICAmJiBtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmdWaWRlbyAhPSBOT05FICYmIG1GbHVzaGluZ1ZpZGVvICE9IEZMVVNIRUQKKyAgICAgICAgICAgICYmIG1GbHVzaGluZ1ZpZGVvICE9IFNIVVRfRE9XTikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgQUxPR1YoImJvdGggYXVkaW8gYW5kIHZpZGVvIGFyZSBmbHVzaGVkIG5vdy4iKTsKIAorICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworCiAgICAgaWYgKG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcpIHsKICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxUaW1lRGlzY29udGludWl0eSgpOwogICAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nID0gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgJiYgbUZsdXNoaW5nQXVkaW8gPT0gRkxVU0hFRCkgewogICAgICAgICBtQXVkaW9EZWNvZGVyLT5zaWduYWxSZXN1bWUoKTsKICAgICB9CiAKLSAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCAmJiBtRmx1c2hpbmdWaWRlbyA9PSBGTFVTSEVEKSB7CiAgICAgICAgIG1WaWRlb0RlY29kZXItPnNpZ25hbFJlc3VtZSgpOwogICAgIH0KIAogICAgIG1GbHVzaGluZ0F1ZGlvID0gTk9ORTsKICAgICBtRmx1c2hpbmdWaWRlbyA9IE5PTkU7CiAKKyAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKKwogICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIH0KIApAQCAtOTA3LDYgKzExMTAsMzggQEAKICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gdHJ1ZTsKIH0KIAordm9pZCBOdVBsYXllcjo6b3BlbkF1ZGlvU2luayhjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgYm9vbCBvZmZsb2FkT25seSkgeworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBib29sIGhhc1ZpZGVvID0gKG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7CisgICAgLy8gRklYTUU6IHdlIHNob3VsZCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHZpZGVvIGRlY29kZXIKKyAgICAvLyBpcyBjcmVhdGVkIGFmdGVyIHdlIHJlY2VpdmUgdGhlIGZvcm1hdCBjaGFuZ2UgaW5kaWNhdGlvbi4KKyAgICAvLyBDdXJyZW50IGNvZGUgd2lsbCBqdXN0IG1ha2UgdGhhdCB3ZSBzZWxlY3QgZGVlcCBidWZmZXIKKyAgICAvLyB3aXRoIHZpZGVvIHdoaWNoIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGFzIGl0IHNob3VsZAorICAgIC8vIG5vdCBwcmV2ZW50IGZyb20ga2VlcGluZyBBL1Ygc3luYy4KKyAgICBpZiAoaGFzVmlkZW8gJiYKKyAgICAgICAgICAgIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSyAmJgorICAgICAgICAgICAgZHVyYXRpb25VcworICAgICAgICAgICAgICAgID4gQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMpIHsKKyAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgfQorCisgICAgbU9mZmxvYWRBdWRpbyA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGZvcm1hdCwgb2ZmbG9hZE9ubHksIGhhc1ZpZGVvLCBmbGFncyk7CisKKyAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0KKyAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICBzZW5kTWV0YURhdGFUb0hhbChtQXVkaW9TaW5rLCBhdWRpb01ldGEpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6Y2xvc2VBdWRpb1NpbmsoKSB7CisgICAgbVJlbmRlcmVyLT5jbG9zZUF1ZGlvU2luaygpOworfQorCiBzdGF0dXNfdCBOdVBsYXllcjo6aW5zdGFudGlhdGVEZWNvZGVyKGJvb2wgYXVkaW8sIHNwPERlY29kZXI+ICpkZWNvZGVyKSB7CiAgICAgaWYgKCpkZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtOTIyLDE4ICsxMTU3LDU3IEBACiAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKICAgICAgICAgbVZpZGVvSXNBVkMgPSAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUuY19zdHIoKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGNjTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSwgaWQoKSk7CisgICAgICAgIG1DQ0RlY29kZXIgPSBuZXcgQ0NEZWNvZGVyKGNjTm90aWZ5KTsKKworICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2VjdXJlIiwgdHJ1ZSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0KLSAgICAgICAgbmV3IEFNZXNzYWdlKGF1ZGlvID8ga1doYXRBdWRpb05vdGlmeSA6IGtXaGF0VmlkZW9Ob3RpZnksCi0gICAgICAgICAgICAgICAgICAgICBpZCgpKTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKTsKIAotICAgICpkZWNvZGVyID0gYXVkaW8gPyBuZXcgRGVjb2Rlcihub3RpZnkpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlY29kZXIobm90aWZ5LCBtTmF0aXZlV2luZG93KTsKLSAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKCpkZWNvZGVyKTsKKyAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFZpZGVvTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKIAorICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbU5hdGl2ZVdpbmRvdyk7CisgICAgfQorICAgICgqZGVjb2RlciktPmluaXQoKTsKICAgICAoKmRlY29kZXIpLT5jb25maWd1cmUoZm9ybWF0KTsKIAorICAgIC8vIGFsbG9jYXRlIGJ1ZmZlcnMgdG8gZGVjcnlwdCB3aWRldmluZSBzb3VyY2UgYnVmZmVycworICAgIGlmICghYXVkaW8gJiYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpKSB7CisgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IGlucHV0QnVmczsKKyAgICAgICAgQ0hFQ0tfRVEoKCpkZWNvZGVyKS0+Z2V0SW5wdXRCdWZmZXJzKCZpbnB1dEJ1ZnMpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtZWRpYUJ1ZnM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRCdWZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gaW5wdXRCdWZzW2ldOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1lZGlhQnVmcy5wdXNoKG1idWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVycyhhdWRpbywgbWVkaWFCdWZzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYUJ1ZnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUJ1ZnNbaV0tPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lZGlhQnVmcy5jbGVhcigpOworICAgICAgICAgICAgQUxPR0UoIlNlY3VyZSBzb3VyY2UgZGlkbid0IHN1cHBvcnQgc2VjdXJlIG1lZGlhQnVmcy4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC05NDEsOCArMTIxNSw5IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OwogICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CiAKLSAgICBpZiAoKGF1ZGlvICYmIElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdBdWRpbykpCi0gICAgICAgICAgICB8fCAoIWF1ZGlvICYmIElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdWaWRlbykpKSB7CisgICAgaWYgKChhdWRpbyAmJiBtRmx1c2hpbmdBdWRpbyAhPSBOT05FKQorICAgICAgICAgICAgfHwgKCFhdWRpbyAmJiBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKQorICAgICAgICAgICAgfHwgbVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgSU5GT19ESVNDT05USU5VSVRZKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtOTUwLDE0ICsxMjI1LDM3IEBACiAKICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwogCisgICAgLy8gQWdncmVnYXRlIHNtYWxsZXIgYnVmZmVycyBpbnRvIGEgbGFyZ2VyIGJ1ZmZlci4KKyAgICAvLyBUaGUgZ29hbCBpcyB0byByZWR1Y2UgcG93ZXIgY29uc3VtcHRpb24uCisgICAgLy8gTm90ZSB0aGlzIHdpbGwgbm90IHdvcmsgaWYgdGhlIGRlY29kZXIgcmVxdWlyZXMgb25lIGZyYW1lIHBlciBidWZmZXIuCisgICAgYm9vbCBkb0J1ZmZlckFnZ3JlZ2F0aW9uID0gKGF1ZGlvICYmIG1PZmZsb2FkQXVkaW8pOworICAgIGJvb2wgbmVlZE1vcmVEYXRhID0gZmFsc2U7CisKICAgICBib29sIGRyb3BBY2Nlc3NVbml0OwogICAgIGRvIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYXVkaW8sICZhY2Nlc3NVbml0KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAvLyBEaWQgd2Ugc2F2ZSBhbiBhY2Nlc3NVbml0IGVhcmxpZXIgYmVjYXVzZSBvZiBhIGRpc2NvbnRpbnVpdHk/CisgICAgICAgIGlmIChhdWRpbyAmJiAobVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQgPSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKKyAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgICAgICAgICBlcnIgPSBtUGVuZGluZ0F1ZGlvRXJyOworICAgICAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgdXNlIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhdWRpbywgJmFjY2Vzc1VuaXQpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAgICAgICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBzb21lIGRhdGEgc28gc2F2ZSB0aGlzIGZvciBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IGVycjsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgPSBhY2Nlc3NVbml0OworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHNhdmUgZGlzY29udGludWl0eSBmb3IgbGF0ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKICAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSk7CiAKQEAgLTEwMDIsMzQgKzEzMDAsNDQgQEAKICAgICAgICAgICAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nID0KICAgICAgICAgICAgICAgICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyB8fCB0aW1lQ2hhbmdlOwogCi0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSB8fCB0aW1lQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FICYmIG1GbHVzaGluZ1ZpZGVvID09IE5PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuZCB3ZSdsbCByZXN1bWUgc2Nhbm5pbmcgc291cmNlcyBvbmNlIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2Zyb250KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY29kZXIoYXVkaW8pLT5zdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2Ugc2VwYXJhdGVseQorICAgICAgICAgICAgICAgICAgICBmb3JtYXRDaGFuZ2UgPSAhc2VhbWxlc3NGb3JtYXRDaGFuZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgc2h1dGRvd25PckZsdXNoID0gZm9ybWF0Q2hhbmdlIHx8IHRpbWVDaGFuZ2U7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPERlY29kZXI+ICZkZWNvZGVyID0gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAmJiAhZGVjb2Rlci0+c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShuZXdGb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gcXVldWUgdXAgc2Nhbi1zb3VyY2VzIG9ubHkgb25jZSBwZXIgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAvLyBXZSBjb250cm9sIHRoaXMgYnkgZG9pbmcgaXQgb25seSBpZiBuZWl0aGVyIGF1ZGlvIG5vciB2aWRlbyBhcmUKKyAgICAgICAgICAgICAgICAvLyBmbHVzaGluZyBvciBzaHV0dGluZyBkb3duLiAgKEFmdGVyIGhhbmRsaW5nIDFzdCBkaXNjb250aW51aXR5LCBvbmUKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZmx1c2hpbmcgc3RhdGVzIHdpbGwgbm90IGJlIE5PTkUuKQorICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2NhbiBzb3VyY2VzIGlmIHRoaXMgZGlzY29udGludWl0eSBkb2VzIG5vdCByZXN1bHQKKyAgICAgICAgICAgICAgICAvLyBpbiBhIGZsdXNoIG9yIHNodXRkb3duLCBhcyB0aGUgZmx1c2hpbmcgc3RhdGUgd2lsbCBzdGF5IE5PTkUuCisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gPT0gTk9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd25PckZsdXNoKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuZCB3ZSdsbCByZXN1bWUgc2Nhbm5pbmcgc291cmNlcyBvbmNlIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgLy8gZmx1c2hpbmcuCisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9mcm9udCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgLyogbm90IHNlYW1sZXNzICovKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgY2hhbmdlIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hEZWNvZGVyKGF1ZGlvLCAvKiBuZWVkU2h1dGRvd24gPSAqLyB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBmbHVzaAorICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIGZhbHNlLCBuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlYW1sZXNzRm9ybWF0Q2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldXNlIGV4aXN0aW5nIGRlY29kZXIgYW5kIGRvbid0IGZsdXNoCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2goYXVkaW8sIG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RyZWFtIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGRpc2NvbnRpbnVpdHkKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gRkxVU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTA0NSwxMyArMTM1Myw1OCBAQAogCiAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gZmFsc2U7CiAgICAgICAgIGlmICghYXVkaW8KLSAgICAgICAgICAgICAgICAmJiBtVmlkZW9MYXRlQnlVcyA+IDEwMDAwMGxsCisgICAgICAgICAgICAgICAgJiYgIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKQorICAgICAgICAgICAgICAgICYmIG1SZW5kZXJlci0+Z2V0VmlkZW9MYXRlQnlVcygpID4gMTAwMDAwbGwKICAgICAgICAgICAgICAgICAmJiBtVmlkZW9Jc0FWQwogICAgICAgICAgICAgICAgICYmICFJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpKSB7CiAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7CiAgICAgICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOwogICAgICAgICB9Ci0gICAgfSB3aGlsZSAoZHJvcEFjY2Vzc1VuaXQpOworCisgICAgICAgIHNpemVfdCBzbWFsbFNpemUgPSBhY2Nlc3NVbml0LT5zaXplKCk7CisgICAgICAgIG5lZWRNb3JlRGF0YSA9IGZhbHNlOworICAgICAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIERvbid0IGJvdGhlciBpZiBvbmx5IHJvb20gZm9yIGEgZmV3IHNtYWxsIGJ1ZmZlcnMuCisgICAgICAgICAgICAgICAgJiYgKHNtYWxsU2l6ZSA8IChrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzIC8gMykpKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBsYXJnZXIgYnVmZmVyIGZvciBjb21iaW5pbmcgc21hbGxlciBidWZmZXJzIGZyb20gdGhlIGV4dHJhY3Rvci4KKyAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIgPSBuZXcgQUJ1ZmZlcihrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzKTsKKyAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIDApOyAvLyBzdGFydCBlbXB0eQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaW50NjRfdCBkdW1teTsKKyAgICAgICAgICAgIGJvb2wgc21hbGxUaW1lc3RhbXBWYWxpZCA9IGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKTsKKyAgICAgICAgICAgIGJvb2wgYmlnVGltZXN0YW1wVmFsaWQgPSBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmR1bW15KTsKKyAgICAgICAgICAgIC8vIFdpbGwgdGhlIHNtYWxsZXIgYnVmZmVyIGZpdD8KKyAgICAgICAgICAgIHNpemVfdCBiaWdTaXplID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHJvb21MZWZ0ID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+Y2FwYWNpdHkoKSAtIGJpZ1NpemU7CisgICAgICAgICAgICAvLyBTaG91bGQgd2Ugc2F2ZSB0aGlzIHNtYWxsIGJ1ZmZlciBmb3IgdGhlIG5leHQgYmlnIGJ1ZmZlcj8KKyAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBzbWFsbCBidWZmZXIgZGlkIG5vdCBoYXZlIGEgdGltZXN0YW1wIHRoZW4gc2F2ZQorICAgICAgICAgICAgLy8gYW55IGJ1ZmZlciB0aGF0IGRvZXMgaGF2ZSBhIHRpbWVzdGFtcCB1bnRpbCB0aGUgbmV4dCBiaWcgYnVmZmVyLgorICAgICAgICAgICAgaWYgKChzbWFsbFNpemUgPiByb29tTGVmdCkKKyAgICAgICAgICAgICAgICB8fCAoIWJpZ1RpbWVzdGFtcFZhbGlkICYmIChiaWdTaXplID4gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvRXJyID0gZXJyOworICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LmNsZWFyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdyYWIgdGltZSBmcm9tIGZpcnN0IHNtYWxsIGJ1ZmZlciBpZiBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgaWYgKChiaWdTaXplID09IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHNtYWxsIGJ1ZmZlciB0byB0aGUgYmlnZ2VyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICBtZW1jcHkobUFnZ3JlZ2F0ZUJ1ZmZlci0+YmFzZSgpICsgYmlnU2l6ZSwgYWNjZXNzVW5pdC0+ZGF0YSgpLCBzbWFsbFNpemUpOworICAgICAgICAgICAgICAgIGJpZ1NpemUgKz0gc21hbGxTaXplOworICAgICAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIGJpZ1NpemUpOworCisgICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIHJ1biBvdXQgb2Ygcm9vbSBpbiB0aGUgbUFnZ3JlZ2F0ZUJ1ZmZlci4KKyAgICAgICAgICAgICAgICBuZWVkTW9yZURhdGEgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgc21hbGxTaXplID0gJXp1LCBiaWdTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbFNpemUsIGJpZ1NpemUsIG1BZ2dyZWdhdGVCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoZHJvcEFjY2Vzc1VuaXQgfHwgbmVlZE1vcmVEYXRhKTsKIAogICAgIC8vIEFMT0dWKCJyZXR1cm5lZCBhIHZhbGlkIGJ1ZmZlciBvZiAlcyBkYXRhIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKQEAgLTEwNjMsNyArMTQxNiwxOSBAQAogICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOwogI2VuZGlmCiAKLSAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBhY2Nlc3NVbml0KTsKKyAgICBpZiAoIWF1ZGlvKSB7CisgICAgICAgIG1DQ0RlY29kZXItPmRlY29kZShhY2Nlc3NVbml0KTsKKyAgICB9CisKKyAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSByZXBseSB3aXRoIGFnZ3JlZ2F0ZWQgYnVmZmVyLCAlenUiLAorICAgICAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNpemUoKSk7CisgICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1BZ2dyZWdhdGVCdWZmZXIpOworICAgICAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7CisgICAgfQorCiAgICAgcmVwbHktPnBvc3QoKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTEwNzUsNyArMTQ0MCw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OwogICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CiAKLSAgICBpZiAoSXNGbHVzaGluZ1N0YXRlKGF1ZGlvID8gbUZsdXNoaW5nQXVkaW8gOiBtRmx1c2hpbmdWaWRlbykpIHsKKyAgICBpZiAoKGF1ZGlvICYmIG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUpCisgICAgICAgICAgICB8fCAoIWF1ZGlvICYmIG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpKSB7CiAgICAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoZSBkZWNvZGVyLCBpbiBvcmRlcgogICAgICAgICAvLyB0byBjb21wbGV0ZSB0aGlzLCB0aGUgZGVjb2RlciB3YW50cyBhbGwgaXRzIGJ1ZmZlcnMgYmFjaywKICAgICAgICAgLy8gc28gd2UgZG9uJ3Qgd2FudCBhbnkgb3V0cHV0IGJ1ZmZlcnMgaXQgc2VudCB1cyAoZnJvbSBiZWZvcmUKQEAgLTEwOTEsMTQgKzE0NTcsMTUgQEAKICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CiAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworCiAgICAgaW50NjRfdCAmc2tpcFVudGlsTWVkaWFUaW1lVXMgPQogICAgICAgICBhdWRpbwogICAgICAgICAgICAgPyBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVcwogICAgICAgICAgICAgOiBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVczsKIAogICAgIGlmIChza2lwVW50aWxNZWRpYVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwogCiAgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IHNraXBVbnRpbE1lZGlhVGltZVVzKSB7CiAgICAgICAgICAgICBBTE9HVigiZHJvcHBpbmcgJXMgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKQEAgLTExMTIsOSArMTQ3OSw3OSBAQAogICAgICAgICBza2lwVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgIH0KIAorICAgIGlmICghYXVkaW8gJiYgbUNDRGVjb2Rlci0+aXNTZWxlY3RlZCgpKSB7CisgICAgICAgIG1DQ0RlY29kZXItPmRpc3BsYXkobWVkaWFUaW1lVXMpOworICAgIH0KKwogICAgIG1SZW5kZXJlci0+cXVldWVCdWZmZXIoYXVkaW8sIGJ1ZmZlciwgcmVwbHkpOwogfQogCit2b2lkIE51UGxheWVyOjp1cGRhdGVWaWRlb1NpemUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgaWYgKGlucHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIlVua25vd24gdmlkZW8gc2l6ZSwgcmVwb3J0aW5nIDB4MCEiKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7CisKKyAgICAgICAgZGlzcGxheVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCisgICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKKyAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAorICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZkaXNwbGF5V2lkdGgpKTsKKyAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmRpc3BsYXlIZWlnaHQpKTsKKworICAgICAgICBBTE9HVigiVmlkZW8gaW5wdXQgZm9ybWF0ICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOworICAgIH0KKworICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgorICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKKyAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpKSB7CisgICAgICAgIEFMT0dWKCJTYW1wbGUgYXNwZWN0IHJhdGlvICVkIDogJWQiLCBzYXJXaWR0aCwgc2FySGVpZ2h0KTsKKworICAgICAgICBkaXNwbGF5V2lkdGggPSAoZGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OworCisgICAgICAgIEFMT0dWKCJkaXNwbGF5IGRpbWVuc2lvbnMgJWQgeCAlZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfQorCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKCFpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAocm90YXRpb25EZWdyZWVzID09IDkwIHx8IHJvdGF0aW9uRGVncmVlcyA9PSAyNzApIHsKKyAgICAgICAgaW50MzJfdCB0bXAgPSBkaXNwbGF5V2lkdGg7CisgICAgICAgIGRpc3BsYXlXaWR0aCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSB0bXA7CisgICAgfQorCisgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwKKyAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKKyAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOworfQorCiB2b2lkIE51UGxheWVyOjpub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKICAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTExMjksNjMgKzE1NjYsNzIgQEAKICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKG1zZywgZXh0MSwgZXh0MiwgaW4pOwogfQogCi12b2lkIE51UGxheWVyOjpmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pIHsKK3ZvaWQgTnVQbGF5ZXI6OmZsdXNoRGVjb2RlcigKKyAgICAgICAgYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbmV3Rm9ybWF0KSB7CiAgICAgQUxPR1YoIlslc10gZmx1c2hEZWNvZGVyIG5lZWRTaHV0ZG93bj0lZCIsCiAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgbmVlZFNodXRkb3duKTsKIAotICAgIGlmICgoYXVkaW8gJiYgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB8fCAoIWF1ZGlvICYmIG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKKyAgICBjb25zdCBzcDxEZWNvZGVyPiAmZGVjb2RlciA9IGdldERlY29kZXIoYXVkaW8pOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0koImZsdXNoRGVjb2RlciAlcyB3aXRob3V0IGRlY29kZXIgcHJlc2VudCIsCiAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgdG8gc2NhbiBzb3VyY2VzIHVudGlsIHdlIGZpbmlzaCBmbHVzaGluZy4KICAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CiAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOwogCi0gICAgKGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXIpLT5zaWduYWxGbHVzaCgpOworICAgIGRlY29kZXItPnNpZ25hbEZsdXNoKG5ld0Zvcm1hdCk7CiAgICAgbVJlbmRlcmVyLT5mbHVzaChhdWRpbyk7CiAKICAgICBGbHVzaFN0YXR1cyBuZXdTdGF0dXMgPQogICAgICAgICBuZWVkU2h1dGRvd24gPyBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOIDogRkxVU0hJTkdfREVDT0RFUjsKIAorICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVtmYWxzZSAvKiBpc0RlY29kZXIgKi9dID0gZmFsc2U7CisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW3RydWUgLyogaXNEZWNvZGVyICovXSA9IGZhbHNlOwogICAgIGlmIChhdWRpbykgewotICAgICAgICBDSEVDSyhtRmx1c2hpbmdBdWRpbyA9PSBOT05FCi0gICAgICAgICAgICAgICAgfHwgbUZsdXNoaW5nQXVkaW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWSk7Ci0KKyAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSwKKyAgICAgICAgICAgICAgICAiYXVkaW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nQXVkaW8pOwogICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IG5ld1N0YXR1czsKLQotICAgICAgICBpZiAobUZsdXNoaW5nVmlkZW8gPT0gTk9ORSkgewotICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSAobVZpZGVvRGVjb2RlciAhPSBOVUxMKQotICAgICAgICAgICAgICAgID8gQVdBSVRJTkdfRElTQ09OVElOVUlUWQotICAgICAgICAgICAgICAgIDogRkxVU0hFRDsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1GbHVzaGluZ1ZpZGVvID09IE5PTkUKLSAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdWaWRlbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZKTsKLQorICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdWaWRlbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJ2aWRlbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdWaWRlbyk7CiAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gbmV3U3RhdHVzOwogCi0gICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FKSB7Ci0gICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IChtQXVkaW9EZWNvZGVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgPyBBV0FJVElOR19ESVNDT05USU5VSVRZCi0gICAgICAgICAgICAgICAgOiBGTFVTSEVEOworICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQ0NEZWNvZGVyLT5mbHVzaCgpOwogICAgICAgICB9CiAgICAgfQogfQogCi1zcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OlNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGdldEZvcm1hdE1ldGEoYXVkaW8pOwordm9pZCBOdVBsYXllcjo6dXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaCgKKyAgICAgICAgYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBBTE9HVigiWyVzXSB1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAKLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGNvbnN0IHNwPERlY29kZXI+ICZkZWNvZGVyID0gZ2V0RGVjb2RlcihhdWRpbyk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgidXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaCAlcyB3aXRob3V0IGRlY29kZXIgcHJlc2VudCIsCisgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGRlY29kZXItPnNpZ25hbFVwZGF0ZUZvcm1hdChmb3JtYXQpOworfQogCi0gICAgaWYoY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwordm9pZCBOdVBsYXllcjo6cXVldWVEZWNvZGVyU2h1dGRvd24oCisgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBBTE9HSSgicXVldWVEZWNvZGVyU2h1dGRvd24gYXVkaW89JWQsIHZpZGVvPSVkIiwgYXVkaW8sIHZpZGVvKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgbmV3IFNodXRkb3duRGVjb2RlckFjdGlvbihhdWRpbywgdmlkZW8pKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOworCisgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFBvc3RNZXNzYWdlQWN0aW9uKHJlcGx5KSk7CisKKyAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSkgewpAQCAtMTIxMSw2ICsxNjU3LDE5IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgTnVQbGF5ZXI6OmdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CisgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIHR5cGUpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBOdVBsYXllcjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCBpZCgpKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKQEAgLTEyMTksOSArMTY3OCwzNSBAQAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CiAKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKKyAgICBzcDxSZW5kZXJlcj4gcmVuZGVyZXIgPSBtUmVuZGVyZXI7CisgICAgaWYgKHJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OmdldFN0YXRzKGludDY0X3QgKm51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICpudW1GcmFtZXNEcm9wcGVkKSB7CisgICAgKm51bUZyYW1lc1RvdGFsID0gbU51bUZyYW1lc1RvdGFsOworICAgICpudW1GcmFtZXNEcm9wcGVkID0gbU51bUZyYW1lc0Ryb3BwZWQ7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6Z2V0RmlsZU1ldGEoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OnNjaGVkdWxlUG9sbER1cmF0aW9uKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsRHVyYXRpb24sIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbik7CkBAIC0xMjM4LDE4ICsxNzIzLDYgQEAKICAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCBpLmUuIG9uZSBtb3JlIG1vcmUgZGVjb2RlcnMgYXJlIGN1cnJlbnRseQogICAgICAgICAvLyBmbHVzaGluZyBvciBzaHV0dGluZyBkb3duLgogCi0gICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gVGhlcmUncyBhbiBlZGdlIGNhc2Ugd2hlcmUgdGhlIHJlbmRlcmVyIG93bnMgYWxsIG91dHB1dAotICAgICAgICAgICAgLy8gYnVmZmVycyBhbmQgaXMgcGF1c2VkLCB0aGVyZWZvcmUgdGhlIGRlY29kZXIgd2lsbCBub3QgcmVhZAotICAgICAgICAgICAgLy8gbW9yZSBpbnB1dCBkYXRhIGFuZCB3aWxsIG5ldmVyIGVuY291bnRlciB0aGUgbWF0Y2hpbmcKLSAgICAgICAgICAgIC8vIGRpc2NvbnRpbnVpdHkuIFRvIGF2b2lkIHRoaXMsIHdlIHJlc3VtZSB0aGUgcmVuZGVyZXIuCi0KLSAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZCi0gICAgICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ1ZpZGVvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkpIHsKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUgfHwgbUZsdXNoaW5nVmlkZW8gIT0gTk9ORSkgewogICAgICAgICAgICAgLy8gV2UncmUgY3VycmVudGx5IGZsdXNoaW5nLCBwb3N0cG9uZSB0aGUgcmVzZXQgdW50aWwgdGhhdCdzCiAgICAgICAgICAgICAvLyBjb21wbGV0ZWQuCkBAIC0xMjY3LDE4ICsxNzQwLDI5IEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpIiwKK3ZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KSB7CisgICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSwgbmVlZE5vdGlmeSglZCkiLAogICAgICAgICAgIHNlZWtUaW1lVXMsCi0gICAgICAgICAgc2Vla1RpbWVVcyAvIDFFNik7CisgICAgICAgICAgc2Vla1RpbWVVcyAvIDFFNiwKKyAgICAgICAgICBuZWVkTm90aWZ5KTsKIAorICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVzZXQgb2NjdXJzIHJpZ2h0IGJlZm9yZSB0aGUgbG9vcCBtb2RlCisgICAgICAgIC8vIGFzeW5jaHJvbm91c2x5IHNlZWtzIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtLgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwsCisgICAgICAgICAgICAgICAgIm1Tb3VyY2UgaXMgTlVMTCBhbmQgZGVjb2RlcnMgbm90IE5VTEwgYXVkaW8oJXApIHZpZGVvKCVwKSIsCisgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5nZXQoKSwgbVZpZGVvRGVjb2Rlci5nZXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgbVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMpOworICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVBvc2l0aW9uKHNlZWtUaW1lVXMpOwotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoKTsKKyAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTMxMywxNCArMTc5Nyw2IEBACiAKICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nID0gdHJ1ZTsKIAotICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FICYmICghYXVkaW8gfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgfQotCi0gICAgaWYgKG1GbHVzaGluZ1ZpZGVvID09IE5PTkUgJiYgKCF2aWRlbyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gRkxVU0hFRDsKLSAgICB9Ci0KICAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIGZsdXNoRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCB0cnVlIC8qIG5lZWRTaHV0ZG93biAqLyk7CiAgICAgfQpAQCAtMTM0MSwxMyArMTgxNywxOSBAQAogICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CiAKKyAgICBpZiAobVJlbmRlcmVyTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlci0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1SZW5kZXJlckxvb3Blci5jbGVhcigpOworICAgIH0KICAgICBtUmVuZGVyZXIuY2xlYXIoKTsKKyAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKIAotICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIobVNvdXJjZS0+aWQoKSk7Ci0KICAgICAgICAgbVNvdXJjZS5jbGVhcigpOwogICAgIH0KIApAQCAtMTQwOCwxNiArMTg5MCwxNSBAQAogCiAgICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCisgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChlcnIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihkdXJhdGlvblVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDQ2LDExICsxOTI3LDE5IEBACiAKICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VmlkZW9TaXplQ2hhbmdlZDoKICAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU0VUX1ZJREVPX1NJWkUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdEJ1ZmZlcmluZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBwZXJjZW50YWdlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBlcmNlbnRhZ2UiLCAmcGVyY2VudGFnZSkpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0NzEsMjEgKzE5NjAsNDAgQEAKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcikpOwogCi0gICAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgZHVyYXRpb25VczsKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIDAgLyogYmFzZUluZGV4ICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRUZXh0RGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICYmIGdlbmVyYXRpb24gIT0gbVRpbWVkVGV4dEdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcG9zTXM7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgcG9zVXM7CisgICAgICAgICAgICBkcml2ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmcG9zTXMpOworICAgICAgICAgICAgcG9zVXMgPSBwb3NNcyAqIDEwMDA7CiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKIAotICAgICAgICAgICAgUGFyY2VsIGluOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQzMih0cmFja0luZGV4KTsKLSAgICAgICAgICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICAgICAgICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICAgICAgICAgIGlmIChwb3NVcyA8IHRpbWVVcykgeworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1UaW1lZFRleHRHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KHRpbWVVcyAtIHBvc1VzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZFRpbWVkVGV4dERhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1MDIsMTMgKzIwMTAsMTEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdERybU5vTGljZW5zZToKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIEVSUk9SX0RSTV9OT19MSUNFTlNFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogfQogCit2b2lkIE51UGxheWVyOjpvbkNsb3NlZENhcHRpb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHdoYXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgIGNhc2UgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6a1doYXRDbG9zZWRDYXB0aW9uRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9JTkZPLCBNRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisKK30KKwordm9pZCBOdVBsYXllcjo6c2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCkgeworICAgIGludDMyX3QgdHJhY2tJbmRleDsKKyAgICBpbnQ2NF90IHRpbWVVcywgZHVyYXRpb25VczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQzMih0cmFja0luZGV4ICsgYmFzZUluZGV4KTsKKyAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7CisgICAgaW4ud3JpdGVJbnQ2NChkdXJhdGlvblVzKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKK30KKwordm9pZCBOdVBsYXllcjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGludDY0X3QgdGltZVVzOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisgICAgQ0hFQ0soc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgPT0gMCk7CisKKyAgICBkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgICAgICBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwYXJjZWwpOworICAgIH0KKworICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsIDAsIDApOworICAgIH0KK30KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7CisKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisKKyAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1zZzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6bm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsYWdzQ2hhbmdlZCk7CkBAIC0xNTE2LDExICsyMTIzLDEwIEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlNvdXJjZTo6bm90aWZ5VmlkZW9TaXplQ2hhbmdlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewordm9pZCBOdVBsYXllcjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCkBAIC0xNTMxLDIzICsyMTM3LDggQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6U291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewordm9pZCBOdVBsYXllcjo6U291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKICAgICBUUkVTUEFTUygpOwogfQogCi12b2lkIE51UGxheWVyOjpxdWV1ZURlY29kZXJTaHV0ZG93bigKLSAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIEFMT0dJKCJxdWV1ZURlY29kZXJTaHV0ZG93biBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOwotCi0gICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICBuZXcgU2h1dGRvd25EZWNvZGVyQWN0aW9uKGF1ZGlvLCB2aWRlbykpOwotCi0gICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKLQotICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKaW5kZXggNTkwZTFmMi4uZDYxMjBkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKQEAgLTI0LDcgKzI0LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUNvZGVjOworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgTWV0YURhdGE7CiBzdHJ1Y3QgTnVQbGF5ZXJEcml2ZXI7CiAKQEAgLTM4LDcgKzM5LDkgQEAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCkBAIC01NiwxMiArNTksMjAgQEAKICAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVJlc2V0Q29tcGxldGUiIG9uY2UgZmluaXNoZWQuCiAgICAgdm9pZCByZXNldEFzeW5jKCk7CiAKLSAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVNlZWtDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KLSAgICB2b2lkIHNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcyk7CisgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlTZWVrQ29tcGxldGUiIG9uY2UgZmluaXNoZWQKKyAgICAvLyBhbmQgbmVlZE5vdGlmeSBpcyB0cnVlLgorICAgIHZvaWQgc2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkgPSBmYWxzZSk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICB2b2lkIGdldFN0YXRzKGludDY0X3QgKm1OdW1GcmFtZXNUb3RhbCwgaW50NjRfdCAqbU51bUZyYW1lc0Ryb3BwZWQpOworCisgICAgc3A8TWV0YURhdGE+IGdldEZpbGVNZXRhKCk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXM7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcigpOwpAQCAtNzQsNiArODUsOCBAQAogCiBwcml2YXRlOgogICAgIHN0cnVjdCBEZWNvZGVyOworICAgIHN0cnVjdCBEZWNvZGVyUGFzc1Rocm91Z2g7CisgICAgc3RydWN0IENDRGVjb2RlcjsKICAgICBzdHJ1Y3QgR2VuZXJpY1NvdXJjZTsKICAgICBzdHJ1Y3QgSFRUUExpdmVTb3VyY2U7CiAgICAgc3RydWN0IFJlbmRlcmVyOwpAQCAtOTYsNiArMTA5LDcgQEAKICAgICAgICAga1doYXRTY2FuU291cmNlcyAgICAgICAgICAgICAgICA9ICdzY2FuJywKICAgICAgICAga1doYXRWaWRlb05vdGlmeSAgICAgICAgICAgICAgICA9ICd2aWROJywKICAgICAgICAga1doYXRBdWRpb05vdGlmeSAgICAgICAgICAgICAgICA9ICdhdWROJywKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5ICAgICAgICA9ICdjYXBOJywKICAgICAgICAga1doYXRSZW5kZXJlck5vdGlmeSAgICAgICAgICAgICA9ICdyZW5OJywKICAgICAgICAga1doYXRSZXNldCAgICAgICAgICAgICAgICAgICAgICA9ICdyc2V0JywKICAgICAgICAga1doYXRTZWVrICAgICAgICAgICAgICAgICAgICAgICA9ICdzZWVrJywKQEAgLTEwNCw2ICsxMTgsNyBAQAogICAgICAgICBrV2hhdFBvbGxEdXJhdGlvbiAgICAgICAgICAgICAgID0gJ3BvbEQnLAogICAgICAgICBrV2hhdFNvdXJjZU5vdGlmeSAgICAgICAgICAgICAgID0gJ3NyY04nLAogICAgICAgICBrV2hhdEdldFRyYWNrSW5mbyAgICAgICAgICAgICAgID0gJ2dUckknLAorICAgICAgICBrV2hhdEdldFNlbGVjdGVkVHJhY2sgICAgICAgICAgID0gJ2dTZWwnLAogICAgICAgICBrV2hhdFNlbGVjdFRyYWNrICAgICAgICAgICAgICAgID0gJ3NlbFQnLAogICAgIH07CiAKQEAgLTExNiw5ICsxMzEsMTQgQEAKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICBzcDxEZWNvZGVyPiBtVmlkZW9EZWNvZGVyOwogICAgIGJvb2wgbVZpZGVvSXNBVkM7Ci0gICAgYm9vbCBtTmVlZHNTd1JlbmRlcmVyOworICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKICAgICBzcDxEZWNvZGVyPiBtQXVkaW9EZWNvZGVyOworICAgIHNwPENDRGVjb2Rlcj4gbUNDRGVjb2RlcjsKICAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOworICAgIHNwPEFMb29wZXI+IG1SZW5kZXJlckxvb3BlcjsKKyAgICBpbnQzMl90IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOwogCiAgICAgTGlzdDxzcDxBY3Rpb24+ID4gbURlZmVycmVkQWN0aW9uczsKIApAQCAtMTI5LDEwICsxNDksMTAgQEAKICAgICBpbnQzMl90IG1TY2FuU291cmNlc0dlbmVyYXRpb247CiAKICAgICBpbnQzMl90IG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uOworICAgIGludDMyX3QgbVRpbWVkVGV4dEdlbmVyYXRpb247CiAKICAgICBlbnVtIEZsdXNoU3RhdHVzIHsKICAgICAgICAgTk9ORSwKLSAgICAgICAgQVdBSVRJTkdfRElTQ09OVElOVUlUWSwKICAgICAgICAgRkxVU0hJTkdfREVDT0RFUiwKICAgICAgICAgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTiwKICAgICAgICAgU0hVVFRJTkdfRE9XTl9ERUNPREVSLApAQCAtMTQ0LDMxICsxNjQsNjAgQEAKICAgICAvLyBub3Rpb24gb2YgdGltZSBoYXMgY2hhbmdlZC4KICAgICBib29sIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmc7CiAKKyAgICAvLyBTdGF0dXMgb2YgZmx1c2ggcmVzcG9uc2VzIGZyb20gdGhlIGRlY29kZXIgYW5kIHJlbmRlcmVyLgorICAgIGJvb2wgbUZsdXNoQ29tcGxldGVbMl1bMl07CisKKyAgICAvLyBVc2VkIGJ5IGZlZWREZWNvZGVySW5wdXREYXRhIHRvIGFnZ3JlZ2F0ZSBzbWFsbCBidWZmZXJzIGludG8KKyAgICAvLyBvbmUgbGFyZ2UgYnVmZmVyLgorICAgIHNwPEFCdWZmZXI+IG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0OworICAgIHN0YXR1c190ICAgIG1QZW5kaW5nQXVkaW9FcnI7CisgICAgc3A8QUJ1ZmZlcj4gbUFnZ3JlZ2F0ZUJ1ZmZlcjsKKwogICAgIEZsdXNoU3RhdHVzIG1GbHVzaGluZ0F1ZGlvOwogICAgIEZsdXNoU3RhdHVzIG1GbHVzaGluZ1ZpZGVvOwogCiAgICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ0F1ZGlvVW50aWxNZWRpYVRpbWVVczsKICAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzOwogCi0gICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbCwgbU51bUZyYW1lc0Ryb3BwZWQ7CiAKICAgICBpbnQzMl90IG1WaWRlb1NjYWxpbmdNb2RlOwogCiAgICAgYm9vbCBtU3RhcnRlZDsKIAorICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CisgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOworICAgIH0KKworICAgIGlubGluZSB2b2lkIGNsZWFyRmx1c2hDb21wbGV0ZSgpIHsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMF1bMV0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMF0gPSBmYWxzZTsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMV1bMV0gPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIG9wZW5BdWRpb1NpbmsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgb2ZmbG9hZE9ubHkpOworICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKwogICAgIHN0YXR1c190IGluc3RhbnRpYXRlRGVjb2Rlcihib29sIGF1ZGlvLCBzcDxEZWNvZGVyPiAqZGVjb2Rlcik7CiAKKyAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCA9IE5VTEwpOworCiAgICAgc3RhdHVzX3QgZmVlZERlY29kZXJJbnB1dERhdGEoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgcmVuZGVyQnVmZmVyKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CiAKKyAgICB2b2lkIGhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpOwogICAgIHZvaWQgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAKLSAgICB2b2lkIGZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bik7CisgICAgYm9vbCBhdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpOwogCi0gICAgc3RhdGljIGJvb2wgSXNGbHVzaGluZ1N0YXRlKEZsdXNoU3RhdHVzIHN0YXRlLCBib29sICpuZWVkU2h1dGRvd24gPSBOVUxMKTsKKyAgICB2b2lkIGZsdXNoRGVjb2RlcigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5ld0Zvcm1hdCA9IE5VTEwpOworICAgIHZvaWQgdXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaChib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKICAgICB2b2lkIHBvc3RTY2FuU291cmNlcygpOwogCkBAIC0xNzcsNyArMjI2LDcgQEAKIAogICAgIHZvaWQgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogCi0gICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpOworICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpOwogICAgIHZvaWQgcGVyZm9ybURlY29kZXJGbHVzaCgpOwogICAgIHZvaWQgcGVyZm9ybURlY29kZXJTaHV0ZG93bihib29sIGF1ZGlvLCBib29sIHZpZGVvKTsKICAgICB2b2lkIHBlcmZvcm1SZXNldCgpOwpAQCAtMTg1LDEwICsyMzQsMTYgQEAKICAgICB2b2lkIHBlcmZvcm1TZXRTdXJmYWNlKGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZ3cmFwcGVyKTsKIAogICAgIHZvaWQgb25Tb3VyY2VOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25DbG9zZWRDYXB0aW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgcXVldWVEZWNvZGVyU2h1dGRvd24oCiAgICAgICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKIAorICAgIHZvaWQgc2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCk7CisgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgY29uc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDI0MjNmZDUuLjI3ZjYxMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0xNywxNCArMTcsMTkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXJEZWNvZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcwICszNyw2NTEgQEAKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZuYXRpdmVXaW5kb3cpCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdykgeworICAgICAgbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpLAorICAgICAgbUJ1ZmZlckdlbmVyYXRpb24oMCksCisgICAgICBtUGF1c2VkKHRydWUpLAorICAgICAgbUNvbXBvbmVudE5hbWUoImRlY29kZXIiKSB7CisgICAgLy8gRXZlcnkgZGVjb2RlciBoYXMgaXRzIG93biBsb29wZXIgYmVjYXVzZSBNZWRpYUNvZGVjIG9wZXJhdGlvbnMKKyAgICAvLyBhcmUgYmxvY2tpbmcsIGJ1dCBOdVBsYXllciBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KKyAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKworICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1Db2RlY0xvb3Blci0+c2V0TmFtZSgiTlBEZWNvZGVyLUNMIik7CisgICAgbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogfQogCiBOdVBsYXllcjo6RGVjb2Rlcjo6fkRlY29kZXIoKSB7CisgICAgbURlY29kZXJMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdG9wKCk7CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CitzdGF0aWMKK3N0YXR1c190IFBvc3RBbmRBd2FpdFJlc3BvbnNlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghKCpyZXNwb25zZSktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5jbGVhcigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgOyArK2kpIHsKKyAgICAgICAgQVN0cmluZyB0YWcgPSAiY3NkLSI7CisgICAgICAgIHRhZy5hcHBlbmQoaSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRCdWZmZXIodGFnLmNfc3RyKCksICZidWZmZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQucHVzaChidWZmZXIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBDSEVDSyhtQ29kZWMgPT0gTlVMTCk7CiAKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCiAgICAgQVN0cmluZyBtaW1lOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5TXNnID0KLSAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIGlkKCkpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBOVUxMOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgc3VyZmFjZSA9IG1OYXRpdmVXaW5kb3ctPmdldFN1cmZhY2VUZXh0dXJlQ2xpZW50KCk7CisgICAgfQogCi0gICAgbUNTREluZGV4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDs7ICsraSkgewotICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7Ci0gICAgICAgIGlmICghZm9ybWF0LT5maW5kQnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSVkIiwgaSkuY19zdHIoKSwgJmNzZCkpIHsKKyAgICBtQ29tcG9uZW50TmFtZSA9IG1pbWU7CisgICAgbUNvbXBvbmVudE5hbWUuYXBwZW5kKCIgZGVjb2RlciIpOworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChzdXJmYWNlPSVwKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHN1cmZhY2UuZ2V0KCkpOworCisgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1Db2RlY0xvb3BlciwgbWltZS5jX3N0cigpLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKKyAgICBpbnQzMl90IHNlY3VyZSA9IDA7CisgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJzZWN1cmUiLCAmc2VjdXJlKSAmJiBzZWN1cmUgIT0gMCkgeworICAgICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuYXBwZW5kKCIuc2VjdXJlIik7CisgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNyZWF0aW5nIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlICVzJXMgZGVjb2RlciIsCisgICAgICAgICAgICAgICAgKHNlY3VyZSA/ICJzZWN1cmUgIiA6ICIiKSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgd2lsbCByZWNvbm5lY3QKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKKyAgICAgICAgICAgICAgICBzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgIC8vIFdlIHRyZWF0IHRoaXMgYXMgYSB3YXJuaW5nLCBhcyB0aGlzIGlzIGEgcHJlcGFyYXRvcnkgc3RlcC4KKyAgICAgICAgLy8gQ29kZWMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgc3VyZmFjZSwgd2hpY2ggaXMgd2hlcmUKKyAgICAgICAgLy8gYW55IGVycm9yIHNpZ25hbGluZyB3aWxsIG9jY3VyLgorICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJmYWlsZWQgdG8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICB9CisgICAgZXJyID0gbUNvZGVjLT5jb25maWd1cmUoCisgICAgICAgICAgICBmb3JtYXQsIHN1cmZhY2UsIE5VTEwgLyogY3J5cHRvICovLCAwIC8qIGZsYWdzICovKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlICVzIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworCisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBpbiBjb25maWd1cmVkIHN0YXRlCisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmbU91dHB1dEZvcm1hdCkpOworICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmbUlucHV0Rm9ybWF0KSk7CisKKyAgICBlcnIgPSBtQ29kZWMtPnN0YXJ0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0ICVzIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGFmdGVyIHN0YXJ0CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldElucHV0QnVmZmVycygmbUlucHV0QnVmZmVycykpOworICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZtT3V0cHV0QnVmZmVycykpOworICAgIEFMT0dWKCJbJXNdIGdvdCAlenUgaW5wdXQgYW5kICV6dSBvdXRwdXQgYnVmZmVycyIsCisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbUlucHV0QnVmZmVycy5zaXplKCksCisgICAgICAgICAgICBtT3V0cHV0QnVmZmVycy5zaXplKCkpOworCisgICAgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgbVBhdXNlZCA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTWVkaWFCdWZmZXJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnNbaV0tPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgbU1lZGlhQnVmZmVycy5yZXNpemUobUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmNsZWFyKCk7CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5yZXNpemUobUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaSkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMuY2xlYXIoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCkgeworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgaWQoKSk7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgbUNvZGVjLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24ocmVwbHkpOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbiAhPSBtQnVmZmVyR2VuZXJhdGlvbjsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aW5pdCgpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbFVwZGF0ZUZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRVcGRhdGVGb3JtYXQsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkRlY29kZXI6OmdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRJbnB1dEJ1ZmZlcnMsIGlkKCkpOworICAgIG1zZy0+c2V0UG9pbnRlcigiYnVmZmVycyIsIGJ1ZmZlcnMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUVycm9yKGludDMyX3QgZXJyKQoreworICAgIC8vIFdlIGNhbm5vdCBpbW1lZGlhdGVseSByZWxlYXNlIHRoZSBjb2RlYyBkdWUgdG8gYnVmZmVycyBzdGlsbCBvdXRzdGFuZGluZworICAgIC8vIGluIHRoZSByZW5kZXJlci4gIFdlIHNpZ25hbCB0byB0aGUgcGxheWVyIHRoZSBlcnJvciBzbyBpdCBjYW4gc2h1dGRvd24vcmVsZWFzZSB0aGUKKyAgICAvLyBkZWNvZGVyIGFmdGVyIGZsdXNoaW5nIGFuZCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gdG8gZGlzY2FyZCB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuSW5wdXRCdWZmZXIoKSB7CisgICAgc2l6ZV90IGJ1ZmZlckl4ID0gLTE7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmJ1ZmZlckl4KTsKKyAgICBBTE9HVigiWyVzXSBkZXF1ZXVlZCBpbnB1dDogJWQiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzID09IE9LID8gKGludClidWZmZXJJeCA6IHJlcyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBpZiAocmVzICE9IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVxdWV1ZSBpbnB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisKKyAgICBpZiAobU1lZGlhQnVmZmVyc1tidWZmZXJJeF0gIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XS0+cmVsZWFzZSgpOworICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gTlVMTDsKKyAgICB9CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IHRydWU7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwgaWQoKSk7CisgICAgcmVwbHktPnNldFNpemUoImJ1ZmZlci1peCIsIGJ1ZmZlckl4KTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisKKyAgICBpZiAoIW1DU0RzVG9TdWJtaXQuaXNFbXB0eSgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1DU0RzVG9TdWJtaXQuaXRlbUF0KDApOworICAgICAgICBBTE9HSSgiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgICAgIG1DU0RzVG9TdWJtaXQucmVtb3ZlQXQoMCk7CisgICAgICAgIENIRUNLKG9uSW5wdXRCdWZmZXJGaWxsZWQocmVwbHkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd2hpbGUgKCFtUGVuZGluZ0lucHV0TWVzc2FnZXMuZW1wdHkoKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gKm1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpOworICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQotICAgICAgICBtQ1NELnB1c2goY3NkKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVyYXNlKG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpKTsKICAgICB9CiAKLSAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJuYXRpdmUtd2luZG93IiwgbU5hdGl2ZVdpbmRvdyk7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8vIEN1cnJlbnQgdmlkZW8gZGVjb2RlcnMgZG8gbm90IHJldHVybiBmcm9tIE9NWF9GaWxsVGhpc0J1ZmZlcgotICAgIC8vIHF1aWNrbHksIHZpb2xhdGluZyB0aGUgT3Blbk1BWCBzcGVjcywgdW50aWwgdGhhdCBpcyByZW1lZGllZAotICAgIC8vIHdlIG5lZWQgdG8gaW52ZXN0IGluIGFuIGV4dHJhIGxvb3BlciB0byBmcmVlIHRoZSBtYWluIGV2ZW50Ci0gICAgLy8gcXVldWUuCi0gICAgYm9vbCBuZWVkRGVkaWNhdGVkTG9vcGVyID0gIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIHJldHVybiB0cnVlOworfQogCi0gICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtQ29kZWMgPSBuZXcgQUNvZGVjOworYm9vbCBhbmRyb2lkOjpOdVBsYXllcjo6RGVjb2Rlcjo6b25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKKyAgICBDSEVDS19MVChidWZmZXJJeCwgbUlucHV0QnVmZmVycy5zaXplKCkpOworICAgIHNwPEFCdWZmZXI+IGNvZGVjQnVmZmVyID0gbUlucHV0QnVmZmVyc1tidWZmZXJJeF07CiAKLSAgICBpZiAobmVlZERlZGljYXRlZExvb3BlciAmJiBtQ29kZWNMb29wZXIgPT0gTlVMTCkgewotICAgICAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllckRlY29kZXIiKTsKLSAgICAgICAgbUNvZGVjTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBib29sIGhhc0J1ZmZlciA9IG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisKKyAgICAvLyBoYW5kbGUgd2lkZXZpbmUgY2xhc3NpYyBzb3VyY2UgLSB0aGF0IGZpbGxzIGFuIGFyYml0cmFyeSBpbnB1dCBidWZmZXIKKyAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBOVUxMOworICAgIGlmIChoYXNCdWZmZXIpIHsKKyAgICAgICAgbWVkaWFCdWZmZXIgPSAoTWVkaWFCdWZmZXIgKikoYnVmZmVyLT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7CisgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBsaWtlbHkgZmlsbGVkIGFub3RoZXIgYnVmZmVyIHRoYW4gd2UgcmVxdWVzdGVkOiBhZGp1c3QgYnVmZmVyIGluZGV4CisgICAgICAgICAgICBzaXplX3QgaXg7CisgICAgICAgICAgICBmb3IgKGl4ID0gMDsgaXggPCBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaXgrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWYgPSBtSW5wdXRCdWZmZXJzW2l4XTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmLT5kYXRhKCkgPT0gbWVkaWFCdWZmZXItPmRhdGEoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgaW5wdXQgYnVmZmVycyBhcmUgZGVxdWV1ZWQgb24gc3RhcnQsIGhlbmNlIHRoZSBjaGVjaworICAgICAgICAgICAgICAgICAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWRbaXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSByZWNlaXZlZCBNZWRpYUJ1ZmZlciBmb3IgIyV6dSBpbnN0ZWFkIG9mICMlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpeCwgYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRSSUNLWTogbmVlZCBidWZmZXIgZm9yIHRoZSBtZXRhZGF0YSwgc28gaW5zdGVhZCwgc2V0CisgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVjQnVmZmVyIHRvIHRoZSBzYW1lICh0aG91Z2ggaW5jb3JyZWN0KSBidWZmZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgYSBtZW1jcHkgaW50byB0aGUgY29kZWNCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXggPSBpeDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0soaXggPCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAobmVlZERlZGljYXRlZExvb3BlciA/IG1Db2RlY0xvb3BlciA6IGxvb3BlcigpKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db2RlYyk7CiAKLSAgICBtQ29kZWMtPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5TXNnKTsKLSAgICBtQ29kZWMtPmluaXRpYXRlU2V0dXAoZm9ybWF0KTsKKworICAgIGlmIChidWZmZXIgPT0gTlVMTCAvKiBpbmNsdWRlcyAhaGFzQnVmZmVyICovKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtRXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZzdHJlYW1FcnIpIHx8ICFoYXNCdWZmZXIpOworCisgICAgICAgIGlmIChzdHJlYW1FcnIgPT0gT0spIHsKKyAgICAgICAgICAgIC8qIGJ1ZmZlcnMgYXJlIHJldHVybmVkIHRvIGhvbGQgb24gdG8gKi8KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0ZW1wdCB0byBxdWV1ZSBFT1MKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUyk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1FcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgc3RyZWFtRXJyID0gZXJyOworICAgICAgICAgICAgLy8gZXJyIHdpbGwgbm90IGJlIEVSUk9SX0VORF9PRl9TVFJFQU0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgJXMgKGVycj0lZCksIEVPUyAlcyBxdWV1ZWQiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1FcnIsCisgICAgICAgICAgICAgICAgICAgIGVyciA9PSBPSyA/ICJzdWNjZXNzZnVsbHkiIDogInVuc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihzdHJlYW1FcnIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICBpbnQzMl90IGVvcywgY3NkOworICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CisgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3NkIiwgJmNzZCkgJiYgY3NkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgaW50byBjb2RlYyBidWZmZXIKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBjb2RlY0J1ZmZlcikgeworICAgICAgICAgICAgQ0hFQ0tfTEUoYnVmZmVyLT5zaXplKCksIGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWV1ZSBpbnB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIENIRUNLKG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdID09IE5VTEwpOworICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBtZWRpYUJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5PdXRwdXRCdWZmZXIoKSB7CisgICAgc2l6ZV90IGJ1ZmZlckl4ID0gLTE7CisgICAgc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmRlcXVldWVPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICAmYnVmZmVySXgsICZvZmZzZXQsICZzaXplLCAmdGltZVVzLCAmZmxhZ3MpOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlZCBvdXRwdXQ6ICVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlZCBvdXRwdXQ6ICVkICh0aW1lPSVsbGQgZmxhZ3M9JSIgUFJJdTMyICIpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAoaW50KWJ1ZmZlckl4LCB0aW1lVXMsIGZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAocmVzID09IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkgeworICAgICAgICByZXMgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJm1PdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlcnMgZm9yICVzIGFmdGVyIElORk8gZXZlbnQgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBOdVBsYXllciBpZ25vcmVzIHRoaXMKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZmb3JtYXQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBvdXRwdXQgZm9ybWF0IGZvciAlcyBhZnRlciBJTkZPIGV2ZW50IChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBpZiAocmVzICE9IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVxdWV1ZSBvdXRwdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19MVChidWZmZXJJeCwgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtT3V0cHV0QnVmZmVyc1tidWZmZXJJeF07CisgICAgYnVmZmVyLT5zZXRSYW5nZShvZmZzZXQsIHNpemUpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICB9CisgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBDT0RFQ0NPTkZJRyBvciBTWU5DRlJBTUUgZm9yIGRlY29kZXIKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlckJ1ZmZlciwgaWQoKSk7CisgICAgcmVwbHktPnNldFNpemUoImJ1ZmZlci1peCIsIGJ1ZmZlckl4KTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJhaW5UaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYWZ0ZXIgcmVuZGVyaW5nIGlzIGNvbXBsZXRlLAorICAgIC8vIGJ1dCBSZW5kZXJlciBuZWVkcyBpdCBub3cKKyAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgQUxPR1YoInF1ZXVlaW5nIGVvcyBbJXNdIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50MzJfdCByZW5kZXI7CisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVuZGVyIiwgJnJlbmRlcikgJiYgcmVuZGVyKSB7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnM7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpOworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoYnVmZmVySXgsIHRpbWVzdGFtcE5zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgpOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uRmx1c2goKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+Zmx1c2goKTsKKyAgICAgICAgbUNTRHNUb1N1Ym1pdCA9IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsgLy8gY29weSBvcGVyYXRvcgorICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCAlcyAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRGbHVzaENvbXBsZXRlZC4KKyAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byByZWxlYXNlIHRoZSBidWZmZXJzIGV2ZW4gaWYgZmx1c2ggZmFpbHMuCisgICAgfQorICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUGF1c2VkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25SZXN1bWUoKSB7CisgICAgbVBhdXNlZCA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblNodXRkb3duKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjID0gTlVMTDsKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIGRpc2Nvbm5lY3RlZCBmcm9tIGl0CisgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9CisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgQUxPR1dfSUYoZXJyb3IgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJbJXNdIGZhaWxlZCB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3csIGVycm9yPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIG1Db21wb25lbnROYW1lID0gImRlY29kZXIiOworICAgIH0KKworICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlbGVhc2UgJXMgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQuCisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUGF1c2VkID0gdHJ1ZTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgb25Db25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFVwZGF0ZUZvcm1hdDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldElucHV0QnVmZmVyczoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXJzIiwgKHZvaWQgKiopJmRzdEJ1ZmZlcnMpKTsKKworICAgICAgICAgICAgZHN0QnVmZmVycy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0QnVmZmVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGRzdEJ1ZmZlcnMtPnB1c2gobUlucHV0QnVmZmVyc1tpXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRDb2RlY05vdGlmeToKICAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgbnVtSW5wdXQsIG51bU91dHB1dDsKIAotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgb25GaWxsVGhpc0J1ZmZlcihtc2cpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgbXNnKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbnB1dC1idWZmZXJzIiwgJm51bUlucHV0KSkgeworICAgICAgICAgICAgICAgICAgICBudW1JbnB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJvdXRwdXQtYnVmZmVycyIsICZudW1PdXRwdXQpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bU91dHB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG51bUlucHV0LS0gPiAwICYmIGhhbmRsZUFuSW5wdXRCdWZmZXIoKSkge30KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobnVtT3V0cHV0LS0gPiAwICYmIGhhbmRsZUFuT3V0cHV0QnVmZmVyKCkpIHt9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhb25JbnB1dEJ1ZmZlckZpbGxlZChtc2cpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlbmRlckJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIG9uUmVuZGVyQnVmZmVyKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRNZXNzYWdlKCJuZXctZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbkZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25TaHV0ZG93bigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTA1LDQ3ICs2OTEsMjAgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uRmlsbFRoaXNCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBTWVzc2FnZT4gcmVwbHk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKLQotI2lmIDAKLSAgICBzcDxBQnVmZmVyPiBvdXRCdWZmZXI7Ci0gICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmb3V0QnVmZmVyKSk7Ci0jZWxzZQotICAgIHNwPEFCdWZmZXI+IG91dEJ1ZmZlcjsKLSNlbmRpZgotCi0gICAgaWYgKG1DU0RJbmRleCA8IG1DU0Quc2l6ZSgpKSB7Ci0gICAgICAgIG91dEJ1ZmZlciA9IG1DU0QuZWRpdEl0ZW1BdChtQ1NESW5kZXgrKyk7Ci0gICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0KLSAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgb3V0QnVmZmVyKTsKLSAgICAgICAgcmVwbHktPnBvc3QoKTsKLSAgICAgICAgcmV0dXJuOwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpOworICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBtc2ctPnNldE1lc3NhZ2UoIm5ldy1mb3JtYXQiLCBmb3JtYXQpOwogICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldE1lc3NhZ2UoImNvZGVjLXJlcXVlc3QiLCBtc2cpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxGbHVzaCgpIHsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwotICAgIH0KKyAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsUmVzdW1lKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgIH0KKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aW5pdGlhdGVTaHV0ZG93bigpIHsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5pbml0aWF0ZVNodXRkb3duKCk7Ci0gICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKIGJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgewpAQCAtMTYzLDE0ICs3MjIsMTYgQEAKICAgICAgICAgY29uc3QgY2hhciAqIGtleXNbXSA9IHsgImNoYW5uZWwtY291bnQiLCAic2FtcGxlLXJhdGUiLCAiaXMtYWR0cyIgfTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplb2Yoa2V5cykgLyBzaXplb2Yoa2V5c1swXSk7IGkrKykgewogICAgICAgICAgICAgaW50MzJfdCBvbGRWYWwsIG5ld1ZhbDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZvbGRWYWwpIHx8ICF0YXJnZXRGb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmbmV3VmFsKQotICAgICAgICAgICAgICAgICAgICB8fCBvbGRWYWwgIT0gbmV3VmFsKSB7CisgICAgICAgICAgICBpZiAoIW1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsICE9IG5ld1ZhbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHNwPEFCdWZmZXI+IG9sZEJ1ZiwgbmV3QnVmOwotICAgICAgICBpZiAobUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmb2xkQnVmKSAmJiB0YXJnZXRGb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm5ld0J1ZikpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm9sZEJ1ZikgJiYKKyAgICAgICAgICAgICAgICB0YXJnZXRGb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJm5ld0J1ZikpIHsKICAgICAgICAgICAgIGlmIChvbGRCdWYtPnNpemUoKSAhPSBuZXdCdWYtPnNpemUoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTE4MSw3ICs3NDIsNyBAQAogfQogCiBib29sIE51UGxheWVyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdCB7Ci0gICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTkwLDcgKzc1MSw3IEBACiAgICAgfQogCiAgICAgQVN0cmluZyBvbGRNaW1lLCBuZXdNaW1lOwotICAgIGlmICghbUZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvbGRNaW1lKQorICAgIGlmICghbU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvbGRNaW1lKQogICAgICAgICAgICAgfHwgIXRhcmdldEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZuZXdNaW1lKQogICAgICAgICAgICAgfHwgIShvbGRNaW1lID09IG5ld01pbWUpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIwMSwxMiArNzYyLDM0MyBAQAogICAgIGlmIChhdWRpbykgewogICAgICAgICBzZWFtbGVzcyA9IHN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZSh0YXJnZXRGb3JtYXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlYW1sZXNzID0gbUNvZGVjICE9IE5VTEwgJiYgbUNvZGVjLT5pc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrKCk7CisgICAgICAgIGludDMyX3QgaXNBZGFwdGl2ZTsKKyAgICAgICAgc2VhbWxlc3MgPSAobUNvZGVjICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCAmaXNBZGFwdGl2ZSkgJiYKKyAgICAgICAgICAgICAgICBpc0FkYXB0aXZlKTsKICAgICB9CiAKICAgICBBTE9HVigiJXMgc2VhbWxlc3Mgc3VwcG9ydCBmb3IgJXMiLCBzZWFtbGVzcyA/ICJ5ZXMiIDogIm5vIiwgb2xkTWltZS5jX3N0cigpKTsKICAgICByZXR1cm4gc2VhbWxlc3M7CiB9CiAKK3N0cnVjdCBDQ0RhdGEgeworICAgIENDRGF0YSh1aW50OF90IHR5cGUsIHVpbnQ4X3QgZGF0YTEsIHVpbnQ4X3QgZGF0YTIpCisgICAgICAgIDogbVR5cGUodHlwZSksIG1EYXRhMShkYXRhMSksIG1EYXRhMihkYXRhMikgeworICAgIH0KKyAgICBib29sIGdldENoYW5uZWwoc2l6ZV90ICpjaGFubmVsKSBjb25zdCB7CisgICAgICAgIGlmIChtRGF0YTEgPj0gMHgxMCAmJiBtRGF0YTEgPD0gMHgxZikgeworICAgICAgICAgICAgKmNoYW5uZWwgPSAobURhdGExID49IDB4MTggPyAxIDogMCkgKyAobVR5cGUgPyAyIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBtVHlwZTsKKyAgICB1aW50OF90IG1EYXRhMTsKKyAgICB1aW50OF90IG1EYXRhMjsKK307CisKK3N0YXRpYyBib29sIGlzTnVsbFBhZChDQ0RhdGEgKmNjKSB7CisgICAgcmV0dXJuIGNjLT5tRGF0YTEgPCAweDEwICYmIGNjLT5tRGF0YTIgPCAweDEwOworfQorCitzdGF0aWMgdm9pZCBkdW1wQnl0ZVBhaXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNjQnVmKSB7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgQVN0cmluZyBvdXQ7CisKKyAgICB3aGlsZSAob2Zmc2V0IDwgY2NCdWYtPnNpemUoKSkgeworICAgICAgICBjaGFyIHRtcFsxMjhdOworCisgICAgICAgIENDRGF0YSAqY2MgPSAoQ0NEYXRhICopIChjY0J1Zi0+ZGF0YSgpICsgb2Zmc2V0KTsKKworICAgICAgICBpZiAoaXNOdWxsUGFkKGNjKSkgeworICAgICAgICAgICAgLy8gMSBudWxsIHBhZCBvciBYRFMgbWV0YWRhdGEsIGlnbm9yZQorICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihDQ0RhdGEpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2MtPm1EYXRhMSA+PSAweDIwICYmIGNjLT5tRGF0YTEgPD0gMHg3ZikgeworICAgICAgICAgICAgLy8gMiBiYXNpYyBjaGFycworICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdQmFzaWM6ICVjICVjIiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDMwICYmIGNjLT5tRGF0YTIgPD0gMHgzZikgeworICAgICAgICAgICAgLy8gMSBzcGVjaWFsIGNoYXIKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXVNwZWNpYWw6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMiB8fCBjYy0+bURhdGExID09IDB4MUEpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBTcGFuaXNoL0ZyZW5jaCBjaGFyCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1TcGFuaXNoOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTMgfHwgY2MtPm1EYXRhMSA9PSAweDFCKQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDNmKXsKKyAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUdlcm1hbjogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZil7CisgICAgICAgICAgICAvLyBNaWQtUm93IENvZGVzIChUYWJsZSA2OSkKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXU1pZC1yb3c6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKChjYy0+bURhdGExID09IDB4MTQgfHwgY2MtPm1EYXRhMSA9PSAweDFjKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZikKKyAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgKChjYy0+bURhdGExID09IDB4MTcgfHwgY2MtPm1EYXRhMSA9PSAweDFmKQorICAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIxICYmIGNjLT5tRGF0YTIgPD0gMHgyMykpeworICAgICAgICAgICAgLy8gTWlzYyBDb250cm9sIENvZGVzIChUYWJsZSA3MCkKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUN0cmw6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgJiAweDcwKSA9PSAweDEwCisgICAgICAgICAgICAgICAgJiYgKGNjLT5tRGF0YTIgJiAweDQwKSA9PSAweDQwCisgICAgICAgICAgICAgICAgJiYgKChjYy0+bURhdGExICYgMHgwNykgfHwgIShjYy0+bURhdGEyICYgMHgyMCkpICkgeworICAgICAgICAgICAgLy8gUHJlYW1ibGUgQWRkcmVzcyBDb2RlcyAoVGFibGUgNzEpCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1QQUM6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBvdXQuYXBwZW5kKCIsICIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmFwcGVuZCh0bXApOworCisgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICB9CisKKyAgICBBTE9HSSgiJXMiLCBvdXQuY19zdHIoKSk7Cit9CisKK051UGxheWVyOjpDQ0RlY29kZXI6OkNDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IG1Ob3RpZnkobm90aWZ5KSwKKyAgICAgIG1DdXJyZW50Q2hhbm5lbCgwKSwKKyAgICAgIG1TZWxlY3RlZFRyYWNrKC0xKSB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihtVHJhY2tJbmRpY2VzKS9zaXplb2YobVRyYWNrSW5kaWNlc1swXSk7ICsraSkgeworICAgICAgICAgIG1UcmFja0luZGljZXNbaV0gPSAtMTsKKyAgICAgIH0KK30KKworc2l6ZV90IE51UGxheWVyOjpDQ0RlY29kZXI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Gb3VuZENoYW5uZWxzLnNpemUoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpDQ0RlY29kZXI6OmdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoIWlzVHJhY2tWYWxpZChpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworCisgICAgZm9ybWF0LT5zZXRJbnQzMigidHlwZSIsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsICJ1bmQiKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwOCk7CisgICAgLy9DQzEsIGZpZWxkIDAgY2hhbm5lbCAwCisgICAgYm9vbCBpc0RlZmF1bHRBdXRvID0gKG1Gb3VuZENoYW5uZWxzW2luZGV4XSA9PSAwKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgaXNEZWZhdWx0QXV0byk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsIGlzRGVmYXVsdEF1dG8pOworICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsIDApOworCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6c2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCkgeworICAgIGlmICghaXNUcmFja1ZhbGlkKGluZGV4KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzZWxlY3QpIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IChzc2l6ZV90KWluZGV4KSB7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGFscmVhZHkgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJzZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gaW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IChzc2l6ZV90KWluZGV4KSB7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGlzIG5vdCBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInVuc2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOworICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IC0xOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgeworICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpIGdldFRyYWNrQ291bnQoKTsKK30KKworYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjppc1RyYWNrVmFsaWQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGluZGV4IDwgZ2V0VHJhY2tDb3VudCgpOworfQorCitpbnQzMl90IE51UGxheWVyOjpDQ0RlY29kZXI6OmdldFRyYWNrSW5kZXgoc2l6ZV90IGNoYW5uZWwpIGNvbnN0IHsKKyAgICBpZiAoY2hhbm5lbCA8IHNpemVvZihtVHJhY2tJbmRpY2VzKS9zaXplb2YobVRyYWNrSW5kaWNlc1swXSkpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFja0luZGljZXNbY2hhbm5lbF07CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmV4dHJhY3RGcm9tU0VJKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIHNwPEFCdWZmZXI+IHNlaTsKKyAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigic2VpIiwgJnNlaSkgfHwgc2VpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOworCisgICAgTkFMQml0UmVhZGVyIGJyKHNlaS0+ZGF0YSgpICsgMSwgc2VpLT5zaXplKCkgLSAxKTsKKyAgICAvLyBzZWlfbWVzc2FnZSgpCisgICAgd2hpbGUgKGJyLmF0TGVhc3ROdW1CaXRzTGVmdCgxNikpIHsgLy8gYXQgbGVhc3QgMTYtYml0IGZvciBzZWlfbWVzc2FnZSgpCisgICAgICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZSA9IDA7CisgICAgICAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworICAgICAgICB1aW50OF90IGxhc3RfYnl0ZTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0X2J5dGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgcGF5bG9hZF90eXBlICs9IGxhc3RfYnl0ZTsKKyAgICAgICAgfSB3aGlsZSAobGFzdF9ieXRlID09IDB4RkYpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3NpemUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgLy8gc2VpX3BheWxvYWQoKQorICAgICAgICBpZiAocGF5bG9hZF90eXBlID09IDQpIHsKKyAgICAgICAgICAgIC8vIHVzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNSgpCisKKyAgICAgICAgICAgIC8vIEFUU0MgQS83MjogNi40LjIKKyAgICAgICAgICAgIHVpbnQ4X3QgaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICB1aW50MTZfdCBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9IGJyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZGVudGlmaWVyID0gYnIuZ2V0Qml0cygzMik7CisgICAgICAgICAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlX2NvZGUgPSBici5nZXRCaXRzKDgpOworCisgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMSArIDIgKyA0ICsgMTsKKworICAgICAgICAgICAgaWYgKGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPT0gMHhCNQorICAgICAgICAgICAgICAgICAgICAmJiBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9PSAweDAwMzEKKyAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9pZGVudGlmaWVyID09ICdHQTk0JworICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2RhdGFfdHlwZV9jb2RlID09IDB4MykgeworICAgICAgICAgICAgICAgIC8vIE1QRUdfY2NfZGF0YSgpCisgICAgICAgICAgICAgICAgLy8gQVRTQyBBLzUzIFBhcnQgNDogNi4yLjMuMQorICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvL3Byb2Nlc3NfZW1fZGF0YV9mbGFnCisgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzX2NjX2RhdGFfZmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vYWRkaXRpb25hbF9kYXRhX2ZsYWcKKyAgICAgICAgICAgICAgICBzaXplX3QgY2NfY291bnQgPSBici5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOyAvLyBlbV9kYXRhOworICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAyOworCisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NfY2NfZGF0YV9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgb3V0OworCisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNjQnVmID0gbmV3IEFCdWZmZXIoY2NfY291bnQgKiBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIGNjQnVmLT5zZXRSYW5nZSgwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWFya2VyID0gYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1hcmtlciwgMHgxZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2NfdmFsaWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY190eXBlID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvZGQgcGFyaXR5IGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzEgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8yID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjY192YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2NfdHlwZSA9PSAwIHx8IGNjX3R5cGUgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0RhdGEgY2MoY2NfdHlwZSwgY2NfZGF0YV8xLCBjY19kYXRhXzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOdWxsUGFkKCZjYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYy5nZXRDaGFubmVsKCZjaGFubmVsKSAmJiBnZXRUcmFja0luZGV4KGNoYW5uZWwpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrSW5kaWNlc1tjaGFubmVsXSA9IG1Gb3VuZENoYW5uZWxzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3VuZENoYW5uZWxzLnB1c2hfYmFjayhjaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQWRkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjY0J1Zi0+ZGF0YSgpICsgY2NCdWYtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZjYywgc2l6ZW9mKGNjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjQnVmLT5zZXRSYW5nZSgwLCBjY0J1Zi0+c2l6ZSgpICsgc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gY2NfY291bnQgKiAzOworCisgICAgICAgICAgICAgICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBjY0J1Zik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk1hbGZvcm1lZCBTRUkgcGF5bG9hZCB0eXBlIDQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJVbnN1cHBvcnRlZCBTRUkgcGF5bG9hZCB0eXBlICVkIiwgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXBwaW5nIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgcGF5bG9hZAorICAgICAgICBici5za2lwQml0cyhwYXlsb2FkX3NpemUgKiA4KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworc3A8QUJ1ZmZlcj4gTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZmlsdGVyQ0NCdWYoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1Ziwgc2l6ZV90IGluZGV4KSB7CisgICAgc3A8QUJ1ZmZlcj4gZmlsdGVyZWRDQ0J1ZiA9IG5ldyBBQnVmZmVyKGNjQnVmLT5zaXplKCkpOworICAgIGZpbHRlcmVkQ0NCdWYtPnNldFJhbmdlKDAsIDApOworCisgICAgc2l6ZV90IGNjX2NvdW50ID0gY2NCdWYtPnNpemUoKSAvIHNpemVvZihDQ0RhdGEpOworICAgIGNvbnN0IENDRGF0YSogY2NfZGF0YSA9IChjb25zdCBDQ0RhdGEqKWNjQnVmLT5kYXRhKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBjaGFubmVsOworICAgICAgICBpZiAoY2NfZGF0YVtpXS5nZXRDaGFubmVsKCZjaGFubmVsKSkgeworICAgICAgICAgICAgbUN1cnJlbnRDaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUN1cnJlbnRDaGFubmVsID09IG1Gb3VuZENoYW5uZWxzW2luZGV4XSkgeworICAgICAgICAgICAgbWVtY3B5KGZpbHRlcmVkQ0NCdWYtPmRhdGEoKSArIGZpbHRlcmVkQ0NCdWYtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmY2NfZGF0YVtpXSwgc2l6ZW9mKENDRGF0YSkpOworICAgICAgICAgICAgZmlsdGVyZWRDQ0J1Zi0+c2V0UmFuZ2UoMCwgZmlsdGVyZWRDQ0J1Zi0+c2l6ZSgpICsgc2l6ZW9mKENDRGF0YSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZpbHRlcmVkQ0NCdWY7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgaWYgKGV4dHJhY3RGcm9tU0VJKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgIEFMT0dJKCJGb3VuZCBDRUEtNjA4IHRyYWNrIik7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VHJhY2tBZGRlZCk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBleHRyYWN0IENDIGZyb20gb3RoZXIgc291cmNlcworfQorCit2b2lkIE51UGxheWVyOjpDQ0RlY29kZXI6OmRpc3BsYXkoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAoIWlzVHJhY2tWYWxpZChtU2VsZWN0ZWRUcmFjaykpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGN1cnJlbnQgdHJhY2soaW5kZXg9JWQpIiwgbVNlbGVjdGVkVHJhY2spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DQ01hcC5pbmRleE9mS2V5KHRpbWVVcyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigiY2MgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQgIiBub3QgZm91bmQiLCB0aW1lVXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gY2NCdWYgPSBmaWx0ZXJDQ0J1ZihtQ0NNYXAudmFsdWVBdChpbmRleCksIG1TZWxlY3RlZFRyYWNrKTsKKworICAgIGlmIChjY0J1Zi0+c2l6ZSgpID4gMCkgeworI2lmIDAKKyAgICAgICAgZHVtcEJ5dGVQYWlyKGNjQnVmKTsKKyNlbmRpZgorCisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKCJ0cmFja0luZGV4IiwgbVNlbGVjdGVkVHJhY2spOworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCAwbGwpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEpOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgY2NCdWYpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICAvLyByZW1vdmUgYWxsIGVudHJpZXMgYmVmb3JlIHRpbWVVcworICAgIG1DQ01hcC5yZW1vdmVJdGVtc0F0KDAsIGluZGV4ICsgMSk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Zmx1c2goKSB7CisgICAgbUNDTWFwLmNsZWFyKCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAppbmRleCA3OGVhNzRhLi5kYmEzZWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCkBAIC0yNSwyMCArMjUsMzYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFDb2RlYzsKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKIAogc3RydWN0IE51UGxheWVyOjpEZWNvZGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdyA9IE5VTEwpOwogCi0gICAgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBpbml0KCk7CiAKLSAgICB2b2lkIHNpZ25hbEZsdXNoKCk7Ci0gICAgdm9pZCBzaWduYWxSZXN1bWUoKTsKLSAgICB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKKyAgICBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnMpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxVcGRhdGVGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOwogCi0gICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmbFRCJywKKyAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyVEInLAorICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnZm10QycsCisgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmbHNDJywKKyAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCAgID0gJ3NoREMnLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnIgJywKKyAgICB9OwogCiBwcm90ZWN0ZWQ6CisKICAgICB2aXJ0dWFsIH5EZWNvZGVyKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtNDYsMjcgKzYyLDkwIEBACiBwcml2YXRlOgogICAgIGVudW0gewogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICA9ICdjZGNOJywKKyAgICAgICAga1doYXRDb25maWd1cmUgICAgICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0R2V0SW5wdXRCdWZmZXJzICAgID0gJ2dJbkInLAorICAgICAgICBrV2hhdElucHV0QnVmZmVyRmlsbGVkICA9ICdpbnBGJywKKyAgICAgICAga1doYXRSZW5kZXJCdWZmZXIgICAgICAgPSAncm5kcicsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdFNodXRkb3duICAgICAgICAgICA9ICdzaHVEJywKKyAgICAgICAga1doYXRVcGRhdGVGb3JtYXQgICAgICAgPSAndUZtdCcsCiAgICAgfTsKIAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CiAKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBzcDxBQ29kZWM+IG1Db2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworICAgIHNwPE1lZGlhQ29kZWM+IG1Db2RlYzsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7CisgICAgc3A8QUxvb3Blcj4gbURlY29kZXJMb29wZXI7CiAKLSAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEOwotICAgIHNpemVfdCBtQ1NESW5kZXg7CisgICAgTGlzdDxzcDxBTWVzc2FnZT4gPiBtUGVuZGluZ0lucHV0TWVzc2FnZXM7CiAKLSAgICBzcDxBTWVzc2FnZT4gbWFrZUZvcm1hdChjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1JbnB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbU91dHB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRHNGb3JDdXJyZW50Rm9ybWF0OworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzVG9TdWJtaXQ7CisgICAgVmVjdG9yPGJvb2w+IG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQ7CisgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1NZWRpYUJ1ZmZlcnM7CiAKLSAgICB2b2lkIG9uRmlsbFRoaXNCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOworICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcigpOworICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoKTsKKworICAgIHZvaWQgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisgICAgdm9pZCByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICBib29sIGlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICB2b2lkIG9uRmx1c2goKTsKKyAgICB2b2lkIG9uUmVzdW1lKCk7CisgICAgYm9vbCBvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uU2h1dGRvd24oKTsKKworICAgIGludDMyX3QgbUJ1ZmZlckdlbmVyYXRpb247CisgICAgYm9vbCBtUGF1c2VkOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAKICAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXIpOwogfTsKIAorc3RydWN0IE51UGxheWVyOjpDQ0RlY29kZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEsCisgICAgICAgIGtXaGF0VHJhY2tBZGRlZCwKKyAgICB9OworCisgICAgQ0NEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OworICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgZmx1c2goKTsKKworcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBzcDxBQnVmZmVyPiA+IG1DQ01hcDsKKyAgICBzaXplX3QgbUN1cnJlbnRDaGFubmVsOworICAgIGludDMyX3QgbVNlbGVjdGVkVHJhY2s7CisgICAgaW50MzJfdCBtVHJhY2tJbmRpY2VzWzRdOworICAgIFZlY3RvcjxzaXplX3Q+IG1Gb3VuZENoYW5uZWxzOworCisgICAgYm9vbCBpc1RyYWNrVmFsaWQoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgICBpbnQzMl90IGdldFRyYWNrSW5kZXgoc2l6ZV90IGNoYW5uZWwpIGNvbnN0OworICAgIGJvb2wgZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHNwPEFCdWZmZXI+IGZpbHRlckNDQnVmKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1Ziwgc2l6ZV90IGluZGV4KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDRGVjb2Rlcik7Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE5VUExBWUVSX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YWFjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCIKKworI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heENhY2hlZEJ5dGVzID0gMjAwMDAwOworLy8gVGhlIGJ1ZmZlcnMgd2lsbCBjb250YWluIGEgYml0IGxlc3MgdGhhbiBrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzLgorLy8gU28gd2UgY2FuIHN0YXJ0IG9mZiB3aXRoIGp1c3QgZW5vdWdoIGJ1ZmZlcnMgdG8ga2VlcCB0aGUgY2FjaGUgZnVsbC4KK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFBlbmRpbmdCdWZmZXJzID0gMSArIChrTWF4Q2FjaGVkQnl0ZXMgLyBOdVBsYXllcjo6a0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyk7CisKK051UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OkRlY29kZXJQYXNzVGhyb3VnaCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBEZWNvZGVyKG5vdGlmeSksCisgICAgICBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1SZWFjaGVkRU9TKHRydWUpLAorICAgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsKDApLAorICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbigwKSwKKyAgICAgIG1DYWNoZWRCeXRlcygwKSwKKyAgICAgIG1Db21wb25lbnROYW1lKCJwYXNzIHRocm91Z2ggZGVjb2RlciIpIHsKKyAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaCIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjp+RGVjb2RlclBhc3NUaHJvdWdoKCkgeworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjppbml0KCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6c2lnbmFsRmx1c2goKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpzaWduYWxSZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aW5pdGlhdGVTaHV0ZG93bigpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpKS0+cG9zdCgpOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIHRhcmdldEZvcm1hdCAqLykgY29uc3QgeworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICBtQ2FjaGVkQnl0ZXMgPSAwOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgcmVxdWVzdE1heEJ1ZmZlcnMoKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6aXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbiAhPSBtQnVmZmVyR2VuZXJhdGlvbjsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpyZXF1ZXN0QUJ1ZmZlcigpIHsKKyAgICBpZiAobUNhY2hlZEJ5dGVzID49IGtNYXhDYWNoZWRCeXRlcykgeworICAgICAgICBBTE9HVigiWyVzXSBtQ2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1DYWNoZWRCeXRlcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlYWNoZWQgRU9TIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbnB1dEJ1ZmZlckZpbGxlZCwgaWQoKSk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCsrOworICAgIEFMT0dWKCJyZXF1ZXN0QUJ1ZmZlcjogI1RvRmlsbCA9ICV6dSwgI1RvRHJhaW4gPSAlenUiLCBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwsCisgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGFuZHJvaWQ6Ok51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uSW5wdXRCdWZmZXJGaWxsZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgLS1tUGVuZGluZ0J1ZmZlcnNUb0ZpbGw7CisgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhY2hlZEJ5dGVzICs9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QnVmZmVyQ29uc3VtZWQsIGlkKCkpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKyAgICByZXBseS0+c2V0SW50MzIoInNpemUiLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJhaW5UaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgICsrbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBBTE9HVigib25JbnB1dEJ1ZmZlckZpbGxlZDogI1RvRmlsbCA9ICV6dSwgI1RvRHJhaW4gPSAlenUsIGNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCwgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkJ1ZmZlckNvbnN1bWVkKGludDMyX3Qgc2l6ZSkgeworICAgIC0tbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKKyAgICBtQ2FjaGVkQnl0ZXMgLT0gc2l6ZTsKKyAgICBBTE9HVigib25CdWZmZXJDb25zdW1lZDogI1RvRmlsbCA9ICV6dSwgI1RvRHJhaW4gPSAlenUsIGNhY2hlZEJ5dGVzID0gJXp1IiwKKyAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsLCBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOworICAgIHJlcXVlc3RBQnVmZmVyKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25GbHVzaCgpIHsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwgPSAwOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gPSAwOworICAgIG1DYWNoZWRCeXRlcyA9IDA7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpyZXF1ZXN0TWF4QnVmZmVycygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhQZW5kaW5nQnVmZmVyczsgaSsrKSB7CisgICAgICAgIGlmICghcmVxdWVzdEFCdWZmZXIoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TaHV0ZG93bigpIHsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtUmVhY2hlZEVPUyA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIG9uQ29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXF1ZXN0QUJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RBQnVmZmVyKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdElucHV0QnVmZmVyRmlsbGVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckZpbGxlZChtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QnVmZmVyQ29uc3VtZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNpemUiLCAmc2l6ZSkpOworICAgICAgICAgICAgICAgIG9uQnVmZmVyQ29uc3VtZWQoc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICByZXF1ZXN0TWF4QnVmZmVycygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjAyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXworCisjZGVmaW5lIE5VUExBWUVSX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCisKKyNpbmNsdWRlICJOdVBsYXllci5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2ggOiBwdWJsaWMgRGVjb2RlciB7CisgICAgRGVjb2RlclBhc3NUaHJvdWdoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBpbml0KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oKTsKKworICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRvKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB+RGVjb2RlclBhc3NUaHJvdWdoKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFJlcXVlc3RBQnVmZmVyICAgICA9ICdyZXFCJywKKyAgICAgICAga1doYXRDb25maWd1cmUgICAgICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQgID0gJ2lucEYnLAorICAgICAgICBrV2hhdEJ1ZmZlckNvbnN1bWVkICAgICA9ICdidWZDJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgID0gJ3NodUQnLAorICAgIH07CisKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBzcDxBTG9vcGVyPiBtRGVjb2Rlckxvb3BlcjsKKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYSBidWZmZXIgd2FzIHJlcXVlc3RlZC4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIGF0IEVPUyBvciBjYWNoZSBhbHJlYWR5IGZ1bGwuCisgICAgICovCisgICAgYm9vbCByZXF1ZXN0QUJ1ZmZlcigpOworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgb25GbHVzaCgpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZpbGxlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkJ1ZmZlckNvbnN1bWVkKGludDMyX3Qgc2l6ZSk7CisgICAgdm9pZCByZXF1ZXN0TWF4QnVmZmVycygpOworICAgIHZvaWQgb25TaHV0ZG93bigpOworCisgICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBib29sICAgIG1SZWFjaGVkRU9TOworICAgIC8vIFRPRE8gbVBlbmRpbmdCdWZmZXJzVG9GaWxsIGFuZCBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluIGFyZSBvbmx5IGZvcgorICAgIC8vIGRlYnVnZ2luZy4gVGhleSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwb3dlciBpbnZlc3RpZ2F0aW9uIGlzIGRvbmUuCisgICAgc2l6ZV90ICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGw7CisgICAgc2l6ZV90ICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIHNpemVfdCAgbUNhY2hlZEJ5dGVzOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyUGFzc1Rocm91Z2gpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggYjk2NTFhMS4uYWI0NjA3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC0yNiw3ICsyNiw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM3LDEyICszOSwxNCBAQAogICAgICAgbVNldFN1cmZhY2VJblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1EdXJhdGlvblVzKC0xKSwKICAgICAgIG1Qb3NpdGlvblVzKC0xKSwKLSAgICAgIG1OdW1GcmFtZXNUb3RhbCgwKSwKLSAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDApLAorICAgICAgbVNlZWtJblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbVBsYXllckZsYWdzKDApLAogICAgICAgbUF0RU9TKGZhbHNlKSwKKyAgICAgIG1Mb29waW5nKGZhbHNlKSwKKyAgICAgIG1BdXRvTG9vcChmYWxzZSksCiAgICAgICBtU3RhcnR1cFNlZWtUaW1lVXMoLTEpIHsKKyAgICBBTE9HVigiTnVQbGF5ZXJEcml2ZXIoJXApIiwgdGhpcyk7CiAgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJEcml2ZXIgTG9vcGVyIik7CiAKICAgICBtTG9vcGVyLT5zdGFydCgKQEAgLTU3LDYgKzYxLDcgQEAKIH0KIAogTnVQbGF5ZXJEcml2ZXI6On5OdVBsYXllckRyaXZlcigpIHsKKyAgICBBTE9HVigifk51UGxheWVyRHJpdmVyKCVwKSIsIHRoaXMpOwogICAgIG1Mb29wZXItPnN0b3AoKTsKIH0KIApAQCAtNzEsNyArNzYsMTAgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSB1cmwoJXMpIiwgdGhpcywgdXJpRGVidWdTdHJpbmcodXJsLCBmYWxzZSkuY19zdHIoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgewpAQCAtODAsNyArODgsNyBAQAogCiAgICAgbVN0YXRlID0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzsKIAotICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyh1cmwsIGhlYWRlcnMpOworICAgIG1QbGF5ZXItPnNldERhdGFTb3VyY2VBc3luYyhodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIAogICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwpAQCAtOTAsNiArOTgsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSBmaWxlKCVkKSIsIHRoaXMsIGZkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CkBAIC0xMDgsNiArMTE3LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSBzdHJlYW0gc291cmNlIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfSURMRSkgewpAQCAtMTI3LDYgKzEzNyw3IEBACiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKKyAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcykgewpAQCAtMTU0LDYgKzE2NSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpwcmVwYXJlKCkgeworICAgIEFMT0dWKCJwcmVwYXJlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIHByZXBhcmVfbCgpOwogfQpAQCAtMTcyLDEyICsxODQsMjMgQEAKICAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIChtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpID8gT0sgOiBVTktOT1dOX0VSUk9SOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbUlzQXN5bmNQcmVwYXJlID0gZmFsc2U7CisgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOworICAgICAgICAgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcpIHsKKyAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQpID8gT0sgOiBVTktOT1dOX0VSUk9SOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoInByZXBhcmVBc3luYyglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKQEAgLTE4NiwxMiArMjA5LDIwIEBACiAgICAgICAgICAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOwogICAgICAgICAgICAgbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IGp1c3QgcGF1c2VkLiBoYW5kbGUgYXMgc2VlayB0byBzdGFydAorICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc7CisgICAgICAgICAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RhcnQoKSB7CisgICAgQUxPR0QoInN0YXJ0KCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewpAQCAtMjE0LDkgKzI0NSw3IEBACiAgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwogCiAgICAgICAgICAgICBpZiAobVN0YXJ0dXBTZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXBTZWVrVGltZVVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2Vla0NvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXBTZWVrVGltZVVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyhtU3RhcnR1cFNlZWtUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjI2LDExICsyNTUsMjYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1BdEVPUykgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICB7Ci0gICAgICAgICAgICBtUGxheWVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI0NCw3ICsyODgsMzEgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIHBhdXNlKCk7CisgICAgQUxPR0QoInN0b3AoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnBhdXNlKCkgewpAQCAtMjU2LDcgKzMyNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUEFVU0VEKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUEFVU0VEKTsKICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMjY0LDggKzMzMyw2IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNzQsNiArMzQxLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNlZWtUbyhpbnQgbXNlYykgeworICAgIEFMT0dEKCJzZWVrVG8oJXApICVkIG1zIiwgdGhpcywgbXNlYyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwbGw7CkBAIC0yODIsNiArMzUwLDEwIEBACiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1TdGFydHVwU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgICAgICAgICAvLyBwcmV0ZW5kIHRoYXQgdGhlIHNlZWsgY29tcGxldGVkLiBJdCB3aWxsIGFjdHVhbGx5IGhhcHBlbiB3aGVuIHN0YXJ0aW5nIHBsYXliYWNrLgorICAgICAgICAgICAgLy8gVE9ETzogYWN0dWFsbHkgcGVyZm9ybSB0aGUgc2VlayBoZXJlLCBzbyB0aGUgcGxheWVyIGlzIHJlYWR5IHRvIGdvIGF0IHRoZSBuZXcKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uCisgICAgICAgICAgICBub3RpZnlTZWVrQ29tcGxldGVfbCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjg5LDkgKzM2MSwxMCBAQAogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKICAgICAgICAgewogICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICBtU2Vla0luUHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QQVVTRUQpOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoc2Vla1RpbWVVcyk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BBVVNFRCk7CisgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyhzZWVrVGltZVVzLCB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjk5LDE4ICszNzIsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBtUG9zaXRpb25VcyA9IHNlZWtUaW1lVXM7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYykgeworICAgIGludDY0X3QgdGVtcFVzID0gMDsKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnRlbXBVcyk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Qb3NpdGlvblVzIDwgMCkgewotICAgICAgICAqbXNlYyA9IDA7CisgICAgLy8gV2UgbmVlZCB0byBjaGVjayBtU2Vla0luUHJvZ3Jlc3MgaGVyZSBiZWNhdXNlIG1QbGF5ZXItPnNlZWtUb0FzeW5jIGlzIGFuIGFzeW5jIGNhbGwsIHdoaWNoCisgICAgLy8gbWVhbnMgZ2V0Q3VycmVudFBvc2l0aW9uIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHNlZWsgaXMgY29tcGxldGVkLiBJb3csIHJlbmRlcmVyIG1heSByZXR1cm4gYQorICAgIC8vIHBvc2l0aW9uIHZhbHVlIHRoYXQncyBkaWZmZXJlbnQgdGhlIHNlZWsgdG8gcG9zaXRpb24uCisgICAgaWYgKHJldCAhPSBPSyB8fCBtU2Vla0luUHJvZ3Jlc3MpIHsKKyAgICAgICAgdGVtcFVzID0gKG1Qb3NpdGlvblVzIDw9IDApID8gMCA6IG1Qb3NpdGlvblVzOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICptc2VjID0gKG1Qb3NpdGlvblVzICsgNTAwbGwpIC8gMTAwMDsKKyAgICAgICAgbVBvc2l0aW9uVXMgPSB0ZW1wVXM7CiAgICAgfQotCisgICAgKm1zZWMgPSAoaW50KWRpdlJvdW5kKHRlbXBVcywgKGludDY0X3QpKDEwMDApKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTMyNyw2ICs0MDYsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cmVzZXQoKSB7CisgICAgQUxPR0QoInJlc2V0KCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewpAQCAtMzQxLDcgKzQyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLKG1Jc0FzeW5jUHJlcGFyZSk7CiAKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BSRVBBUkVEKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMzQ5LDcgKzQyOSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVE9QUEVEKTsKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX1NUT1BQRUQpIHsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKKyAgICB9CiAKICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CkBAIC0zNjEsMTIgKzQ0MywxNCBAQAogICAgIG1EdXJhdGlvblVzID0gLTE7CiAgICAgbVBvc2l0aW9uVXMgPSAtMTsKICAgICBtU3RhcnR1cFNlZWtUaW1lVXMgPSAtMTsKKyAgICBtTG9vcGluZyA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0TG9vcGluZyhpbnQgLyogbG9vcCAqLykgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7CisgICAgbUxvb3BpbmcgPSBsb29wICE9IDA7CisgICAgcmV0dXJuIE9LOwogfQogCiBwbGF5ZXJfdHlwZSBOdVBsYXllckRyaXZlcjo6cGxheWVyVHlwZSgpIHsKQEAgLTQxMCw2ICs0OTQsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8pOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNDE5LDYgKzUwOSw3IEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKKyAgICBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKApAQCAtNDU4LDYgKzU0OSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoKSB7CisgICAgQUxPR0QoIm5vdGlmeVJlc2V0Q29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpOwpAQCAtNDY2LDYgKzU1OCw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpIHsKKyAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOwpAQCAtNDc5LDM1ICs1NzIsNDUgQEAKICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVBvc2l0aW9uKGludDY0X3QgcG9zaXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVBvc2l0aW9uVXMgPSBwb3NpdGlvblVzOwotfQotCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGUoKSB7Ci0gICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU0VFS19DT01QTEVURSk7CisgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUZyYW1lU3RhdHMoCi0gICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwsIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbU51bUZyYW1lc1RvdGFsID0gbnVtRnJhbWVzVG90YWw7Ci0gICAgbU51bUZyYW1lc0Ryb3BwZWQgPSBudW1GcmFtZXNEcm9wcGVkOwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woKSB7CisgICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgICAgICBpZiAoIW1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByZXBhcmluZyBzeW5jaHJvbm91c2x5LCBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5vdGlmeUxpc3RlbmVyX2wod2FzU2Vla2luZyA/IE1FRElBX1NFRUtfQ09NUExFVEUgOiBNRURJQV9QUkVQQVJFRCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpkdW1wKAogICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsOworICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZDsKKyAgICBtUGxheWVyLT5nZXRTdGF0cygmbnVtRnJhbWVzVG90YWwsICZudW1GcmFtZXNEcm9wcGVkKTsKIAogICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOwogCiAgICAgZnByaW50ZihvdXQsICIgTnVQbGF5ZXJcbiIpOwogICAgIGZwcmludGYob3V0LCAiICBudW1GcmFtZXNUb3RhbCglIiBQUklkNjQgIiksIG51bUZyYW1lc0Ryb3BwZWQoJSIgUFJJZDY0ICIpLCAiCiAgICAgICAgICAgICAgICAgICJwZXJjZW50YWdlRHJvcHBlZCglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1RvdGFsLAotICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzRHJvcHBlZCwKLSAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1RvdGFsID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKW1OdW1GcmFtZXNEcm9wcGVkIC8gbU51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgIG51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsID09IDAKKyAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKW51bUZyYW1lc0Ryb3BwZWQgLyBudW1GcmFtZXNUb3RhbCk7CiAKICAgICBmY2xvc2Uob3V0KTsKICAgICBvdXQgPSBOVUxMOwpAQCAtNTE3LDExICs2MjAsNDEgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewotICAgIGlmIChtc2cgPT0gTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgfHwgbXNnID09IE1FRElBX0VSUk9SKSB7Ci0gICAgICAgIG1BdEVPUyA9IHRydWU7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBub3RpZnlMaXN0ZW5lcl9sKG1zZywgZXh0MSwgZXh0MiwgaW4pOworfQorCit2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAorICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICBjYXNlIE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb29waW5nIHx8IChtQXV0b0xvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvU2luay0+cmVhbHRpbWUoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQV9FUlJPUjoKKyAgICAgICAgeworICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIG1Mb2NrLnVubG9jaygpOwogICAgIHNlbmRFdmVudChtc2csIGV4dDEsIGV4dDIsIGluKTsKKyAgICBtTG9jay5sb2NrKCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQoc3RhdHVzX3QgZXJyKSB7CkBAIC01NTAsMTUgKzY4MywyNCBAQAogICAgIG1Bc3luY1Jlc3VsdCA9IGVycjsKIAogICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUFJFUEFSRUQpOwotICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZSBzdGF0ZSBiZWZvcmUgbm90aWZ5aW5nIGNsaWVudCwgc28gdGhhdCBpZiBjbGllbnQgY2FsbHMgYmFjayBpbnRvIE51UGxheWVyRHJpdmVyCisgICAgICAgIC8vIGluIHJlc3BvbnNlLCBOdVBsYXllckRyaXZlciBoYXMgdGhlIHJpZ2h0IHN0YXRlCiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUkVEOwotICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9VTlBSRVBBUkVEOworICAgICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtUGxheWVyLT5nZXRGaWxlTWV0YSgpOworICAgIGludDMyX3QgbG9vcDsKKyAgICBpZiAobWV0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkgJiYgbG9vcCAhPSAwKSB7CisgICAgICAgIG1BdXRvTG9vcCA9IHRydWU7CiAgICAgfQogCiAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggOTlmNzJhNi4uNWNiYTdkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTMxLDcgKzMxLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIApAQCAtNjYsOSArNjgsOCBAQAogICAgIHZvaWQgbm90aWZ5UmVzZXRDb21wbGV0ZSgpOwogICAgIHZvaWQgbm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCk7CiAgICAgdm9pZCBub3RpZnlEdXJhdGlvbihpbnQ2NF90IGR1cmF0aW9uVXMpOwotICAgIHZvaWQgbm90aWZ5UG9zaXRpb24oaW50NjRfdCBwb3NpdGlvblVzKTsKICAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZSgpOwotICAgIHZvaWQgbm90aWZ5RnJhbWVTdGF0cyhpbnQ2NF90IG51bUZyYW1lc1RvdGFsLCBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQpOworICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlX2woKTsKICAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CiAgICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOwogCkBAIC04NSw2ICs4Niw5IEBACiAgICAgICAgIFNUQVRFX1JVTk5JTkcsCiAgICAgICAgIFNUQVRFX1BBVVNFRCwKICAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCisgICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKKyAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKKyAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKICAgICB9OwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTEwMCwxOSArMTA0LDIyIEBACiAgICAgYm9vbCBtU2V0U3VyZmFjZUluUHJvZ3Jlc3M7CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKICAgICBpbnQ2NF90IG1Qb3NpdGlvblVzOwotICAgIGludDY0X3QgbU51bUZyYW1lc1RvdGFsOwotICAgIGludDY0X3QgbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgYm9vbCBtU2Vla0luUHJvZ3Jlc3M7CiAgICAgLy8gPDw8CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPE51UGxheWVyPiBtUGxheWVyOworICAgIHNwPEF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICB1aW50MzJfdCBtUGxheWVyRmxhZ3M7CiAKICAgICBib29sIG1BdEVPUzsKKyAgICBib29sIG1Mb29waW5nOworICAgIGJvb2wgbUF1dG9Mb29wOwogCiAgICAgaW50NjRfdCBtU3RhcnR1cFNlZWtUaW1lVXM7CiAKICAgICBzdGF0dXNfdCBwcmVwYXJlX2woKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyRHJpdmVyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggYmY1MjcxZS4uODZjZTM4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMjAsMjMgKzIwLDQ0IEBACiAKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAKLSNpbmNsdWRlICJTb2Z0d2FyZVJlbmRlcmVyLmgiCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxWaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luaworLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDYwMDAwMDAwbGw7CisKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBsbDsKIAorc3RhdGljIGJvb2wgc0ZyYW1lQWNjdXJhdGVBVnN5bmMgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgcmVhZFByb3BlcnRpZXMoKSB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoInBlcnNpc3Quc3lzLm1lZGlhLmF2c3luYyIsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICBzRnJhbWVBY2N1cmF0ZUFWc3luYyA9CisgICAgICAgICAgICAhc3RyY21wKCIxIiwgdmFsdWUpIHx8ICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpOworICAgIH0KK30KKwogTnVQbGF5ZXI6OlJlbmRlcmVyOjpSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpCiAgICAgOiBtQXVkaW9TaW5rKHNpbmspLAotICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKICAgICAgIG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTnVtRnJhbWVzV3JpdHRlbigwKSwKQEAgLTQ0LDI4ICs2NSwzNyBAQAogICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcoZmFsc2UpLAogICAgICAgbUF1ZGlvUXVldWVHZW5lcmF0aW9uKDApLAogICAgICAgbVZpZGVvUXVldWVHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVSZWFsVXMoLTEpLAotICAgICAgbUZsdXNoaW5nQXVkaW8oZmFsc2UpLAotICAgICAgbUZsdXNoaW5nVmlkZW8oZmFsc2UpLAorICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAorICAgICAgbUFuY2hvck1heE1lZGlhVXMoLTEpLAorICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKICAgICAgIG1IYXNBdWRpbyhmYWxzZSksCiAgICAgICBtSGFzVmlkZW8oZmFsc2UpLAorICAgICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoLTEpLAorICAgICAgbUZsdXNoaW5nQXVkaW8oZmFsc2UpLAorICAgICAgbUZsdXNoaW5nVmlkZW8oZmFsc2UpLAogICAgICAgbVN5bmNRdWV1ZXMoZmFsc2UpLAogICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKICAgICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKLSAgICAgIG1MYXN0UG9zaXRpb25VcGRhdGVVcygtMWxsKSwKLSAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCkgeworICAgICAgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9PZmZsb2FkVG9ybkRvd24oZmFsc2UpLAorICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyhBVURJT19JTkZPX0lOSVRJQUxJWkVSKSwKKyAgICAgIG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQoMCksCisgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCgwKSB7CisgICAgcmVhZFByb3BlcnRpZXMoKTsKIH0KIAogTnVQbGF5ZXI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7Ci0gICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRTb2Z0UmVuZGVyZXIoU29mdHdhcmVSZW5kZXJlciAqc29mdFJlbmRlcmVyKSB7Ci0gICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci0gICAgbVNvZnRSZW5kZXJlciA9IHNvZnRSZW5kZXJlcjsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnF1ZXVlQnVmZmVyKApAQCAtOTIsMTAgKzEyMiwxNCBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwogICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgIENIRUNLKCFtRmx1c2hpbmdBdWRpbyk7CisgICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyghbUZsdXNoaW5nVmlkZW8pOworICAgICAgICAgICAgaWYgKG1GbHVzaGluZ1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA2LDEzICsxNDAsMjMgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgLy8gQ0hFQ0sobUF1ZGlvUXVldWUuZW1wdHkoKSk7CiAgICAgLy8gQ0hFQ0sobVZpZGVvUXVldWUuZW1wdHkoKSk7Ci0gICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbUFuY2hvclRpbWVSZWFsVXMgPSAtMTsKKyAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZSgtMSk7CisgICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOworICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CiAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKIH0KIAordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvU2lua0NoYW5nZWQsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbywgaWQoKSkpLT5wb3N0KCk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwYXVzZSgpIHsKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOwogfQpAQCAtMTIxLDggKzE2NSwxNjggQEAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKIH0KIAordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSwgaWQoKSk7CisgICAgbXNnLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZSIsIGZwcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKKyAgICByZXR1cm4gZ2V0Q3VycmVudFBvc2l0aW9uKG1lZGlhVXMsIEFMb29wZXI6OkdldE5vd1VzKCkpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbigKKyAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIGlmICghbUhhc0F1ZGlvICYmICFtSGFzVmlkZW8pIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaW50NjRfdCBwb3NpdGlvblVzID0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICsgbUFuY2hvclRpbWVNZWRpYVVzOworCisgICAgaWYgKG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzICE9IC0xKSB7CisgICAgICAgIHBvc2l0aW9uVXMgLT0gKG5vd1VzIC0gbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMpOworICAgIH0KKworICAgIC8vIGxpbWl0IHBvc2l0aW9uIHRvIHRoZSBsYXN0IHF1ZXVlZCBtZWRpYSB0aW1lIChmb3IgdmlkZW8gb25seSBzdHJlYW0KKyAgICAvLyBwb3NpdGlvbiB3aWxsIGJlIGRpc2NyZXRlIGFzIHdlIGRvbid0IGtub3cgaG93IGxvbmcgZWFjaCBmcmFtZSBsYXN0cykKKyAgICBpZiAobUFuY2hvck1heE1lZGlhVXMgPj0gMCAmJiAhYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKKyAgICAgICAgaWYgKHBvc2l0aW9uVXMgPiBtQW5jaG9yTWF4TWVkaWFVcykgeworICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1BbmNob3JNYXhNZWRpYVVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBvc2l0aW9uVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIHBvc2l0aW9uVXMgPSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgIH0KKworICAgICptZWRpYVVzID0gKHBvc2l0aW9uVXMgPD0gMCkgPyAwIDogcG9zaXRpb25VczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRIYXNNZWRpYShib29sIGF1ZGlvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIG1IYXNBdWRpbyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZShpbnQ2NF90IG1lZGlhVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQoaW50NjRfdCBtZWRpYVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKKyAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QW5jaG9yVGltZSgKKyAgICAgICAgaW50NjRfdCBtZWRpYVVzLCBpbnQ2NF90IHJlYWxVcywgaW50NjRfdCBudW1GcmFtZXNXcml0dGVuLCBib29sIHJlc3VtZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7CisgICAgbUFuY2hvclRpbWVSZWFsVXMgPSByZWFsVXM7CisgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSBudW1GcmFtZXNXcml0dGVuOworICAgIGlmIChyZXN1bWUpIHsKKyAgICAgICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgPSAtMTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRWaWRlb0xhdGVCeVVzKGludDY0X3QgbGF0ZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbVZpZGVvTGF0ZUJ5VXMgPSBsYXRlVXM7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRWaWRlb0xhdGVCeVVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIHJldHVybiBtVmlkZW9MYXRlQnlVczsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoaW50NjRfdCByZWFsVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyA9IHJlYWxVczsKK30KKworYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6Om9wZW5BdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPcGVuQXVkaW9TaW5rLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5zZXRJbnQzMigib2ZmbG9hZC1vbmx5Iiwgb2ZmbG9hZE9ubHkpOworICAgIG1zZy0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKKyAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpbnQzMl90IG9mZmxvYWQ7CisgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigib2ZmbG9hZCIsICZvZmZsb2FkKSk7CisgICAgcmV0dXJuIChvZmZsb2FkICE9IDApOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Y2xvc2VBdWRpb1NpbmsoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlQXVkaW9TaW5rLCBpZCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9wZW5BdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgIGludDMyX3Qgb2ZmbG9hZE9ubHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigib2ZmbG9hZC1vbmx5IiwgJm9mZmxvYWRPbmx5KSk7CisKKyAgICAgICAgICAgIGludDMyX3QgaGFzVmlkZW87CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKKworICAgICAgICAgICAgYm9vbCBvZmZsb2FkID0gb25PcGVuQXVkaW9TaW5rKGZvcm1hdCwgb2ZmbG9hZE9ubHksIGhhc1ZpZGVvLCBmbGFncyk7CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigib2ZmbG9hZCIsIG9mZmxvYWQpOworCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2xvc2VBdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIG9uQ2xvc2VBdWRpb1NpbmsoKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3BBdWRpb1Npbms6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdERyYWluQXVkaW9RdWV1ZToKICAgICAgICAgewogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwpAQCAtMTQ5LDcgKzM1MywxMCBAQAogCiAgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKICAgICAgICAgICAgICAgICAvLyBoYXMgZWxhcHNlZC4KLSAgICAgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKGRlbGF5VXMgLyAyKTsKKyAgICAgICAgICAgICAgICAvLyBrV2hhdERyYWluQXVkaW9RdWV1ZSBpcyB1c2VkIGZvciBub24tb2ZmbG9hZGluZyBtb2RlLAorICAgICAgICAgICAgICAgIC8vIGFuZCBtTG9jayBpcyB1c2VkIG9ubHkgZm9yIG9mZmxvYWRpbmcgbW9kZS4gVGhlcmVmb3JlLAorICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gYWNxdWlyZSBtTG9jayBoZXJlLgorICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbChkZWxheVVzIC8gMik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTcwLDYgKzM3NywxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVZpZGVvUXVldWVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRRdWV1ZUJ1ZmZlcjoKICAgICAgICAgewogICAgICAgICAgICAgb25RdWV1ZUJ1ZmZlcihtc2cpOwpAQCAtMTk0LDYgKzQxNCwxMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbzoKKyAgICAgICAgeworICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgewogICAgICAgICAgICAgb25QYXVzZSgpOwpAQCAtMjA2LDE0ICs0MzIsNDEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldFZpZGVvRnJhbWVSYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBmcHM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcHMpKTsKKyAgICAgICAgICAgIG9uU2V0VmlkZW9GcmFtZVJhdGUoZnBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKGtEdWVUb0Vycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJBdWRpbyBPZmZsb2FkIHRlYXIgZG93biBkdWUgdG8gcGF1c2UgdGltZW91dC4iKTsKKyAgICAgICAgICAgIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oa0R1ZVRvVGltZW91dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZShpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVBhdXNlZCkgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBpZiAobURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVBhdXNlZAorICAgICAgICAgICAgfHwgb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjI3LDEwICs0ODAsNiBAQAogICAgIG1zZy0+cG9zdChkZWxheVVzKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvU2lua0NoYW5nZWQsIGlkKCkpKS0+cG9zdCgpOwotfQotCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKSB7CiAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKQEAgLTI0OCw2ICs0OTcsMTAyIEBACiAgICAgfQogfQogCisvLyBzdGF0aWMKK3NpemVfdCBOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqIC8qIGF1ZGlvU2luayAqLywKKyAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgeworICAgIE51UGxheWVyOjpSZW5kZXJlciAqbWUgPSAoTnVQbGF5ZXI6OlJlbmRlcmVyICopY29va2llOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUjoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1lLT5maWxsQXVkaW9CdWZmZXIoYnVmZmVyLCBzaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKKyAgICAgICAgeworICAgICAgICAgICAgbWUtPm5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOOgorICAgICAgICB7CisgICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9PZmZsb2FkVGVhckRvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3NpemVfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkgfHwgbVBhdXNlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sIGhhc0VPUyA9IGZhbHNlOworCisgICAgc2l6ZV90IHNpemVDb3BpZWQgPSAwOworICAgIGJvb2wgZmlyc3RFbnRyeSA9IHRydWU7CisgICAgd2hpbGUgKHNpemVDb3BpZWQgPCBzaXplICYmICFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOworCisgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7IC8vIEVPUworICAgICAgICAgICAgaGFzRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3RFbnRyeSAmJiBlbnRyeS0+bU9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKG1lZGlhVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZVJlbWFpbmluZyA9IHNpemUgLSBzaXplQ29waWVkOworICAgICAgICBpZiAoY29weSA+IHNpemVSZW1haW5pbmcpIHsKKyAgICAgICAgICAgIGNvcHkgPSBzaXplUmVtYWluaW5nOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KChjaGFyICopYnVmZmVyICsgc2l6ZUNvcGllZCwKKyAgICAgICAgICAgICAgIGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwKKyAgICAgICAgICAgICAgIGNvcHkpOworCisgICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IGNvcHk7CisgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzaXplQ29waWVkICs9IGNvcHk7CisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7CisgICAgfQorCisgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgc2V0QW5jaG9yVGltZShtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzLCBub3dVcyAtIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25Vcyhub3dVcykpOworICAgIH0KKworICAgIC8vIHdlIGRvbid0IGtub3cgaG93IG11Y2ggZGF0YSB3ZSBhcmUgcXVldWVpbmcgZm9yIG9mZmxvYWRlZCB0cmFja3MKKyAgICBtQW5jaG9yTWF4TWVkaWFVcyA9IC0xOworCisgICAgaWYgKGhhc0VPUykgeworICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcEF1ZGlvU2luaywgaWQoKSkpLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemVDb3BpZWQ7Cit9CisKIGJvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkRyYWluQXVkaW9RdWV1ZSgpIHsKICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CiAgICAgaWYgKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpICE9IE9LKSB7CkBAIC0yNzIsMTAgKzYxNywxNSBAQAogICAgIHdoaWxlIChudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgPiAwICYmICFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOwogCisgICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkID0gZW50cnktPm1CdWZmZXJPcmRpbmFsOworCiAgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBFT1MKLQotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQpOworICAgICAgICAgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCwgcG9zdEVPU0RlbGF5VXMpOwogCiAgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKQEAgLTI4NSwyNiArNjM1LDggQEAKICAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IDApIHsKICAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotCiAgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLQotICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOwotICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ID0KLSAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZDsKLQotICAgICAgICAgICAgaW50NjRfdCByZWFsVGltZU9mZnNldFVzID0KLSAgICAgICAgICAgICAgICAobUF1ZGlvU2luay0+bGF0ZW5jeSgpIC8gMiAgLyogWFhYICovCi0gICAgICAgICAgICAgICAgICAgICsgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKSAqIDEwMDBsbDsKLQotICAgICAgICAgICAgLy8gQUxPR0koInJlYWxUaW1lT2Zmc2V0VXMgPSAlbGxkIHVzIiwgcmVhbFRpbWVPZmZzZXRVcyk7Ci0KLSAgICAgICAgICAgIG1BbmNob3JUaW1lUmVhbFVzID0KLSAgICAgICAgICAgICAgICBBTG9vcGVyOjpHZXROb3dVcygpICsgcmVhbFRpbWVPZmZzZXRVczsKKyAgICAgICAgICAgIG9uTmV3QXVkaW9NZWRpYVRpbWUobWVkaWFUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CkBAIC0zMTIsMTEgKzY0NCwxMyBAQAogICAgICAgICAgICAgY29weSA9IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZTsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPndyaXRlKAotICAgICAgICAgICAgICAgICAgICBlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsIGNvcHkpLAotICAgICAgICAgICAgICAgICAoc3NpemVfdCljb3B5KTsKKyAgICAgICAgc3NpemVfdCB3cml0dGVuID0gbUF1ZGlvU2luay0+d3JpdGUoZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LCBjb3B5KTsKKyAgICAgICAgaWYgKHdyaXR0ZW4gPCAwKSB7CisgICAgICAgICAgICAvLyBBbiBlcnJvciBpbiBBdWRpb1Npbmsgd3JpdGUgaXMgZmF0YWwgaGVyZS4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkF1ZGlvU2luayB3cml0ZSBlcnJvciglemQpIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgfQogCi0gICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IGNvcHk7CisgICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IHdyaXR0ZW47CiAgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CiAgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKQEAgLTMyNCwyMCArNjU4LDczIEBACiAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgLT0gY29weTsKLSAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IGNvcHkgLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKKyAgICAgICAgbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlIC09IHdyaXR0ZW47CisgICAgICAgIHNpemVfdCBjb3BpZWRGcmFtZXMgPSB3cml0dGVuIC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CiAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IGNvcGllZEZyYW1lczsKIAogICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOwotICAgIH0KIAotICAgIG5vdGlmeVBvc2l0aW9uKCk7CisgICAgICAgIGlmICh3cml0dGVuICE9IChzc2l6ZV90KWNvcHkpIHsKKyAgICAgICAgICAgIC8vIEEgc2hvcnQgY291bnQgd2FzIHJlY2VpdmVkIGZyb20gQXVkaW9TaW5rOjp3cml0ZSgpCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQXVkaW9TaW5rIHdyaXRlIHNob3VsZCBibG9jayB1bnRpbCBleGFjdGx5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXJlIGRlbGl2ZXJlZC4KKyAgICAgICAgICAgIC8vIEJ1dCBpdCBtYXkgcmV0dXJuIHdpdGggYSBzaG9ydCBjb3VudCAod2l0aG91dCBhbiBlcnJvcikgd2hlbjoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAxKSBTaXplIHRvIGJlIGNvcGllZCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gV2UgY29uc2lkZXIgdGhpcyBmYXRhbC4KKyAgICAgICAgICAgIC8vIDIpIEF1ZGlvU2luayBpcyBhbiBBdWRpb0NhY2hlIGZvciBkYXRhIHJldHJpZXZhbCwgYW5kIHRoZSBBdWRpb0NhY2hlIGlzIGV4Y2VlZGVkLgorCisgICAgICAgICAgICAvLyAoQ2FzZSAxKQorICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgSWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgYSBmcmFtZSBzaXplLCBpdAorICAgICAgICAgICAgLy8gbmVlZHMgdG8gZmFpbCwgYXMgd2Ugc2hvdWxkIG5vdCBjYXJyeSBvdmVyIGZyYWN0aW9uYWwgZnJhbWVzIGJldHdlZW4gY2FsbHMuCisgICAgICAgICAgICBDSEVDS19FUShjb3B5ICUgbUF1ZGlvU2luay0+ZnJhbWVTaXplKCksIDApOworCisgICAgICAgICAgICAvLyAoQ2FzZSAyKQorICAgICAgICAgICAgLy8gUmV0dXJuIGVhcmx5IHRvIHRoZSBjYWxsZXIuCisgICAgICAgICAgICAvLyBCZXdhcmUgb2YgY2FsbGluZyBpbW1lZGlhdGVseSBhZ2FpbiBhcyB0aGlzIG1heSBidXN5LWxvb3AgaWYgeW91IGFyZSBub3QgY2FyZWZ1bC4KKyAgICAgICAgICAgIEFMT0dXKCJBdWRpb1Npbmsgd3JpdGUgc2hvcnQgZnJhbWUgY291bnQgJXpkIDwgJXp1Iiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQW5jaG9yTWF4TWVkaWFVcyA9CisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyArCisgICAgICAgICAgICAgICAgKGludDY0X3QpKG1heCgobG9uZyBsb25nKW1OdW1GcmFtZXNXcml0dGVuIC0gbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIDBMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKTsKIAogICAgIHJldHVybiAhbUF1ZGlvUXVldWUuZW1wdHkoKTsKIH0KIAoraW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIHsKKyAgICBpbnQ2NF90IHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgPQorICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKTsKKyAgICByZXR1cm4gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25Vcyhub3dVcyk7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOworICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzLCBub3dVcywgdHJ1ZSAvKiBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyAqLykgIT0gT0spIHsKKyAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLCBlLmcuIGR1ZSB0byBhdWRpbyBjbG9jayBpcyBub3QgcmVhZHksIHRoZW4ganVzdAorICAgICAgICAvLyBwbGF5IG91dCB2aWRlbyBpbW1lZGlhdGVseSB3aXRob3V0IGRlbGF5LgorICAgICAgICByZXR1cm4gbm93VXM7CisgICAgfQorICAgIHJldHVybiAobWVkaWFUaW1lVXMgLSBjdXJyZW50UG9zaXRpb25VcykgKyBub3dVczsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIC8vIFRSSUNLWTogdm9yYmlzIGRlY29kZXIgZ2VuZXJhdGVzIG11bHRpcGxlIGZyYW1lcyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdGltZXN0YW1wLCBzbyBvbmx5IHVwZGF0ZSBvbiB0aGUgZmlyc3QgZnJhbWUgd2l0aCBhIGdpdmVuIHRpbWVzdGFtcAorICAgIGlmIChtZWRpYVRpbWVVcyA9PSBtQW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKG1lZGlhVGltZVVzKTsKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBzZXRBbmNob3JUaW1lKAorICAgICAgICAgICAgbWVkaWFUaW1lVXMsIG5vd1VzICsgZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMobm93VXMpLCBtTnVtRnJhbWVzV3JpdHRlbik7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5WaWRlb1F1ZXVlKCkgewotICAgIGlmIChtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkKSB7CisgICAgaWYgKG1EcmFpblZpZGVvUXVldWVQZW5kaW5nCisgICAgICAgICAgICB8fCBtU3luY1F1ZXVlcworICAgICAgICAgICAgfHwgKG1QYXVzZWQgJiYgbVZpZGVvU2FtcGxlUmVjZWl2ZWQpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM1MCwzNiArNzM3LDY3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluVmlkZW9RdWV1ZSwgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb1F1ZXVlR2VuZXJhdGlvbik7CiAKLSAgICBpbnQ2NF90IGRlbGF5VXM7Ci0KICAgICBpZiAoZW50cnkubUJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIEVPUyBkb2Vzbid0IGNhcnJ5IGEgdGltZXN0YW1wLgotICAgICAgICBkZWxheVVzID0gMDsKLSAgICB9IGVsc2UgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXM7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCByZWFsVGltZVVzOworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgewogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0KLSAgICAgICAgZGVsYXlVcyA9IG1lZGlhVGltZVVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgcmVhbFRpbWVVcyA9IG1lZGlhVGltZVVzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAogICAgICAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgewotICAgICAgICAgICAgZGVsYXlVcyA9IDA7Ci0KLSAgICAgICAgICAgIGlmICghbUhhc0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0QW5jaG9yVGltZShtZWRpYVRpbWVVcywgbm93VXMpOworICAgICAgICAgICAgcmVhbFRpbWVVcyA9IG5vd1VzOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCByZWFsVGltZVVzID0KLSAgICAgICAgICAgICAgICAobWVkaWFUaW1lVXMgLSBtQW5jaG9yVGltZU1lZGlhVXMpICsgbUFuY2hvclRpbWVSZWFsVXM7CisgICAgICAgICAgICByZWFsVGltZVVzID0gZ2V0UmVhbFRpbWVVcyhtZWRpYVRpbWVVcywgbm93VXMpOworICAgICAgICB9CisgICAgICAgIGlmICghbUhhc0F1ZGlvKSB7CisgICAgICAgICAgICBtQW5jaG9yTWF4TWVkaWFVcyA9IG1lZGlhVGltZVVzICsgMTAwMDAwOyAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcworICAgICAgICB9CiAKLSAgICAgICAgICAgIGRlbGF5VXMgPSByZWFsVGltZVVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgLy8gSGV1cmlzdGljcyB0byBoYW5kbGUgc2l0dWF0aW9uIHdoZW4gbWVkaWEgdGltZSBjaGFuZ2VkIHdpdGhvdXQgYQorICAgICAgICAvLyBkaXNjb250aW51aXR5LiBJZiB3ZSBoYXZlIG5vdCBkcmFpbmVkIGFuIGF1ZGlvIGJ1ZmZlciB0aGF0IHdhcworICAgICAgICAvLyByZWNlaXZlZCBhZnRlciB0aGlzIGJ1ZmZlciwgcmVwb3N0IGluIDEwIG1zZWMuIE90aGVyd2lzZSByZXBvc3QKKyAgICAgICAgLy8gaW4gNTAwIG1zZWMuCisgICAgICAgIGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7CisgICAgICAgIGlmIChkZWxheVVzID4gNTAwMDAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBvc3REZWxheVVzID0gNTAwMDAwOworICAgICAgICAgICAgaWYgKG1IYXNBdWRpbyAmJiAobUxhc3RBdWRpb0J1ZmZlckRyYWluZWQgLSBlbnRyeS5tQnVmZmVyT3JkaW5hbCkgPD0gMCkgeworICAgICAgICAgICAgICAgIHBvc3REZWxheVVzID0gMTAwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFdoYXQoa1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdChwb3N0RGVsYXlVcyk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPnJlc3RhcnQoKTsKKyAgICAgICAgICAgIEFMT0dJKCJwb3NzaWJsZSB2aWRlbyB0aW1lIGp1bXAgb2YgJWRtcywgcmV0cnlpbmcgaW4gJWRtcyIsCisgICAgICAgICAgICAgICAgICAgIChpbnQpKGRlbGF5VXMgLyAxMDAwKSwgKGludCkocG9zdERlbGF5VXMgLyAxMDAwKSk7CisgICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CisgICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKKyAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKKworICAgIGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7CisKKyAgICBBTE9HV19JRihkZWxheVVzID4gNTAwMDAwLCAidW51c3VhbGx5IGhpZ2ggZGVsYXlVczogJSIgUFJJZDY0LCBkZWxheVVzKTsKKyAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKKyAgICAvLyBGSVhNRSBjdXJyZW50bHkgdGhpcyBpbmNyZWFzZXMgcG93ZXIgY29uc3VtcHRpb24sIHNvIHVubGVzcyBmcmFtZS1hY2N1cmF0ZQorICAgIC8vIEFWIHN5bmMgaXMgcmVxdWVzdGVkLCBwb3N0IGNsb3NlciB0byByZXF1aXJlZCByZW5kZXIgdGltZSAoYXQgMC42MyB2c3luY3MpCisgICAgaWYgKCFzRnJhbWVBY2N1cmF0ZUFWc3luYykgeworICAgICAgICB0d29Wc3luY3NVcyA+Pj0gNDsKKyAgICB9CisgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiB0d29Wc3luY3NVcyA/IGRlbGF5VXMgLSB0d29Wc3luY3NVcyA6IDApOwogCiAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOwogfQpAQCAtMzk5LDEyICs4MTcsMTEgQEAKICAgICAgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7CiAgICAgICAgIGVudHJ5ID0gTlVMTDsKIAotICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDBsbDsKLQotICAgICAgICBub3RpZnlQb3NpdGlvbigpOworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaW50NjRfdCBub3dVcyA9IC0xOwogICAgIGludDY0X3QgcmVhbFRpbWVVczsKICAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmcmVhbFRpbWVVcykpOwpAQCAtNDEyLDM3ICs4MjksNTEgQEAKICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAotICAgICAgICByZWFsVGltZVVzID0gbWVkaWFUaW1lVXMgLSBtQW5jaG9yVGltZU1lZGlhVXMgKyBtQW5jaG9yVGltZVJlYWxVczsKKyAgICAgICAgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICByZWFsVGltZVVzID0gZ2V0UmVhbFRpbWVVcyhtZWRpYVRpbWVVcywgbm93VXMpOwogICAgIH0KIAotICAgIG1WaWRlb0xhdGVCeVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHJlYWxUaW1lVXM7Ci0gICAgYm9vbCB0b29MYXRlID0gKG1WaWRlb0xhdGVCeVVzID4gNDAwMDApOworICAgIGJvb2wgdG9vTGF0ZSA9IGZhbHNlOwogCi0gICAgaWYgKHRvb0xhdGUpIHsKLSAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCi0gICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMsIG1WaWRlb0xhdGVCeVVzIC8gMUU2KTsKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgaWYgKG5vd1VzID09IC0xKSB7CisgICAgICAgICAgICBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcyhub3dVcyAtIHJlYWxUaW1lVXMpOworICAgICAgICB0b29MYXRlID0gKG1WaWRlb0xhdGVCeVVzID4gNDAwMDApOworCisgICAgICAgIGlmICh0b29MYXRlKSB7CisgICAgICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMsIG1WaWRlb0xhdGVCeVVzIC8gMUU2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgdmlkZW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUgPyByZWFsVGltZVVzIDoKKyAgICAgICAgICAgICAgICAgICAgKHJlYWxUaW1lVXMgKyBtQW5jaG9yVGltZU1lZGlhVXMgLSBtQW5jaG9yVGltZVJlYWxVcykpIC8gMUU2KTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgdmlkZW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgotICAgICAgICAgICAgICAgIChyZWFsVGltZVVzICsgbUFuY2hvclRpbWVNZWRpYVVzIC0gbUFuY2hvclRpbWVSZWFsVXMpKSAvIDFFNik7Ci0gICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXItPnJlbmRlcihlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpLCBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpLCBOVUxMKTsKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKKyAgICAgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCAmJiAhbUhhc0F1ZGlvKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIGEgZmx1c2ggd29uJ3QgYmUgdXNlZCBhcyBhbmNob3IKKyAgICAgICAgICAgIC8vIHdoZW4gcmVuZGVyZXIgaXMgaW4gcGF1c2VkIHN0YXRlLCBiZWNhdXNlIHJlc3VtZSBjYW4gaGFwcGVuIGFueSB0aW1lIGFmdGVyIHNlZWsuCisgICAgICAgICAgICBzZXRBbmNob3JUaW1lKC0xLCAtMSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMGxsKTsKICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQzMigicmVuZGVyIiwgIXRvb0xhdGUpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKICAgICBlbnRyeSA9IE5VTEw7CiAKLSAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IHRydWU7CisKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgaWYgKCFtVmlkZW9SZW5kZXJpbmdTdGFydGVkKSB7CisgICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOwogICAgIH0KLQotICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7Ci0KLSAgICBub3RpZnlQb3NpdGlvbigpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpIHsKQEAgLTQ1MSwyMiArODgyLDI5IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQpIHsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKICAgICBub3RpZnktPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKLSAgICBub3RpZnktPnBvc3QoKTsKKyAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24sIGlkKCkpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25RdWV1ZUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgYXVkaW87CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOworICAgIHNldEhhc01lZGlhKGF1ZGlvKTsKKworICAgIGlmIChtSGFzVmlkZW8pIHsKKyAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYXVkaW8sIG1zZykpIHsKQEAgLTQ4NCwxNSArOTIyLDE4IEBACiAgICAgZW50cnkubU5vdGlmeUNvbnN1bWVkID0gbm90aWZ5Q29uc3VtZWQ7CiAgICAgZW50cnkubU9mZnNldCA9IDA7CiAgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gT0s7CisgICAgZW50cnkubUJ1ZmZlck9yZGluYWwgPSArK21Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CiAKICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9IGVsc2UgewogICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1TeW5jUXVldWVzIHx8IG1BdWRpb1F1ZXVlLmVtcHR5KCkgfHwgbVZpZGVvUXVldWUuZW1wdHkoKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTAyLDcgKzk0Myw3IEBACiAKICAgICBpZiAoZmlyc3RBdWRpb0J1ZmZlciA9PSBOVUxMIHx8IGZpcnN0VmlkZW9CdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBFT1Mgc2lnbmFsbGVkIG9uIGVpdGhlciBxdWV1ZS4KLSAgICAgICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01MjYsMTAgKzk2NywxMCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzeW5jUXVldWVzRG9uZSgpIHsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzeW5jUXVldWVzRG9uZV9sKCkgewogICAgIGlmICghbVN5bmNRdWV1ZXMpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUzNyw3ICs5NzgsNyBAQAogICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CiAKICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9CiAKICAgICBpZiAoIW1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKQEAgLTU2MSwxNCArMTAwMiwxNiBAQAogICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IGZpbmFsUmVzdWx0OwogCiAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgIGlmIChtQXVkaW9RdWV1ZS5lbXB0eSgpICYmIG1TeW5jUXVldWVzKSB7Ci0gICAgICAgICAgICBzeW5jUXVldWVzRG9uZSgpOworICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogICAgICAgICB9CiAgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKLSAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwogICAgICAgICB9CiAgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CiAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKQEAgLTU3OSw2ICsxMDIyLDE1IEBACiAgICAgaW50MzJfdCBhdWRpbzsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOworICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN5bmNpbmcgdGhlIHF1ZXVlcywgaS5lLiBkcm9wcGluZyBhdWRpbyB3aGlsZQogICAgIC8vIGFsaWduaW5nIHRoZSBmaXJzdCBhdWRpby92aWRlbyBidWZmZXIgdGltZXMgYW5kIG9ubHkgb25lIG9mIHRoZQogICAgIC8vIHR3byBxdWV1ZXMgaGFzIGRhdGEsIHdlIG1heSBzdGFydmUgdGhhdCBxdWV1ZSBieSBub3QgcmVxdWVzdGluZwpAQCAtNTg3LDMxICsxMDM5LDQ3IEBACiAgICAgLy8gY29ycmVzcG9uZGluZyBkaXNjb250aW51aXR5IG9uIHRoZSBvdGhlciBxdWV1ZS4KICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgc3RvcCBzeW5jaW5nIHRoZSBxdWV1ZXMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0KICAgICAvLyBpcyBmbHVzaGVkLgotICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgeworICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICAgICAgIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoLTEpOworICAgIH0KIAogICAgIEFMT0dWKCJmbHVzaGluZyAlcyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgIGlmIChhdWRpbykgewotICAgICAgICBmbHVzaFF1ZXVlKCZtQXVkaW9RdWV1ZSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBmbHVzaFF1ZXVlKCZtQXVkaW9RdWV1ZSk7CiAKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwotICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IGZhbHNlOworICAgICAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworCisgICAgICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZSgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKIAotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGZsdXNoUXVldWUoJm1WaWRlb1F1ZXVlKTsKIAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7Ci0gICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gZmFsc2U7Ci0KICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CiAKKyAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPnJlc3RhcnQoKTsKKyAgICAgICAgfQorCiAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CiAgICAgfQogCisgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSBmYWxzZTsKICAgICBub3RpZnlGbHVzaENvbXBsZXRlKGF1ZGlvKTsKIH0KIApAQCAtNjYxLDcwICsxMTI5LDczIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkF1ZGlvU2lua0NoYW5nZWQoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgQ0hFQ0soIW1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nKTsKICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7CisgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSAtMTsKICAgICB1aW50MzJfdCB3cml0dGVuOwogICAgIGlmIChtQXVkaW9TaW5rLT5nZXRGcmFtZXNXcml0dGVuKCZ3cml0dGVuKSA9PSBPSykgewogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IHdyaXR0ZW47CiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5UG9zaXRpb24oKSB7Ci0gICAgaWYgKG1BbmNob3JUaW1lUmVhbFVzIDwgMCB8fCBtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIGlmIChtTGFzdFBvc2l0aW9uVXBkYXRlVXMgPj0gMAotICAgICAgICAgICAgJiYgbm93VXMgPCBtTGFzdFBvc2l0aW9uVXBkYXRlVXMgKyBrTWluUG9zaXRpb25VcGRhdGVEZWxheVVzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUxhc3RQb3NpdGlvblVwZGF0ZVVzID0gbm93VXM7Ci0KLSAgICBpbnQ2NF90IHBvc2l0aW9uVXMgPSAobm93VXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKyBtQW5jaG9yVGltZU1lZGlhVXM7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UG9zaXRpb24pOwotICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBwb3NpdGlvblVzKTsKLSAgICBub3RpZnktPnNldEludDY0KCJ2aWRlb0xhdGVCeVVzIiwgbVZpZGVvTGF0ZUJ5VXMpOwotICAgIG5vdGlmeS0+cG9zdCgpOwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uRGlzYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1GbGFncyAmPSB+RkxBR19PRkZMT0FEX0FVRElPOworICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25QYXVzZSgpIHsKLSAgICBDSEVDSyghbVBhdXNlZCk7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgQUxPR1coIlJlbmRlcmVyOjpvblBhdXNlKCkgY2FsbGVkIHdoaWxlIGFscmVhZHkgcGF1c2VkISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICB9CiAKICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwotCiAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKLQotICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CiAKICAgICBpZiAobUhhc0F1ZGlvKSB7CiAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAgICAgfQogCiAgICAgQUxPR1YoIm5vdyBwYXVzZWQgYXVkaW8gcXVldWUgaGFzICVkIGVudHJpZXMsIHZpZGVvIGhhcyAlZCBlbnRyaWVzIiwKICAgICAgICAgICBtQXVkaW9RdWV1ZS5zaXplKCksIG1WaWRlb1F1ZXVlLnNpemUoKSk7Ci0KLSAgICBtUGF1c2VkID0gdHJ1ZTsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uUmVzdW1lKCkgeworICAgIHJlYWRQcm9wZXJ0aWVzKCk7CisKICAgICBpZiAoIW1QYXVzZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChtSGFzQXVkaW8pIHsKKyAgICAgICAgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgaWYgKG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzICE9IC0xKSB7CisgICAgICAgIGludDY0X3QgbmV3QW5jaG9yUmVhbFVzID0KKyAgICAgICAgICAgIG1BbmNob3JUaW1lUmVhbFVzICsgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzOworICAgICAgICBzZXRBbmNob3JUaW1lKAorICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcywgbmV3QW5jaG9yUmVhbFVzLCBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgdHJ1ZSAvKiByZXN1bWUgKi8pOworICAgIH0KIAogICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0KIAogICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewpAQCAtNzMyLDUgKzEyMDMsMjQyIEBACiAgICAgfQogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKKyAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICB9CisgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7Cit9CisKKy8vIFRPRE86IFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxscyB0byBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoKQorLy8gYXMgaXQgYWNxdWlyZXMgbG9ja3MgYW5kIG1heSBxdWVyeSB0aGUgYXVkaW8gZHJpdmVyLgorLy8KKy8vIFNvbWUgY2FsbHMgY291bGQgY29uY2VpdmFibHkgcmV0cmlldmUgZXh0cmFwb2xhdGVkIGRhdGEgaW5zdGVhZCBvZgorLy8gYWNjZXNzaW5nIGdldFRpbWVzdGFtcCgpIG9yIGdldFBvc2l0aW9uKCkgZXZlcnkgdGltZSBhIGRhdGEgYnVmZmVyIHdpdGgKKy8vIGEgbWVkaWEgdGltZSBpcyByZWNlaXZlZC4KKy8vCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIHsKKyAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICBBdWRpb1RpbWVzdGFtcCB0czsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU3RhbGVUaW1lc3RhbXAxMDBtcyA9IDEwMDAwMDsKKworICAgIHN0YXR1c190IHJlcyA9IG1BdWRpb1NpbmstPmdldFRpbWVzdGFtcCh0cyk7CisgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgorICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CisgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0KKyAgICAgICAgICAgIHRzLm1UaW1lLnR2X3NlYyAqIDEwMDAwMDBMTCArIHRzLm1UaW1lLnR2X25zZWMgLyAxMDAwOworICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVzdGFtcEFnZSA9IG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgICAgIGlmICh0aW1lc3RhbXBBZ2UgPiBrU3RhbGVUaW1lc3RhbXAxMDBtcykgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBhdWRpbyBGSVhNRS4KKyAgICAgICAgICAgIC8vIGdldFRpbWVzdGFtcCByZXR1cm5zIGEgdGltZXN0YW1wIHdoaWNoIG1heSBjb21lIGZyb20gYXVkaW8gbWl4aW5nIHRocmVhZHMuCisgICAgICAgICAgICAvLyBBZnRlciBwYXVzaW5nLCB0aGUgTWl4ZXJUaHJlYWQgbWF5IGdvIGlkbGUsIHRodXMgdGhlIG1UaW1lIGVzdGltYXRlIG1heQorICAgICAgICAgICAgLy8gYmVjb21lIHN0YWxlLiBBc3N1bWluZyB0aGF0IHRoZSBNaXhlclRocmVhZCBydW5zIDIwbXMsIHdpdGggRmFzdE1peGVyIGF0IDVtcywKKyAgICAgICAgICAgIC8vIHRoZSBtYXggbGF0ZW5jeSBzaG91bGQgYmUgYWJvdXQgMjVtcyB3aXRoIGFuIGF2ZXJhZ2UgYXJvdW5kIDEybXMgKHRvIGJlIHZlcmlmaWVkKS4KKyAgICAgICAgICAgIC8vIEZvciBzYWZldHkgd2UgdXNlIDEwMG1zLgorICAgICAgICAgICAgQUxPR1YoImdldFRpbWVzdGFtcDogcmV0dXJuZWQgc3RhbGUgdGltZXN0YW1wIG5vd1VzKCVsbGQpIG51bUZyYW1lc1BsYXllZEF0KCVsbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylub3dVcywgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzIC0ga1N0YWxlVGltZXN0YW1wMTAwbXM7CisgICAgICAgIH0KKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeyAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVczsKKyAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKKyAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAzOiB0cmFuc2l0b3J5IGF0IG5ldyB0cmFjayBvciBhdWRpbyBmYXN0IHRyYWNrcy4KKyAgICAgICAgcmVzID0gbUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7CisgICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPSBub3dVczsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgKz0gMTAwMExMICogbUF1ZGlvU2luay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCisgICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCBudW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgfQorCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZSAoaW50MzJfdCkgY2FzdGluZyBiZWxvdyBhcyBpdCBtYXkgb3ZlcmZsb3cgYXQgMTIuNCBob3Vycy4KKyAgICAvL0NIRUNLX0VRKG51bUZyYW1lc1BsYXllZCAmICgxIDw8IDMxKSwgMCk7ICAvLyBjYW4ndCBiZSBuZWdhdGl2ZSB1bnRpbCAxMi40IGhycywgdGVzdAorICAgIGludDY0X3QgZHVyYXRpb25VcyA9IChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXNQbGF5ZWQgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpCisgICAgICAgICAgICArIG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXQ7CisgICAgaWYgKGR1cmF0aW9uVXMgPCAwKSB7CisgICAgICAgIC8vIE9jY3VycyB3aGVuIG51bUZyYW1lc1BsYXllZCBwb3NpdGlvbiBpcyB2ZXJ5IHNtYWxsIGFuZCB0aGUgZm9sbG93aW5nOgorICAgICAgICAvLyAoMSkgSW4gY2FzZSAxLCB0aGUgdGltZSBub3dVcyBpcyBjb21wdXRlZCBiZWZvcmUgZ2V0VGltZXN0YW1wKCkgaXMgY2FsbGVkIGFuZAorICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkQXQgaXMgZ3JlYXRlciB0aGFuIG5vd1VzIGJ5IHRpbWUgbW9yZSB0aGFuIG51bUZyYW1lc1BsYXllZC4KKyAgICAgICAgLy8gKDIpIEluIGNhc2UgMywgdXNpbmcgZ2V0UG9zaXRpb24gYW5kIGFkZGluZyBtQXVkaW9TaW5rLT5sYXRlbmN5KCkgdG8KKyAgICAgICAgLy8gICAgIG51bUZyYW1lc1BsYXllZEF0LCBieSBhIHRpbWUgYW1vdW50IGdyZWF0ZXIgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJvdGggb2YgdGhlc2UgYXJlIHRyYW5zaXRvcnkgY29uZGl0aW9ucy4KKyAgICAgICAgQUxPR1YoImdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VczogbmVnYXRpdmUgZHVyYXRpb24gJWxsZCBzZXQgdG8gemVybyIsIChsb25nIGxvbmcpZHVyYXRpb25Vcyk7CisgICAgICAgIGR1cmF0aW9uVXMgPSAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKCVsbGQpIG5vd1VzKCVsbGQpIGZyYW1lcygldSkgZnJhbWVzQXQoJWxsZCkiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylkdXJhdGlvblVzLCAobG9uZyBsb25nKW5vd1VzLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIHJldHVybiBkdXJhdGlvblVzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25BdWRpb09mZmxvYWRUZWFyRG93bihBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiByZWFzb24pIHsKKyAgICBpZiAobUF1ZGlvT2ZmbG9hZFRvcm5Eb3duKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duID0gdHJ1ZTsKKworICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CisgICAgICAgIGN1cnJlbnRQb3NpdGlvblVzID0gMDsKKyAgICB9CisKKyAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBdWRpb09mZmxvYWRUZWFyRG93bik7CisgICAgbm90aWZ5LT5zZXRJbnQ2NCgicG9zaXRpb25VcyIsIGN1cnJlbnRQb3NpdGlvblVzKTsKKyAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3Qoa09mZmxvYWRQYXVzZU1heFVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICsrbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b25PcGVuQXVkaW9TaW5rKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZE9ubHkoJWQpIG9mZmxvYWRpbmdBdWRpbyglZCkiLAorICAgICAgICAgICAgb2ZmbG9hZE9ubHksIG9mZmxvYWRpbmdBdWRpbygpKTsKKyAgICBib29sIGF1ZGlvU2lua0NoYW5nZWQgPSBmYWxzZTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKKworICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICAvLyBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBkZXJpdmUgdGhlIG1hc2sgZnJvbSBjb3VudC4KKyAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CisgICAgfQorCisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CisKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwgbWltZS5jX3N0cigpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGRuJ3QgbWFwIG1pbWUgXCIlc1wiIHRvIGEgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZm9ybWF0IiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIk1pbWUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgMHgleCIsCisgICAgICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwgYXVkaW9Gb3JtYXQpOworCisgICAgICAgICAgICBpbnQgYXZnQml0UmF0ZSA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImJpdC1yYXRlIiwgJmF2Z0JpdFJhdGUpOworCisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDCisgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJhYWMtcHJvZmlsZSIsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgICAgIC8vIFJlZGVmaW5lIEFBQyBmb3JtYXQgYXMgcGVyIGFhYyBwcm9maWxlCisgICAgICAgICAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1Byb2ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvblVzIiwgJm9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmJpdF9yYXRlID0gYXZnQml0UmF0ZTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaXNfc3RyZWFtaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKG1lbWNtcCgmbUN1cnJlbnRPZmZsb2FkSW5mbywgJm9mZmxvYWRJbmZvLCBzaXplb2Yob2ZmbG9hZEluZm8pKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG5vIGNoYW5nZSBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgZnJvbSBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBldmVyeXRoaW5nIG9rLgorICAgICAgICAgICAgICAgIHJldHVybiBvZmZsb2FkaW5nQXVkaW8oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiB0cnkgdG8gb3BlbiBBdWRpb1NpbmsgaW4gb2ZmbG9hZCBtb2RlIik7CisgICAgICAgICAgICBmbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOworICAgICAgICAgICAgZmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZvZmZsb2FkSW5mbyk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGxheWJhY2sgaXMgb2ZmbG9hZGVkIHRvIGgvdywgd2UgcGFzcworICAgICAgICAgICAgICAgIC8vIHRoZSBIQUwgc29tZSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yIFBDTSBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBnb2luZyB0aHJvdWdoIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIKKyAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVhY2hpbmcgdGhlIGhhcmR3YXJlLgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gb2ZmbG9hZEluZm87CisgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVl9JRihlcnIgPT0gT0ssICJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwLCBmYWxsIGJhY2sgdG8gbm9uIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghb2ZmbG9hZE9ubHkgJiYgIW9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIGZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOworICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb3BlbiBBdWRpb1NpbmsgaW4gTk9OLW9mZmxvYWQgbW9kZSIpOworCisgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+b3BlbigKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncyksCisgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgfQorICAgIGlmIChhdWRpb1NpbmtDaGFuZ2VkKSB7CisgICAgICAgIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIH0KKworICAgIHJldHVybiBvZmZsb2FkaW5nQXVkaW8oKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQ2xvc2VBdWRpb1NpbmsoKSB7CisgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggOTEyNGUwMy4uN2I0NmE1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yMywxNiArMjMsMjIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1jbGFzcyBTb2Z0d2FyZVJlbmRlcmVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewogICAgICAgICBGTEFHX1JFQUxfVElNRSA9IDEsCisgICAgICAgIEZMQUdfT0ZGTE9BRF9BVURJTyA9IDIsCiAgICAgfTsKICAgICBSZW5kZXJlcihjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKIAorICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKm1lLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpOworCiAgICAgdm9pZCBxdWV1ZUJ1ZmZlcigKICAgICAgICAgICAgIGJvb2wgYXVkaW8sCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLApAQCAtNDYsMTggKzUyLDQ3IEBACiAKICAgICB2b2lkIHNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKTsKIAorICAgIHZvaWQgc2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOworCiAgICAgdm9pZCBwYXVzZSgpOwogICAgIHZvaWQgcmVzdW1lKCk7CiAKKyAgICB2b2lkIHNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcyk7CisKKyAgICAvLyBGb2xsb3dpbmcgc2V0dGVycyBhbmQgZ2V0dGVycyBhcmUgcHJvdGVjdGVkIGJ5IG1UaW1lTG9jay4KKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyA9IGZhbHNlKTsKKyAgICB2b2lkIHNldEhhc01lZGlhKGJvb2wgYXVkaW8pOworICAgIHZvaWQgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoaW50NjRfdCBtZWRpYVVzKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQoaW50NjRfdCBtZWRpYVVzKTsKKyAgICB2b2lkIHNldEFuY2hvclRpbWUoCisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMsIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90IG51bUZyYW1lc1dyaXR0ZW4gPSAtMSwgYm9vbCByZXN1bWUgPSBmYWxzZSk7CisgICAgdm9pZCBzZXRWaWRlb0xhdGVCeVVzKGludDY0X3QgbGF0ZVVzKTsKKyAgICBpbnQ2NF90IGdldFZpZGVvTGF0ZUJ5VXMoKTsKKyAgICB2b2lkIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoaW50NjRfdCByZWFsVXMpOworCisgICAgYm9vbCBvcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CisKICAgICBlbnVtIHsKICAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAogICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGUgICAgICAgPSAnZmx1QycsCiAgICAgICAgIGtXaGF0UG9zaXRpb24gICAgICAgICAgICA9ICdwb3NpJywKICAgICAgICAga1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0ID0gJ3ZkcmQnLAogICAgICAgICBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQgPSAnbWRyZCcsCisgICAgICAgIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24gPSAnYU9URCcsCisgICAgICAgIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0ID0gJ2FPUFQnLAogICAgIH07CiAKLSAgICB2b2lkIHNldFNvZnRSZW5kZXJlcihTb2Z0d2FyZVJlbmRlcmVyICpzb2Z0UmVuZGVyZXIpOworICAgIGVudW0gQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24geworICAgICAgICBrRHVlVG9FcnJvciA9IDAsCisgICAgICAgIGtEdWVUb1RpbWVvdXQsCisgICAgfTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflJlbmRlcmVyKCk7CkBAIC02NiwxNCArMTAxLDIwIEBACiAKIHByaXZhdGU6CiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0RHJhaW5BdWRpb1F1ZXVlICAgID0gJ2RyYUEnLAotICAgICAgICBrV2hhdERyYWluVmlkZW9RdWV1ZSAgICA9ICdkcmFWJywKLSAgICAgICAga1doYXRRdWV1ZUJ1ZmZlciAgICAgICAgPSAncXVlQicsCi0gICAgICAgIGtXaGF0UXVldWVFT1MgICAgICAgICAgID0gJ3FFT1MnLAotICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKLSAgICAgICAga1doYXRBdWRpb1NpbmtDaGFuZ2VkICAgPSAnYXVTQycsCi0gICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgID0gJ3BhdXMnLAotICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICA9ICdyZXNtJywKKyAgICAgICAga1doYXREcmFpbkF1ZGlvUXVldWUgICAgID0gJ2RyYUEnLAorICAgICAgICBrV2hhdERyYWluVmlkZW9RdWV1ZSAgICAgPSAnZHJhVicsCisgICAgICAgIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSA9ICdwRFZRJywKKyAgICAgICAga1doYXRRdWV1ZUJ1ZmZlciAgICAgICAgID0gJ3F1ZUInLAorICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICAgPSAncUVPUycsCisgICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRBdWRpb1NpbmtDaGFuZ2VkICAgID0gJ2F1U0MnLAorICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgPSAncGF1cycsCisgICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgICA9ICdyZXNtJywKKyAgICAgICAga1doYXRPcGVuQXVkaW9TaW5rICAgICAgID0gJ29wbkEnLAorICAgICAgICBrV2hhdENsb3NlQXVkaW9TaW5rICAgICAgPSAnY2xzQScsCisgICAgICAgIGtXaGF0U3RvcEF1ZGlvU2luayAgICAgICA9ICdzdHBBJywKKyAgICAgICAga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvID0gJ25vT0EnLAorICAgICAgICBrV2hhdFNldFZpZGVvRnJhbWVSYXRlICAgPSAnc1ZGUicsCiAgICAgfTsKIAogICAgIHN0cnVjdCBRdWV1ZUVudHJ5IHsKQEAgLTgxLDQ0ICsxMjIsNzIgQEAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlDb25zdW1lZDsKICAgICAgICAgc2l6ZV90IG1PZmZzZXQ7CiAgICAgICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKyAgICAgICAgaW50MzJfdCBtQnVmZmVyT3JkaW5hbDsKICAgICB9OwogCiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pblBvc2l0aW9uVXBkYXRlRGVsYXlVczsKIAogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotICAgIFNvZnR3YXJlUmVuZGVyZXIgKm1Tb2Z0UmVuZGVyZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgTXV0ZXggbUxvY2s7CiAgICAgdWludDMyX3QgbUZsYWdzOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CiAgICAgaW50MzJfdCBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CiAKKyAgICBNdXRleCBtVGltZUxvY2s7CisgICAgLy8gfG1UaW1lTG9ja3wgcHJvdGVjdHMgdGhlIGZvbGxvd2luZyA3IG1lbWJlciB2YXJzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGltZS4KKyAgICAvLyBOb3RlOiB0aG9zZSBtZW1iZXJzIGFyZSBvbmx5IHdyaXR0ZW4gb24gUmVuZGVyZXIgdGhyZWFkLCBzbyByZWFkaW5nIG9uIFJlbmRlcmVyIHRocmVhZAorICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQuIE90aGVyd2lzZSBhY2Nlc3NpbmcgdGhvc2UgbWVtYmVycyBtdXN0IGJlIHByb3RlY3RlZCBieQorICAgIC8vIHxtVGltZUxvY2t8LgorICAgIC8vIFRPRE86IG1vdmUgdGhvc2UgbWVtYmVycyB0byBhIHNlcGVyYXRlZCBtZWRpYSBjbG9jayBjbGFzcy4KKyAgICBpbnQ2NF90IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CiAgICAgaW50NjRfdCBtQW5jaG9yVGltZU1lZGlhVXM7CiAgICAgaW50NjRfdCBtQW5jaG9yVGltZVJlYWxVczsKKyAgICBpbnQ2NF90IG1BbmNob3JOdW1GcmFtZXNXcml0dGVuOworICAgIGludDY0X3QgbUFuY2hvck1heE1lZGlhVXM7CisgICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKKyAgICBib29sIG1IYXNBdWRpbzsKKyAgICBib29sIG1IYXNWaWRlbzsKKyAgICBpbnQ2NF90IG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzOwogCiAgICAgTXV0ZXggbUZsdXNoTG9jazsgIC8vIHByb3RlY3RzIHRoZSBmb2xsb3dpbmcgMiBtZW1iZXIgdmFycy4KICAgICBib29sIG1GbHVzaGluZ0F1ZGlvOwogICAgIGJvb2wgbUZsdXNoaW5nVmlkZW87CiAKLSAgICBib29sIG1IYXNBdWRpbzsKLSAgICBib29sIG1IYXNWaWRlbzsKICAgICBib29sIG1TeW5jUXVldWVzOwogCiAgICAgYm9vbCBtUGF1c2VkOworICAgIGJvb2wgbVZpZGVvU2FtcGxlUmVjZWl2ZWQ7CiAgICAgYm9vbCBtVmlkZW9SZW5kZXJpbmdTdGFydGVkOwogICAgIGludDMyX3QgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uOwogCiAgICAgaW50NjRfdCBtTGFzdFBvc2l0aW9uVXBkYXRlVXM7Ci0gICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKKworICAgIGludDMyX3QgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247CisgICAgYm9vbCBtQXVkaW9PZmZsb2FkVG9ybkRvd247CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgbUN1cnJlbnRPZmZsb2FkSW5mbzsKKworICAgIGludDMyX3QgbVRvdGFsQnVmZmVyc1F1ZXVlZDsKKyAgICBpbnQzMl90IG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkOworCisKKyAgICBzaXplX3QgZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCiAgICAgYm9vbCBvbkRyYWluQXVkaW9RdWV1ZSgpOwotICAgIHZvaWQgcG9zdERyYWluQXVkaW9RdWV1ZShpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKyAgICBpbnQ2NF90IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpOworICAgIGludDY0X3QgZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKGludDY0X3Qgbm93VXMpOworICAgIHZvaWQgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcyA9IDApOworCisgICAgdm9pZCBvbk5ld0F1ZGlvTWVkaWFUaW1lKGludDY0X3QgbWVkaWFUaW1lVXMpOworICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKTsKIAogICAgIHZvaWQgb25EcmFpblZpZGVvUXVldWUoKTsKICAgICB2b2lkIHBvc3REcmFpblZpZGVvUXVldWUoKTsKQEAgLTEzMCwxOCArMTk5LDMzIEBACiAgICAgdm9pZCBvblF1ZXVlRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25BdWRpb1NpbmtDaGFuZ2VkKCk7CisgICAgdm9pZCBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKICAgICB2b2lkIG9uUmVzdW1lKCk7CisgICAgdm9pZCBvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcyk7CisgICAgdm9pZCBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHJlYXNvbik7CisgICAgYm9vbCBvbk9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgb25DbG9zZUF1ZGlvU2luaygpOwogCi0gICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQpOworICAgIHZvaWQgbm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMgPSAwKTsKICAgICB2b2lkIG5vdGlmeUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbyk7CiAgICAgdm9pZCBub3RpZnlQb3NpdGlvbigpOwogICAgIHZvaWQgbm90aWZ5VmlkZW9MYXRlQnkoaW50NjRfdCBsYXRlQnlVcyk7CiAgICAgdm9pZCBub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCk7CisgICAgdm9pZCBub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpOwogCiAgICAgdm9pZCBmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKTsKICAgICBib29sIGRyb3BCdWZmZXJXaGlsZUZsdXNoaW5nKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgdm9pZCBzeW5jUXVldWVzRG9uZV9sKCk7CisKKyAgICBib29sIG9mZmxvYWRpbmdBdWRpbygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX09GRkxPQURfQVVESU8pICE9IDA7IH0KKworICAgIHZvaWQgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKKyAgICB2b2lkIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVuZGVyZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKaW5kZXggMTEyNzlmYy4uMmYwNmMzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKQEAgLTIxLDExICsyMSwxNSBAQAogI2luY2x1ZGUgIk51UGxheWVyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IE1ldGFEYXRhOworc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0zNCwxNiArMzgsMjAgQEAKICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEICAgPSA0LCAgLy8gdGhlICIxMCBzZWMgZm9yd2FyZCBidXR0b24iCiAgICAgICAgIEZMQUdfQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCiAgICAgICAgIEZMQUdfRFlOQU1JQ19EVVJBVElPTiAgID0gMTYsCisgICAgICAgIEZMQUdfU0VDVVJFICAgICAgICAgICAgID0gMzIsCiAgICAgfTsKIAogICAgIGVudW0gewogICAgICAgICBrV2hhdFByZXBhcmVkLAogICAgICAgICBrV2hhdEZsYWdzQ2hhbmdlZCwKICAgICAgICAga1doYXRWaWRlb1NpemVDaGFuZ2VkLAorICAgICAgICBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSwKICAgICAgICAga1doYXRCdWZmZXJpbmdTdGFydCwKICAgICAgICAga1doYXRCdWZmZXJpbmdFbmQsCiAgICAgICAgIGtXaGF0U3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdFRpbWVkVGV4dERhdGEsCiAgICAgICAgIGtXaGF0UXVldWVEZWNvZGVyU2h1dGRvd24sCisgICAgICAgIGtXaGF0RHJtTm9MaWNlbnNlLAogICAgIH07CiAKICAgICAvLyBUaGUgcHJvdmlkZXMgbWVzc2FnZSBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgcGxheWVyIGFib3V0IHZhcmlvdXMKQEAgLTU5LDExICs2NywxNiBAQAogICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpIHt9CiAgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpIHt9CiAKKyAgICAvLyBFeHBsaWNpdGx5IGRpc2Nvbm5lY3QgdGhlIHVuZGVybGluZyBkYXRhIHNvdXJjZQorICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkge30KKwogICAgIC8vIFJldHVybnMgT0sgaWZmIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlLAogICAgIC8vIGFuIGVycm9yIG9yIEVSUk9SX0VORF9PRl9TVFJFQU0gaWYgbm90LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIC8qIGF1ZGlvICovKSB7IHJldHVybiBOVUxMOyB9CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KAogICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpID0gMDsKQEAgLTcyLDcgKzg1LDE1IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIC8qIHJlcGx5ICovKSBjb25zdCB7CisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCAvKiB0cmFja0luZGV4ICovKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgLyogdHlwZSAqLykgY29uc3QgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC04NCw2ICsxMDUsMTAgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIC8qIGF1ZGlvICovLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJi8qIGJ1ZmZlcnMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3QgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTMsMTIgKzExOCwxMCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCAvKiBhdWRpbyAqLykgeyByZXR1cm4gTlVMTDsgfQotCiAgICAgc3A8QU1lc3NhZ2U+IGR1cE5vdGlmeSgpIGNvbnN0IHsgcmV0dXJuIG1Ob3RpZnktPmR1cCgpOyB9CiAKICAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncyk7Ci0gICAgdm9pZCBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQgPSBOVUxMKTsKICAgICB2b2lkIG5vdGlmeVByZXBhcmVkKHN0YXR1c190IGVyciA9IE9LKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCAxOGNmNmQxLi5mZmFjYjhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTXlIYW5kbGVyLmgiCiAjaW5jbHVkZSAiU0RQTG9hZGVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTMzLDEyICszNCwxNCBAQAogCiBOdVBsYXllcjo6UlRTUFNvdXJjZTo6UlRTUFNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgIGJvb2wgdWlkVmFsaWQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgYm9vbCBpc1NEUCkKICAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1VUkwodXJsKSwKICAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCiAgICAgICBtVUlEKHVpZCksCkBAIC02Nyw2ICs3MCw3IEBACiAKIE51UGxheWVyOjpSVFNQU291cmNlOjp+UlRTUFNvdXJjZSgpIHsKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwogICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CiAgICAgfQogfQpAQCAtNzcsMTQgKzgxLDEzIEBACiAgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AiKTsKICAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKIAotICAgICAgICBtUmVmbGVjdG9yID0gbmV3IEFIYW5kbGVyUmVmbGVjdG9yPFJUU1BTb3VyY2U+KHRoaXMpOwotICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKICAgICB9CiAKICAgICBDSEVDSyhtSGFuZGxlciA9PSBOVUxMKTsKICAgICBDSEVDSyhtU0RQTG9hZGVyID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgaWQoKSk7CiAKICAgICBDSEVDS19FUShtU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKICAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwpAQCAtOTIsNyArOTUsNyBAQAogICAgIGlmIChtSXNTRFApIHsKICAgICAgICAgbVNEUExvYWRlciA9IG5ldyBTRFBMb2FkZXIobm90aWZ5LAogICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBTRFBMb2FkZXI6OmtGbGFnSW5jb2duaXRvIDogMCwKLSAgICAgICAgICAgICAgICBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSk7CiAKICAgICAgICAgbVNEUExvYWRlci0+bG9hZCgKICAgICAgICAgICAgICAgICBtVVJMLmNfc3RyKCksIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKQEAgLTExNSw3ICsxMTgsNyBAQAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIGlkKCkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IGR1bW15OwogICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJmR1bW15KTsKQEAgLTMwMiw3ICszMDUsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBlcmZvcm1TZWVrLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttU2Vla0dlbmVyYXRpb24pOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHNlZWtUaW1lVXMpOwogICAgIG1zZy0+cG9zdCgyMDAwMDBsbCk7CkBAIC0zNTMsNyArMzU2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgb25Db25uZWN0ZWQoKTsKIAotICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKIAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCkBAIC01MDIsNyArNTA1LDEwIEBACiAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlzY2FyZCAqLyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjA3LDcgKzYxMyw3IEBACiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGZpbmQgdXJsIGluIFNEUCIpOwogICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgaWQoKSk7CiAKICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihydHNwVXJpLmNfc3RyKCksIG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKICAgICAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAppbmRleCA4Y2YzNGEwLi5mMWNhZTUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKQEAgLTIyLDggKzIyLDYgQEAKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOwpAQCAtMzQsNiArMzIsNyBAQAogc3RydWN0IE51UGxheWVyOjpSVFNQU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewogICAgIFJUU1BTb3VyY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgICAgIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwKQEAgLTg4LDYgKzg3LDcgQEAKICAgICAgICAgYm9vbCBtTlBUTWFwcGluZ1ZhbGlkOwogICAgIH07CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogICAgIEFTdHJpbmcgbVVSTDsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwogICAgIGJvb2wgbVVJRFZhbGlkOwpAQCAtMTAwLDcgKzEwMCw2IEBACiAgICAgYm9vbCBtQnVmZmVyaW5nOwogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKLSAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxSVFNQU291cmNlPiA+IG1SZWZsZWN0b3I7CiAgICAgc3A8TXlIYW5kbGVyPiBtSGFuZGxlcjsKICAgICBzcDxTRFBMb2FkZXI+IG1TRFBMb2FkZXI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKaW5kZXggMjhmMGQ1MC4uMmU5YTI5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKKyAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CiAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKDApOwogICAgIG5vdGlmeVByZXBhcmVkKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYWU0ZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTVA0U291cmNlLmgiCi0KLSNpbmNsdWRlICJGcmFnbWVudGVkTVA0UGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFN0cmVhbVNvdXJjZSA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpTb3VyY2UgewotICAgIFN0cmVhbVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKQotICAgICAgICA6IG1MaXN0ZW5lcihuZXcgTnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXIoc291cmNlLCAwKSksCi0gICAgICAgICAgbVBvc2l0aW9uKDApIHsKLSAgICAgICAgbUxpc3RlbmVyLT5zdGFydCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBtUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAtRVBJUEU7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAob2Zmc2V0ID4gbVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICAgICAgICAgIG9mZjY0X3Qgc2tpcEJ5dGVzID0gb2Zmc2V0IC0gbVBvc2l0aW9uOwotICAgICAgICAgICAgaWYgKHNraXBCeXRlcyA+IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgc2tpcEJ5dGVzID0gc2l6ZW9mKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBuID0gbUxpc3RlbmVyLT5yZWFkKGJ1ZmZlciwgc2tpcEJ5dGVzLCAmZXh0cmEpOwotCi0gICAgICAgICAgICAgICAgaWYgKG4gPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigic2tpcHBlZCAlbGQgYnl0ZXMgYXQgb2Zmc2V0ICVsbGQiLCBuLCBtUG9zaXRpb24pOwotCi0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVBvc2l0aW9uICs9IG47Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7Ci0gICAgICAgIHNpemVfdCB0b3RhbCA9IDA7Ci0gICAgICAgIHdoaWxlICh0b3RhbCA8IHNpemUpIHsKLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1MaXN0ZW5lci0+cmVhZCgKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilkYXRhICsgdG90YWwsIHNpemUgLSB0b3RhbCwgJmV4dHJhKTsKLQotICAgICAgICAgICAgaWYgKG4gPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uICs9IHRvdGFsOwotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0b3RhbCArPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoInJlYWQgJWxkIGJ5dGVzIGF0IG9mZnNldCAlbGxkIiwgdG90YWwsIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgbVBvc2l0aW9uICs9IHRvdGFsOwotCi0gICAgICAgIHJldHVybiB0b3RhbDsKLSAgICB9Ci0KLSAgICBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8TnVQbGF5ZXI6Ok51UGxheWVyU3RyZWFtTGlzdGVuZXI+IG1MaXN0ZW5lcjsKLSAgICBvZmY2NF90IG1Qb3NpdGlvbjsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmVhbVNvdXJjZSk7Ci19OwotCi1NUDRTb3VyY2U6Ok1QNFNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbVBhcnNlcihuZXcgRnJhZ21lbnRlZE1QNFBhcnNlciksCi0gICAgICBtRU9TKGZhbHNlKSB7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1QYXJzZXIpOwotfQotCi1NUDRTb3VyY2U6On5NUDRTb3VyY2UoKSB7Ci19Ci0KLXZvaWQgTVA0U291cmNlOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKLSAgICBub3RpZnlGbGFnc0NoYW5nZWQoMCk7Ci0gICAgbm90aWZ5UHJlcGFyZWQoKTsKLX0KLQotdm9pZCBNUDRTb3VyY2U6OnN0YXJ0KCkgewotICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLyk7Ci0gICAgbVBhcnNlci0+c3RhcnQobmV3IFN0cmVhbVNvdXJjZShtU291cmNlKSk7Ci19Ci0KLXN0YXR1c190IE1QNFNvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7Ci0gICAgcmV0dXJuIG1FT1MgPyBFUlJPUl9FTkRfT0ZfU1RSRUFNIDogKHN0YXR1c190KU9LOwotfQotCi1zcDxBTWVzc2FnZT4gTVA0U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIHJldHVybiBtUGFyc2VyLT5nZXRGb3JtYXQoYXVkaW8pOwotfQotCi1zdGF0dXNfdCBNUDRTb3VyY2U6OmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIHJldHVybiBtUGFyc2VyLT5kZXF1ZXVlQWNjZXNzVW5pdChhdWRpbywgYWNjZXNzVW5pdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlZjYyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTVA0X1NPVVJDRV9ICi0jZGVmaW5lIE1QNF9TT1VSQ0VfSAotCi0jaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjsKLQotc3RydWN0IE1QNFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKLSAgICBNUDRTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOwotCi0gICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1QNFNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHNwPElTdHJlYW1Tb3VyY2U+IG1Tb3VyY2U7Ci0gICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKLSAgICBzcDxGcmFnbWVudGVkTVA0UGFyc2VyPiBtUGFyc2VyOwotICAgIGJvb2wgbUVPUzsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QNFNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gTVA0X1NPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tawppbmRleCA2OWM3NWI4Li45NzA3YzRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKQEAgLTMxLDkgKzMxLDggQEAKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlibWVkaWEKLSMgVGhpcyBkZXBlbmRlbmN5IG9uIGxpYm1lZGlhIGlzIGZvciBTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuCi0jIENvbnNpZGVyIGEgc2VwYXJhdGUgYSBsaWJyYXJ5IGZvciBTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuCisgICAgbGlibG9nCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCmluZGV4IDc0YTZmZGIuLjU1MWY1MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuY3BwCkBAIC0yNCwxMSArMjQsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZTo6QXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkgOgogICAgIE5CQUlPX1NvdXJjZShmb3JtYXQpLCBtUHJvdmlkZXIocHJvdmlkZXIpLCBtQ29uc3VtZWQoMCkKIHsKICAgICBBTE9HX0FTU0VSVChwcm92aWRlciAhPSBOVUxMKTsKLSAgICBBTE9HX0FTU0VSVChmb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpOworICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpOwogfQogCiBBdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlOjp+QXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSgpCkBAIC02OCw3ICs2OCw3IEBACiAgICAgfQogICAgIC8vIGNvdW50IGNvdWxkIGJlIHplcm8sIGVpdGhlciBiZWNhdXNlIGNvdW50IHdhcyB6ZXJvIG9uIGVudHJ5IG9yCiAgICAgLy8gYXZhaWxhYmxlIGlzIHplcm8sIGJ1dCBib3RoIGFyZSB1bmxpa2VseSBzbyBkb24ndCBjaGVjayBmb3IgdGhhdAotICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCA8PCBtQml0U2hpZnQpLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCAqIG1GcmFtZVNpemUpLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgIGlmIChDQ19VTkxJS0VMWSgobUNvbnN1bWVkICs9IGNvdW50KSA+PSBtQnVmZmVyLmZyYW1lQ291bnQpKSB7CiAgICAgICAgIG1Qcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgICAgIG1CdWZmZXIucmF3ID0gTlVMTDsKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgICAgICAgICAgY291bnQgPSBhdmFpbGFibGU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBjaGFyKiByZWFkVGd0ID0gKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBjaGFyKiByZWFkVGd0ID0gKGNoYXIgKikgbUJ1ZmZlci5yYXcgKyAobUNvbnN1bWVkICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IHZpYSh1c2VyLCByZWFkVGd0LCBjb3VudCwgcmVhZFBUUyk7CiAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkocmV0IDw9IDApKSB7CiAgICAgICAgICAgICAgICAgaWYgKENDX0xJS0VMWShhY2N1bXVsYXRvciA+IDApKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCmluZGV4IDA1MjczZjYuLjZhYWI0OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwCkBAIC00MCwxNiArNDAsMTUgQEAKIHNzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIGlmIChtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzID0gbVN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbVN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0ID0gbVN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIGlmIChzdHJlYW1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBwb3Bjb3VudChjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQobUZvcm1hdCk7Ci0gICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1NvdXJjZTo6bmVnb3RpYXRlKG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKIH0KQEAgLTY1LDE0ICs2NCwxNCBAQAogICAgIHJldHVybiBtRnJhbWVzT3ZlcnJ1bjsKIH0KIAotc3NpemVfdCBBdWRpb1N0cmVhbUluU291cmNlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQorc3NpemVfdCBBdWRpb1N0cmVhbUluU291cmNlOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMgX191bnVzZWQpCiB7Ci0gICAgaWYgKENDX1VOTElLRUxZKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpKSB7CisgICAgaWYgKENDX1VOTElLRUxZKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkpIHsKICAgICAgICAgcmV0dXJuIE5FR09USUFURTsKICAgICB9Ci0gICAgc3NpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgIGlmIChieXRlc1JlYWQgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkID4+IG1CaXRTaGlmdDsKKyAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWQgPSBieXRlc1JlYWQgLyBtRnJhbWVTaXplOwogICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICByZXR1cm4gZnJhbWVzUmVhZDsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggZTQzNDFkNy4uMGQ1ZjkzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC0zNywxNiArMzcsMTUgQEAKIHNzaXplX3QgQXVkaW9TdHJlYW1PdXRTaW5rOjpuZWdvdGlhdGUoY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1tdLCBzaXplX3QgbnVtT2ZmZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgaWYgKG1Gb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtU3RyZWFtLT5jb21tb24pOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQgPSBtU3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgaWYgKHN0cmVhbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsIHBvcGNvdW50KGNoYW5uZWxNYXNrKSk7Ci0gICAgICAgICAgICBtQml0U2hpZnQgPSBGb3JtYXRfZnJhbWVCaXRTaGlmdChtRm9ybWF0KTsKLSAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCkgbVN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbVN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLCBzdHJlYW1Gb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KTsKICAgICB9CiAgICAgcmV0dXJuIE5CQUlPX1Npbms6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CiB9CkBAIC01NiwxMCArNTUsMTAgQEAKICAgICBpZiAoIW1OZWdvdGlhdGVkKSB7CiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKG1Gb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpOwotICAgIHNzaXplX3QgcmV0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKTsKKyAgICBzc2l6ZV90IHJldCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAocmV0ID4gMCkgewotICAgICAgICByZXQgPj49IG1CaXRTaGlmdDsKKyAgICAgICAgcmV0IC89IG1GcmFtZVNpemU7CiAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IHJldDsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGSVhNRSB2ZXJpZnkgSEFMIGltcGxlbWVudGF0aW9ucyBhcmUgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGVzIGUuZy4gV09VTERfQkxPQ0sKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcAppbmRleCAzYzYxYjYwLi4wYjY1ODYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2RlZmluZSBMT0dfVEFHICJNb25vUGlwZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIApAQCAtMzAsNyArMzIsMjQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1Nb25vUGlwZTo6TW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCwgYm9vbCB3cml0ZUNhbkJsb2NrKSA6CitzdGF0aWMgdWludDY0X3QgY2FjaGVOOyAvLyBvdXRwdXQgb2YgQ0NIZWxwZXI6OmdldExvY2FsRnJlcSgpCitzdGF0aWMgYm9vbCBjYWNoZVZhbGlkOyAvLyB3aGV0aGVyIGNhY2hlTiBpcyB2YWxpZAorc3RhdGljIHB0aHJlYWRfb25jZV90IGNhY2hlT25jZUNvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgY2FjaGVPbmNlSW5pdCgpCit7CisgICAgQ0NIZWxwZXIgdG1wSGVscGVyOworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoT0sgIT0gKHJlcyA9IHRtcEhlbHBlci5nZXRMb2NhbEZyZXEoJmNhY2hlTikpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmV0Y2ggbG9jYWwgdGltZSBmcmVxdWVuY3kgd2hlbiBjb25zdHJ1Y3RpbmcgYSIKKyAgICAgICAgICAgICAgIiBNb25vUGlwZSAocmVzID0gJWQpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUiCisgICAgICAgICAgICAgICIgbm9uLWZ1bmN0aW9uYWwiLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhY2hlVmFsaWQgPSB0cnVlOworfQorCitNb25vUGlwZTo6TW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jaykgOgogICAgICAgICBOQkFJT19TaW5rKGZvcm1hdCksCiAgICAgICAgIG1VcGRhdGVTZXEoMCksCiAgICAgICAgIG1SZXFGcmFtZXMocmVxRnJhbWVzKSwKQEAgLTQ3LDggKzY2LDYgQEAKICAgICAgICAgbVRpbWVzdGFtcE11dGF0b3IoJm1UaW1lc3RhbXBTaGFyZWQpLAogICAgICAgICBtVGltZXN0YW1wT2JzZXJ2ZXIoJm1UaW1lc3RhbXBTaGFyZWQpCiB7Ci0gICAgQ0NIZWxwZXIgdG1wSGVscGVyOwotICAgIHN0YXR1c190IHJlczsKICAgICB1aW50NjRfdCBOLCBEOwogCiAgICAgbU5leHRSZFBUUyA9IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOwpAQCAtNTksMTkgKzc2LDIwIEBACiAgICAgbVNhbXBsZXNUb0xvY2FsVGltZS5hX3RvX2JfZGVub20gPSAwOwogCiAgICAgRCA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgaWYgKE9LICE9IChyZXMgPSB0bXBIZWxwZXIuZ2V0TG9jYWxGcmVxKCZOKSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmZXRjaCBsb2NhbCB0aW1lIGZyZXF1ZW5jeSB3aGVuIGNvbnN0cnVjdGluZyBhIgotICAgICAgICAgICAgICAiIE1vbm9QaXBlIChyZXMgPSAlZCkuICBnZXROZXh0V3JpdGVUaW1lc3RhbXAgY2FsbHMgd2lsbCBiZSIKLSAgICAgICAgICAgICAgIiBub24tZnVuY3Rpb25hbCIsIHJlcyk7CisKKyAgICAodm9pZCkgcHRocmVhZF9vbmNlKCZjYWNoZU9uY2VDb250cm9sLCBjYWNoZU9uY2VJbml0KTsKKyAgICBpZiAoIWNhY2hlVmFsaWQpIHsKKyAgICAgICAgLy8gbG9nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZQogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIE4gPSBjYWNoZU47CiAKICAgICBMaW5lYXJUcmFuc2Zvcm06OnJlZHVjZSgmTiwgJkQpOwogICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrU2lnbmVkSGlCaXRzTWFzayAgID0gfigweDdGRkZGRkZGdWxsKTsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1Vuc2lnbmVkSGlCaXRzTWFzayA9IH4oMHhGRkZGRkZGRnVsbCk7CiAgICAgaWYgKChOICYga1NpZ25lZEhpQml0c01hc2spIHx8IChEICYga1Vuc2lnbmVkSGlCaXRzTWFzaykpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWR1Y2Ugc2FtcGxlIHJhdGUgdG8gbG9jYWwgY2xvY2sgZnJlcXVlbmN5IHJhdGlvIHRvIGZpdCIKLSAgICAgICAgICAgICAgIiBpbiBhIDMyLzMyIGJpdCByYXRpb25hbC4gIChtYXggcmVkdWN0aW9uIGlzIDB4JTAxNmxseC8weCUwMTZsbHgiCisgICAgICAgICAgICAgICIgaW4gYSAzMi8zMiBiaXQgcmF0aW9uYWwuICAobWF4IHJlZHVjdGlvbiBpcyAweCUwMTYiIFBSSXg2NCAiLzB4JTAxNiIgUFJJeDY0CiAgICAgICAgICAgICAgICIpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUgbm9uLWZ1bmN0aW9uYWwiLCBOLCBEKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTExNSwxMSArMTMzLDExIEBACiAgICAgICAgICAgICBwYXJ0MSA9IHdyaXR0ZW47CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MSA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyIDw8IG1CaXRTaGlmdCksIGJ1ZmZlciwgcGFydDEgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgKiBtRnJhbWVTaXplKSwgYnVmZmVyLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHJlYXIgKyBwYXJ0MSA9PSBtTWF4RnJhbWVzKSkgewogICAgICAgICAgICAgICAgIHNpemVfdCBwYXJ0MiA9IHdyaXR0ZW4gLSBwYXJ0MTsKICAgICAgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKHBhcnQyID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSA8PCBtQml0U2hpZnQpLCBwYXJ0MiA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIHBhcnQyICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSh3cml0dGVuICsgbVJlYXIsICZtUmVhcik7CkBAIC0xMjksNyArMTQ3LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNvdW50IC09IHdyaXR0ZW47Ci0gICAgICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuIDw8IG1CaXRTaGlmdCk7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIC8vIFNpbXVsYXRlIGJsb2NraW5nIEkvTyBieSBzbGVlcGluZyBhdCBkaWZmZXJlbnQgcmF0ZXMsIGRlcGVuZGluZyBvbiBhIHRocm90dGxlLgogICAgICAgICAvLyBUaGUgdGhyb3R0bGUgdHJpZXMgdG8ga2VlcCB0aGUgbWVhbiBwaXBlIGRlcHRoIG5lYXIgdGhlIHNldHBvaW50LCB3aXRoIGEgc2xpZ2h0IGppdHRlci4KICAgICAgICAgdWludDMyX3QgbnM7CkBAIC0yOTIsNyArMzEwLDcgQEAKICAgICAgICAgLy8gZXJyb3IsIGJ1dCB0aGVuIHplcm8gb3V0IHRoZSByYXRpbyBpbiB0aGUgbGluZWFyIHRyYW5zZm9ybSBzbwogICAgICAgICAvLyB0aGF0IHdlIGRvbid0IHRyeSB0byBkbyBhbnkgY29udmVyc2lvbnMgZnJvbSBub3cgb24uICBUaGlzCiAgICAgICAgIC8vIE1vbm9QaXBlJ3MgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGlzIG5vdyBicm9rZW4gZm9yIGdvb2QuCi0gICAgICAgIEFMT0dFKCJPdmVyZmxvdyB3aGVuIGF0dGVtcHRpbmcgdG8gY29udmVydCAlZCBhdWRpbyBmcmFtZXMgdG8iCisgICAgICAgIEFMT0dFKCJPdmVyZmxvdyB3aGVuIGF0dGVtcHRpbmcgdG8gY29udmVydCAlenUgYXVkaW8gZnJhbWVzIHRvIgogICAgICAgICAgICAgICAiIGR1cmF0aW9uIGluIGxvY2FsIHRpbWUuICBnZXROZXh0V3JpdGVUaW1lc3RhbXAgd2lsbCBmYWlsIGZyb20iCiAgICAgICAgICAgICAgICIgbm93IG9uLiIsIGF1ZEZyYW1lcyk7CiAgICAgICAgIG1TYW1wbGVzVG9Mb2NhbFRpbWUuYV90b19iX251bWVyID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcAppbmRleCA4NTEzNDFhLi5kZTgyMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCkBAIC03MywxMSArNzMsMTEgQEAKICAgICAgICAgcGFydDEgPSByZWQ7CiAgICAgfQogICAgIGlmIChDQ19MSUtFTFkocGFydDEgPiAwKSkgewotICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCBwYXJ0MSA8PCBtQml0U2hpZnQpOworICAgICAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS0+bUJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoZnJvbnQgKyBwYXJ0MSA9PSBtUGlwZS0+bU1heEZyYW1lcykpIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MiA9IHJlZCAtIHBhcnQxOwogICAgICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MiA+IDApKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSA8PCBtQml0U2hpZnQpLCBtUGlwZS0+bUJ1ZmZlciwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHBhcnQxICogbUZyYW1lU2l6ZSksIG1QaXBlLT5tQnVmZmVyLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1QaXBlLT51cGRhdGVGcm9udEFuZE5SUFRTKHJlZCArIG1QaXBlLT5tRnJvbnQsIG5leHRSZWFkUFRTKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcAppbmRleCBlMGQyYzIxLi5kNjQxZTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCkBAIC0yMiwxMTkgKzIyLDQyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc2l6ZV90IEZvcm1hdF9mcmFtZVNpemUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgKiBzaXplb2Yoc2hvcnQpOworICAgIHJldHVybiBmb3JtYXQubUZyYW1lU2l6ZTsKIH0KIAotc2l6ZV90IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQgPSB7IDAsIDAsIEFVRElPX0ZPUk1BVF9JTlZBTElELCAwIH07CisKK3Vuc2lnbmVkIEZvcm1hdF9zYW1wbGVSYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQogewotICAgIC8vIHNpemVvZihzaG9ydCkgPT0gMiwgc28gZnJhbWUgc2l6ZSA9PSAxIDw8IGNoYW5uZWxzCi0gICAgcmV0dXJuIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGU7CiB9CiAKLWVudW0gewotICAgIEZvcm1hdF9TUl84MDAwLAotICAgIEZvcm1hdF9TUl8xMTAyNSwKLSAgICBGb3JtYXRfU1JfMTYwMDAsCi0gICAgRm9ybWF0X1NSXzIyMDUwLAotICAgIEZvcm1hdF9TUl8yNDAwMCwKLSAgICBGb3JtYXRfU1JfMzIwMDAsCi0gICAgRm9ybWF0X1NSXzQ0MTAwLAotICAgIEZvcm1hdF9TUl80ODAwMCwKLSAgICBGb3JtYXRfU1JfTWFzayA9IDcKLX07Ci0KLWVudW0gewotICAgIEZvcm1hdF9DXzEgPSAweDA4LAotICAgIEZvcm1hdF9DXzIgPSAweDEwLAotICAgIEZvcm1hdF9DX01hc2sgPSAweDE4Ci19OwotCi11bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShOQkFJT19Gb3JtYXQgZm9ybWF0KQordW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9TUl9NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfU1JfODAwMDoKLSAgICAgICAgcmV0dXJuIDgwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTEwMjU6Ci0gICAgICAgIHJldHVybiAxMTAyNTsKLSAgICBjYXNlIEZvcm1hdF9TUl8xNjAwMDoKLSAgICAgICAgcmV0dXJuIDE2MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzIyMDUwOgotICAgICAgICByZXR1cm4gMjIwNTA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMjQwMDA6Ci0gICAgICAgIHJldHVybiAyNDAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8zMjAwMDoKLSAgICAgICAgcmV0dXJuIDMyMDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ0MTAwOgotICAgICAgICByZXR1cm4gNDQxMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfNDgwMDA6Ci0gICAgICAgIHJldHVybiA0ODAwMDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIGZvcm1hdC5tQ2hhbm5lbENvdW50OwogfQogCi11bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitOQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKLSAgICBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzd2l0Y2ggKGZvcm1hdCAmIEZvcm1hdF9DX01hc2spIHsKLSAgICBjYXNlIEZvcm1hdF9DXzE6Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRm9ybWF0X0NfMjoKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1OQkFJT19Gb3JtYXQgRm9ybWF0X2Zyb21fU1JfQyh1bnNpZ25lZCBzYW1wbGVSYXRlLCB1bnNpZ25lZCBjaGFubmVsQ291bnQpCi17Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl84MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDExMDI1OgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTEwMjU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzIyMDUwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI0MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMjQwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ0MTAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfNDgwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6CisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCB8fCBjaGFubmVsQ291bnQgPT0gMCB8fCAhYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgcmV0dXJuIEZvcm1hdF9JbnZhbGlkOwogICAgIH0KLSAgICBzd2l0Y2ggKGNoYW5uZWxDb3VudCkgewotICAgIGNhc2UgMToKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgZm9ybWF0IHw9IEZvcm1hdF9DXzI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKKyAgICBOQkFJT19Gb3JtYXQgcmV0OworICAgIHJldC5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgcmV0Lm1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgcmV0Lm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgcmV0Lm1GcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPworICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpIDogc2l6ZW9mKHVpbnQ4X3QpOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8vIFRoaXMgaXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uOyBpdCBpcyBleHBlY3RlZCB0aGF0IHN1YmNsYXNzZXMgd2lsbCBvcHRpbWl6ZSB0aGlzLgpAQCAtMjE0LDExICsxMzcsMTEgQEAKIHNzaXplX3QgTkJBSU9fUG9ydDo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkFJT19Gb3JtYXQgY291bnRlck9mZmVyc1tdLCBzaXplX3QmIG51bUNvdW50ZXJPZmZlcnMpCiB7Ci0gICAgQUxPR1YoIm5lZ290aWF0ZSBvZmZlcnM9JXAgbnVtT2ZmZXJzPSV1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXUiLAorICAgIEFMT0dWKCJuZWdvdGlhdGUgb2ZmZXJzPSVwIG51bU9mZmVycz0lenUgY291bnRlcnNPZmZlcnM9JXAgbnVtQ291bnRlck9mZmVycz0lenUiLAogICAgICAgICAgICAgb2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgIGlmIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKG1Gb3JtYXQpKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtT2ZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChvZmZlcnNbaV0gPT0gbUZvcm1hdCkgeworICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKG9mZmVyc1tpXSwgbUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBtTmVnb3RpYXRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICB9CkBAIC0yMzMsNCArMTU2LDE3IEBACiAgICAgcmV0dXJuIChzc2l6ZV90KSBORUdPVElBVEU7CiB9CiAKK2Jvb2wgRm9ybWF0X2lzVmFsaWQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCit7CisgICAgcmV0dXJuIGZvcm1hdC5tU2FtcGxlUmF0ZSAhPSAwICYmIGZvcm1hdC5tQ2hhbm5lbENvdW50ICE9IDAgJiYKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEICYmIGZvcm1hdC5tRnJhbWVTaXplICE9IDA7Cit9CisKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpCit7CisgICAgcmV0dXJuIGZvcm1hdDEubVNhbXBsZVJhdGUgPT0gZm9ybWF0Mi5tU2FtcGxlUmF0ZSAmJgorICAgICAgICAgICAgZm9ybWF0MS5tQ2hhbm5lbENvdW50ID09IGZvcm1hdDIubUNoYW5uZWxDb3VudCAmJiBmb3JtYXQxLm1Gb3JtYXQgPT0gZm9ybWF0Mi5tRm9ybWF0ICYmCisgICAgICAgICAgICBmb3JtYXQxLm1GcmFtZVNpemUgPT0gZm9ybWF0Mi5tRnJhbWVTaXplOworfQorCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcCBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcAppbmRleCA0ZjU3NjJmLi40ZDE0OTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCkBAIC0zNDEsOCArMzQxLDggQEAKICAgICBtRmQgPSBmZDsKICAgICBtSW5kZW50ID0gaW5kZW50OwogICAgIFN0cmluZzggdGltZXN0YW1wLCBib2R5OwotICAgIGlmIChpID4gMCkgewotICAgICAgICBsb3N0ICs9IGk7CisgICAgbG9zdCArPSBpOworICAgIGlmIChsb3N0ID4gMCkgewogICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7CiAgICAgICAgIC8vIFRPRE8gdGltZXN0YW1wIGVtcHR5IGhlcmUsIG9ubHkgb3RoZXIgY2hvaWNlIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCB0aW1lc3RhbXAgZXZlbnQgaW4gdGhlCiAgICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byByZWFkQXQoKS4KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiBib29sIE5CTG9nOjpSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKIHsKLSAgICByZXR1cm4gaU1lbW9yeS5nZXQoKSA9PSBtSU1lbW9yeS5nZXQoKTsKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAppbmRleCAxYzIxZjljLi42ZTBlYzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9QaXBlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9QaXBlLmNwcApAQCAtMjUsMTkgKzI1LDIyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0KSA6CitQaXBlOjpQaXBlKHNpemVfdCBtYXhGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCB2b2lkICpidWZmZXIpIDoKICAgICAgICAgTkJBSU9fU2luayhmb3JtYXQpLAogICAgICAgICBtTWF4RnJhbWVzKHJvdW5kdXAobWF4RnJhbWVzKSksCi0gICAgICAgIG1CdWZmZXIobWFsbG9jKG1NYXhGcmFtZXMgKiBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpKSwKKyAgICAgICAgbUJ1ZmZlcihidWZmZXIgPT0gTlVMTCA/IG1hbGxvYyhtTWF4RnJhbWVzICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSA6IGJ1ZmZlciksCiAgICAgICAgIG1SZWFyKDApLAotICAgICAgICBtUmVhZGVycygwKQorICAgICAgICBtUmVhZGVycygwKSwKKyAgICAgICAgbUZyZWVCdWZmZXJJbkRlc3RydWN0b3IoYnVmZmVyID09IE5VTEwpCiB7CiB9CiAKIFBpcGU6On5QaXBlKCkKIHsKICAgICBBTE9HX0FTU0VSVChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1SZWFkZXJzKSA9PSAwKTsKLSAgICBmcmVlKG1CdWZmZXIpOworICAgIGlmIChtRnJlZUJ1ZmZlckluRGVzdHJ1Y3RvcikgeworICAgICAgICBmcmVlKG1CdWZmZXIpOworICAgIH0KIH0KIAogc3NpemVfdCBQaXBlOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKQEAgLTUyLDEzICs1NSwxMyBAQAogICAgIGlmIChDQ19MSUtFTFkod3JpdHRlbiA+IGNvdW50KSkgewogICAgICAgICB3cml0dGVuID0gY291bnQ7CiAgICAgfQotICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgPDwgbUJpdFNoaWZ0KSwgYnVmZmVyLCB3cml0dGVuIDw8IG1CaXRTaGlmdCk7CisgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciAqIG1GcmFtZVNpemUpLCBidWZmZXIsIHdyaXR0ZW4gKiBtRnJhbWVTaXplKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkocmVhciArIHdyaXR0ZW4gPT0gbU1heEZyYW1lcykpIHsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKChjb3VudCAtPSB3cml0dGVuKSA+IHJlYXIpKSB7CiAgICAgICAgICAgICBjb3VudCA9IHJlYXI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gPDwgbUJpdFNoaWZ0KSwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiAqIG1GcmFtZVNpemUpLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgd3JpdHRlbiArPSBjb3VudDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKaW5kZXggZDc4NmI4NC4uYzhlNDk1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICByZXR1cm4gYXZhaWw7CiB9CiAKLXNzaXplX3QgUGlwZVJlYWRlcjo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTKQorc3NpemVfdCBQaXBlUmVhZGVyOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMgX191bnVzZWQpCiB7CiAgICAgc3NpemVfdCBhdmFpbCA9IGF2YWlsYWJsZVRvUmVhZCgpOwogICAgIGlmIChDQ19VTkxJS0VMWShhdmFpbCA8PSAwKSkgewpAQCAtNzYsMTQgKzc2LDE0IEBACiAgICAgICAgIHJlZCA9IGNvdW50OwogICAgIH0KICAgICAvLyBJbiBwYXJ0aWN1bGFyLCBhbiBvdmVycnVuIGR1cmluZyB0aGUgbWVtY3B5IHdpbGwgcmVzdWx0IGluIHJlYWRpbmcgY29ycnVwdCBkYXRhCi0gICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUubUJ1ZmZlciArIChmcm9udCA8PCBtQml0U2hpZnQpLCByZWQgPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtUGlwZS5tQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSksIHJlZCAqIG1GcmFtZVNpemUpOwogICAgIC8vIFdlIGNvdWxkIHJlLXJlYWQgdGhlIHJlYXIgcG9pbnRlciBoZXJlIHRvIGRldGVjdCB0aGUgY29ycnVwdGlvbiwgYnV0IHdoeSBib3RoZXI/CiAgICAgaWYgKENDX1VOTElLRUxZKGZyb250ICsgcmVkID09IG1QaXBlLm1NYXhGcmFtZXMpKSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoY291bnQgLT0gcmVkKSA+IGZyb250KSkgewogICAgICAgICAgICAgY291bnQgPSBmcm9udDsKICAgICAgICAgfQogICAgICAgICBpZiAoQ0NfTElLRUxZKGNvdW50ID4gMCkpIHsKLSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocmVkIDw8IG1CaXRTaGlmdCksIG1QaXBlLm1CdWZmZXIsIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHJlZCAqIG1GcmFtZVNpemUpLCBtUGlwZS5tQnVmZmVyLCBjb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgcmVkICs9IGNvdW50OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAppbmRleCAwNjJmYTBmLi5lMjFlZjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjpTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSkgOgogICAgIG1Tb3VyY2Uoc291cmNlKSwKLSAgICAvLyBtRnJhbWVCaXRTaGlmdEZvcm1hdCBiZWxvdworICAgIC8vIG1GcmFtZVNpemUgYmVsb3cKICAgICBtQWxsb2NhdGVkKE5VTEwpLCBtU2l6ZSgwKSwgbU9mZnNldCgwKSwgbVJlbWFpbmluZygwKSwgbUdldENvdW50KDApLCBtRnJhbWVzUmVsZWFzZWQoMCkKIHsKICAgICBBTE9HX0FTU0VSVChzb3VyY2UgIT0gMCk7CkBAIC0zNyw3ICszNyw3IEBACiAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CiAgICAgaW5kZXggPSBzb3VyY2UtPm5lZ290aWF0ZShjb3VudGVyT2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICBtRnJhbWVCaXRTaGlmdCA9IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KHNvdXJjZS0+Zm9ybWF0KCkpOworICAgIG1GcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKHNvdXJjZS0+Zm9ybWF0KCkpOwogfQogCiBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjp+U291cmNlQXVkaW9CdWZmZXJQcm92aWRlcigpCkBAIC01NCwxNCArNTQsMTQgQEAKICAgICAgICAgaWYgKG1SZW1haW5pbmcgPCBidWZmZXItPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1SZW1haW5pbmc7CiAgICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgPDwgbUZyYW1lQml0U2hpZnQpOworICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCAqIG1GcmFtZVNpemUpOwogICAgICAgICBtR2V0Q291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAgICAgLy8gZG8gd2UgbmVlZCB0byByZWFsbG9jYXRlPwogICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtU2l6ZSkgewogICAgICAgICBmcmVlKG1BbGxvY2F0ZWQpOwotICAgICAgICBtQWxsb2NhdGVkID0gbWFsbG9jKGJ1ZmZlci0+ZnJhbWVDb3VudCA8PCBtRnJhbWVCaXRTaGlmdCk7CisgICAgICAgIG1BbGxvY2F0ZWQgPSBtYWxsb2MoYnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgIG1TaXplID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIH0KICAgICAvLyByZWFkIGZyb20gc291cmNlCkBAIC04NCw3ICs4NCw3IEBACiB2b2lkIFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQnVmZmVyICpidWZmZXIpCiB7CiAgICAgQUxPR19BU1NFUlQoKGJ1ZmZlciAhPSBOVUxMKSAmJgotICAgICAgICAgICAgKGJ1ZmZlci0+cmF3ID09IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCA8PCBtRnJhbWVCaXRTaGlmdCkpICYmCisgICAgICAgICAgICAoYnVmZmVyLT5yYXcgPT0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0ICogbUZyYW1lU2l6ZSkpICYmCiAgICAgICAgICAgICAoYnVmZmVyLT5mcmFtZUNvdW50IDw9IG1HZXRDb3VudCkgJiYKICAgICAgICAgICAgIChtR2V0Q291bnQgPD0gbVJlbWFpbmluZykgJiYKICAgICAgICAgICAgIChtT2Zmc2V0ICsgbVJlbWFpbmluZyA8PSBtU2l6ZSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggZGVlZThlNy4uMzUzOTIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFBQ1dyaXRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDEwICszMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQ4LDcgKzM1MCw3IEBACiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICVsbGQsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJWxsZCIsCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsCiAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKICAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA4OTQ1ZDU4Li4yZjJmOWNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTE3LDYgKzE3LDEwIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFDb2RlYyIKIAorI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKwogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtMjgsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgpAQCAtMzksNiArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKQEAgLTQ2LDYgKzUyLDQ4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gT01YIGVycm9ycyBhcmUgZGlyZWN0bHkgbWFwcGVkIGludG8gc3RhdHVzX3QgcmFuZ2UgaWYKKy8vIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgTWVkaWFFcnJvciBzdGF0dXMgY29kZS4KKy8vIFVzZSB0aGUgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIGZ1bmN0aW9uLgorLy8KKy8vIEN1cnJlbnRseSB0aGlzIGlzIGEgZGlyZWN0IG1hcC4KKy8vIFNlZSBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaAorLy8KKy8vIFZlbmRvciBPTVggZXJyb3JzICAgICBmcm9tIDB4OTAwMDAwMDAgLSAweDkwMDBGRkZGCisvLyBFeHRlbnNpb24gT01YIGVycm9ycyAgZnJvbSAweDhGMDAwMDAwIC0gMHg5MDAwMDAwMAorLy8gU3RhbmRhcmQgT01YIGVycm9ycyAgIGZyb20gMHg4MDAwMTAwMCAtIDB4ODAwMDEwMjQgKDB4ODAwMDEwMjQgY3VycmVudCkKKy8vCisKKy8vIHJldHVybnMgdHJ1ZSBpZiBlcnIgaXMgYSByZWNvZ25pemVkIE9NWCBlcnJvciBjb2RlLgorLy8gYXMgT01YIGVycm9yIGlzIE9NWF9TMzIsIHRoaXMgaXMgYW4gaW50MzJfdCB0eXBlCitzdGF0aWMgaW5saW5lIGJvb2wgaXNPTVhFcnJvcihpbnQzMl90IGVycikgeworICAgIHJldHVybiAoRVJST1JfQ09ERUNfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfQ09ERUNfTUFYKTsKK30KKworLy8gY29udmVydHMgYW4gT01YIGVycm9yIHRvIGEgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3Qgc3RhdHVzRnJvbU9NWEVycm9yKGludDMyX3Qgb214RXJyb3IpIHsKKyAgICBzd2l0Y2ggKG9teEVycm9yKSB7CisgICAgY2FzZSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZToKKyAgICBjYXNlIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOgorICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7IC8vIGNhbiB0cmlnZ2VyIGlsbGVnYWwgYXJndW1lbnQgZXJyb3IgZm9yIHByb3ZpZGVkIG5hbWVzLgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBpc09NWEVycm9yKG9teEVycm9yKSA/IG9teEVycm9yIDogMDsgLy8gbm8gdHJhbnNsYXRpb24gcmVxdWlyZWQKKyAgICB9Cit9CisKKy8vIGNoZWNrcyBhbmQgY29udmVydHMgc3RhdHVzX3QgdG8gYSBub24tc2lkZS1lZmZlY3Qgc3RhdHVzX3QKK3N0YXRpYyBpbmxpbmUgc3RhdHVzX3QgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2ggKGVycikgeworICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGhhdmUgc2lkZSBlZmZlY3RzIGFuZCBtYXkgY29tZQorICAgIC8vIGZyb20gb3RoZXIgY29kZSBtb2R1bGVzLiBSZW1hcCBmb3Igc2FmZXR5IHJlYXNvbnMuCisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKQEAgLTEwMCwxMiArMTQ4LDYgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1fcHJpdmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFfcHRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5kYXRhX3B0cik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTE2MCw5ICsyMDIsNyBAQAogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAogICAgICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCi0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgICAgICB2b2lkICpkYXRhUHRyKTsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzKTsKIAogICAgIHZvaWQgZ2V0TW9yZUlucHV0RGF0YUlmUG9zc2libGUoKTsKIApAQCAtMzY4LDE2ICs0MDgsMjEgQEAKICAgICAgIG1Jc0VuY29kZXIoZmFsc2UpLAogICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0KGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soZmFsc2UpLAorICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKKyAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCiAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzaygwKSwKICAgICAgIG1EZXF1ZXVlQ291bnRlcigwKSwKICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKGZhbHNlKSwKICAgICAgIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCgwKSwKICAgICAgIG1SZXBlYXRGcmFtZURlbGF5VXMoLTFsbCksCi0gICAgICBtTWF4UHRzR2FwVXMoLTFsbCkgeworICAgICAgbU1heFB0c0dhcFVzKC0xbGwpLAorICAgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAorICAgICAgbVRpbWVQZXJDYXB0dXJlVXMoLTFsbCksCisgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKGZhbHNlKSwKKyAgICAgIG1UdW5uZWxlZChmYWxzZSkgewogICAgIG1VbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgVW5pbml0aWFsaXplZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRTdGF0ZSA9IG5ldyBMb2FkZWRTdGF0ZSh0aGlzKTsKICAgICBtTG9hZGVkVG9JZGxlU3RhdGUgPSBuZXcgTG9hZGVkVG9JZGxlU3RhdGUodGhpcyk7CkBAIC00NTMsNiArNDk4LDEwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwga2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgbXNnLT5wb3N0KCk7CisgICAgaWYgKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgICAgIC8vIGVuc3VyZSBzaHV0ZG93biBjb21wbGV0ZXMgaW4gMyBzZWNvbmRzCisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSwgaWQoKSkpLT5wb3N0KDMwMDAwMDApOworICAgIH0KIH0KIAogdm9pZCBBQ29kZWM6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKQEAgLTU0Nyw3ICs1OTYsNyBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZCk7CiAKICAgICBub3RpZnktPnNldEludDMyKCJwb3J0SW5kZXgiLCBwb3J0SW5kZXgpOwogCkBAIC01OTEsNiArNjQwLDI3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOworICAgICAgICBzd2l0Y2ggKG1Sb3RhdGlvbkRlZ3JlZXMpIHsKKyAgICAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhbnNmb3JtID4gMCkgeworICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0gZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gU2V0IHVwIHRoZSBuYXRpdmUgd2luZG93LgogICAgIE9NWF9VMzIgdXNhZ2UgPSAwOwogICAgIGVyciA9IG1PTVgtPmdldEdyYXBoaWNCdWZmZXJVc2FnZShtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgJnVzYWdlKTsKQEAgLTYzMiw2ICs3MDIsMjEgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICAvLyBFeGl0cyBoZXJlIGZvciB0dW5uZWxlZCB2aWRlbyBwbGF5YmFjayBjb2RlY3MgLS0gaS5lLiBza2lwcyBuYXRpdmUgd2luZG93CisgICAgLy8gYnVmZmVyIGFsbG9jYXRpb24gc3RlcCBhcyB0aGlzIGlzIG1hbmFnZWQgYnkgdGhlIHR1bm5lbGVkIE9NWCBvbXBvbmVudAorICAgIC8vIGl0c2VsZiBhbmQgZXhwbGljaXRseSBzZXRzIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgdG8gMC4KKyAgICBpZiAobVR1bm5lbGVkKSB7CisgICAgICAgIEFMT0dWKCJUdW5uZWxlZCBQbGF5YmFjazogc2tpcHBpbmcgbmF0aXZlIHdpbmRvdyBidWZmZXIgYWxsb2NhdGlvbi4iKTsKKyAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IDA7CisgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOworCisgICAgICAgICptaW5VbmRlcXVldWVkQnVmZmVycyA9IDA7CisgICAgICAgICpidWZmZXJDb3VudCA9IDA7CisgICAgICAgICpidWZmZXJTaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOwogICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAogICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLApAQCAtNjQzLDE4ICs3MjgsMzQgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBYWFg6IElzIHRoaXMgdGhlIHJpZ2h0IGxvZ2ljIHRvIHVzZT8gIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHdoYXQgdGhlIE9NWAotICAgIC8vIGJ1ZmZlciBjb3VudHMgcmVmZXIgdG8gLSBob3cgZG8gdGhleSBhY2NvdW50IGZvciB0aGUgcmVuZGVyZXIgaG9sZGluZyBvbgotICAgIC8vIHRvIGJ1ZmZlcnM/Ci0gICAgaWYgKGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPCBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzKSB7Ci0gICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPSBkZWYubkJ1ZmZlckNvdW50TWluICsgKm1pblVuZGVxdWV1ZWRCdWZmZXJzOworICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCBzdXJmYWNlIGlzIGNvbnRyb2xsZWQgYnkgYXBwIChuYXRpdmUgd2luZG93CisgICAgLy8gcmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgY2FzZSB3aGVuIHN1cmZhY2UgaXMgbm90IGNvbnRyb2xsZWQgYnkgYXBwKQorICAgIC8vIEZJWE1FMjogVGhpcyBtZWFucyB0aGF0IG1pblVuZGVxZXVldWRCdWZzIGNhbiBiZSAxIGxhcmdlciB0aGFuIHJlcG9ydGVkCisgICAgLy8gRm9yIG5vdywgdHJ5IHRvIGFsbG9jYXRlIDEgbW9yZSBidWZmZXIsIGJ1dCBkb24ndCBmYWlsIGlmIHVuc3VjY2Vzc2Z1bAorCisgICAgLy8gVXNlIGNvbnNlcnZhdGl2ZSBhbGxvY2F0aW9uIHdoaWxlIGFsc28gdHJ5aW5nIHRvIHJlZHVjZSBzdGFydmF0aW9uCisgICAgLy8KKyAgICAvLyAxLiBhbGxvY2F0ZSBhdCBsZWFzdCBuQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmZmVycyAtIHRoYXQgaXMgdGhlCisgICAgLy8gICAgbWluaW11bSBuZWVkZWQgZm9yIHRoZSBjb25zdW1lciB0byBiZSBhYmxlIHRvIHdvcmsKKyAgICAvLyAyLiB0cnkgdG8gYWxsb2NhdGUgdHdvICgyKSBhZGRpdGlvbmFsIGJ1ZmZlcnMgdG8gcmVkdWNlIHN0YXJ2YXRpb24gZnJvbQorICAgIC8vICAgIHRoZSBjb25zdW1lcgorICAgIC8vICAgIHBsdXMgYW4gZXh0cmEgYnVmZmVyIHRvIGFjY291bnQgZm9yIGluY29ycmVjdCBtaW5VbmRlcXVldWVkQnVmcworICAgIGZvciAoT01YX1UzMiBleHRyYUJ1ZmZlcnMgPSAyICsgMTsgLyogY29uZGl0aW9uIGluc2lkZSBsb29wICovOyBleHRyYUJ1ZmZlcnMtLSkgeworICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0KKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgKyBleHRyYUJ1ZmZlcnM7CiAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBuZXdCdWZmZXJDb3VudDsKICAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CiAKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlslc10gc2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJXUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgKz0gZXh0cmFCdWZmZXJzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVygiWyVzXSBzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAldSBmYWlsZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgLyogZXhpdCBjb25kaXRpb24gKi8KKyAgICAgICAgaWYgKGV4dHJhQnVmZmVycyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpAQCAtNjc5LDYgKzc4MCw3IEBACiAgICAgICAgICAgICAmYnVmZmVyQ291bnQsICZidWZmZXJTaXplLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwogICAgIGlmIChlcnIgIT0gMCkKICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMgPSBtaW5VbmRlcXVldWVkQnVmZmVyczsKIAogICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICV1IG9uICIKICAgICAgICAgICJvdXRwdXQgcG9ydCIsCkBAIC03MzIsNyArODM0LDEwIEBACiAKICAgICBmb3IgKE9NWF9VMzIgaSA9IGNhbmNlbFN0YXJ0OyBpIDwgY2FuY2VsRW5kOyBpKyspIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOwotICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBlcnI7CkBAIC03NDQsNiArODQ5LDcgQEAKICAgICAgICAgICAgICZidWZmZXJDb3VudCwgJmJ1ZmZlclNpemUsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CiAgICAgaWYgKGVyciAhPSAwKQogICAgICAgICByZXR1cm4gZXJyOworICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCiAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBtZXRhIGJ1ZmZlcnMgb24gb3V0cHV0IHBvcnQiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQpOwpAQCAtODA2LDE3ICs5MTIsMjUgQEAKICAgICBpbnQgZXJyID0gbU5hdGl2ZVdpbmRvdy0+Y2FuY2VsQnVmZmVyKAogICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpOwogCi0gICAgQ0hFQ0tfRVEoZXJyLCAwKTsKKyAgICBBTE9HV19JRihlcnIgIT0gMCwgIlslc10gY2FuIG5vdCByZXR1cm4gYnVmZmVyICV1IHRvIG5hdGl2ZSB3aW5kb3ciLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIEFDb2RlYzo6QnVmZmVySW5mbyAqQUNvZGVjOjpkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgaW50IGZlbmNlRmQgPSAtMTsKICAgICBDSEVDSyhtTmF0aXZlV2luZG93LmdldCgpICE9IE5VTEwpOworCisgICAgaWYgKG1UdW5uZWxlZCkgeworICAgICAgICBBTE9HVygiZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0dW5uZWwiCisgICAgICAgICAgICAgICIgdmlkZW8gcGxheWJhY2sgbW9kZSBtb2RlISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBpZiAobmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmKSAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZC4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC05MTAsNyArMTAyNCw3IEBACiAKICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMCiAgICAgICAgICAgICAmJiBpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7Ci0gICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbykpOworICAgICAgICBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKICAgICB9CiAKICAgICBDSEVDS19FUShtT01YLT5mcmVlQnVmZmVyKApAQCAtOTY0LDEyICsxMDc4LDE2IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMWFsYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIiwgInZpZGVvX2VuY29kZXIuaGV2YyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKQEAgLTEwMzksNiArMTE1Nyw5IEBACiAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKICAgICB9CiAKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKICAgICBtSXNFbmNvZGVyID0gZW5jb2RlcjsKIAogICAgIHN0YXR1c190IGVyciA9IHNldENvbXBvbmVudFJvbGUoZW5jb2RlciAvKiBpc0VuY29kZXIgKi8sIG1pbWUpOwpAQCAtMTEyMSw3NCArMTI0MiwxMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgewotICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsOworICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWUtbGFwc2UiLCAmbVRpbWVQZXJDYXB0dXJlVXMpKSB7CisgICAgICAgICAgICBtVGltZVBlckNhcHR1cmVVcyA9IC0xbGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSkgeworICAgICAgICAgICAgbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQWx3YXlzIHRyeSB0byBlbmFibGUgZHluYW1pYyBvdXRwdXQgYnVmZmVycyBvbiBuYXRpdmUgc3VyZmFjZQogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBpbnQzMl90IGhhdmVOYXRpdmVXaW5kb3cgPSBtc2ctPmZpbmRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCAmb2JqKSAmJgotICAgICAgICAgICAgb2JqICE9IE5VTEw7CisgICAgICAgIG9iaiAhPSBOVUxMOwogICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gZmFsc2U7Ci0gICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICBpZiAodmlkZW8gJiYgIWVuY29kZXIpIHsKKyAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIGZhbHNlKTsKKyAgICB9CiAgICAgaWYgKCFlbmNvZGVyICYmIHZpZGVvICYmIGhhdmVOYXRpdmVXaW5kb3cpIHsKLSAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAotICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gd2luZG93V3JhcHBlcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSB3aW5kb3dXcmFwcGVyLT5nZXROYXRpdmVXaW5kb3coKTsKIAotICAgICAgICAgICAgLy8gaWYgYWRhcHRpdmUgcGxheWJhY2sgaGFzIGJlZW4gcmVxdWVzdGVkLCB0cnkgSkIgZmFsbGJhY2sKLSAgICAgICAgICAgIC8vIE5PVEU6IFRISVMgRkFMTEJBQ0sgTUVDSEFOSVNNIFdJTEwgQkUgUkVNT1ZFRCBEVUUgVE8gSVRTCi0gICAgICAgICAgICAvLyBMQVJHRSBNRU1PUlkgUkVRVUlSRU1FTlQKKyAgICAgICAgaW50MzJfdCB0dW5uZWxlZDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwgJnR1bm5lbGVkKSAmJgorICAgICAgICAgICAgdHVubmVsZWQgIT0gMCkgeworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIFRVTk5FTEVEIHZpZGVvIHBsYXliYWNrLiIpOworICAgICAgICAgICAgbVR1bm5lbGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgLy8gd2Ugd2lsbCBub3QgZG8gYWRhcHRpdmUgcGxheWJhY2sgb24gc29mdHdhcmUgYWNjZXNzZWQKLSAgICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIHRoZXkgbmV2ZXIgaGFkIHRvIHJlc3BvbmQgdG8gY2hhbmdlcyBpbiB0aGUKLSAgICAgICAgICAgIC8vIGNyb3Agd2luZG93LCBhbmQgd2UgZG9uJ3QgdHJ1c3QgdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0by4KLSAgICAgICAgICAgIGludCB1c2FnZUJpdHMgPSAwOwotICAgICAgICAgICAgYm9vbCBjYW5Eb0FkYXB0aXZlUGxheWJhY2s7Ci0KLSAgICAgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IHdpbmRvd1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKSk7Ci0gICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3cgPSB3aW5kb3dXcmFwcGVyLT5nZXROYXRpdmVXaW5kb3coKTsKLQotICAgICAgICAgICAgaWYgKG5hdGl2ZVdpbmRvdy0+cXVlcnkoCi0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAotICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzKSAhPSBPSykgewotICAgICAgICAgICAgICAgIGNhbkRvQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYW5Eb0FkYXB0aXZlUGxheWJhY2sgPQotICAgICAgICAgICAgICAgICAgICAodXNhZ2VCaXRzICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0spKSA9PSAwOworICAgICAgICAgICAgaW50MzJfdCBhdWRpb0h3U3luYyA9IDA7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhdWRpby1ody1zeW5jIiwgJmF1ZGlvSHdTeW5jKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJObyBBdWRpbyBIVyBTeW5jIHByb3ZpZGVkIGZvciB2aWRlbyB0dW5uZWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGNvbmZpZ3VyZVR1bm5lbGVkVmlkZW9QbGF5YmFjayhhdWRpb0h3U3luYywgbmF0aXZlV2luZG93KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKCVkLCVwKSBmYWlsZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvSHdTeW5jLCBuYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwLCBtYXhIZWlnaHQgPSAwOwotICAgICAgICAgICAgaWYgKGNhbkRvQWRhcHRpdmVQbGF5YmFjayAmJgotICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpICYmCi0gICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKCVkeCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsIG1heEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAotICAgICAgICAgICAgICAgICAgICAgICAgIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2sgZmFpbGVkIHcvIGVyciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICAgICAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrID0gKGVyciA9PSBPSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhbGxvdyBmYWlsdXJlCi0gICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgc3VjY2VlZGVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IHRydWU7Ci0gICAgICAgICAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiQ29uZmlndXJpbmcgQ1BVIGNvbnRyb2xsZWQgdmlkZW8gcGxheWJhY2suIik7CisgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQWx3YXlzIHRyeSB0byBlbmFibGUgZHluYW1pYyBvdXRwdXQgYnVmZmVycyBvbiBuYXRpdmUgc3VyZmFjZQorICAgICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKworICAgICAgICAgICAgICAgIC8vIGlmIGFkYXB0aXZlIHBsYXliYWNrIGhhcyBiZWVuIHJlcXVlc3RlZCwgdHJ5IEpCIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gTk9URTogVEhJUyBGQUxMQkFDSyBNRUNIQU5JU00gV0lMTCBCRSBSRU1PVkVEIERVRSBUTyBJVFMKKyAgICAgICAgICAgICAgICAvLyBMQVJHRSBNRU1PUlkgUkVRVUlSRU1FTlQKKworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGRvIGFkYXB0aXZlIHBsYXliYWNrIG9uIHNvZnR3YXJlIGFjY2Vzc2VkCisgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgYXMgdGhleSBuZXZlciBoYWQgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGNyb3Agd2luZG93LCBhbmQgd2UgZG9uJ3QgdHJ1c3QgdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0by4KKyAgICAgICAgICAgICAgICBpbnQgdXNhZ2VCaXRzID0gMDsKKyAgICAgICAgICAgICAgICBib29sIGNhbkRvQWRhcHRpdmVQbGF5YmFjazsKKworICAgICAgICAgICAgICAgIGlmIChuYXRpdmVXaW5kb3ctPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9VU0FHRV9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlQml0cykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1c2FnZUJpdHMgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSkgPT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY2FuRG9BZGFwdGl2ZVBsYXliYWNrICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayglZHglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1heFdpZHRoLCBtYXhIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwgbWF4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIGZhaWxlZCB3LyBlcnIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJtYXgtd2lkdGgiLCBtYXhXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC1oZWlnaHQiLCBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbG93IGZhaWx1cmUKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBzdWNjZWVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBwdXNoOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcHVzaCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnUHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93T25TaHV0ZG93bjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgcHVzaDsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iLCAmcHVzaCkKLSAgICAgICAgICAgICAgICAmJiBwdXNoICE9IDApIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd247CisgICAgICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbVJvdGF0aW9uRGVncmVlcyA9IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSAwOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTk2LDEzICsxMzY3LDcgQEAKICAgICAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRGVjb2RlcihtaW1lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHNldHVwVmlkZW9EZWNvZGVyKG1pbWUsIG1zZyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0xMjI0LDE2ICsxMzg5LDUyIEBACiAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludDMyX3QgaXNBRFRTLCBhYWNQcm9maWxlOworICAgICAgICAgICAgaW50MzJfdCBzYnJNb2RlOworICAgICAgICAgICAgaW50MzJfdCBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGU7CisgICAgICAgICAgICBkcmNQYXJhbXNfdCBkcmM7CiAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpcy1hZHRzIiwgJmlzQURUUykpIHsKICAgICAgICAgICAgICAgICBpc0FEVFMgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgICAgICBhYWNQcm9maWxlID0gT01YX0FVRElPX0FBQ09iamVjdE51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtc2JyLW1vZGUiLCAmc2JyTW9kZSkpIHsKKyAgICAgICAgICAgICAgICBzYnJNb2RlID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiLCAmbWF4T3V0cHV0Q2hhbm5lbENvdW50KSkgeworICAgICAgICAgICAgICAgIG1heE91dHB1dENoYW5uZWxDb3VudCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXBjbS1saW1pdGVyLWVuYWJsZSIsICZwY21MaW1pdGVyRW5hYmxlKSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBwY21MaW1pdGVyRW5hYmxlID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLCAmZHJjLmVuY29kZWRUYXJnZXRMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmVuY29kZWRUYXJnZXRMZXZlbCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCAmZHJjLmRyY0N1dCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmRyY0N1dCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1ib29zdC1sZXZlbCIsICZkcmMuZHJjQm9vc3QpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5kcmNCb29zdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1oZWF2eS1jb21wcmVzc2lvbiIsICZkcmMuaGVhdnlDb21wcmVzc2lvbikpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmhlYXZ5Q29tcHJlc3Npb24gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwgJmRyYy50YXJnZXRSZWZMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLnRhcmdldFJlZkxldmVsID0gLTE7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGVyciA9IHNldHVwQUFDQ29kZWMoCiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBiaXRSYXRlLCBhYWNQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICBpc0FEVFMgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGlzQURUUyAhPSAwLCBzYnJNb2RlLCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGRyYywKKyAgICAgICAgICAgICAgICAgICAgcGNtTGltaXRlckVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKICAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCBmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOwpAQCAtMTI2MCw4ICsxNDYxLDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXhpdHkiLCAmY29tcHJlc3Npb25MZXZlbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIiwgJmNvbXByZXNzaW9uTGV2ZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTGV2ZWwgPSA1Oy8vIGRlZmF1bHQgRkxBQyBjb21wcmVzc2lvbiBsZXZlbAorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkxldmVsID0gNTsgLy8gZGVmYXVsdCBGTEFDIGNvbXByZXNzaW9uIGxldmVsCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wcmVzc2lvbkxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29tcHJlc3Npb24gbGV2ZWwgJWQgb3V0c2lkZSBbMC4uOF0gcmFuZ2UsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIDAiLApAQCAtMTMyMiw2ICsxNTI1LDExIEBACiAgICAgICAgIGVyciA9IHNldE1pbkJ1ZmZlclNpemUoa1BvcnRJbmRleElucHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAorICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbnB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7CisgICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBvdXRwdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIG1PdXRwdXRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xMzkwLDcgKzE1OTgsOSBAQAogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwQUFDQ29kZWMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQzMl90IGJpdFJhdGUsIGludDMyX3QgYWFjUHJvZmlsZSwgYm9vbCBpc0FEVFMpIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlLCBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgIGludDMyX3QgbWF4T3V0cHV0Q2hhbm5lbENvdW50LCBjb25zdCBkcmNQYXJhbXNfdCYgZHJjLAorICAgICAgICBpbnQzMl90IHBjbUxpbWl0ZXJFbmFibGUpIHsKICAgICBpZiAoZW5jb2RlciAmJiBpc0FEVFMpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTQ1Nyw2ICsxNjY3LDMyIEBACiAgICAgICAgIHByb2ZpbGUubkFBQ0VSdG9vbHMgPSBPTVhfQVVESU9fQUFDRVJOb25lOwogICAgICAgICBwcm9maWxlLmVBQUNQcm9maWxlID0gKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjUHJvZmlsZTsKICAgICAgICAgcHJvZmlsZS5lQUFDU3RyZWFtRm9ybWF0ID0gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOworICAgICAgICBzd2l0Y2ggKHNick1vZGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLy8gZGlzYWJsZSBzYnIKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLy8gZW5hYmxlIHNpbmdsZS1yYXRlIHNicgorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIC8vIGVuYWJsZSBkdWFsLXJhdGUgc2JyCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIC8vIGVuYWJsZSBib3RoIG1vZGVzIC0+IHRoZSBjb2RlYyB3aWxsIGRlY2lkZSB3aGljaCBtb2RlIHNob3VsZCBiZSB1c2VkCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgc2JyIG1vZGUKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKwogCiAgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CkBAIC0xNDg3LDggKzE3MjMsMjQgQEAKICAgICAgICAgICAgID8gT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEFEVFMKICAgICAgICAgICAgIDogT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGOwogCi0gICAgcmV0dXJuIG1PTVgtPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLCAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKTsKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFIHByZXNlbnRhdGlvbjsKKyAgICBwcmVzZW50YXRpb24ubk1heE91dHB1dENoYW5uZWxzID0gbWF4T3V0cHV0Q2hhbm5lbENvdW50OworICAgIHByZXNlbnRhdGlvbi5uRHJjQ3V0ID0gZHJjLmRyY0N1dDsKKyAgICBwcmVzZW50YXRpb24ubkRyY0Jvb3N0ID0gZHJjLmRyY0Jvb3N0OworICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbiA9IGRyYy5oZWF2eUNvbXByZXNzaW9uOworICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSBkcmMudGFyZ2V0UmVmTGV2ZWw7CisgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBkcmMuZW5jb2RlZFRhcmdldExldmVsOworICAgIHByZXNlbnRhdGlvbi5uUENNTGltaXRlckVuYWJsZSA9IHBjbUxpbWl0ZXJFbmFibGU7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycywgd2lsbCBub3QgY2F1c2UgY29uZmlndXJhdGlvbiBmYWlsdXJlCisgICAgICAgIG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJkaWQgbm90IHNldCBBdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24gZHVlIHRvIGVycm9yICVkIHdoZW4gc2V0dGluZyBBdWRpb0FhYyIsIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBBQzNDb2RlYygKQEAgLTE2ODUsNiArMTkzNywyNyBAQAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwY21QYXJhbXMsIHNpemVvZihwY21QYXJhbXMpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soCisgICAgICAgIGludDMyX3QgYXVkaW9Id1N5bmMsIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIHNpZGViYW5kSGFuZGxlOworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCBhdWRpb0h3U3luYywgJnNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbShuYXRpdmVXaW5kb3cuZ2V0KCksIHNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKKyAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCiAgICAgICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0LApAQCAtMTcwNiw2ICsxOTc5LDE3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gc3Vic3RpdHV0ZSBiYWNrIGZsZXhpYmxlIGNvbG9yIGZvcm1hdCB0byBjb2RlYyBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgIE9NWF9VMzIgZmxleGlibGVFcXVpdmFsZW50OworICAgICAgICBpZiAoY29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ1VudXNlZCAmJgorICAgICAgICAgICAgICAgIGlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PTVgsIG1Ob2RlLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCAmZmxleGlibGVFcXVpdmFsZW50KSAmJgorICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID09IGZsZXhpYmxlRXF1aXZhbGVudCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gdXNpbmcgY29sb3IgZm9ybWF0ICUjeCBpbiBwbGFjZSBvZiAlI3giLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGZvcm1hdC5lQ29sb3JGb3JtYXQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiBpcyB2aW9sYXRlZCBieSBUSSdzIHZpZGVvIGRlY29kZXIuCiAgICAgICAgIC8vIENIRUNLX0VRKGZvcm1hdC5uSW5kZXgsIGluZGV4KTsKIApAQCAtMTc2Niw2ICsyMDUwLDcgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtVmlkZW9Db2RpbmdUeXBlOwogfSBrVmlkZW9Db2RpbmdNYXBFbnRyeVtdID0gewogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBPTVhfVklERU9fQ29kaW5nQVZDIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBPTVhfVklERU9fQ29kaW5nSEVWQyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIE9NWF9WSURFT19Db2RpbmdNUEVHNCB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgT01YX1ZJREVPX0NvZGluZ0gyNjMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCBPTVhfVklERU9fQ29kaW5nTVBFRzIgfSwKQEAgLTE4MDYsNyArMjA5MSwxMyBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0OwogICAgIHN0YXR1c190IGVyciA9IEdldFZpZGVvQ29kaW5nVHlwZUZyb21NaW1lKG1pbWUsICZjb21wcmVzc2lvbkZvcm1hdCk7CiAKQEAgLTE4MjEsNyArMjExMiwyMCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIGludDMyX3QgdG1wOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnRtcCkpIHsKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KHRtcCk7CisgICAgICAgIGVyciA9IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCisgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1ZJREVPX0NvZGluZ1VudXNlZCwgY29sb3JGb3JtYXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiWyVzXSBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBlcnIgPSBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE5MTIsNiArMjIxNiw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICAgICAgbVRpbWVQZXJGcmFtZVVzID0gKGludDY0X3QpICgxMDAwMDAwLjBmIC8gZnJhbWVSYXRlKTsKICAgICB9CiAKICAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAoT01YX1UzMikoZnJhbWVSYXRlICogNjU1MzYuMGYpOwpAQCAtMTk4Niw2ICsyMjkxLDEwIEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdIRVZDOgorICAgICAgICAgICAgZXJyID0gc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA5OgogICAgICAgICAgICAgZXJyID0gc2V0dXBWUFhFbmNvZGVyUGFyYW1ldGVycyhtc2cpOwpAQCAtMjA0NCw3ICsyMzUzLDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIE9NWF9VMzIgcmV0ID0gZnJhbWVSYXRlICogaUZyYW1lc0ludGVydmFsOwotICAgIENIRUNLKHJldCA+IDEpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTIyMTQsNiArMjUyMiw1OCBAQAogICAgIHJldHVybiBzZXR1cEVycm9yQ29ycmVjdGlvblBhcmFtZXRlcnMoKTsKIH0KIAorLy8gc3RhdGljCitpbnQgLyogT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqLyBBQ29kZWM6OmdldEFWQ0xldmVsRm9yKAorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByYXRlLCBpbnQgYml0cmF0ZSwKKyAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHByb2ZpbGUpIHsKKyAgICAvLyBjb252ZXJ0IGJpdHJhdGUgdG8gbWFpbi9iYXNlbGluZSBwcm9maWxlIGticHMgZXF1aXZhbGVudAorICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDMwMDApOyBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMTI1MCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDEwMDApOyBicmVhazsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHNpemUgYW5kIHJhdGUgdG8gTUJzCisgICAgd2lkdGggPSBkaXZVcCh3aWR0aCwgMTYpOworICAgIGhlaWdodCA9IGRpdlVwKGhlaWdodCwgMTYpOworICAgIGludCBtYnMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICByYXRlICo9IG1iczsKKyAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKKyAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KKyAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUobGltaXRzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCAoJmxpbWl0KVs1XSA9IGxpbWl0c1tpXTsKKyAgICAgICAgaWYgKHJhdGUgPD0gbGltaXRbMF0gJiYgbWJzIDw9IGxpbWl0WzFdICYmIG1heERpbWVuc2lvbiA8PSBsaW1pdFsyXQorICAgICAgICAgICAgICAgICYmIGJpdHJhdGUgPD0gbGltaXRbM10pIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdFs0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBiaXRyYXRlLCBpRnJhbWVJbnRlcnZhbDsKICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpCkBAIC0yMzIyLDE0ICsyNjgyLDEzOSBAQAogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBiaXRyYXRlOwotICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGJpdHJhdGUsIGlGcmFtZUludGVydmFsOworICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsICZpRnJhbWVJbnRlcnZhbCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOwogCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUgaGV2Y1R5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmaGV2Y1R5cGUpOworICAgIGhldmNUeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjLCAmaGV2Y1R5cGUsIHNpemVvZihoZXZjVHlwZSkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgIGludDMyX3QgbGV2ZWw7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChwcm9maWxlLCBsZXZlbCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBoZXZjVHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEU+KHByb2ZpbGUpOworICAgICAgICBoZXZjVHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4obGV2ZWwpOworICAgIH0KKworICAgIC8vIFRPRE86IE5lZWQgT01YIHN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciBzZXR0aW5nIGlGcmFtZUludGVydmFsCisKKyAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIHNpemVfdCB0c0xheWVycyA9IDA7CisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIHBhdHRlcm4gPQorICAgICAgICBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uCisgICAgICAgIFtPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU10KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXSA9IHsKKyAgICAgICAgezEwMCwgMTAwLCAxMDB9LCAgLy8gMSBsYXllcgorICAgICAgICB7IDYwLCAxMDAsIDEwMH0sICAvLyAyIGxheWVycyB7NjAlLCA0MCV9CisgICAgICAgIHsgNDAsICA2MCwgMTAwfSwgIC8vIDMgbGF5ZXJzIHs0MCUsIDIwJSwgNDAlfQorICAgIH07CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKTsKKworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOworCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBBU3RyaW5nIHRzU2NoZW1hOworICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoInRzLXNjaGVtYSIsICZ0c1NjaGVtYSkpIHsKKyAgICAgICAgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjEtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjItbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjMtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgdHNTY2hlbWEuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgIEluaXRPTVhQYXJhbXMoJnZwOHR5cGUpOworICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpZiAoaUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICB2cDh0eXBlLm5LZXlGcmFtZUludGVydmFsID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgdnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50ID0gdHNMYXllcnM7CisgICAgICAgIGlmICh0c0xheWVycyA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIHZwOHR5cGUublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gPQorICAgICAgICAgICAgICAgICAgICBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uW3RzTGF5ZXJzIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHJhdGVNb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50KSB7CisgICAgICAgICAgICB2cDh0eXBlLm5NaW5RdWFudGl6ZXIgPSAyOworICAgICAgICAgICAgdnA4dHlwZS5uTWF4UXVhbnRpemVyID0gNjM7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAmdnA4dHlwZSwgc2l6ZW9mKHZwOHR5cGUpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkV4dGVuZGVkIFZQOCBwYXJhbWV0ZXJzIHNldCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIApAQCAtMjQ4NSwxOSArMjk3MCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAotICAgICAgICAgICAgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlslc10gTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotCi0gICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY291bnRCdWZmZXJzT3duZWRCeU5hdGl2ZVdpbmRvdygpID4gKHNpemVfdCltaW5VbmRlcXVldWVkQnVmcworICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMKICAgICAgICAgICAgICYmIGRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGVzZSBidWZmZXJzIHdpbGwgYmUgc3VibWl0dGVkIGFzIHJlZ3VsYXIgYnVmZmVyczsgYWNjb3VudCBmb3IgdGhpcwogICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgJiYgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgewpAQCAtMjU0Myw3OSArMzAxNiwyOTEgQEAKICAgICB9CiB9CiAKLXZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisvLyBzdGF0aWMKK2Jvb2wgQUNvZGVjOjpkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZwYXJhbXMpIHsKKyAgICBNZWRpYUltYWdlICZpbWFnZSA9IHBhcmFtcy5zTWVkaWFJbWFnZTsKKyAgICBtZW1zZXQoJmltYWdlLCAwLCBzaXplb2YoaW1hZ2UpKTsKIAorICAgIGltYWdlLm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOOworICAgIGltYWdlLm1OdW1QbGFuZXMgPSAwOworCisgICAgY29uc3QgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZm10ID0gcGFyYW1zLmVDb2xvckZvcm1hdDsKKyAgICBpbWFnZS5tV2lkdGggPSBwYXJhbXMubkZyYW1lV2lkdGg7CisgICAgaW1hZ2UubUhlaWdodCA9IHBhcmFtcy5uRnJhbWVIZWlnaHQ7CisKKyAgICAvLyBvbmx5IHN1cHBvcnRpbmcgWVVWNDIwCisgICAgaWYgKGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyICYmCisgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpIHsKKyAgICAgICAgQUxPR1coImRvIG5vdCBrbm93IGNvbG9yIGZvcm1hdCAweCV4ID0gJWQiLCBmbXQsIGZtdCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBURU1QT1JBUlkgRklYIGZvciBzb21lIHZlbmRvcnMgdGhhdCBhZHZlcnRpc2Ugc2xpY2VIZWlnaHQgYXMgMAorICAgIGlmIChwYXJhbXMublN0cmlkZSAhPSAwICYmIHBhcmFtcy5uU2xpY2VIZWlnaHQgPT0gMCkgeworICAgICAgICBBTE9HVygidXNpbmcgc2xpY2VIZWlnaHQ9JXUgaW5zdGVhZCBvZiB3aGF0IGNvZGVjIGFkdmVydGlzZWQgKD0wKSIsCisgICAgICAgICAgICAgICAgcGFyYW1zLm5GcmFtZUhlaWdodCk7CisgICAgICAgIHBhcmFtcy5uU2xpY2VIZWlnaHQgPSBwYXJhbXMubkZyYW1lSGVpZ2h0OworICAgIH0KKworICAgIC8vIHdlIG5lZWQgc3RyaWRlIGFuZCBzbGljZS1oZWlnaHQgdG8gYmUgbm9uLXplcm8KKyAgICBpZiAocGFyYW1zLm5TdHJpZGUgPT0gMCB8fCBwYXJhbXMublNsaWNlSGVpZ2h0ID09IDApIHsKKyAgICAgICAgQUxPR1coImNhbm5vdCBkZXNjcmliZSBjb2xvciBmb3JtYXQgMHgleCA9ICVkIHdpdGggc3RyaWRlPSV1IGFuZCBzbGljZUhlaWdodD0ldSIsCisgICAgICAgICAgICAgICAgZm10LCBmbXQsIHBhcmFtcy5uU3RyaWRlLCBwYXJhbXMublNsaWNlSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldC11cCBZVVYgZm9ybWF0CisgICAgaW1hZ2UubVR5cGUgPSBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1lVVjsKKyAgICBpbWFnZS5tTnVtUGxhbmVzID0gMzsKKyAgICBpbWFnZS5tQml0RGVwdGggPSA4OworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tT2Zmc2V0ID0gMDsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUNvbEluYyA9IDE7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tVmVydFN1YnNhbXBsaW5nID0gMTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjogLy8gdXNlZCBmb3IgWVYxMgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCA9IHBhcmFtcy5uU3RyaWRlICogcGFyYW1zLm5TbGljZUhlaWdodDsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldAorICAgICAgICAgICAgICAgICAgICArIChwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQgLyA0KTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGUgLyAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAvLyBGSVhNRTogTlYyMSBmb3Igc3ctZW5jb2RlciwgTlYxMiBmb3IgZGVjb2RlciBhbmQgaHctZW5jb2RlcgorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgLy8gTlYxMgorICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgPSBwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQ7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1PZmZzZXQgPSBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubU9mZnNldCArIDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEFDb2RlYzo6ZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcykKK3sKKyAgICBPTVhfSU5ERVhUWVBFIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleDsKKyAgICBpZiAob214LT5nZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIG5vZGUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVDb2xvckZvcm1hdCIsCisgICAgICAgICAgICAmZGVzY3JpYmVDb2xvckZvcm1hdEluZGV4KSAhPSBPSyB8fAorICAgICAgICBvbXgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG5vZGUsIGRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleCwKKyAgICAgICAgICAgICZkZXNjcmliZVBhcmFtcywgc2l6ZW9mKGRlc2NyaWJlUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaWJlRGVmYXVsdENvbG9yRm9ybWF0KGRlc2NyaWJlUGFyYW1zKTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLm1UeXBlICE9CisgICAgICAgICAgICBNZWRpYUltYWdlOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Cit9CisKKy8vIHN0YXRpYworYm9vbCBBQ29kZWM6OmlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgIHVpbnQzMl90IGNvbG9yRm9ybWF0LCBPTVhfVTMyICpmbGV4aWJsZUVxdWl2YWxlbnQpIHsKKyAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zIGRlc2NyaWJlUGFyYW1zOworICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICBkZXNjcmliZVBhcmFtcy5lQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7CisgICAgLy8gcmVhc29uYWJsZSBkdW1teSB2YWx1ZXMKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVXaWR0aCA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMublN0cmlkZSA9IDEyODsKKyAgICBkZXNjcmliZVBhcmFtcy5uU2xpY2VIZWlnaHQgPSAxMjg7CisKKyAgICBDSEVDSyhmbGV4aWJsZUVxdWl2YWxlbnQgIT0gTlVMTCk7CisKKyAgICBpZiAoIWRlc2NyaWJlQ29sb3JGb3JtYXQob214LCBub2RlLCBkZXNjcmliZVBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IE1lZGlhSW1hZ2UgJmltZyA9IGRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlOworICAgIGlmIChpbWcubVR5cGUgPT0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVYpIHsKKyAgICAgICAgaWYgKGltZy5tTnVtUGxhbmVzICE9IDMgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1Ib3JpelN1YnNhbXBsaW5nICE9IDEgfHwKKyAgICAgICAgICAgIGltZy5tUGxhbmVbaW1nLlldLm1WZXJ0U3Vic2FtcGxpbmcgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gWVVWIDQyMAorICAgICAgICBpZiAoaW1nLm1QbGFuZVtpbWcuVV0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlVdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgICAgICYmIGltZy5tUGxhbmVbaW1nLlZdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5WXS5tVmVydFN1YnNhbXBsaW5nID09IDIpIHsKKyAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZsZXhpYmxlIFlVVjQyMCBmb3JtYXQKKyAgICAgICAgICAgIGlmIChpbWcubUJpdERlcHRoIDw9IDgpIHsKKyAgICAgICAgICAgICAgICpmbGV4aWJsZUVxdWl2YWxlbnQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6Z2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICAvLyBUT0RPOiBjYXRjaCBlcnJvcnMgYW4gcmV0dXJuIHRoZW0gaW5zdGVhZCBvZiB1c2luZyBDSEVDSwogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwogICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSksCiAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKIAotICAgIENIRUNLX0VRKChpbnQpZGVmLmVEaXIsIChpbnQpT01YX0Rpck91dHB1dCk7CisgICAgQ0hFQ0tfRVEoKGludClkZWYuZURpciwKKyAgICAgICAgICAgIChpbnQpKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ID8gT01YX0Rpck91dHB1dCA6IE9NWF9EaXJJbnB1dCkpOwogCiAgICAgc3dpdGNoIChkZWYuZURvbWFpbikgewogICAgICAgICBjYXNlIE9NWF9Qb3J0RG9tYWluVmlkZW86CiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvRGVmID0gJmRlZi5mb3JtYXQudmlkZW87CisgICAgICAgICAgICBzd2l0Y2ggKChpbnQpdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1VudXNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwogCi0gICAgICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEdldE1pbWVUeXBlRm9yVmlkZW9Db2RpbmcoCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgdmlkZW9EZWYtPm5TbGljZUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQpOworCisgICAgICAgICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXMgZGVzY3JpYmVQYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlc2NyaWJlUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gdmlkZW9EZWYtPmVDb2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZUhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSB2aWRlb0RlZi0+blN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQYXJhbXMublNsaWNlSGVpZ2h0ID0gdmlkZW9EZWYtPm5TbGljZUhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpYmVDb2xvckZvcm1hdChtT01YLCBtTm9kZSwgZGVzY3JpYmVQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlLWRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaWJlUGFyYW1zLnNNZWRpYUltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggIT0ga1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWxzbyBnZXQgaW5wdXQgY3JvcAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFIHJlY3Q7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnJlY3QpOworICAgICAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uSGVpZ2h0ID0gdmlkZW9EZWYtPm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5Ub3AsIDApOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZ2cDh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnA4dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodnA4dHlwZSkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWEgPSAibm9uZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4xLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4yLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTY2hlbWEgPSAid2VicnRjLnZwOC4zLWxheWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoInRzLXNjaGVtYSIsIHRzU2NoZW1hKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gc2V0IHVwIG1pbWUuCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkpOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9EZWYtPmVDb21wcmVzc2lvbkZvcm1hdCwgJm1pbWUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgIGlmICghbUlzRW5jb2RlcikgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInN0cmlkZSIsIHZpZGVvRGVmLT5uU3RyaWRlKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzbGljZS1oZWlnaHQiLCB2aWRlb0RlZi0+blNsaWNlSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCB2aWRlb0RlZi0+ZUNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIE9NWF9DT05GSUdfUkVDVFRZUEUgcmVjdDsKLSAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKLSAgICAgICAgICAgICAgICByZWN0Lm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotCi0gICAgICAgICAgICAgICAgaWYgKG1PTVgtPmdldENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgc2l6ZW9mKHJlY3QpKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGggPSB2aWRlb0RlZi0+bkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uTGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5XaWR0aCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkhlaWdodCwgMHUpOwotICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUocmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0UmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjYyOCw3ICszMzEzLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKQEAgLTI2NDgsMjAgKzMzMzMsNiBAQAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRW5jb2RlckRlbGF5ICsgbUVuY29kZXJQYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gcGFyYW1zLm5DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmJ1ZnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZidWZzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IG5ldyBTa2lwQ3V0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsTWFza1ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtbWFzayIsIG1DaGFubmVsTWFzayk7CkBAIC0yNjczLDcgKzMzNDQsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLApAQCAtMjY5MCw3ICszMzYxLDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLApAQCAtMjcxNiw3ICszMzg3LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0ZsYWMsCkBAIC0yNzI5LDExICszNDAwLDQ1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ01QMzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb01wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdWT1JCSVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9Wb3JiaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUMzOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUMzVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCkBAIC0yNzQ3LDcgKzM0NTIsNTIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0c3MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcykpKTsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZU1VTGF3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUFMYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHBhcmFtcy5lUENNTW9kZSA9PSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVU5LTk9XTiBBVURJTyBDT0RJTkc6ICVkXG4iLCBhdWRpb0RlZi0+ZUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjc1Nyw2ICszNTA3LDQzIEBACiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBQ29kZWM6OnNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKKworICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgbm90aWZ5KSwgKHN0YXR1c190KU9LKTsKKworICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhub3RpZnktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fUkFXICYmCisgICAgICAgIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICBub3RpZnktPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgLy8gbm90aWZ5IHJlbmRlcmVyIG9mIHRoZSBjcm9wIGNoYW5nZQorICAgICAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICAgICAgcmVwbHktPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIHJpZ2h0ICsgMSwgYm90dG9tICsgMSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyAmJgorICAgICAgICAgICAgICAgKG1FbmNvZGVyRGVsYXkgfHwgbUVuY29kZXJQYWRkaW5nKSkgeworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgQ0hFQ0sobm90aWZ5LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmY2hhbm5lbENvdW50KSk7CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtRW5jb2RlckRlbGF5ICogZnJhbWVTaXplLAorICAgICAgICAgICAgICAgIG1FbmNvZGVyUGFkZGluZyAqIGZyYW1lU2l6ZSk7CisgICAgfQorCiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtU2VudEZvcm1hdCA9IHRydWU7CkBAIC0yNzY0LDkgKzM1NTEsMTkgQEAKIAogdm9pZCBBQ29kZWM6OnNpZ25hbEVycm9yKE9NWF9FUlJPUlRZUEUgZXJyb3IsIHN0YXR1c190IGludGVybmFsRXJyb3IpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRFcnJvcik7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigib214LWVycm9yIiwgZXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RXJyb3IpOworICAgIEFMT0dFKCJzaWduYWxFcnJvcihvbXhFcnJvciAlI3gsIGludGVybmFsRXJyb3IgJWQpIiwgZXJyb3IsIGludGVybmFsRXJyb3IpOworCisgICAgaWYgKGludGVybmFsRXJyb3IgPT0gVU5LTk9XTl9FUlJPUikgeyAvLyBmaW5kIGJldHRlciBlcnJvciBjb2RlCisgICAgICAgIGNvbnN0IHN0YXR1c190IG9teFN0YXR1cyA9IHN0YXR1c0Zyb21PTVhFcnJvcihlcnJvcik7CisgICAgICAgIGlmIChvbXhTdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgaW50ZXJuYWxFcnJvciA9IG9teFN0YXR1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnZhbGlkIE9NWCBlcnJvciAlI3giLCBlcnJvcik7CisgICAgICAgIH0KKyAgICB9CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgaW50ZXJuYWxFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYWN0aW9uQ29kZSIsIEFDVElPTl9DT0RFX0ZBVEFMKTsgLy8gY291bGQgdHJhbnNsYXRlIGZyb20gT01YIGVycm9yLgogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCkBAIC0yOTYzLDcgKzM3NjAsOCBAQAogICAgICAgbUNvZGVjKGNvZGVjKSB7CiB9CiAKLUFDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgpIHsKK0FDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkJhc2VTdGF0ZTo6Z2V0UG9ydE1vZGUoCisgICAgICAgIE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgcmV0dXJuIEtFRVBfQlVGRkVSUzsKIH0KIApAQCAtMjk4OSw2ICszNzg3LDcgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgogICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXBwIGlsbGVnYWwgc3RhdGUgZXhjZXB0aW9uLgogICAgICAgICAgICAgQUxPR0UoIk1lc3NhZ2UgMHgleCB3YXMgbm90IGhhbmRsZWQiLCBtc2ctPndoYXQoKSk7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yOTk2LDExICszNzk1LDI1IEBACiAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T01YRGllZDoKICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlc3VsdCBpbiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllIGhhbmRsaW5nIGluIE1lZGlhQ29kZWMuCiAgICAgICAgICAgICBBTE9HRSgiT01YL21lZGlhc2VydmVyIGRpZWQsIHNpZ25hbGxpbmcgZXJyb3IhIik7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclJlc291cmNlc0xvc3QsIERFQURfT0JKRUNUKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZvcmNpbmcgdGhlIHJlbGVhc2Ugb2YgY29kZWMiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5mcmVlTm9kZShtQ29kZWMtPm1Ob2RlKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCJbJXNdIGZhaWxlZCB0byByZWxlYXNlIGNvZGVjIGluc3RhbmNlOiBlcnI9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzAxMiw2ICszODI1LDE0IEBACiAgICAgaW50MzJfdCB0eXBlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpKTsKIAorICAgIC8vIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGlzIGlzIGFuIG91dHN0YW5kaW5nIG1lc3NhZ2UgZm9yIGEKKyAgICAvLyBjb2RlYyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkZXN0cm95ZWQKKyAgICBpZiAobUNvZGVjLT5tTm9kZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJpZ25vcmluZyBtZXNzYWdlIGFzIGFscmVhZHkgZnJlZWQgY29tcG9uZW50OiAlcyIsCisgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBJT01YOjpub2RlX2lkIG5vZGVJRDsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibm9kZSIsIChpbnQzMl90Kikmbm9kZUlEKSk7CiAgICAgQ0hFQ0tfRVEobm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKQEAgLTMwNTYsMjMgKzM4NzcsMTcgQEAKIAogICAgICAgICAgICAgaW50MzJfdCByYW5nZU9mZnNldCwgcmFuZ2VMZW5ndGgsIGZsYWdzOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGU7Ci0gICAgICAgICAgICB2b2lkICpkYXRhUHRyOwogCiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2Vfb2Zmc2V0IiwgJnJhbmdlT2Zmc2V0KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmFuZ2VfbGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXAiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJwbGF0Zm9ybV9wcml2YXRlIiwgJnBsYXRmb3JtUHJpdmF0ZSkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YV9wdHIiLCAmZGF0YVB0cikpOwogCiAgICAgICAgICAgICByZXR1cm4gb25PTVhGaWxsQnVmZmVyRG9uZSgKICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpcmFuZ2VPZmZzZXQsIChzaXplX3QpcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKWZsYWdzLAotICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgZGF0YVB0cik7CisgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzA5Miw3ICszOTA3LDEzIEBACiAKICAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOGx4KSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YTEpOwogCi0gICAgbUNvZGVjLT5zaWduYWxFcnJvcigoT01YX0VSUk9SVFlQRSlkYXRhMSk7CisgICAgLy8gdmVyaWZ5IE9NWCBjb21wb25lbnQgc2VuZHMgYmFjayBhbiBlcnJvciB3ZSBleHBlY3QuCisgICAgT01YX0VSUk9SVFlQRSBvbXhFcnJvciA9IChPTVhfRVJST1JUWVBFKWRhdGExOworICAgIGlmICghaXNPTVhFcnJvcihvbXhFcnJvcikpIHsKKyAgICAgICAgQUxPR1coIkludmFsaWQgT01YIGVycm9yICUjeCIsIG9teEVycm9yKTsKKyAgICAgICAgb214RXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorICAgIG1Db2RlYy0+c2lnbmFsRXJyb3Iob214RXJyb3IpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0zMTA3LDIzICszOTI4LDEyIEBACiAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCk7CiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogCi0gICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZidWZmZXJNZXRhID0gaW5mby0+bURhdGEtPm1ldGEoKTsKLSAgICB2b2lkICptZWRpYUJ1ZmZlcjsKLSAgICBpZiAoYnVmZmVyTWV0YS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1lZGlhQnVmZmVyKQotICAgICAgICAgICAgJiYgbWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKLSAgICAgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAotICAgICAgICAvLyBieSB0aGlzICJtZWRpYUJ1ZmZlciIgb2JqZWN0LiBOb3cgdGhhdCB0aGUgT01YIGNvbXBvbmVudCBoYXMKLSAgICAgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKLSAgICAgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgotCi0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1lZGlhQnVmZmVyKTsKLQotICAgICAgICAoKE1lZGlhQnVmZmVyICopbWVkaWFCdWZmZXIpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1lZGlhQnVmZmVyID0gTlVMTDsKLQotICAgICAgICBidWZmZXJNZXRhLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOwotICAgIH0KKyAgICAvLyBXZSdyZSBpbiAic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIgbW9kZSwgdGhlIHVuZGVybHlpbmcKKyAgICAvLyBPTVggY29tcG9uZW50IGhhZCBhY2Nlc3MgdG8gZGF0YSB0aGF0J3MgaW1wbGljaXRseSByZWZjb3VudGVkCisgICAgLy8gYnkgdGhpcyAiTWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCisgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKKyAgICAvLyB0aGUgbWVkaWFCdWZmZXIncyByZWZlcmVuY2UgY291bnQuCisgICAgaW5mby0+bURhdGEtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKIAogICAgIFBvcnRNb2RlIG1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQpOwogCkBAIC0zMTU0LDcgKzM5NjQsNyBAQAogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+Y2xlYXIoKTsKQEAgLTMyNzYsOCArNDA4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dE1vZGUgPT0gRlJFRV9CVUZGRVJTID8gIkZSRUUiIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TW9kZSA9PSBLRUVQX0JVRkZFUlMgPyAiS0VFUCIgOiAiUkVTVUJNSVQiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRNb2RlID09IFJFU1VCTUlUX0JVRkZFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMzM3MCwxMCArNDE3OSw4IEBACiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgIGludDY0X3QgdGltZVVzLAotICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgIHZvaWQgKmRhdGFQdHIpIHsKLSAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICVwIHRpbWUgJWxsZCB1cywgZmxhZ3MgPSAweCUwOGx4IiwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICV1IHRpbWUgJSIgUFJJZDY0ICIgdXMsIGZsYWdzID0gMHglMDh4IiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcywgZmxhZ3MpOwogCiAgICAgc3NpemVfdCBpbmRleDsKQEAgLTM0MjQsNyArNDIzMSw3IEBACiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPQogICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQsIG1Db2RlYy0+aWQoKSk7CiAKLSAgICAgICAgICAgIGlmICghbUNvZGVjLT5tU2VudEZvcm1hdCkgeworICAgICAgICAgICAgaWYgKCFtQ29kZWMtPm1TZW50Rm9ybWF0ICYmIHJhbmdlTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgIG1Db2RlYy0+c2VuZEZvcm1hdENoYW5nZShyZXBseSk7CiAgICAgICAgICAgICB9CiAKQEAgLTM0NTEsNyArNDI1OCw3IEBACiAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcik7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOwogICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwpAQCAtMzQ2OCw3ICs0Mjc1LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVPUyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFT1MpOwogICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIG1Db2RlYy0+bUlucHV0RU9TUmVzdWx0KTsKICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKIApAQCAtMzUxMiwxMyArNDMxOSwzMiBAQAogICAgICAgICBBVFJBQ0VfTkFNRSgicmVuZGVyIik7CiAgICAgICAgIC8vIFRoZSBjbGllbnQgd2FudHMgdGhpcyBidWZmZXIgdG8gYmUgcmVuZGVyZWQuCiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQorICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCisgICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCisjaWYgMAorICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zICo9IDEwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gc2V0IGJ1ZmZlciB0aW1lc3RhbXA6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoZXJyID0gbUNvZGVjLT5tTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSwgLTEpKSA9PSBPSykgewogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTM2MjYsMTAgKzQ0NTIsMTEgQEAKICAgICAgICAgICAgIGludDMyX3Qga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwotICAgICAgICAgICAgQ0hFQ0soIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICAgICAgQUxPR1dfSUYoa2VlcENvbXBvbmVudEFsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qga2VlcCBjb21wb25lbnQgYWxsb2NhdGVkIG9uIHNodXRkb3duIGluIFVuaW5pdGlhbGl6ZWQgc3RhdGUiKTsKIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzYzOSwxMyArNDQ2NiwyMCBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgYXMgd2UgaGF2ZSBhbHJlYWR5IHNpZ25hbGVkIHNodXRkb3duCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CiAgICAgfQpAQCAtMzY4Niw2ICs0NTIwLDcgQEAKIAogICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBxdWlya3MgPSAwOworICAgIGludDMyX3QgZW5jb2RlciA9IGZhbHNlOwogICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLmFkZCgpOwogICAgICAgICBPTVhDb2RlYzo6Q29kZWNOYW1lQW5kUXVpcmtzICplbnRyeSA9ICZtYXRjaGluZ0NvZGVjcy5lZGl0SXRlbUF0KGluZGV4KTsKQEAgLTM2OTgsNyArNDUzMyw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICBpbnQzMl90IGVuY29kZXI7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKICAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKICAgICAgICAgfQpAQCAtMzcyNyw2ICs0NTYxLDggQEAKIAogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbGxvY2F0aW5nIGNvbXBvbmVudCAnJXMnIGZhaWxlZCwgdHJ5IG5leHQgb25lLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBub2RlID0gTlVMTDsKQEAgLTM3MzQsMTAgKzQ1NzAsMTAgQEAKIAogICAgIGlmIChub2RlID09IE5VTEwpIHsKICAgICAgICAgaWYgKCFtaW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSBkZWNvZGVyIGZvciB0eXBlICclcycuIiwKLSAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSAlc2NvZGVyIGZvciB0eXBlICclcycuIiwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA/ICJlbiIgOiAiZGUiLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBkZWNvZGVyICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJy4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZCk7CkBAIC0zNzYxLDcgKzQ1OTcsNyBAQAogCiAgICAgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQpAQCAtMzc4OCw3ICs0NjI0LDggQEAKICAgICBtQ29kZWMtPm1EZXF1ZXVlQ291bnRlciA9IDA7CiAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOwogICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7Ci0gICAgbUNvZGVjLT5tSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgIG1Db2RlYy0+bUlucHV0Rm9ybWF0LmNsZWFyKCk7CisgICAgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CiAKICAgICBpZiAobUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzKSB7CiAgICAgICAgIGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IG1Db2RlYy0+bUtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CkBAIC0zNzk4LDYgKzQ2MzUsOSBAQAogCiAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgfQorICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSBmYWxzZTsKKworICAgIG1Db2RlYy0+cHJvY2Vzc0RlZmVycmVkTWVzc2FnZXMoKTsKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewpAQCAtMzgwNyw5ICs0NjQ3LDEyIEBACiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tVW5pbml0aWFsaXplZFN0YXRlKTsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKKyAgICBpZiAobUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93bikgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisgICAgfQogfQogCiBib29sIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0zODQzLDYgKzQ2ODYsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsICZrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSk7CiAKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgb25TaHV0ZG93bihrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKIAogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CkBAIC0zODUyLDcgKzQ2OTYsNyBAQAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzg4MSw3ICs0NzI1LDcgQEAKICAgICAgICAgQUxPR0UoIlslc10gY29uZmlndXJlQ29kZWMgcmV0dXJuaW5nIGVycm9yICVkIiwKICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzkwMSw3ICs0NzQ1LDkgQEAKIAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiaW5wdXQtZm9ybWF0IiwgbUNvZGVjLT5tSW5wdXRGb3JtYXQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCBtQ29kZWMtPm1PdXRwdXRGb3JtYXQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiAKQEAgLTM5MDksMTEgKzQ3NTUsMTEgQEAKIH0KIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbkNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7CiAgICAgQUxPR1YoIm9uQ3JlYXRlSW5wdXRTdXJmYWNlIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCk7CiAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC0zOTM3LDcgKzQ3ODMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsKSB7CisgICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtMzk0Nyw2ICs0NzkzLDQxIEBACiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBtYXggdGltZXN0YW1wIGdhcCAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVcyA+IDBsbAorICAgICAgICAgICAgJiYgbUNvZGVjLT5tVGltZVBlckZyYW1lVXMgPiAwbGwpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lTGFwc2VbMl07CisgICAgICAgIHRpbWVMYXBzZVswXSA9IG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzOworICAgICAgICB0aW1lTGFwc2VbMV0gPSBtQ29kZWMtPm1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLAorICAgICAgICAgICAgICAgICZ0aW1lTGFwc2VbMF0sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRpbWVMYXBzZSkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgdGltZSBsYXBzZSAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSB7CisgICAgICAgIGJvb2wgc3VzcGVuZCA9IHRydWU7CisgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKKyAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsCisgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQsCisgICAgICAgICAgICAgICAgJnN1c3BlbmQsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN1c3BlbmQpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIG9wdGlvbiB0byBzdXNwZW5kIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CiAgICAgICAgIH0KQEAgLTM5OTEsNyArNDg3Miw3IEBACiAgICAgICAgICAgICAgIihlcnJvciAweCUwOHgpIiwKICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUxvYWRlZFN0YXRlKTsKICAgICB9CkBAIC00MDA5LDYgKzQ4OTAsNyBAQAogCiBib29sIEFDb2RlYzo6TG9hZGVkVG9JZGxlU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDAzMSw3ICs0OTEzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBldmVuIHN0YXJ0ZWQgeWV0LCBzbyB3ZSdyZSBmbHVzaGVkIGFscmlnaHQuLi4KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTQwNzUsNiArNDk1Nyw3IEBACiAKIGJvb2wgQUNvZGVjOjpJZGxlVG9FeGVjdXRpbmdTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgogICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CiAgICAgICAgIHsKICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CkBAIC00MDkxLDcgKzQ5NzQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IGV2ZW4gc3RhcnRlZCB5ZXQsIHNvIHdlJ3JlIGZsdXNoZWQgYWxyaWdodC4uLgogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDEzNSw3ICs1MDE4LDcgQEAKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OmdldFBvcnRNb2RlKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBSRVNVQk1JVF9CVUZGRVJTOwogfQogCkBAIC00MTk3LDExICs1MDgwLDE0IEBACiAKICAgICBzdWJtaXRPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICAvLyBQb3N0IHRoZSBmaXJzdCBpbnB1dCBidWZmZXIuCisgICAgLy8gUG9zdCBhbGwgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlcnMKICAgICBDSEVDS19HVChtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpLCAwdSk7Ci0gICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdCgwKTsKLQotICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCk7IGkrKykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOworICAgICAgICB9CisgICAgfQogCiAgICAgbUFjdGl2ZSA9IHRydWU7CiB9CkBAIC00MjIzLDYgKzUxMDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCiAgICAgICAgICAgICBtQ29kZWMtPm1TaHV0ZG93bkluUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IHRydWU7CiAgICAgICAgICAgICBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkID0ga2VlcENvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwpAQCAtNDM0NCw2ICs1MjMxLDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVczsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZza2lwRnJhbWVzQmVmb3JlVXMpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAmc2tpcEZyYW1lc0JlZm9yZVVzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNraXBGcmFtZXNCZWZvcmVVcykpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHBhcmFtZXRlciAnc2tpcC1mcmFtZXMtYmVmb3JlJyAoZXJyICVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7CiAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGRyb3BJbnB1dEZyYW1lcyAhPSAwOwpAQCAtNDM3Nyw3ICs1MjgwLDcgQEAKIAogdm9pZCBBQ29kZWM6Om9uU2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaWduYWxlZElucHV0RU9TKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1MpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShtTm9kZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtNDQ5Nyw3ICs1NDAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCByZWNvbmZpZ3VyYXRpb24gKGVycm9yIDB4JTA4eCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIGVycik7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgbm90IGNvcnJlY3QsIGJ1dCBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmx5IHdheSB0byBmcmVlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuCkBAIC00ODA3LDcgKzU3MTAsNyBAQAogICAgICAgICBtQ29kZWMtPndhaXRVbnRpbEFsbFBvc3NpYmxlTmF0aXZlV2luZG93QnVmZmVyc0FyZVJldHVybmVkVG9VcygpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgIG1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA2NTNjYTM2Li45YWE3ZDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0LDYgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CkBAIC0yMiwxMCArMjgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTIzNSw3ICsyMzcsNyBAQAogICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJSIgUFJJZDY0ICIsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOwogICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgewogICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDM2MTk4MjEuLjE5M2Y4YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMTUsNyArMTUsOSBAQAogICAgICAgICBDYW1lcmFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwICAgICAgICAgXAogICAgICAgICBDbG9ja0VzdGltYXRvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBDb2RlY0Jhc2UuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBEYXRhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEYXRhVVJJU291cmNlLmNwcCAgICAgICAgICAgICAgICAgXAogICAgICAgICBEUk1FeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBFU0RTLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBGaWxlU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXApAQCAtMzEsOCArMzMsMTAgQEAKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cC5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFDb2RlY0xpc3QuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFDb2RlY1NvdXJjZS5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFEZWZzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaHR0cC9NZWRpYUhUVFAuY3BwICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFNdXhlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWV0YURhdGEuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU2LDIyICs2MCwyMyBAQAogICAgICAgICBXVk1FeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBYSU5HU2Vla2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhdmNfdXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBtcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAgICAgICAgXAotICAgICAgICBtcDQvVHJhY2tGcmFnbWVudC5jcHAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhLyBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL3NlcnZpY2VzL2Nvbm5lY3Rpdml0eW1hbmFnZXIgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8gXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC9saWJ3ZWJtIFwKKyAgICAgICAgJChUT1ApL3N5c3RlbS9uZXRkL2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9jb21tb24gXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9pMThuIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgICAgICBsaWJjb25uZWN0aXZpdHltYW5hZ2VyIFwKICAgICAgICAgbGliY3V0aWxzIFwKICAgICAgICAgbGliZGwgXAogICAgICAgICBsaWJkcm1mcmFtZXdvcmsgXApAQCAtODEsNiArODYsOCBAQAogICAgICAgICBsaWJpY3V1YyBcCiAgICAgICAgIGxpYmxvZyBcCiAgICAgICAgIGxpYm1lZGlhIFwKKyAgICAgICAgbGlibmV0ZF9jbGllbnQgXAorICAgICAgICBsaWJvcHVzIFwKICAgICAgICAgbGlic29uaXZveCBcCiAgICAgICAgIGxpYnNzbCBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBcCkBAIC05Niw2ICsxMDMsNyBAQAogICAgICAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbWF0cm9za2EgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF93ZWJtIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IFwKICAgICAgICAgbGlidnB4IFwKICAgICAgICAgbGlid2VibSBcCkBAIC0xMDQsMTMgKzExMiw2IEBACiAgICAgICAgIGxpYkZMQUMgXAogICAgICAgICBsaWJtZWRpYV9oZWxwZXIKIAotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICAgICAgY2hyb21pdW1faHR0cF9zdHViLmNwcAotTE9DQUxfQ1BQRkxBR1MgKz0gLURDSFJPTUlVTV9BVkFJTEFCTEU9MQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnN0bHBvcnQKLWluY2x1ZGUgZXh0ZXJuYWwvc3RscG9ydC9saWJzdGxwb3J0Lm1rCi0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYXZjX2NvbW1vbiBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKaW5kZXggODYyMzEwMC4uZTI0ODI0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QbGF5ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yMSw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CkBAIC0xMzksNiArMTQyLDEyIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0IDB4JXgiLCBtaW1lLCBhdWRpb0Zvcm1hdCk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOworICAgICAgICBpZiAoKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUMpICYmIGZvcm1hdC0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7CisgICAgICAgICAgICAvLyBSZWRlZmluZSBBQUMgZm9ybWF0IGNvcnJvc3BvbmRpbmcgdG8gYWFjIHByb2ZpbGUKKyAgICAgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQgYXZnQml0UmF0ZSA9IC0xOwpAQCAtMjIxLDcgKzIzMCw4IEBACiAKICAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgYXVkaW9NYXNrLAotICAgICAgICAgICAgICAgIDAsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKKyAgICAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywKKyAgICAgICAgICAgICAgICAwIC8qbm90aWZpY2F0aW9uRnJhbWVzKi8pOwogCiAgICAgICAgIGlmICgoZXJyID0gbUF1ZGlvVHJhY2stPmluaXRDaGVjaygpKSAhPSBPSykgewogICAgICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKQEAgLTU2NSwxMiArNTc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVG9Db21wbGV0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwMDAwMGxsICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQpIC8gbVNhbXBsZVJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICVsbGQgKCVsbGQgdXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQ6ICUiIFBSSWQ2NCAiICglbGxkIHVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1BsYXllZCArIG51bUFkZGl0aW9uYWxGcmFtZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGUpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIGZyYW1lcyBsZWZ0IHRvIHBsYXksICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNQZW5kaW5nUGxheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUb0NvbXBsZXRpb25VcywgdGltZVRvQ29tcGxldGlvblVzIC8gMUU2KTsKIApAQCAtNjI3LDcgKzYzNyw3IEBACiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9CiAgICAgICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlenUsICIKICAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCiAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwpAQCAtNzQ1LDcgKzc1NSw3IEBACiAKICAgICAvLyBIQUwgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGJ1ZmZlciB3ZSBzZW50IGF0IG1TdGFydFBvc1VzCiAgICAgY29uc3QgaW50NjRfdCByZW5kZXJlZER1cmF0aW9uID0gbVN0YXJ0UG9zVXMgKyBwbGF5ZWRVczsKLSAgICBBTE9HVigiZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCAlbGxkIiwgcmVuZGVyZWREdXJhdGlvbik7CisgICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJSIgUFJJZDY0LCByZW5kZXJlZER1cmF0aW9uKTsKICAgICByZXR1cm4gcmVuZGVyZWREdXJhdGlvbjsKIH0KIApAQCAtNzU2LDggKzc2NiwxMyBAQAogICAgICAgICBpZiAobVNlZWtpbmcpIHsKICAgICAgICAgICAgIHJldHVybiBtU2Vla1RpbWVVczsKICAgICAgICAgfQorICAgICAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25Vcyk7CisgICAgICAgICAgICByZXR1cm4gZHVyYXRpb25VczsKKyAgICAgICAgfQogICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpOwotICAgICAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMgZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpIG1Qb3NpdGlvblRpbWVSZWFsVXMgJWxsZCIsCisgICAgICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVVcyBnZXRPdXRwdXRQbGF5UG9zaXRpb25Vc19sKCkgbVBvc2l0aW9uVGltZVJlYWxVcyAlIiBQUklkNjQsCiAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMpOwogICAgICAgICByZXR1cm4gbVBvc2l0aW9uVGltZVJlYWxVczsKICAgICB9CkBAIC03OTUsNyArODEwLDcgQEAKIHN0YXR1c190IEF1ZGlvUGxheWVyOjpzZWVrVG8oaW50NjRfdCB0aW1lX3VzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIEFMT0dWKCJzZWVrVG8oICVsbGQgKSIsIHRpbWVfdXMpOworICAgIEFMT0dWKCJzZWVrVG8oICUiIFBSSWQ2NCAiICkiLCB0aW1lX3VzKTsKIAogICAgIG1TZWVraW5nID0gdHJ1ZTsKICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBlNjhhNzEwLi44MDRmMTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NvdXJjZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI2LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjUsNyArNjcsNyBAQAogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIEF1ZGlvUmVjb3JkIGNhbGxiYWNrIG5ldmVyIHJldHVybnMgbW9yZSB0aGFuIHRoZSBtYXhpbXVtCiAgICAgICAgIC8vIGJ1ZmZlciBzaXplCi0gICAgICAgIGludCBmcmFtZUNvdW50ID0ga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCkgLyBjaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90IGZyYW1lQ291bnQgPSBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSAvIGNoYW5uZWxDb3VudDsKIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgdG90YWwgYnVmZmVyIHNpemUgaXMgbGFyZ2UgZW5vdWdoCiAgICAgICAgIHNpemVfdCBidWZDb3VudCA9IDI7CkBAIC03NiwxMCArNzgsMTAgQEAKICAgICAgICAgbVJlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpLAotICAgICAgICAgICAgICAgICAgICBidWZDb3VudCAqIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChidWZDb3VudCAqIGZyYW1lQ291bnQpLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50IC8qbm90aWZpY2F0aW9uRnJhbWVzKi8pOwogICAgICAgICBtSW5pdENoZWNrID0gbVJlY29yZC0+aW5pdENoZWNrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IHN0YXR1czsKQEAgLTEzNiw3ICsxMzgsNyBAQAogfQogCiB2b2lkIEF1ZGlvU291cmNlOjp3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sKCkgewotICAgIEFMT0dWKCJ3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sOiAlbGxkIiwgbU51bUNsaWVudE93bmVkQnVmZmVycyk7CisgICAgQUxPR1YoIndhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2w6ICUiIFBSSWQ2NCwgbU51bUNsaWVudE93bmVkQnVmZmVycyk7CiAgICAgd2hpbGUgKG1OdW1DbGllbnRPd25lZEJ1ZmZlcnMgPiAwKSB7CiAgICAgICAgIG1GcmFtZUVuY29kaW5nQ29tcGxldGlvbkNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CkBAIC0xNTMsNiArMTU1LDggQEAKICAgICB9CiAKICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKKwogICAgIG1SZWNvcmQtPnN0b3AoKTsKICAgICB3YWl0T3V0c3RhbmRpbmdFbmNvZGluZ0ZyYW1lc19sKCk7CiAgICAgcmVsZWFzZVF1ZXVlZEZyYW1lc19sKCk7CkBAIC0yNjksNyArMjczLDcgQEAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpkYXRhQ2FsbGJhY2soY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYXVkaW9CdWZmZXIpIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDBsbDsKIAotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICVsbGQgdXMiLCB0aW1lVXMpOworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR1coIlNwdXJpb3VzIGNhbGxiYWNrIGZyb20gQXVkaW9SZWNvcmQuIERyb3AgdGhlIGF1ZGlvIGRhdGEuIik7CkBAIC0yNzgsOCArMjgyLDggQEAKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOwotICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICVsbGQvJWxsZCB1cyIsIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgKHZvaWQpIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOworICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IGVhNmMxNWIuLmFiOGFjNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0xOSw3ICsxOSw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF3ZXNvbWVQbGF5ZXIiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTM1LDYgKzM3LDggQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00Niw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgpAQCAtOTgsMTcgKzEwMywyMSBAQAogCiBzdHJ1Y3QgQXdlc29tZUxvY2FsUmVuZGVyZXIgOiBwdWJsaWMgQXdlc29tZVJlbmRlcmVyIHsKICAgICBBd2Vzb21lTG9jYWxSZW5kZXJlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKLSAgICAgICAgOiBtVGFyZ2V0KG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG5hdGl2ZVdpbmRvdywgbWV0YSkpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KQorICAgICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVGFyZ2V0KG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG5hdGl2ZVdpbmRvdykpIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCiAgICAgICAgIHJlbmRlcigoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgdGltZVVzICogMTAwMCk7CiAgICAgfQogCi0gICAgdm9pZCByZW5kZXIoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgbVRhcmdldC0+cmVuZGVyKGRhdGEsIHNpemUsIE5VTEwpOworICAgIHZvaWQgcmVuZGVyKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgICAgIG1UYXJnZXQtPnJlbmRlcihkYXRhLCBzaXplLCB0aW1lc3RhbXBOcywgTlVMTCwgbUZvcm1hdCk7CiAgICAgfQogCiBwcm90ZWN0ZWQ6CkBAIC0xMTgsNiArMTI3LDcgQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CiAgICAgU29mdHdhcmVSZW5kZXJlciAqbVRhcmdldDsKIAogICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKGNvbnN0IEF3ZXNvbWVMb2NhbFJlbmRlcmVyICYpOwpAQCAtMjgwLDE1ICsyOTAsMjAgQEAKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKHVyaSwgaGVhZGVycyk7CisgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZV9sKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICByZXNldF9sKCk7CiAKKyAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKICAgICBtVXJpID0gdXJpOwogCiAgICAgaWYgKGhlYWRlcnMpIHsKQEAgLTMwNSw3ICszMjAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0koInNldERhdGFTb3VyY2VfbChVUkwgc3VwcHJlc3NlZCkiKTsKKyAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKCVzKSIsIHVyaURlYnVnU3RyaW5nKG1VcmksIG1GbGFncyAmIElOQ09HTklUTykuY19zdHIoKSk7CiAKICAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwogICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgpAQCAtMzk3LDYgKzQxMiwxMyBAQAogCiAgICAgICAgIHRvdGFsQml0UmF0ZSArPSBiaXRyYXRlOwogICAgIH0KKyAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1CaXRyYXRlID0gdG90YWxCaXRSYXRlOwogCkBAIC01ODUsNiArNjA3LDcgQEAKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgIG1TZWVrVGltZVVzID0gMDsKIAorICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwogICAgIG1Vcmkuc2V0VG8oIiIpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CiAKQEAgLTcxMiwxMSArNzM1LDkgQEAKICAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgICAgICAgICAgaWYgKGdldEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNhY2hlZFNpemUgPSBtQ2FjaGVkU291cmNlLT5jYWNoZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkU2l6ZSAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0KKyAgICAgICAgICAgIGJvb2wgZW9zMjsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWREdXJhdGlvbl9sKCZjYWNoZWREdXJhdGlvblVzLCAmZW9zMikgJiYgbUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIChkb3VibGUpY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CkBAIC03MjQsNyArNzQ1LDcgQEAKIAogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUgb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBiaXRyYXRlL2R1cmF0aW9uIG9mIHRoZSBzdHJlYW0sIHVzZSBhYnNvbHV0ZSBzaXplCiAgICAgICAgICAgICAgICAgLy8gbGltaXRzIHRvIG1haW50YWluIHRoZSBjYWNoZS4KIAogICAgICAgICAgICAgICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgIWVvcwpAQCAtMTIxNyw3ICsxMjM4LDkgQEAKICAgICAgICAgLy8gYWxsb2NhdGUgdGhlaXIgYnVmZmVycyBpbiBsb2NhbCBhZGRyZXNzIHNwYWNlLiAgVGhpcyByZW5kZXJlcgogICAgICAgICAvLyB0aGVuIHBlcmZvcm1zIGEgY29sb3IgY29udmVyc2lvbiBhbmQgY29weSB0byBnZXQgdGhlIGRhdGEKICAgICAgICAgLy8gaW50byB0aGUgQU5hdGl2ZUJ1ZmZlci4KLSAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KTsKKyAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBuZXcgQXdlc29tZUxvY2FsUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgZm9ybWF0KTsKICAgICB9CiB9CiAKQEAgLTE0ODYsNyArMTUwOSw3IEBACiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCiAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgbVRleHREcml2ZXIgPSBuZXcgVGltZWRUZXh0RHJpdmVyKG1MaXN0ZW5lcik7CisgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgfQogCiAgICAgbVRleHREcml2ZXItPmFkZEluQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgc291cmNlKTsKQEAgLTE2OTgsNyArMTcyMSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICVsbGQgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKKyAgICAgICAgQUxPR1YoInNlZWtpbmcgYXVkaW8gdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykuIiwgdmlkZW9UaW1lVXMsIHZpZGVvVGltZVVzIC8gMUU2KTsKIAogICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgdmlkZW8gdGltZSwgc2VlayBhdWRpbyB0byB0aGUgb3JpZ2luYWxseQogICAgICAgICAvLyByZXF1ZXN0ZWQgc2VlayB0aW1lIGluc3RlYWQuCkBAIC0xNzYyLDcgKzE3ODUsNyBAQAogICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CiAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwogICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CisgICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLCBtU2Vla1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAogICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywKQEAgLTE4MzIsNyArMTg1NSw3IEBACiAKICAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7CiAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+IHRpbWVVcykgewotICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMiLAorICAgICAgICAgICAgQUxPR0koIlhYWCBtU2Vla1RpbWVVcyA9ICUiIFBSSWQ2NCAiIHVzLCB0aW1lVXMgPSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCB0aW1lVXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTkzMCwxMyArMTk1MywxMyBAQAogCiAgICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0gICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CiAKICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIFNMT1dfREVDT0RFUl9IQUNLKQogICAgICAgICAgICAgICAgICAgICB8fCBtU2luY2VMYXN0RHJvcHBlZCA+IEZSQU1FX0RST1BfRlJFUSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nICIKKyAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSBkcm9wcGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAib25lIGFmdGVyICVkIGZyYW1lcyIsCiAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2LCBtU2luY2VMYXN0RHJvcHBlZCk7CiAKQEAgLTIyMTgsMTUgKzIyNDEsMTQgQEAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCBtVXJpLnN0cmluZygpLCA4KQogICAgICAgICAgICAgfHwgaXNXaWRldmluZVN0cmVhbWluZykgewotICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBJTkNPR05JVE8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCk7Ci0KLSAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7CisgICAgICAgIGlmIChtSFRUUFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gcGxheSBtZWRpYSBmcm9tIGh0dHAgVVJJIHdpdGhvdXQgSFRUUCBzZXJ2aWNlLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisKICAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwogICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKApAQCAtMjIzNCw2ICsyMjU2LDEwIEBACiAKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdChtVXJpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICAvLyBmb3JjZSBjb25uZWN0aW9uIGF0IHRoaXMgcG9pbnQsIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBnZXRNSU1FVHlwZSBhbmQgdGhlCisgICAgICAgIC8vIGNhY2hpbmcgZGF0YXNvdXJjZSBjb25zdHJ1Y3RlZCBiZWxvdywgd2hpY2ggY291bGQgcmVzdWx0IGluIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZQorICAgICAgICAvLyBzZXJ2ZXIsIGFuZC9vciBmYWlsZWQgY29ubmVjdGlvbnMuCisgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMjY0LDggKzIyOTAsNiBAQAogCiAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBkYXRhU291cmNlLT5nZXRNSU1FVHlwZSgpOwotCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChjb250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZG9pbmcgdGhpcyBmb3Igc3RyZWFtcyB0aGF0IGFwcGVhciB0byBiZSBhdWRpby1vbmx5CiAgICAgICAgICAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CkBAIC0yMjk3LDEyICsyMzIxLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1ldGFEYXRhU2l6ZSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0gbWV0YURhdGFTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1ldGFEYXRhU2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3cgY2FjaGVkICVkIGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBjYWNoZWQgJXp1IGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFTaXplIDwgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKQEAgLTIzNDIsNyArMjM2Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CiAgICAgfQogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewpAQCAtMjY4MCw3ICsyNzA1LDcgQEAKIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigic2VsZWN0VHJhY2s6IHRyYWNrSW5kZXggPSAlZCBhbmQgc2VsZWN0PSVkIiwgdHJhY2tJbmRleCwgc2VsZWN0KTsKKyAgICBBTE9HVigic2VsZWN0VHJhY2s6IHRyYWNrSW5kZXggPSAlenUgYW5kIHNlbGVjdD0lZCIsIHRyYWNrSW5kZXgsIHNlbGVjdCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgaWYgKG1UZXh0RHJpdmVyICE9IE5VTEwpIHsKQEAgLTI3ODQsNyArMjgwOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdHJpbmcgdmFsdWVzIHdyaXR0ZW4gaW4gUGFyY2VsIGFyZSBVVEYtMTYgdmFsdWVzLgogICAgICAgICAgICAgU3RyaW5nOCB1cmkocmVxdWVzdC5yZWFkU3RyaW5nMTYoKSk7CkBAIC0yNzk2LDcgKzI4MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyLCBtSFRUUFNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGZkICAgICAgICAgPSByZXF1ZXN0LnJlYWRGaWxlRGVzY3JpcHRvcigpOwogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSByZXF1ZXN0LnJlYWRJbnQ2NCgpOwpAQCAtMjgzNyw3ICsyODYyLDcgQEAKIAogICAgIGZwcmludGYob3V0LCAiIEF3ZXNvbWVQbGF5ZXJcbiIpOwogICAgIGlmIChtU3RhdHMubUZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKG91dCwgIiAgVVJJKHN1cHByZXNzZWQpIik7CisgICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoJXMpIiwgdXJpRGVidWdTdHJpbmcobVVyaSwgbUZsYWdzICYgSU5DT0dOSVRPKS5jX3N0cigpKTsKICAgICB9IGVsc2UgewogICAgICAgICBmcHJpbnRmKG91dCwgIiAgZmQoJWQpIiwgbVN0YXRzLm1GZCk7CiAgICAgfQpAQCAtMjkyNiw2ICsyOTUxLDkgQEAKICAgICAvLyBnZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gc3RhcnQgcmVjcmVhdGVkIHN0cmVhbSBmcm9tIGhlcmUKICAgICBnZXRQb3NpdGlvbigmbUF1ZGlvVGVhckRvd25Qb3NpdGlvbik7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gc2F2ZWRIVFRQU2VydmljZSA9IG1IVFRQU2VydmljZTsKKworICAgIGJvb2wgd2FzTG9vcGluZyA9IG1GbGFncyAmIExPT1BJTkc7CiAgICAgLy8gUmVzZXQgYW5kIHJlY3JlYXRlCiAgICAgcmVzZXRfbCgpOwogCkBAIC0yOTM1LDcgKzI5NjMsNyBAQAogICAgICAgICBtRmlsZVNvdXJjZSA9IGZpbGVTb3VyY2U7CiAgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChmaWxlU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBzZXREYXRhU291cmNlX2wodXJpLCAmdXJpSGVhZGVycyk7CisgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChzYXZlZEhUVFBTZXJ2aWNlLCB1cmksICZ1cmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwpAQCAtMjk0NCw2ICsyOTcyLDkgQEAKICAgICAgICAgLy8gYSBNRURJQV9FUlJPUiB0byB0aGUgY2xpZW50IGFuZCBhYm9ydCB0aGUgcHJlcGFyZQogICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CiAgICAgfQorICAgIGlmICh3YXNMb29waW5nKSB7CisgICAgICAgIG1GbGFncyB8PSBMT09QSU5HOworICAgIH0KIAogICAgIG1BdWRpb1RlYXJEb3duID0gdHJ1ZTsKICAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggNWI0MWYzMC4uZjc2YWVkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMSw2ICszMywxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDBMTDsKQEAgLTYzLDEyICs3MSwxNSBAQAogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShtc2dUeXBlKTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0MSk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGV4dDIpOwogICAgIEFMT0dWKCJub3RpZnkoJWQsICVkLCAlZCkiLCBtc2dUeXBlLCBleHQxLCBleHQyKTsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICogLyogbWV0YWRhdGEgKi8pIHsKLSAgICBBTE9HVigicG9zdERhdGEoJWQsIHB0cjolcCwgc2l6ZTolZCkiLAorICAgIEFMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiV6dSkiLAogICAgICAgICAgbXNnVHlwZSwgZGF0YVB0ci0+cG9pbnRlcigpLCBkYXRhUHRyLT5zaXplKCkpOwogCiAgICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKQEAgLTU3NywxNCArNTg4LDE1IEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYVNvdXJjZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCkgewogICAgIEFMT0dWKCJzdGFydENhbWVyYVJlY29yZGluZyIpOwogICAgIC8vIFJlc2V0IHRoZSBpZGVudGl0eSB0byB0aGUgY3VycmVudCB0aHJlYWQgYmVjYXVzZSBtZWRpYSBzZXJ2ZXIgb3ducyB0aGUKICAgICAvLyBjYW1lcmEgYW5kIHJlY29yZGluZyBpcyBzdGFydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbnMuIFRoZSBhcHBsaWNhdGlvbnMKICAgICAvLyB3aWxsIGNvbm5lY3QgdG8gdGhlIGNhbWVyYSBpbiBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nLgogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIHN0YXR1c190IGVycjsKICAgICBpZiAobU51bUlucHV0QnVmZmVycyA+IDApIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNhbWVyYS0+c2VuZENvbW1hbmQoCisgICAgICAgIGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAogICAgICAgICAgICAgQ0FNRVJBX0NNRF9TRVRfVklERU9fQlVGRkVSX0NPVU5ULCBtTnVtSW5wdXRCdWZmZXJzLCAwKTsKIAogICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgQ2FtZXJhSEFMMSBjbGllbnRzOyB0aHVzIHRoZSBmYWlsdXJlIGlzCkBAIC01OTUsMTcgKzYwNywyNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZXJyID0gT0s7CiAgICAgaWYgKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpIHsKICAgICAgICAgbUNhbWVyYS0+dW5sb2NrKCk7CiAgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5zdGFydFJlY29yZGluZyhuZXcgUHJveHlMaXN0ZW5lcih0aGlzKSkpOworICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoCisgICAgICAgICAgICAgICAgbmV3IFByb3h5TGlzdGVuZXIodGhpcykpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmcsIHJlY2VpdmVkIGVycm9yOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOwogICAgICAgICBtQ2FtZXJhLT5zdGFydFJlY29yZGluZygpOwotICAgICAgICBDSEVDSyhtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpOworICAgICAgICBpZiAoIW1DYW1lcmEtPnJlY29yZGluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nIik7CisgICAgICAgIH0KICAgICB9CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewpAQCAtNjM3LDEwICs2NTcsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gc3RhcnRDYW1lcmFSZWNvcmRpbmcoKSkgPT0gT0spIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIH0KIAotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2U6OnN0b3BDYW1lcmFSZWNvcmRpbmcoKSB7CkBAIC02NTUsNjMgKzY3Nyw4MCBAQAogCiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZUNhbWVyYSgpIHsKICAgICBBTE9HVigicmVsZWFzZUNhbWVyYSIpOwotICAgIGlmIChtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIGlmICgobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSB3YXMgY29sZCB3aGVuIHdlIHN0YXJ0ZWQsIHN0b3BwaW5nIHByZXZpZXciKTsKLSAgICAgICAgICAgIG1DYW1lcmEtPnN0b3BQcmV2aWV3KCk7Ci0gICAgICAgICAgICBtQ2FtZXJhLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbWVyYS0+dW5sb2NrKCk7CisgICAgc3A8Q2FtZXJhPiBjYW1lcmE7CisgICAgYm9vbCBjb2xkQ2FtZXJhID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAvLyBnZXQgYSBsb2NhbCByZWYgYW5kIGNsZWFyIHJlZiB0byBtQ2FtZXJhIG5vdworICAgICAgICBjYW1lcmEgPSBtQ2FtZXJhOwogICAgICAgICBtQ2FtZXJhLmNsZWFyKCk7Ci0gICAgICAgIG1DYW1lcmEgPSAwOworICAgICAgICBjb2xkQ2FtZXJhID0gKG1DYW1lcmFGbGFncyAmIEZMQUdTX0hPVF9DQU1FUkEpID09IDA7CisgICAgfQorCisgICAgaWYgKGNhbWVyYSAhPSAwKSB7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICBpZiAoY29sZENhbWVyYSkgeworICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSB3YXMgY29sZCB3aGVuIHdlIHN0YXJ0ZWQsIHN0b3BwaW5nIHByZXZpZXciKTsKKyAgICAgICAgICAgIGNhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIGNhbWVyYS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYS0+dW5sb2NrKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KLSAgICBpZiAobUNhbWVyYVJlY29yZGluZ1Byb3h5ICE9IDApIHsKLSAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKLSAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LmNsZWFyKCk7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gMCkgeworICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1DYW1lcmFGbGFncyA9IDA7CiAgICAgfQotICAgIG1DYW1lcmFGbGFncyA9IDA7CiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZTo6cmVzZXQoKSB7CiAgICAgQUxPR0QoInJlc2V0OiBFIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIAotICAgIGludDY0X3QgdG9rZW47Ci0gICAgYm9vbCBpc1Rva2VuVmFsaWQgPSBmYWxzZTsKLSAgICBpZiAobUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgIHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgaXNUb2tlblZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOwotICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7Ci0gICAgICAgIGlmIChOT19FUlJPUiAhPQotICAgICAgICAgICAgbUZyYW1lQ29tcGxldGVDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1Mb2NrLAotICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyAqIDEwMDBMTCArIENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUykpIHsKLSAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICVkIiwKLSAgICAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLnNpemUoKSk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisKKyAgICAgICAgaW50NjRfdCB0b2tlbjsKKyAgICAgICAgYm9vbCBpc1Rva2VuVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1DYW1lcmEgIT0gMCkgeworICAgICAgICAgICAgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgaXNUb2tlblZhbGlkID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7CisgICAgICAgIHdoaWxlICghbUZyYW1lc0JlaW5nRW5jb2RlZC5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0KKyAgICAgICAgICAgICAgICBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyAqIDEwMDBMTCArIENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHN0YW5kaW5nIGZyYW1lcyBiZWluZyBlbmNvZGVkOiAlenUiLAorICAgICAgICAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RvcENhbWVyYVJlY29yZGluZygpOworICAgICAgICBpZiAoaXNUb2tlblZhbGlkKSB7CisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQ29sbGVjdFN0YXRzKSB7CisgICAgICAgICAgICBBTE9HSSgiRnJhbWVzIHJlY2VpdmVkL2VuY29kZWQvZHJvcHBlZDogJWQvJWQvJWQgaW4gJSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkLCBtTnVtRnJhbWVzRHJvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1OdW1HbGl0Y2hlcyA+IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlZCBsb25nIGRlbGF5cyBiZXR3ZWVuIG5laWdoYm9yaW5nIHZpZGVvIGZyYW1lcyIsIG1OdW1HbGl0Y2hlcyk7CisgICAgICAgIH0KKworICAgICAgICBDSEVDS19FUShtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkICsgbU51bUZyYW1lc0Ryb3BwZWQpOwogICAgIH0KLSAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CisKICAgICByZWxlYXNlQ2FtZXJhKCk7Ci0gICAgaWYgKGlzVG9rZW5WYWxpZCkgewotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICB9CiAKLSAgICBpZiAobUNvbGxlY3RTdGF0cykgewotICAgICAgICBBTE9HSSgiRnJhbWVzIHJlY2VpdmVkL2VuY29kZWQvZHJvcHBlZDogJWQvJWQvJWQgaW4gJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCwgbU51bUZyYW1lc0Ryb3BwZWQsCi0gICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOwotICAgIH0KLQotICAgIGlmIChtTnVtR2xpdGNoZXMgPiAwKSB7Ci0gICAgICAgIEFMT0dXKCIlZCBsb25nIGRlbGF5cyBiZXR3ZWVuIG5laWdoYm9yaW5nIHZpZGVvIGZyYW1lcyIsIG1OdW1HbGl0Y2hlcyk7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCArIG1OdW1GcmFtZXNEcm9wcGVkKTsKICAgICBBTE9HRCgicmVzZXQ6IFgiKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC03ODksNyArODI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNhbWVyYSByZWNvcmRpbmcgcHJveHkgaXMgZ29uZSIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbmNvbWluZyBjYW1lcmEgdmlkZW8gZnJhbWVzOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGluY29taW5nIGNhbWVyYSB2aWRlbyBmcmFtZXM6ICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODEyLDEwICs4NTEsMTAgQEAKIAogdm9pZCBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLAogICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7Ci0gICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogdGltZXN0YW1wICVsbGQgdXMiLCB0aW1lc3RhbXBVcyk7CisgICAgQUxPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIHVzIiwgdGltZXN0YW1wVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCB8fCAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZXN0YW1wVXMgPCBtU3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgIEFMT0dWKCJEcm9wIGZyYW1lIGF0ICVsbGQvJWxsZCB1cyIsIHRpbWVzdGFtcFVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICBBTE9HVigiRHJvcCBmcmFtZSBhdCAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiB1cyIsIHRpbWVzdGFtcFVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NTQsNyArODkzLDcgQEAKICAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOwogICAgIGludDY0X3QgdGltZVVzID0gbVN0YXJ0VGltZVVzICsgKHRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOwogICAgIG1GcmFtZVRpbWVzLnB1c2hfYmFjayh0aW1lVXMpOwotICAgIEFMT0dWKCJpbml0aWFsIGRlbGF5OiAlbGxkLCBjdXJyZW50IHRpbWUgc3RhbXA6ICVsbGQiLAorICAgIEFMT0dWKCJpbml0aWFsIGRlbGF5OiAlIiBQUklkNjQgIiwgY3VycmVudCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsCiAgICAgICAgIG1TdGFydFRpbWVVcywgdGltZVVzKTsKICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAppbmRleCA1OTFkYWFjLi4wYWNkOWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZSIKIApAQCAtNzksMTMgKzgxLDE0IEBACiAgICAgICBtU2tpcEN1cnJlbnRGcmFtZShmYWxzZSkgewogCiAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMgPSB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzOwotICAgIEFMT0dEKCJzdGFydGluZyB0aW1lIGxhcHNlIG1vZGU6ICVsbGQgdXMiLAorICAgIEFMT0dEKCJzdGFydGluZyB0aW1lIGxhcHNlIG1vZGU6ICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgbVRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMpOwogCiAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1NpemUud2lkdGg7CiAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9TaXplLmhlaWdodDsKIAotICAgIGlmICghdHJ5U2V0dGluZ1ZpZGVvU2l6ZSh2aWRlb1NpemUud2lkdGgsIHZpZGVvU2l6ZS5oZWlnaHQpKSB7CisgICAgaWYgKE9LID09IG1Jbml0Q2hlY2sgJiYgIXRyeVNldHRpbmdWaWRlb1NpemUodmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0KSkgeworICAgICAgICByZWxlYXNlQ2FtZXJhKCk7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwogICAgIH0KIApAQCAtMjY1LDcgKzI2OCw3IEBACiAKICAgICAgICAgICAgIC8vIFJlYWxseSBtYWtlIHN1cmUgdGhhdCB0aGlzIHZpZGVvIHJlY29yZGluZyBmcmFtZSB3aWxsIG5vdCBiZSBkcm9wcGVkLgogICAgICAgICAgICAgaWYgKCp0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgIEFMT0dJKCJzZXQgdGltZXN0YW1wVXMgdG8gc3RhcnQgdGltZSBzdGFtcCAlbGxkIHVzIiwgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgic2V0IHRpbWVzdGFtcFVzIHRvIHN0YXJ0IHRpbWUgc3RhbXAgJSIgUFJJZDY0ICIgdXMiLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9IG1TdGFydFRpbWVVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjlkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDb2RlY0Jhc2U6OkNvZGVjQmFzZSgpIHsKK30KKworQ29kZWNCYXNlOjp+Q29kZWNCYXNlKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6flBvcnREZXNjcmlwdGlvbigpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggOTc5ODdlMi4uYzk5ZGI4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTEzLDEzICsxMywxMSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKIAogI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCkBAIC0zNSwxMCArMzMsMTUgQEAKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMTgwLDcgKzE4MywxNSBAQAogCiAvLyBzdGF0aWMKIHNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCisgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlKSB7CisgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgKmNvbnRlbnRUeXBlID0gIiI7CisgICAgfQorCiAgICAgYm9vbCBpc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKCJ3aWRldmluZTovLyIsIHVyaSwgMTEpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwpAQCAtMTg5LDcgKzIwMCwxOSBAQAogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KQogICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkKICAgICAgICAgICAgIHx8IGlzV2lkZXZpbmUpIHsKLSAgICAgICAgc3A8SFRUUEJhc2U+IGh0dHBTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChodHRwU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN0cmluZzggdG1wOwogICAgICAgICBpZiAoaXNXaWRldmluZSkgewpAQCAtMTk5LDMyICsyMjIsMzggQEAKICAgICAgICAgICAgIHVyaSA9IHRtcC5zdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKKyAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKKyAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCisgICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc1dpZGV2aW5lKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwotICAgICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvcHkgPSAqaGVhZGVyczsKLSAgICAgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgJmNvcHksICZjYWNoZUNvbmZpZywgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqY29udGVudFR5cGUgPSBodHRwU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgTnVDYWNoZWRTb3VyY2UyKAogICAgICAgICAgICAgICAgICAgICBodHRwU291cmNlLAotICAgICAgICAgICAgICAgICAgICBjYWNoZUNvbmZpZy5pc0VtcHR5KCkgPyBOVUxMIDogY2FjaGVDb25maWcuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBjYWNoZUNvbmZpZy5pc0VtcHR5KCkgPyBOVUxMIDogY2FjaGVDb25maWcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdGhhdCBwcmVmZXRjaGluZywgY2FjaGluZywgZGF0YXNvdXJjZSB3cmFwcGVyCiAgICAgICAgICAgICAvLyBpbiB0aGUgd2lkZXZpbmU6Ly8gY2FzZS4KICAgICAgICAgICAgIHNvdXJjZSA9IGh0dHBTb3VyY2U7CiAgICAgICAgIH0KLQotIyBpZiBDSFJPTUlVTV9BVkFJTEFCTEUKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7Ci0gICAgICAgIHNvdXJjZSA9IGNyZWF0ZURhdGFVcmlTb3VyY2UodXJpKTsKLSNlbmRpZgorICAgICAgICBzb3VyY2UgPSBEYXRhVVJJU291cmNlOjpDcmVhdGUodXJpKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBBc3N1bWUgaXQncyBhIGZpbGVuYW1lLgogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkpOwpAQCAtMjM3LDYgKzI2NiwxOSBAQAogICAgIHJldHVybiBzb3VyY2U7CiB9CiAKK3NwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKSB7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICB9Cit9CisKIFN0cmluZzggRGF0YVNvdXJjZTo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM5MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPERhdGFVUklTb3VyY2U+IERhdGFVUklTb3VyY2U6OkNyZWF0ZShjb25zdCBjaGFyICp1cmkpIHsKKyAgICBpZiAoc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjaGFyICpjb21tYVBvcyA9IHN0cnJjaHIodXJpLCAnLCcpOworCisgICAgaWYgKGNvbW1hUG9zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworCisgICAgQVN0cmluZyB0bXAoJnVyaVs1XSwgY29tbWFQb3MgLSAmdXJpWzVdKTsKKworICAgIGlmICh0bXAuZW5kc1dpdGgoIjtiYXNlNjQiKSkgeworICAgICAgICBBU3RyaW5nIGVuY29kZWQoY29tbWFQb3MgKyAxKTsKKworICAgICAgICAvLyBTdHJpcCBDUiBhbmQgTEYuLi4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGVuY29kZWQuc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICAgICAgaWYgKGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXHInIHx8IGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlZC5lcmFzZShpLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9IGRlY29kZUJhc2U2NChlbmNvZGVkKTsKKworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgY29udGVudCBmb3VuZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNpZiAwCisgICAgICAgIHNpemVfdCBkYXRhTGVuID0gc3RybGVuKHVyaSkgLSB0bXAuc2l6ZSgpIC0gNjsKKyAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoZGF0YUxlbik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgY29tbWFQb3MgKyAxLCBkYXRhTGVuKTsKKworICAgICAgICAvLyB1bmVzY2FwZQorI2Vsc2UKKyAgICAgICAgLy8gTWVkaWFQbGF5ZXIgZG9lc24ndCBjYXJlIGZvciB0aGlzIHJpZ2h0IG5vdyBhcyB3ZSBkb24ndAorICAgICAgICAvLyBwbGF5IGFueSB0ZXh0LWJhc2VkIG1lZGlhLgorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IGNoYXJzZXQgb3IgbWltZSB0eXBlLgorCisgICAgcmV0dXJuIG5ldyBEYXRhVVJJU291cmNlKGJ1ZmZlcik7Cit9CisKK0RhdGFVUklTb3VyY2U6OkRhdGFVUklTb3VyY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IG1CdWZmZXIoYnVmZmVyKSB7Cit9CisKK0RhdGFVUklTb3VyY2U6On5EYXRhVVJJU291cmNlKCkgeworfQorCitzdGF0dXNfdCBEYXRhVVJJU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IERhdGFVUklTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgPj0gKG9mZjY0X3QpbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgY29weSA9IG1CdWZmZXItPnNpemUoKSAtIG9mZnNldDsKKyAgICBpZiAoY29weSA+IHNpemUpIHsKKyAgICAgICAgY29weSA9IHNpemU7CisgICAgfQorCisgICAgbWVtY3B5KGRhdGEsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgY29weSk7CisKKyAgICByZXR1cm4gY29weTsKK30KKworc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgKnNpemUgPSBtQnVmZmVyLT5zaXplKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKaW5kZXggNGEwYzM1Yy4uNDI3YmY3YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICB9CiAgICAgd2hpbGUgKG1vcmUpOwogCi0gICAgQUxPR1YoInRhZz0weCUwMnggZGF0YV9zaXplPSVkIiwgKnRhZywgKmRhdGFfc2l6ZSk7CisgICAgQUxPR1YoInRhZz0weCUwMnggZGF0YV9zaXplPSV6dSIsICp0YWcsICpkYXRhX3NpemUpOwogCiAgICAgaWYgKCpkYXRhX3NpemUgPiBzaXplKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggNWZhNGI2Zi4uMzIyOTFjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMjAsMTcgKzIwLDEzIEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKLSNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKLSNpbmNsdWRlICJpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIgotI2VuZGlmCi0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgogCi0jaW5jbHVkZSA8Q29ubmVjdGl2aXR5TWFuYWdlci5oPgorI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwzNCArMzYsNyBAQAogICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKICAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKICAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcygwKSwKLSAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApLAotICAgICAgbVVJRFZhbGlkKGZhbHNlKSwKLSAgICAgIG1VSUQoMCkgewotfQotCi0vLyBzdGF0aWMKLXNwPEhUVFBCYXNlPiBIVFRQQmFzZTo6Q3JlYXRlKHVpbnQzMl90IGZsYWdzKSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgICAgIEhUVFBCYXNlICpkYXRhU291cmNlID0gY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci0gICAgICAgIGlmIChkYXRhU291cmNlKSB7Ci0gICAgICAgICAgIHJldHVybiBkYXRhU291cmNlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB7Ci0gICAgICAgIFRSRVNQQVNTKCk7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEhUVFBCYXNlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0gICAgcmV0dXJuIFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLSNlbHNlCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotI2VuZGlmCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7CiB9CiAKIHZvaWQgSFRUUEJhc2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KApAQCAtMTM1LDIxICsxMDQsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBIVFRQQmFzZTo6c2V0VUlEKHVpZF90IHVpZCkgewotICAgIG1VSURWYWxpZCA9IHRydWU7Ci0gICAgbVVJRCA9IHVpZDsKLX0KLQotYm9vbCBIVFRQQmFzZTo6Z2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0IHsKLSAgICBpZiAoIW1VSURWYWxpZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnVpZCA9IG1VSUQ7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gc3RhdGljCiB2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7CiAgICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKQEAgLTE2OCw3ICsxMjIsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7Ci0gICAgQ29ubmVjdGl2aXR5TWFuYWdlcjo6bWFya1NvY2tldEFzVXNlcihzb2NrZmQsIHVpZCk7CisgICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKaW5kZXggNzhjMTJlMS4uOTg1NmY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKQEAgLTY4Miw3ICs2ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBBTE9HVigid3JpdGluZyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUuMmYgc2VjcyAoaW5kZXggJWQpIiwKKyAgICAgICAgICAgICAgICBBTE9HVigid3JpdGluZyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUuMmYgc2VjcyAoaW5kZXggJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgLyAxRTYsIG1pbkluZGV4KTsKIAogICAgICAgICAgICAgICAgIHNvdXJjZSA9IG1Tb3VyY2VzLmVkaXRJdGVtQXQobWluSW5kZXgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IDM2MmNkNmIuLmQ5MjJkYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTE2LDE3ICsxNiwxOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1QRUc0RXh0cmFjdG9yIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00NiwxMSArNDgsMTMgQEAKIGNsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKIHB1YmxpYzoKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCi0gICAgTVBFRzRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCisgICAgTVBFRzRTb3VyY2UoY29uc3Qgc3A8TVBFRzRFeHRyYWN0b3I+ICZvd25lciwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAorICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CkBAIC02Nyw2ICs3MSw4IEBACiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCisgICAgLy8ga2VlcCB0aGUgTVBFRzRFeHRyYWN0b3IgYXJvdW5kLCBzaW5jZSB3ZSdyZSByZWZlcmVuY2luZyBpdHMgZGF0YQorICAgIHNwPE1QRUc0RXh0cmFjdG9yPiBtT3duZXI7CiAgICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7CiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgaW50MzJfdCBtVGltZXNjYWxlOwpAQCAtNzQsNiArODAsNyBAQAogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgdWludDMyX3QgbUN1cnJlbnRGcmFnbWVudEluZGV4OwogICAgIFZlY3RvcjxTaWR4RW50cnk+ICZtU2VnbWVudHM7CisgICAgY29uc3QgVHJleCAqbVRyZXg7CiAgICAgb2ZmNjRfdCBtRmlyc3RNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbUN1cnJlbnRNb29mT2Zmc2V0OwogICAgIG9mZjY0X3QgbU5leHRNb29mT2Zmc2V0OwpAQCAtOTUsNiArMTAyLDcgQEAKICAgICB1aW50NjRfdCogbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0czsKIAogICAgIGJvb2wgbUlzQVZDOworICAgIGJvb2wgbUlzSEVWQzsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKICAgICBib29sIG1TdGFydGVkOwpAQCAtMTQwLDYgKzE0OCw3IEBACiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0OwogICAgICAgICBzaXplX3Qgc2l6ZTsKICAgICAgICAgdWludDMyX3QgZHVyYXRpb247CisgICAgICAgIGludDMyX3QgY29tcG9zaXRpb25PZmZzZXQ7CiAgICAgICAgIHVpbnQ4X3QgaXZbMTZdOwogICAgICAgICBWZWN0b3I8c2l6ZV90PiBjbGVhcnNpemVzOwogICAgICAgICBWZWN0b3I8c2l6ZV90PiBlbmNyeXB0ZWRzaXplczsKQEAgLTMxNyw2ICszMjYsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzM5LDggKzM1MSw3IEBACiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbVNpZHhEdXJhdGlvbigwKSwKLSAgICAgIG1Nb29mT2Zmc2V0KDApLAorICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCkBAIC0zNjUsNyArMzc2LDcgQEAKICAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKICAgICB3aGlsZSAoc2luZikgewogICAgICAgICBTSU5GICpuZXh0ID0gc2luZi0+bmV4dDsKLSAgICAgICAgZGVsZXRlIHNpbmYtPklQTVBEYXRhOworICAgICAgICBkZWxldGVbXSBzaW5mLT5JUE1QRGF0YTsKICAgICAgICAgZGVsZXRlIHNpbmY7CiAgICAgICAgIHNpbmYgPSBuZXh0OwogICAgIH0KQEAgLTQwNSw3ICs0MTYsNyBAQAogICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OwogICAgIH0KIAotICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3M6ICVkIHRyYWNrcyIsIG4pOworICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3M6ICV6dSB0cmFja3MiLCBuKTsKICAgICByZXR1cm4gbjsKIH0KIApAQCAtNDc4LDggKzQ4OSwxOCBAQAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKICAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgeworCisgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8PSBvcmlnX29mZnNldCkgeworICAgICAgICAgICAgLy8gb25seSBjb250aW51ZSBwYXJzaW5nIGlmIHRoZSBvZmZzZXQgd2FzIGFkdmFuY2VkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBpbiBhbiBpbmZpbml0ZSBsb29wCisgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBhZHZhbmNlOiAweCVsbGQtPjB4JWxsZCIsIG9yaWdfb2Zmc2V0LCBvZmZzZXQpOworICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00ODgsMTIgKzUwOSwxMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpKSB7Ci0gICAgICAgICAgICAvLyBwYXJzZSB0aGUgc2lkeCBib3ggdG9vCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CiAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWdtZW50CiAgICAgICAgICAgICBtTW9vZk9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpKSB7CisgICAgICAgICAgICAvLyBrZWVwIHBhcnNpbmcgdW50aWwgd2UgZ2V0IHRvIHRoZSBkYXRhCisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CkBAIC01MDUsOCArNTI2LDYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0KLQotICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKICAgICB9CkBAIC02ODMsNyArNzAyLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNpbmYtPmxlbiA9IGRhdGFMZW4gLSAzOwotICAgICAgICAgICAgc2luZi0+SVBNUERhdGEgPSBuZXcgY2hhcltzaW5mLT5sZW5dOworICAgICAgICAgICAgc2luZi0+SVBNUERhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltzaW5mLT5sZW5dOworICAgICAgICAgICAgaWYgKHNpbmYtPklQTVBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gMjsKIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIHNpbmYtPklQTVBEYXRhLCBzaW5mLT5sZW4pIDwgc2luZi0+bGVuKSB7CkBAIC03NTgsOCArNzgwLDI1IEBACiAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKKyAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgIC8vIGF0b20gZXh0ZW5kcyB0byBlbmQgb2YgZmlsZQorICAgICAgICAgICAgb2ZmNjRfdCBzb3VyY2VTaXplOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSAoc291cmNlU2l6ZSAtICpvZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBYWFggY291bGQgd2UganVzdCBwaWNrIGEgInN1ZmZpY2llbnRseSBsYXJnZSIgdmFsdWUgaGVyZT8KKyAgICAgICAgICAgICAgICBBTE9HRSgiYXRvbSBzaXplIGlzIDAsIGFuZCBkYXRhIHNvdXJjZSBoYXMgbm8gc2l6ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBub3QgYWxsb3dlZCBmb3Igbm9uLXRvcGxldmVsIGF0b21zLCBza2lwIGl0CisgICAgICAgICAgICAqb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7CiAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNodW5rIHNpemU6ICUiIFBSSXU2NCwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCkBAIC03NzAsNyArODA5LDcgQEAKICNpZiAwCiAgICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOwotICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJWxsZFxuIiwgaW5kZW50LCBjaHVuaywgY2h1bmtfc2l6ZSk7CisgICAgcHJpbnRmKCIlc2ZvdW5kIGNodW5rICclcycgb2Ygc2l6ZSAlIiBQUkl1NjQgIlxuIiwgaW5kZW50LCBjaHVuaywgY2h1bmtfc2l6ZSk7CiAKICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogICAgIHNpemVfdCBuID0gY2h1bmtfc2l6ZTsKQEAgLTgyNiw3ICs4NjUsNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlZCBieXRlcyBsb25nLiIsIChzaXplX3QpY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICYgKERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nCkBAIC05MTMsNiArOTUyLDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdsJywgJ3MnLCAndCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIC8vIFNlZSAxNDQ5Ni0xMiA4LjYuNgogICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCAxKSA8IDEpIHsKQEAgLTk3NSwxMiArMTAxNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxfZm91cmNjOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZvcmlnaW5hbF9mb3VyY2MsIDQpIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTk5NCwxMiArMTAzNiwxMyBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnZScsICduJywgJ2MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDMyKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEwNDQsMjMgKzEwODcsMjUgQEAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdrJywgJ2gnLCAnZCcpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VUcmFja0hlYWRlcihkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgUHNzaEluZm8gcHNzaDsKIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCAmcHNzaC51dWlkLCAxNikgPCAxNikgewpAQCAtMTA3OCw3ICsxMTIzLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHNzaC5kYXRhID0gbmV3IHVpbnQ4X3RbcHNzaC5kYXRhbGVuXTsKKyAgICAgICAgICAgIHBzc2guZGF0YSA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3Bzc2guZGF0YWxlbl07CisgICAgICAgICAgICBpZiAocHNzaC5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlZCBwc3NoIEAgJXAiLCBwc3NoLmRhdGEpOwogICAgICAgICAgICAgc3NpemVfdCByZXF1ZXN0ZWQgPSAoc3NpemVfdCkgcHNzaC5kYXRhbGVuOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyNCwgcHNzaC5kYXRhLCByZXF1ZXN0ZWQpIDwgcmVxdWVzdGVkKSB7CkBAIC0xMDg2LDEyICsxMTM0LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMTIyLDYgKzExNzEsOCBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgPSBudG9obCh0aW1lc2NhbGUpOwogCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMiBzYXlzIGFsbCBvbmVzIG1lYW5zIGluZGV0ZXJtaW5hdGUsIGJ1dCBzb21lIGZpbGVzIHNlZW0gdG8gdXNlCisgICAgICAgICAgICAvLyAwIGluc3RlYWQuIFdlIHRyZWF0IGJvdGggdGhlIHNhbWUuCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTExMjksNyArMTE4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2g2NChkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uMzI7CiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xMTM3LDEzICsxMTkwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbjMyKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZmbXBlZyBzZXRzIGR1cmF0aW9uIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCiAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwogICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKQEAgLTExNzIsNyArMTIyNiw2IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTI4Miw2ICsxMzM1LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKICAgICAgICAgewogICAgICAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKIApAQCAtMTMzOSwxMSArMTM5NCwxMiBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzUzLDExICsxNDA5LDEyIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTM2OCw2ICsxNDI1LDggQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTQwOCw3ICsxNDY3LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCkBAIC0xNDMyLDYgKzE0OTAsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDQwLDEyICsxNTAwLDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDU0LDEyICsxNTE1LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFN5bmNTYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0NjgsMTMgKzE1MzAsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEB4eXoKICAgICAgICAgY2FzZSBGT1VSQ0MoJ1x4QTknLCAneCcsICd5JywgJ3onKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiQHh5eiIgYm94CiAgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIkB4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LApAQCAtMTUwMywxMiArMTU2NiwxMyBAQAogCiAgICAgICAgICAgICBidWZmZXJbbG9jYXRpb25fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgYnVmZmVyKTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xNTQ2LDEyICsxNjEwLDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xNTYyLDEyICsxNjI3LDI3IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgogICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCkBAIC0xNTkzLDcgKzE2NzMsNiBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTYwMSwxMSArMTY4MCwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTE2MzksNiArMTcyMCw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA9PSA2ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlSVR1bmVzTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKQEAgLTE2NDcsMTcgKzE3MzAsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAzMikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzI0XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzMyXTsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCiAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE2NjUsMTQgKzE3NDksMjcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDY0X3QgY3JlYXRpb25UaW1lOworICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwogICAgICAgICAgICAgaWYgKGhlYWRlclswXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTY0X0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsyMF0pOworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZoZWFkZXJbMjRdKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTMyX0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsxMl0pOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMiA9IFUzMl9BVCgmaGVhZGVyWzE2XSk7CisgICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CkBAIC0xNjgwLDcgKzE3NzcsNTAgQEAKIAogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIDY0IGJpdAorICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAzMiBiaXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzAxLDYgKzE4NDEsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgewpAQCAtMTcxNSw3ICsxODU3LDI2IEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgICAgIFRyZXggdHJleDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZ0cmV4LnRyYWNrX0lEKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgOCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxMiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24pIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxNiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfc2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDIwLCAmdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJleC5hZGQodHJleCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzI5LDcgKzE4OTAsMTAgQEAKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IHVpbnQ4X3Rbc2l6ZSArIGNodW5rX3NpemVdOworICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIGNodW5rX3NpemVdOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CkBAIC0xNzQwLDYgKzE5MDQsOCBAQAogICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSByZWFkIHBvaW50ZXIgc28gd2UgZG9uJ3QgZW5kIHVwIHJlYWRpbmcgdGhpcyBhZ2FpbgorICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTE3NTQsNiArMTkyMCw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAobUZpbGVNZXRhRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNodW5rX2RhdGFfc2l6ZSA9ICVsbGQgYW5kIGRhdGFfb2Zmc2V0ID0gJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKQEAgLTE3NjgsNyArMTkzNiw2IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpICsga1NraXBCeXRlc09mRGF0YUJveCwgY2h1bmtfZGF0YV9zaXplIC0ga1NraXBCeXRlc09mRGF0YUJveCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE3NzksMjUgKzE5NDYsMjcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZTNHUFBNZXRhRGF0YShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplLCBkZXB0aCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdJJywgJ0QnLCAnMycsICcyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDYpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwYXJzZUlEM3YyTWV0YURhdGEoZGF0YV9vZmZzZXQgKyA2KTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTg4OSw3ICsyMDU4LDcgQEAKICAgICAgICAgb2Zmc2V0ICs9IDE2OwogICAgICAgICBzaXplIC09IDE2OwogICAgIH0KLSAgICBBTE9HVigic2lkeCBwcmVzL29mZjogJUxkLyVMZCIsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOworICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlIiBQUkl1NjQgIi8lIiBQUkl1NjQsIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSwgZmlyc3RPZmZzZXQpOwogCiAgICAgaWYgKHNpemUgPCA0KSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMSw5ICsyMDkwLDEwIEBACiAgICAgICAgICAgICBBTE9HVygic3ViLXNpZHggYm94ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKICAgICAgICAgfQogICAgICAgICBib29sIHNhcCA9IGQzICYgMHg4MDAwMDAwMDsKLSAgICAgICAgYm9vbCBzYXB0eXBlID0gZDMgPj4gMjg7Ci0gICAgICAgIGlmICghc2FwIHx8IHNhcHR5cGUgPiAyKSB7Ci0gICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZSIpOworICAgICAgICB1aW50MzJfdCBzYXB0eXBlID0gKGQzID4+IDI4KSAmIDc7CisgICAgICAgIGlmICghc2FwIHx8IChzYXB0eXBlICE9IDEgJiYgc2FwdHlwZSAhPSAyKSkgeworICAgICAgICAgICAgLy8gdHlwZSAxIGFuZCAyIGFyZSBzeW5jIHNhbXBsZXMKKyAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlOiAlMDh4IiwgZDMpOwogICAgICAgICB9CiAgICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGQyOwogICAgICAgICBvZmZzZXQgKz0gMTI7CkBAIC0xOTM0LDEyICsyMTA0LDExIEBACiAgICAgICAgIG1TaWR4RW50cmllcy5hZGQoc2UpOwogICAgIH0KIAotICAgIG1TaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7Ci0gICAgQUxPR1YoImR1cmF0aW9uOiAlbGxkIiwgbVNpZHhEdXJhdGlvbik7CisgICAgdWludDY0X3Qgc2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwogCiAgICAgaW50NjRfdCBtZXRhRHVyYXRpb247CiAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIG1TaWR4RHVyYXRpb24pOworICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTIwNDAsNyArMjIwOSwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W3NpemUgKyAxXTsKKyAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgMV07CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCwgYnVmZmVyLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CiAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKQEAgLTIyMjcsNyArMjM5OSwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemVdOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewogICAgICAgICBkZWxldGVbXSBidWZmZXI7CkBAIC0yNDA2LDExICsyNTgxLDI0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICVkIiwgbVBzc2guc2l6ZSgpKTsKIAotICAgIHJldHVybiBuZXcgTVBFRzRTb3VyY2UoCisgICAgVHJleCAqdHJleCA9IE5VTEw7CisgICAgaW50MzJfdCB0cmFja0lkOworICAgIGlmICh0cmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKKyAgICAgICAgICAgICAgICB0cmV4ID0gdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CisKKyAgICByZXR1cm4gbmV3IE1QRUc0U291cmNlKHRoaXMsCiAgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKLSAgICAgICAgICAgIG1TaWR4RW50cmllcywgbU1vb2ZPZmZzZXQpOworICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjQyNiw2ICsyNjE0LDExIEBACiAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUFWQ0MpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQpAQCAtMjQzNCwxNCArMjYyNyw2NyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCF0cmFjay0+c2FtcGxlVGFibGUtPmlzVmFsaWQoKSkgeworICAgIGlmICh0cmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCB8fCAhdHJhY2stPnNhbXBsZVRhYmxlLT5pc1ZhbGlkKCkpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSBtZXRhZGF0YSB3ZSBuZWVkLgorICAgICAgICBBTE9HRSgic3RibCBhdG9tIG1pc3NpbmcvaW52YWxpZC4iKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKK3R5cGVkZWYgZW51bSB7CisgICAgLy9BT1RfTk9ORSAgICAgICAgICAgICA9IC0xLAorICAgIC8vQU9UX05VTExfT0JKRUNUICAgICAgPSAwLAorICAgIC8vQU9UX0FBQ19NQUlOICAgICAgICAgPSAxLCAvKio8IE1haW4gcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQU9UX0FBQ19MQyAgICAgICAgICAgPSAyLCAgIC8qKjwgTG93IENvbXBsZXhpdHkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BQUNfU1NSICAgICAgICAgID0gMywKKyAgICAvL0FPVF9BQUNfTFRQICAgICAgICAgID0gNCwKKyAgICBBT1RfU0JSICAgICAgICAgICAgICA9IDUsCisgICAgLy9BT1RfQUFDX1NDQUwgICAgICAgICA9IDYsCisgICAgLy9BT1RfVFdJTl9WUSAgICAgICAgICA9IDcsCisgICAgLy9BT1RfQ0VMUCAgICAgICAgICAgICA9IDgsCisgICAgLy9BT1RfSFZYQyAgICAgICAgICAgICA9IDksCisgICAgLy9BT1RfUlNWRF8xMCAgICAgICAgICA9IDEwLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8xMSAgICAgICAgICA9IDExLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfVFRTSSAgICAgICAgICAgICA9IDEyLCAvKio8IFRUU0kgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTUFJTl9TWU5USCAgICAgICA9IDEzLCAvKio8IE1haW4gU3ludGhldGljIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfV0FWX1RBQl9TWU5USCAgICA9IDE0LCAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfR0VOX01JREkgICAgICAgICA9IDE1LCAvKio8IEdlbmVyYWwgTUlESSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUxHX1NZTlRIX0FVRF9GWCA9IDE2LCAvKio8IEFsZ29yaXRobWljIFN5bnRoZXNpcyBhbmQgQXVkaW8gRlggb2JqZWN0ICovCisgICAgQU9UX0VSX0FBQ19MQyAgICAgICAgPSAxNywgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvdyBDb21wbGV4aXR5ICAgICovCisgICAgLy9BT1RfUlNWRF8xOCAgICAgICAgICA9IDE4LCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfQUFDX0xUUCAgICAgICA9IDE5LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExUUCBvYmplY3QgICAgICAgICovCisgICAgQU9UX0VSX0FBQ19TQ0FMICAgICAgPSAyMCwgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIFNjYWxhYmxlIG9iamVjdCAgICovCisgICAgLy9BT1RfRVJfVFdJTl9WUSAgICAgICA9IDIxLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgVHdpblZRIG9iamVjdCAgICAgICAgICovCisgICAgQU9UX0VSX0JTQUMgICAgICAgICAgPSAyMiwgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQlNBQyBvYmplY3QgICAgICAgICAgICovCisgICAgQU9UX0VSX0FBQ19MRCAgICAgICAgPSAyMywgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvd0RlbGF5IG9iamVjdCAgICovCisgICAgLy9BT1RfRVJfQ0VMUCAgICAgICAgICA9IDI0LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQ0VMUCBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfSFZYQyAgICAgICAgICA9IDI1LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSFZYQyBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfSElMTiAgICAgICAgICA9IDI2LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSElMTiBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfUEFSQSAgICAgICAgICA9IDI3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgUGFyYW1ldHJpYyBvYmplY3QgICAgICovCisgICAgLy9BT1RfUlNWRF8yOCAgICAgICAgICA9IDI4LCAvKio8IG1pZ2h0IGJlY29tZSBTU0MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQU9UX1BTICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IFBTLCBQYXJhbWV0cmljIFN0ZXJlbyAoaW5jbHVkZXMgU0JSKSAgICAgICovCisgICAgLy9BT1RfTVBFR1MgICAgICAgICAgICA9IDMwLCAvKio8IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBBT1RfRVNDQVBFICAgICAgICAgICA9IDMxLCAgIC8qKjwgU2lnbmFsIEFPVCB1c2VzIG1vcmUgdGhhbiA1IGJpdHMgICAgICAgICAgKi8KKworICAgIC8vQU9UX01QM09OTVA0X0wxICAgICAgPSAzMiwgLyoqPCBNUEVHLUxheWVyMSBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01QM09OTVA0X0wyICAgICAgPSAzMywgLyoqPCBNUEVHLUxheWVyMiBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01QM09OTVA0X0wzICAgICAgPSAzNCwgLyoqPCBNUEVHLUxheWVyMyBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMzUgICAgICAgICAgPSAzNSwgLyoqPCBtaWdodCBiZWNvbWUgRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMzYgICAgICAgICAgPSAzNiwgLyoqPCBtaWdodCBiZWNvbWUgQUxTICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FBQ19TTFMgICAgICAgICAgPSAzNywgLyoqPCBBQUMgKyBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1NMUyAgICAgICAgICAgICAgPSAzOCwgLyoqPCBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0FBQ19FTEQgICAgICAgPSAzOSwgLyoqPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5ICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLy9BT1RfVVNBQyAgICAgICAgICAgICA9IDQyLCAvKio8IFVTQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfU0FPQyAgICAgICAgICAgICA9IDQzLCAvKio8IFNBT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTERfTVBFR1MgICAgICAgICA9IDQ0LCAvKio8IExvdyBEZWxheSBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvL0FPVF9SU1ZENTAgICAgICAgICAgID0gNTAsICAvKio8IEludGVyaW0gQU9UIGZvciBSc3ZkNTAgICAgICAgICAgICAgICAgICAgKi8KK30gQVVESU9fT0JKRUNUX1RZUEU7CisKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCiAgICAgICAgIGNvbnN0IHZvaWQgKmVzZHNfZGF0YSwgc2l6ZV90IGVzZHNfc2l6ZSkgewogICAgIEVTRFMgZXNkcyhlc2RzX2RhdGEsIGVzZHNfc2l6ZSk7CkBAIC0yNTI0LDcgKzI3NzAsNyBAQAogICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlID09IDUgfHwgb2JqZWN0VHlwZSA9PSAyOSkgeyAvLyBTQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlOwogICAgICAgICBpZiAoZXh0RnJlcUluZGV4ID09IDE1KSB7CkBAIC0yNTQyLDYgKzI3ODgsMTMxIEBACiAgICAgICAgIC8vICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwogICAgIH0KIAorICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgLy8gdmFsdWVzIGRlZmluZWQgaW4gMTQ0OTYtM18yMDA5IGFtZW5kbWVudC00IFRhYmxlIDEuMTkgLSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDE6Ly8gRkMKKyAgICAgICAgY2FzZSAyOi8vIEZMIEZSCisgICAgICAgIGNhc2UgMzovLyBGQywgRkwgRlIKKyAgICAgICAgY2FzZSA0Oi8vIEZDLCBGTCBGUiwgUkMKKyAgICAgICAgY2FzZSA1Oi8vIEZDLCBGTCBGUiwgU0wgU1IKKyAgICAgICAgY2FzZSA2Oi8vIEZDLCBGTCBGUiwgU0wgU1IsIExGRQorICAgICAgICAgICAgLy9udW1DaGFubmVscyBhbHJlYWR5IGNvbnRhaW5zIHRoZSByaWdodCB2YWx1ZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgUkMsIExGRQorICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogLy8gRkMsIEZDTCBGQ1IsIEZMIEZSLCBTTCBTUiwgTEZFCisgICAgICAgIGNhc2UgMTI6Ly8gRkMsIEZMICBGUiwgIFNMIFNSLCBSTCBSUiwgTEZFCisgICAgICAgIGNhc2UgMTQ6Ly8gRkMsIEZMICBGUiwgIFNMIFNSLCBMRkUsIEZITCBGSFIKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgeworICAgICAgICAgICAgb2JqZWN0VHlwZSA9IGJyLmdldEJpdHMoNSk7CisKKyAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9FU0NBUEUpIHsKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gMzIgKyBici5nZXRCaXRzKDYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9BQUNfTEMgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xDIHx8CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0xEIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19TQ0FMIHx8CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQlNBQykgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZUxlbmd0aEZsYWcgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlcGVuZHNPbkNvcmVDb2RlciA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAgICAgICAgIGlmIChkZXBlbmRzT25Db3JlQ29kZXIgKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb3JlQ29kZXJEZWxheSA9IGJyLmdldEJpdHMoMTQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGV4dGVuc2lvbkZsYWcgPSAtMTsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID4gMCkgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyAxNDQ5Ni0zIDQuNS4xLjEgZXh0ZW5zaW9uRmxhZworICAgICAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9CU0FDOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVygiY3NkIG1pc3NpbmcgZXh0ZW5zaW9uIGZsYWc7IGFzc3VtaW5nICVkIGZvciBvYmplY3QgdHlwZSAldS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZywgb2JqZWN0VHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc051bSA9IDA7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVNpZGVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1MZmVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQXNzb2NEYXRhRWxlbWVudHMgPSBici5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoTW9ub01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChTdGVyZW9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBTaWRlRWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gJWQiLCBjaGFubmVsc0VmZmVjdGl2ZU51bSk7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBjaGFubmVsc051bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CkBAIC0yNTcyLDE5ICsyOTQzLDIzIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNUEVHNFNvdXJjZTo6TVBFRzRTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCiAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAorICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCkKLSAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICA6IG1Pd25lcihvd25lciksCisgICAgICBtRm9ybWF0KGZvcm1hdCksCiAgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UaW1lc2NhbGUodGltZVNjYWxlKSwKICAgICAgIG1TYW1wbGVUYWJsZShzYW1wbGVUYWJsZSksCiAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4KDApLAogICAgICAgbUN1cnJlbnRGcmFnbWVudEluZGV4KDApLAogICAgICAgbVNlZ21lbnRzKHNpZHgpLAorICAgICAgbVRyZXgodHJleCksCiAgICAgICBtRmlyc3RNb29mT2Zmc2V0KGZpcnN0TW9vZk9mZnNldCksCiAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKICAgICAgIG1DdXJyZW50VGltZSgwKSwKQEAgLTI1OTMsNiArMjk2OCw3IEBACiAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKDApLAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCisgICAgICBtSXNIRVZDKGZhbHNlKSwKICAgICAgIG1OQUxMZW5ndGhTaXplKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbUdyb3VwKE5VTEwpLApAQCAtMjYwMCw2ICsyOTc2LDggQEAKICAgICAgIG1XYW50c05BTEZyYWdtZW50cyhmYWxzZSksCiAgICAgICBtU3JjQnVmZmVyKE5VTEwpIHsKIAorICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CisKICAgICBtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CiAgICAgbURlZmF1bHRJVlNpemUgPSAwOwogICAgIG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKQEAgLTI2MTcsNiArMjk5NSw3IEBACiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKICAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKIAogICAgIGlmIChtSXNBVkMpIHsKICAgICAgICAgdWludDMyX3QgdHlwZTsKQEAgLTI2MzEsNiArMzAxMCwxOCBAQAogCiAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBlbmNvZGUgdGhlIGxlbmd0aCBvZiBhIE5BTCB1bml0LgogICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIENIRUNLKHNpemUgPj0gNyk7CisgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClwdHJbMF0sIDF1KTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKworICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzE0ICsgN10gJiAzKTsKICAgICB9CiAKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7CkBAIC0yNjY5LDcgKzMwNjAsMTEgQEAKIAogICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobWF4X3NpemUpKTsKIAotICAgIG1TcmNCdWZmZXIgPSBuZXcgdWludDhfdFttYXhfc2l6ZV07CisgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKKyAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCkBAIC0yNzQyLDkgKzMxMzcsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewotICAgICAgICAgICAgICAgIC8vICpvZmZzZXQgcG9pbnRzIHRvIHRoZSBtZGF0IGJveCBmb2xsb3dpbmcgdGhpcyBtb29mCi0gICAgICAgICAgICAgICAgcGFyc2VDaHVuayhvZmZzZXQpOyAvLyBkb2Vzbid0IGFjdHVhbGx5IHBhcnNlIGl0LCBqdXN0IHVwZGF0ZXMgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgorCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOworICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxNDMsOCArMzU0OSw4IEBACiAgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCiAgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewogICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247CisgICAgfSBlbHNlIGlmIChtVHJleCkgeworICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmV4LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKQEAgLTMxNzEsNyArMzU3Nyw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCBzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CisgICAgaWYgKHNpemUgPCAob2ZmNjRfdClzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMzIwNSw3ICszNjExLDcgQEAKICAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4bGx4LCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgorICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgogICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCkBAIC0zMjEzLDYgKzM2MTksNyBAQAogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKKyAgICAgICAgdG1wLmNvbXBvc2l0aW9uT2Zmc2V0ID0gc2FtcGxlQ3RzT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFNhbXBsZXMuYWRkKHRtcCk7CiAKICAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwpAQCAtMzI4NCw3ICszNjkxLDcgQEAKIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKiBtVGltZXNjYWxlIC8gMTAwMDAwMCwKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAogICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKIAogICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CkBAIC0zMzQ2LDcgKzM3NTMsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgdWludDMyX3QgY3RzOworICAgIHVpbnQzMl90IGN0cywgc3R0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTMzNTQsNyArMzc2MSw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzM2OCw3ICszNzc1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghbUlzQVZDIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CkBAIC0zMzg1LDYgKzM3OTIsOCBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTMzOTgsNyArMzgwNyw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzUwNyw2ICszOTE2LDggQEAKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM1NDksNyArMzk2MCw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQykgfHwKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgpAQCAtMzU2MiwxMSArMzk3MywxOSBAQAogICAgICAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwogICAgICAgICAgICAgfQotICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0bXApOworICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKQEAgLTM1NzgsNyArMzk5Nyw3IEBACiAgICAgfQogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwotICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBzaXplID0gMDsKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKQEAgLTM1ODYsMjIgKzQwMDUsMjQgQEAKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQKLSAgICAgICAgICAgIFNhbXBsZSBsYXN0U2FtcGxlID0gbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7IC8vIGxhc3RTYW1wbGUub2Zmc2V0ICsgbGFzdFNhbXBsZS5zaXplOworICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQorICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBwYXJzZUNodW5rKCZuZXh0TW9vZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwotICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWU7CisgICAgICAgIGN0cyA9IG1DdXJyZW50VGltZSArIHNtcGwtPmNvbXBvc2l0aW9uT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CiAgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOyAvLyBYWFgKIApAQCAtMzYyOSw3ICs0MDUwLDcgQEAKICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBtQ3J5cHRvS2V5LCAxNik7CiAgICAgfQogCi0gICAgaWYgKCFtSXNBVkMgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwpAQCAtMzY0Niw2ICs0MDY3LDggQEAKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM2NTksNyArNDA4Miw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzc2OSw2ICs0MTkyLDggQEAKIAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzgzMSw2ICs0MjU2LDggQEAKICAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICdtJyksCiAgICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnMicpLAogICAgICAgICBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyksCisgICAgICAgIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLApAQCAtMzkwMiw3ICs0MzI5LDcgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJWxsZCBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNThhNDQ4Ny4uNGI4NDQwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMTYsMTMgKzE2LDE3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzRXcml0ZXIiCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CkBAIC0zNCwxMyArMzgsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjZGVmaW5lIFdBUk5fVU5MRVNTKGNvbmRpdGlvbiwgbWVzc2FnZSwgLi4uKSBcCisoIChDT05ESVRJT04oY29uZGl0aW9uKSkgPyBmYWxzZSA6ICh7IFwKKyAgICBBTE9HVygiQ29uZGl0aW9uICVzIGZhaWxlZCAiICBtZXNzYWdlLCAjY29uZGl0aW9uLCAjI19fVkFfQVJHU19fKTsgXAorICAgIHRydWU7IFwKK30pKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzID0gNSAqIDEwMjQgKiAxMDI0OwpAQCAtNDM1LDcgKzQ0MSw3IEBACiAKICAgICAvLyBBdCBtb3N0IDIgdHJhY2tzIGNhbiBiZSBzdXBwb3J0ZWQuCiAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID49IDIpIHsKLSAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJWQpIHRvIGFkZCIsIG1UcmFja3Muc2l6ZSgpKTsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoJXp1KSB0byBhZGQiLCBtVHJhY2tzLnNpemUoKSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKQEAgLTU0OSw4ICs1NTUsOCBAQAogICAgICAgICBzaXplID0gTUFYX01PT1ZfQk9YX1NJWkU7CiAgICAgfQogCi0gICAgQUxPR0koImxpbWl0czogJWxsZC8lbGxkIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUgZXN0aW1hdGVkIgotICAgICAgICAgIiBtb292IHNpemUgJWxsZCBieXRlcyIsCisgICAgQUxPR0koImxpbWl0czogJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgYnl0ZXMvdXMsIGJpdCByYXRlOiAlZCBicHMgYW5kIHRoZSIKKyAgICAgICAgICIgZXN0aW1hdGVkIG1vb3Ygc2l6ZSAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcywgYml0UmF0ZSwgc2l6ZSk7CiAgICAgcmV0dXJuIGZhY3RvciAqIHNpemU7CiB9CkBAIC01ODYsOCArNTkyLDggQEAKICAgICAgICAgLy8gSWYgZmlsZSBzaXplIGlzIHNldCB0byBiZSBsYXJnZXIgdGhhbiB0aGUgMzIgYml0IGZpbGUKICAgICAgICAgLy8gc2l6ZSBsaW1pdCwgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCiAgICAgICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID4ga01heDMyQml0RmlsZVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dXKCIzMi1iaXQgZmlsZSBzaXplIGxpbWl0ICglbGxkIGJ5dGVzKSB0b28gYmlnLiAiCi0gICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICVsbGQgYnl0ZXMiLAorICAgICAgICAgICAgQUxPR1coIjMyLWJpdCBmaWxlIHNpemUgbGltaXQgKCUiIFBSSWQ2NCAiIGJ5dGVzKSB0b28gYmlnLiAiCisgICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICUiIFBSSWQ2NCAiIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzLCBrTWF4MzJCaXRGaWxlU2l6ZSk7CiAgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CiAgICAgICAgIH0KQEAgLTg0OCw3ICs4NTQsNyBAQAogICAgIH0KIAogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslbGxkLCAlbGxkXSB1cyIsCisgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsCiAgICAgICAgICAgICBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKICAgICB9CiAKQEAgLTk3NSwxMyArOTgxLDE2IEBACiAgICAgaWYgKHBhcmFtICYmIHBhcmFtLT5maW5kSW50MzIoa0tleUZpbGVUeXBlLCAmZmlsZVR5cGUpICYmCiAgICAgICAgIGZpbGVUeXBlICE9IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKICAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB3cml0ZUludDMyKDApOworICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOwogICAgIH0KIAotICAgIHdyaXRlSW50MzIoMCk7Ci0gICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwogICAgIGVuZEJveCgpOwogfQogCkBAIC0xMzEyLDEyICsxMzIxLDEyIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OnNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBBTE9HSSgic2V0U3RhcnRUaW1lc3RhbXBVczogJWxsZCIsIHRpbWVVcyk7CisgICAgQUxPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCwgdGltZVVzKTsKICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgPCAwIHx8IG1TdGFydFRpbWVzdGFtcFVzID4gdGltZVVzKSB7CiAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZVVzOwotICAgICAgICBBTE9HSSgiRWFybGllc3QgdHJhY2sgc3RhcnRpbmcgdGltZTogJWxsZCIsIG1TdGFydFRpbWVzdGFtcFVzKTsKKyAgICAgICAgQUxPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICUiIFBSSWQ2NCwgbVN0YXJ0VGltZXN0YW1wVXMpOwogICAgIH0KIH0KIApAQCAtMTUxOCw3ICsxNTI3LDcgQEAKICAgICB7CiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDY0KGtLZXlUcmFja1RpbWVTdGF0dXMsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZSByZXF1ZXN0IHRvIHRyYWNrIHByb2dyZXNzIHN0YXR1cyBmb3IgZXZlcnkgJSIgUFJJZDY0ICIgdXMiLCB0aW1lVXMpOwogICAgICAgICAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IHRpbWVVczsKICAgICAgICAgICAgIG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTU1Miw3ICsxNTYxLDcgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVDaHVua1RvRmlsZShDaHVuayogY2h1bmspIHsKLSAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJWxsZCBmcm9tICVzIHRyYWNrIiwKKyAgICBBTE9HVigid3JpdGVDaHVua1RvRmlsZTogJSIgUFJJZDY0ICIgZnJvbSAlcyB0cmFjayIsCiAgICAgICAgIGNodW5rLT5tVGltZVN0YW1wVXMsIGNodW5rLT5tVHJhY2stPmlzQXVkaW8oKT8gImF1ZGlvIjogInZpZGVvIik7CiAKICAgICBpbnQzMl90IGlzRmlyc3RTYW1wbGUgPSB0cnVlOwpAQCAtMTcyOCw3ICsxNzM3LDcgQEAKICAgICAgICAgICAgIHN0YXJ0VGltZU9mZnNldFVzID0ga0luaXRpYWxEZWxheVRpbWVVczsKICAgICAgICAgfQogICAgICAgICBzdGFydFRpbWVVcyArPSBzdGFydFRpbWVPZmZzZXRVczsKLSAgICAgICAgQUxPR0koIlN0YXJ0IHRpbWUgb2Zmc2V0OiAlbGxkIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOworICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICUiIFBSSWQ2NCAiIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOwogICAgIH0KIAogICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CkBAIC0xNzYzLDcgKzE3NzIsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnN0b3AoKSB7Ci0gICAgQUxPR0QoIlN0b3BwaW5nICVzIHRyYWNrIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworICAgIEFMT0dEKCIlcyB0cmFjayBzdG9wcGluZyIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dFKCJTdG9wKCkgY2FsbGVkIGJ1dCB0cmFjayBpcyBub3Qgc3RhcnRlZCIpOwogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKQEAgLTE3NzQsMTkgKzE3ODMsMTQgQEAKICAgICB9CiAgICAgbURvbmUgPSB0cnVlOwogCisgICAgQUxPR0QoIiVzIHRyYWNrIHNvdXJjZSBzdG9wcGluZyIsIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iKTsKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgQUxPR0QoIiVzIHRyYWNrIHNvdXJjZSBzdG9wcGVkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworCiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7Ci0KICAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAKLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2sgc291cmNlIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwotICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgZXJyID0gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTE4MTMsNyArMTgxNyw3IEBACiBzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZE5leHRTdGFydENvZGUoCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpIHsKIAotICAgIEFMT0dWKCJmaW5kTmV4dFN0YXJ0Q29kZTogJXAgJWQiLCBkYXRhLCBsZW5ndGgpOworICAgIEFMT0dWKCJmaW5kTmV4dFN0YXJ0Q29kZTogJXAgJXp1IiwgZGF0YSwgbGVuZ3RoKTsKIAogICAgIHNpemVfdCBieXRlc0xlZnQgPSBsZW5ndGg7CiAgICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgICYmCkBAIC0yMTAwLDYgKzIxMDQsNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBjb25zdCBjaGFyICp0cmFja05hbWUgPSBtSXNBdWRpbyA/ICJBdWRpbyIgOiAiVmlkZW8iOwogICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcikpID09IE9LKSB7CiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjE5NSwxNSArMjIwMCwyNyBAQAogCiAgICAgICAgIGlmIChtUmVzdW1lZCkgewogICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHBhdXNlZER1cmF0aW9uVXMgPj0gbGFzdER1cmF0aW9uVXMsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSBwYXVzZWREdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXM7CiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZTogdGltZXN0YW1wVXMKQEAgLTIyMTUsMTUgKzIyMzIsMjMgQEAKICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKICAgICAgICAgICAgIGN0dHNPZmZzZXRUaW1lVXMgPQogICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShjdHRzT2Zmc2V0VGltZVVzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN0dHNPZmZzZXRUaW1lVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICVsbGQgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICVsbGQiLAorICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICUiIFBSSWQ2NCAiIGFuZCBjdHRzIG9mZnNldCB0aW1lOiAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNPZmZzZXRUaW1lVXMpOwogCiAgICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyBib3ggdGFibGUgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICBjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9CiAgICAgICAgICAgICAgICAgICAgIChjdHRzT2Zmc2V0VGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKLSAgICAgICAgICAgIENIRUNLX0xFKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzLCAweDBGRkZGRkZGRkxMKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA8PSAweDBGRkZGRkZGRkxMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBmaXJzdCBjdHRzIHRhYmxlIGVudHJ5IHRvIGhhdmUgb25lIHNpbmdsZSBlbnRyeQogICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGRvIGFkanVzdG1lbnQgZm9yIHRoZSBpbml0aWFsIHRyYWNrIHN0YXJ0CkBAIC0yMjYxLDkgKzIyODYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOwotICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJWxsZCBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICVsbGQiLAotICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgewogICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0yMjc3LDExICsyMzA2LDI4IEBACiAgICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCiAgICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwogICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlbGxkIDwgbGFzdFRpbWVzdGFtcFVzICVsbGQgZm9yICVzIHRyYWNrIiwKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgICAgICAgICBBTE9HRSgidGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgPCBsYXN0VGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgZm9yICVzIHRyYWNrIiwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCB0cmFja05hbWUpOworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBpZiB0aGUgZHVyYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGlzIHNhbXBsZSwgc2VlIGlmIGl0IGlzIGNsb3NlIGVub3VnaCB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gZHVyYXRpb24gdGhhdCB3ZSBjYW4gZnVkZ2UgaXQgYW5kIHVzZSB0aGUgc2FtZSB2YWx1ZSwgdG8gYXZvaWQgZmlsbGluZyB0aGUgc3R0cyB0YWJsZQorICAgICAgICAvLyB3aXRoIGxvdHMgb2YgbmVhci1pZGVudGljYWwgZW50cmllcy4KKyAgICAgICAgLy8gImNsb3NlIGVub3VnaCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGR1cmF0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IGxlc3MKKyAgICAgICAgLy8gdGhhbiAwLjEgbWlsbGlzZWNvbmRzCisgICAgICAgIGlmIChsYXN0RHVyYXRpb25UaWNrcyAmJiAoY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpKSB7CisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhVXMgPSAoKGxhc3REdXJhdGlvblRpY2tzIC0gY3VyckR1cmF0aW9uVGlja3MpICogMTAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICsgKG1UaW1lU2NhbGUgLyAyKSkgLyBtVGltZVNjYWxlOworICAgICAgICAgICAgaWYgKGRlbHRhVXMgPiAtMTAwICYmIGRlbHRhVXMgPCAxMDApIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgcHJldmlvdXMgdGlja3MsIGFuZCBhZGp1c3QgdGltZXN0YW1wIGFzIGlmIGl0IHdhcyBhY3R1YWxseSB0aGF0IG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIHRpY2tzCisgICAgICAgICAgICAgICAgY3VyckR1cmF0aW9uVGlja3MgPSBsYXN0RHVyYXRpb25UaWNrczsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSBkZWx0YVVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVTaXplKSk7CiAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA+IDIpIHsKIApAQCAtMjMwMSw4ICsyMzQ3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByZXZpb3VzU2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CisgICAgICAgIEFMT0dWKCIlcyB0aW1lc3RhbXBVcy9sYXN0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMpOwogICAgICAgICBsYXN0RHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzIC0gbGFzdFRpbWVzdGFtcFVzOwogICAgICAgICBsYXN0RHVyYXRpb25UaWNrcyA9IGN1cnJEdXJhdGlvblRpY2tzOwogICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKQEAgLTI0MDcsOSArMjQ1Myw5IEBACiAgICAgc2VuZFRyYWNrU3VtbWFyeShoYXNNdWx0aXBsZVRyYWNrcyk7CiAKICAgICBBTE9HSSgiUmVjZWl2ZWQgdG90YWwvMC1sZW5ndGggKCVkLyVkKSBidWZmZXJzIGFuZCBlbmNvZGVkICVkIGZyYW1lcy4gLSAlcyIsCi0gICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCBtSXNBdWRpbz8gImF1ZGlvIjogInZpZGVvIik7CisgICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCB0cmFja05hbWUpOwogICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICBBTE9HSSgiQXVkaW8gdHJhY2sgZHJpZnQgdGltZTogJWxsZCB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CisgICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlIiBQUklkNjQgIiB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CiAgICAgfQogCiAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CkBAIC0yNDkyLDExICsyNTM4LDExIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKLSAgICBBTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgQUxPR1YoInRyYWNrUHJvZ3Jlc3NTdGF0dXM6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKIAogICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCAmJgogICAgICAgICB0aW1lVXMgLSBtUHJldmlvdXNUcmFja1RpbWVVcyA+PSBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKSB7Ci0gICAgICAgIEFMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICBBTE9HVigiRmlyZSB0aW1lIHRyYWNraW5nIHByb2dyZXNzIHN0YXR1cyBhdCAlIiBQUklkNjQgIiB1cyIsIHRpbWVVcyk7CiAgICAgICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyhtVHJhY2tJZCwgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CiAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOwogICAgIH0KQEAgLTI1MzAsMTMgKzI1NzYsMTMgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6c2V0RHJpZnRUaW1lVXMoaW50NjRfdCBkcmlmdFRpbWVVcykgewotICAgIEFMT0dWKCJzZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIGRyaWZ0VGltZVVzKTsKKyAgICBBTE9HVigic2V0RHJpZnRUaW1lVXM6ICUiIFBSSWQ2NCAiIHVzIiwgZHJpZnRUaW1lVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgbURyaWZ0VGltZVVzID0gZHJpZnRUaW1lVXM7CiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OmdldERyaWZ0VGltZVVzKCkgewotICAgIEFMT0dWKCJnZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIG1EcmlmdFRpbWVVcyk7CisgICAgQUxPR1YoImdldERyaWZ0VGltZVVzOiAlIiBQUklkNjQgIiB1cyIsIG1EcmlmdFRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbURyaWZ0VGltZVVzOwogfQpAQCAtMjk5Miw3ICszMDM4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJjdHRzIGJveCBoYXMgJWQgZW50cmllcyB3aXRoIHJhbmdlIFslbGxkLCAlbGxkXSIsCisgICAgQUxPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIHdpdGggcmFuZ2UgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0iLAogICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCksIG1NaW5DdHRzT2Zmc2V0VGltZVVzLCBtTWF4Q3R0c09mZnNldFRpbWVVcyk7CiAKICAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAKaW5kZXggOGFmMDg4MC4uMWY4MGE0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmNwcApAQCAtMTM0LDcgKzEzNCw3IEBACiAKIHZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7CiAgICAgaWYgKChtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKSAmJiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpKSB7Ci0gICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlZCwgbGVuZ3RoID0gJWQsIG1TaXplID0gJWQiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOworICAgICAgICBBTE9HRSgib2Zmc2V0ID0gJXp1LCBsZW5ndGggPSAlenUsIG1TaXplID0gJXp1Iiwgb2Zmc2V0LCBsZW5ndGgsIG1TaXplKTsKICAgICB9CiAgICAgQ0hFQ0soKG1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHx8IChvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmNwcAppbmRleCA4MGFhZTUxLi42YWM2ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmNwcApAQCAtNTUsNyArNTUsOCBAQAogICAgIG1MYXN0QnVmZmVyID0gYnVmZmVyOwogfQogCi1zdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKm91dCkgeworc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBib29sIG5vbkJsb2NraW5nKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGZvciAoOzspIHsKQEAgLTcwLDYgKzcxLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKKyAgICAgICAgICAgICpvdXQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICB9CisKICAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZS4gQmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQgdG8gdXMuCiAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCAzY2I0MjE3Li5kZjQ3YmQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMTYsMTIgKzE2LDEzIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlYyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgotCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKIAorI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtMzEsNDUgKzMyLDExOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIHN0YXRpYwotc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIpIHsKLSAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3Blcik7Ci0gICAgaWYgKGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2RlcikgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitzdHJ1Y3QgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyIDogcHVibGljIFNpbmdsZXRvbjxCYXR0ZXJ5Tm90aWZpZXI+IHsKKyAgICBCYXR0ZXJ5Tm90aWZpZXIoKTsKKworICAgIHZvaWQgbm90ZVN0YXJ0VmlkZW8oKTsKKyAgICB2b2lkIG5vdGVTdG9wVmlkZW8oKTsKKyAgICB2b2lkIG5vdGVTdGFydEF1ZGlvKCk7CisgICAgdm9pZCBub3RlU3RvcEF1ZGlvKCk7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBtVmlkZW9SZWZDb3VudDsKKyAgICBpbnQzMl90IG1BdWRpb1JlZkNvdW50OworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IG1CYXR0ZXJ5U3RhdFNlcnZpY2U7Cit9OworCitBTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyKQorCitNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6OkJhdHRlcnlOb3RpZmllcigpIDoKKyAgICBtVmlkZW9SZWZDb3VudCgwKSwKKyAgICBtQXVkaW9SZWZDb3VudCgwKSB7CisgICAgLy8gZ2V0IGJhdHRlcnkgc2VydmljZQorICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOworICAgIGlmIChzbSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUJhdHRlcnlTdGF0cz4oc20tPmdldFNlcnZpY2UobmFtZSkpOworICAgICAgICBpZiAobUJhdHRlcnlTdGF0U2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRWaWRlbygpIHsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0YXJ0VmlkZW8oQUlEX01FRElBKTsKKyAgICB9CisgICAgbVZpZGVvUmVmQ291bnQrKzsKK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wVmlkZW8oKSB7CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coIkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3AoKTogdmlkZW8gcmVmY291bnQgaXMgYnJva2VuISIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmV0dXJuIGNvZGVjOworICAgIG1WaWRlb1JlZkNvdW50LS07CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgbUJhdHRlcnlTdGF0U2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdG9wVmlkZW8oQUlEX01FRElBKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6QmF0dGVyeU5vdGlmaWVyOjpub3RlU3RhcnRBdWRpbygpIHsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0YXJ0QXVkaW8oQUlEX01FRElBKTsKKyAgICB9CisgICAgbUF1ZGlvUmVmQ291bnQrKzsKK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wQXVkaW8oKSB7CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coIkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3AoKTogYXVkaW8gcmVmY291bnQgaXMgYnJva2VuISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUF1ZGlvUmVmQ291bnQtLTsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0b3BBdWRpbyhBSURfTUVESUEpOworICAgIH0KK30KKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIpIHsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3Blcik7CisKKyAgICBjb25zdCBzdGF0dXNfdCByZXQgPSBjb2RlYy0+aW5pdChtaW1lLCB0cnVlIC8qIG5hbWVJc1R5cGUgKi8sIGVuY29kZXIpOworICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAqZXJyID0gcmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0ID09IE9LID8gY29kZWMgOiBOVUxMOyAvLyBOVUxMIGRlYWxsb2NhdGVzIGNvZGVjLgogfQogCiAvLyBzdGF0aWMKIHNwPE1lZGlhQ29kZWM+IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCAqZXJyKSB7CiAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIpOwotICAgIGlmIChjb2RlYy0+aW5pdChuYW1lLCBmYWxzZSAvKiBuYW1lSXNUeXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXR1cm4gY29kZWM7CisgICAgY29uc3Qgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQobmFtZSwgZmFsc2UgLyogbmFtZUlzVHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLyk7CisgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICAgICplcnIgPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCiB9CiAKIE1lZGlhQ29kZWM6Ok1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKICAgICA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSwKICAgICAgIG1Mb29wZXIobG9vcGVyKSwKLSAgICAgIG1Db2RlYyhuZXcgQUNvZGVjKSwKKyAgICAgIG1Db2RlYyhOVUxMKSwKICAgICAgIG1SZXBseUlEKDApLAogICAgICAgbUZsYWdzKDApLAorICAgICAgbVN0aWNreUVycm9yKE9LKSwKICAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCisgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZChmYWxzZSksCisgICAgICBtSXNWaWRlbyhmYWxzZSksCiAgICAgICBtRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb24oMCksCiAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCgwKSwKICAgICAgIG1EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24oMCksCkBAIC05NywyOSArMTcyLDQyIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlYzo6aW5pdChjb25zdCBjaGFyICpuYW1lLCBib29sIG5hbWVJc1R5cGUsIGJvb2wgZW5jb2RlcikgeworLy8gc3RhdGljCit2b2lkIE1lZGlhQ29kZWM6OlBvc3RSZXBseVdpdGhFcnJvcihpbnQzMl90IHJlcGx5SUQsIGludDMyX3QgZXJyKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjppbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKSB7CisgICAgLy8gc2F2ZSBpbml0IHBhcmFtZXRlcnMgZm9yIHJlc2V0CisgICAgbUluaXROYW1lID0gbmFtZTsKKyAgICBtSW5pdE5hbWVJc1R5cGUgPSBuYW1lSXNUeXBlOworICAgIG1Jbml0SXNFbmNvZGVyID0gZW5jb2RlcjsKKwogICAgIC8vIEN1cnJlbnQgdmlkZW8gZGVjb2RlcnMgZG8gbm90IHJldHVybiBmcm9tIE9NWF9GaWxsVGhpc0J1ZmZlcgogICAgIC8vIHF1aWNrbHksIHZpb2xhdGluZyB0aGUgT3Blbk1BWCBzcGVjcywgdW50aWwgdGhhdCBpcyByZW1lZGllZAogICAgIC8vIHdlIG5lZWQgdG8gaW52ZXN0IGluIGFuIGV4dHJhIGxvb3BlciB0byBmcmVlIHRoZSBtYWluIGV2ZW50CiAgICAgLy8gcXVldWUuCisgICAgbUNvZGVjID0gbmV3IEFDb2RlYzsKICAgICBib29sIG5lZWREZWRpY2F0ZWRMb29wZXIgPSBmYWxzZTsKLSAgICBpZiAobmFtZUlzVHlwZSAmJiAhc3RybmNhc2VjbXAobmFtZSwgInZpZGVvLyIsIDYpKSB7CisgICAgaWYgKG5hbWVJc1R5cGUgJiYgIXN0cm5jYXNlY21wKG5hbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpKSB7CiAgICAgICAgIG5lZWREZWRpY2F0ZWRMb29wZXIgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTdHJpbmcgdG1wID0gbmFtZTsKICAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CiAgICAgICAgICAgICB0bXAuZXJhc2UodG1wLnNpemUoKSAtIDcsIDcpOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICptY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICAgICAgc3NpemVfdCBjb2RlY0lkeCA9IG1jbC0+ZmluZENvZGVjQnlOYW1lKHRtcC5jX3N0cigpKTsKICAgICAgICAgaWYgKGNvZGVjSWR4ID49IDApIHsKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiB0eXBlczsKLSAgICAgICAgICAgIGlmIChtY2wtPmdldFN1cHBvcnRlZFR5cGVzKGNvZGVjSWR4LCAmdHlwZXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lZWREZWRpY2F0ZWRMb29wZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOworICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1pbWVzOworICAgICAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWltZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTUzLDYgKzI0MSwxNCBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0Q2FsbGJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiY2FsbGJhY2siLCBjYWxsYmFjayk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Y29uZmlndXJlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJm5hdGl2ZVdpbmRvdywKQEAgLTE3NCw3ICsyNzAsMjAgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAvLyBNZWRpYUNvZGVjIG5vdyBzZXQgc3RhdGUgdG8gVU5JTklUSUFMSVpFRCB1cG9uIGFueSBmYXRhbCBlcnJvci4KKyAgICAgICAgLy8gVG8gbWFpbnRhaW4gYmFja3dhcmQtY29tcGF0aWJpbGl0eSwgZG8gYSByZXNldCgpIHRvIHB1dCBjb2RlYworICAgICAgICAvLyBiYWNrIGludG8gSU5JVElBTElaRUQgc3RhdGUuCisgICAgICAgIC8vIEJ1dCBkb24ndCByZXNldCBpZiB0aGUgZXJyIGlzIElOVkFMSURfT1BFUkFUSU9OLCB3aGljaCBtZWFucworICAgICAgICAvLyB0aGUgY29uZmlndXJlIGZhaWx1cmUgaXMgZHVlIHRvIHdyb25nIHN0YXRlLgorCisgICAgICAgIEFMT0dFKCJjb25maWd1cmUgZmFpbGVkIHdpdGggZXJyIDB4JTA4eCwgcmVzZXR0aW5nLi4uIiwgZXJyKTsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpjcmVhdGVJbnB1dFN1cmZhY2UoCkBAIC0yMTgsNiArMzI3LDQxIEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVzZXQoKSB7CisgICAgLyogV2hlbiBleHRlcm5hbC1mYWNpbmcgTWVkaWFDb2RlYyBvYmplY3QgaXMgY3JlYXRlZCwKKyAgICAgICBpdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiAgVGh1cywgcmVzZXQgaXMgZXNzZW50aWFsbHkKKyAgICAgICByZWxlYXNlKCkgZm9sbG93ZWQgYnkgaW5pdCgpLCBwbHVzIGNsZWFyaW5nIHRoZSBzdGF0ZSAqLworCisgICAgc3RhdHVzX3QgZXJyID0gcmVsZWFzZSgpOworCisgICAgLy8gdW5yZWdpc3RlciBoYW5kbGVycworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBpZiAobUNvZGVjTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Db2RlY0xvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUNvZGVjLT5pZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1Db2RlYy0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjID0gTlVMTDsKKyAgICB9CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisKKyAgICBtRmxhZ3MgPSAwOyAgICAvLyBjbGVhciBhbGwgZmxhZ3MKKyAgICBtU3RpY2t5RXJyb3IgPSBPSzsKKworICAgIC8vIHJlc2V0IHN0YXRlIG5vdCByZXNldCBieSBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKQorICAgIG1SZXBseUlEID0gMDsKKyAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IDA7CisgICAgbURlcXVldWVPdXRwdXRSZXBseUlEID0gMDsKKyAgICBtRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb24gPSAwOworICAgIG1EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb24gPSAwOworICAgIG1IYXZlSW5wdXRTdXJmYWNlID0gZmFsc2U7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IGluaXQobUluaXROYW1lLCBtSW5pdE5hbWVJc1R5cGUsIG1Jbml0SXNFbmNvZGVyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cXVldWVJbnB1dEJ1ZmZlcigKICAgICAgICAgc2l6ZV90IGluZGV4LAogICAgICAgICBzaXplX3Qgb2Zmc2V0LApAQCAtMzIzLDYgKzQ2NywxNiBAQAogICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIGlkKCkpOworICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CisgICAgbXNnLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVsZWFzZU91dHB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSk7CiAgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKQEAgLTM1Miw2ICs1MDYsMjAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0Rm9ybWF0LCBpZCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0TmFtZShBU3RyaW5nICpuYW1lKSBjb25zdCB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldE5hbWUsIGlkKCkpOwogCkBAIC0zODQsNiArNTUyLDU1IEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0T3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCwgc3A8QUJ1ZmZlcj4gKmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgcmV0dXJuIGdldEJ1ZmZlckFuZEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBpbmRleCwgYnVmZmVyLCAmZm9ybWF0KTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0T3V0cHV0Rm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgcmV0dXJuIGdldEJ1ZmZlckFuZEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBpbmRleCwgJmJ1ZmZlciwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0SW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICByZXR1cm4gZ2V0QnVmZmVyQW5kRm9ybWF0KGtQb3J0SW5kZXhJbnB1dCwgaW5kZXgsIGJ1ZmZlciwgJmZvcm1hdCk7Cit9CisKK2Jvb2wgTWVkaWFDb2RlYzo6aXNFeGVjdXRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFSVEVEIHx8IG1TdGF0ZSA9PSBGTFVTSEVEOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRCdWZmZXJBbmRGb3JtYXQoCisgICAgICAgIHNpemVfdCBwb3J0SW5kZXgsIHNpemVfdCBpbmRleCwKKyAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKKyAgICAvLyB1c2UgbXV0ZXggaW5zdGVhZCBvZiBhIGNvbnRleHQgc3dpdGNoCisKKyAgICBidWZmZXItPmNsZWFyKCk7CisgICAgZm9ybWF0LT5jbGVhcigpOworICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gd2UgZG8gbm90IHdhbnQgbVBvcnRCdWZmZXJzIHRvIGNoYW5nZSBkdXJpbmcgdGhpcyBzZWN0aW9uCisgICAgLy8gd2UgYWxzbyBkb24ndCB3YW50IG1Pd25lZEJ5Q2xpZW50IHRvIGNoYW5nZSBkdXJpbmcgdGhpcworICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CisgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICpidWZmZXJzID0gJm1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdOworICAgIGlmIChpbmRleCA8IGJ1ZmZlcnMtPnNpemUoKSkgeworICAgICAgICBjb25zdCBCdWZmZXJJbmZvICZpbmZvID0gYnVmZmVycy0+aXRlbUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGluZm8ubU93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgIC8vIGJ5IHRoZSB0aW1lIGJ1ZmZlcnMgYXJyYXkgaXMgaW5pdGlhbGl6ZWQsIGNyeXB0byBpcyBzZXQKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBpbmZvLm1FbmNyeXB0ZWREYXRhOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW5mby5tRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpmb3JtYXQgPSBpbmZvLm1Gb3JtYXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpmbHVzaCgpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpOwogCkBAIC00MDcsOSArNjI0LDcgQEAKIAogdm9pZCBNZWRpYUNvZGVjOjpjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKSB7CiAgICAgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlSW5wdXRSZXBseUlEKTsKKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlSW5wdXRSZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAKICAgICAgICAgKyttRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb247CiAgICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKQEAgLTQxNyw5ICs2MzIsNyBAQAogICAgIH0KIAogICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVPdXRwdXRSZXBseUlEKTsKKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogCiAgICAgICAgICsrbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbjsKICAgICAgICAgbURlcXVldWVPdXRwdXRSZXBseUlEID0gMDsKQEAgLTQyOCwxNCArNjQxLDEyIEBACiB9CiAKIGJvb2wgTWVkaWFDb2RlYzo6aGFuZGxlRGVxdWV1ZUlucHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgewotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRAotICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCisgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpCiAgICAgICAgICAgICB8fCAobmV3UmVxdWVzdCAmJiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotCisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNDU2LDEwICs2NjcsMTEgQEAKIGJvb2wgTWVkaWFDb2RlYzo6aGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QpIHsKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAKLSAgICBpZiAobVN0YXRlICE9IFNUQVJURUQKLSAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKQorICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKQogICAgICAgICAgICAgfHwgKG5ld1JlcXVlc3QgJiYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpKSkgewogICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBnZXRTdGlja3lFcnJvcigpKTsKICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQ7CkBAIC01MTYsMjIgKzcyOCwyMCBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCiAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRFcnJvcjoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRFcnJvcjoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb214RXJyb3IsIGludGVybmFsRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJvbXgtZXJyb3IiLCAmb214RXJyb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZpbnRlcm5hbEVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyLCBhY3Rpb25Db2RlOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWN0aW9uQ29kZSIsICZhY3Rpb25Db2RlKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGFuIGVycm9yLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIob214IGVycm9yIDB4JTA4eCwgaW50ZXJuYWxFcnJvciAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhFcnJvciwgaW50ZXJuYWxFcnJvcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9teEVycm9yID09IE9NWF9FcnJvclJlc291cmNlc0xvc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnRlcm5hbEVycm9yID09IERFQURfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnIgJSN4LCBhY3Rpb25Db2RlICVkLCB3aGlsZSBpbiBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTYXdNZWRpYVNlcnZlckRpZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZEVycm9yUmVwb25zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZEVycm9yUmVzcG9uc2UgPSB0cnVlOwogCiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWklORzoKQEAgLTU0MiwxMyArNzUyLDE1IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFSVElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShDT05GSUdVUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBDT05GSUdVUkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTU4LDcgKzc3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBlcnJvciwgYXNzdW1pbmcgd2UnbGwgc3RpbGwgZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWFTZXJ2ZXIgZGllZCwgdGhlcmUgZGVmaW5pdGVseSB3b24ndApAQCAtNTY5LDcgKzc4MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNUT1BQSU5HLT5VTklOSVRJQUxJWkVELCBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbCBTVE9QUElORy0+SU5JVElBTElaRUQgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU3Nyw0NCArNzkxLDgwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgPyBGTFVTSEVEIDogU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGlja3lFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfVFJBTlNJRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGlja3lFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbkNvZGUgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZSBpcyBhbHdheXMgZmF0YWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGUgPSBBQ1RJT05fQ09ERV9GQVRBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfVFJBTlNJRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VuZEVycm9yUmVwb25zZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBVTktOT1dOX0VSUk9SKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRXJyb3JSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1SZXBseUlELCBlcnIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWklORyk7CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJm1Db21wb25lbnROYW1lKSk7CiAKQEAgLTYzNCwyMSArODg0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09ORklHVVJJTkcpOwotICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShDT05GSUdVUkVEKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBpbnB1dCBzdXJmYWNlIGZsYWcKICAgICAgICAgICAgICAgICAgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSBmYWxzZTsKIAorICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCAmbUlucHV0Rm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCAmbU91dHB1dEZvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gQUNvZGVjOjprV2hhdENyZWF0ZUlucHV0U3VyZmFjZQorICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKQEAgLTY2NCw5ICs5MTcsOSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaWduYWxlZElucHV0RU9TOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdFNpZ25hbGVkSW5wdXRFT1M6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBBQ29kZWM6OmtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewpAQCAtNjc3LDggKzkzMCw5IEBACiAgICAgICAgICAgICAgICAgfQogCiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRCdWZmZXJzQWxsb2NhdGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBvcnRJbmRleDsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBvcnRJbmRleCIsICZwb3J0SW5kZXgpKTsKIApAQCAtNjk1LDggKzk0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJwb3J0RGVzYyIsICZvYmopKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBQ29kZWM6OlBvcnREZXNjcmlwdGlvbj4gcG9ydERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNvZGVjOjpQb3J0RGVzY3JpcHRpb24gKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8Q29kZWNCYXNlOjpQb3J0RGVzY3JpcHRpb24+IHBvcnREZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMgPSBwb3J0RGVzYy0+Y291bnRCdWZmZXJzKCk7CiAKQEAgLTcyOSw0MCArOTgzLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQiKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIGtGbGFnSXNTb2Z0d2FyZUNvZGVjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVNvZnRSZW5kZXJlciA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSXNTb2Z0d2FyZUNvZGVjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtU29mdFJlbmRlcmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUmVjdCgiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1OYXRpdmVXaW5kb3csIG1ldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1OYXRpdmVXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3Myw2ICsxMDA1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgY29kZWMgc3BlY2lmaWMgZGF0YSBhbmQgYW1lbmQgdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOwogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwpAQCAtNzgwLDcgKzEwMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcjoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHNpemVfdCBpbmRleCA9ICovdXBkYXRlQnVmZmVycyhrUG9ydEluZGV4SW5wdXQsIG1zZyk7CiAKQEAgLTgwNyw3ICsxMDQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicXVldWVDU0RJbnB1dEJ1ZmZlciBmYWlsZWQgdy8gZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGlja3lFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpOwpAQCAtODE1LDcgKzEwNDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1IYXZlSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaGFuZGxlRGVxdWV1ZUlucHV0QnVmZmVyKG1EZXF1ZXVlSW5wdXRSZXBseUlEKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICsrbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uOwpAQCAtODI3LDcgKzEwNjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXI6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RHJhaW5UaGlzQnVmZmVyOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluZGV4ID0gKi91cGRhdGVCdWZmZXJzKGtQb3J0SW5kZXhPdXRwdXQsIG1zZyk7CiAKQEAgLTg2MiwxMCArMTEwMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnR2F0aGVyQ29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICArK21EZXF1ZXVlT3V0cHV0VGltZW91dEdlbmVyYXRpb247CkBAIC04NzgsMzIgKzExMjIsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0RU9TOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEVPUzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgbm90aWZ5IHRoZSBjbGllbnQgb2YgdGhpcyBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBmbGFnIGluICJvbk91dHB1dEJ1ZmZlclJlYWR5Ii4KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIFJFTEVBU0lORyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgRkxVU0hJTkcpOwotICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBGTFVTSElORykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlY2VpdmVkIEZsdXNoQ29tcGxldGVkIG1lc3NhZ2UgaW4gc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShGTFVTSEVEKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxSZXN1bWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTkyMSwxMCArMTE3NSw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtOTU0LDE2ICsxMjA1LDQ1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVECisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGNhbid0IGJlIHNldCBhZnRlciBjb2RlYyBpcyBleGVjdXRpbmcsCisgICAgICAgICAgICAgICAgLy8gb3IgYmVmb3JlIGl0J3MgaW5pdGlhbGl6ZWQgKGFzIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgY2xlYXJlZCB3aGVuIGl0IGdvZXMgdG8gSU5JVElBTElaRUQpCisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGNhbGxiYWNrOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiY2FsbGJhY2siLCAmY2FsbGJhY2spKTsKKworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjIHdpbGwgb3BlcmF0ZSBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNBc3luYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQXN5bmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTk4MywxMCArMTI2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldFN1cmZhY2VUZXh0dXJlQ2xpZW50KCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMjQsMTAgKzEzMDEsNyBAQAogCiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNvbmZpZ3VyZWQsIGJ1dCBjYW4ndCBoYXZlIGJlZW4gc3RhcnRlZCB5ZXQuCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEwNDEsMTEgKzEzMTUsMTEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBPSyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTA2NSwyMCArMTMzOSwyMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRAotICAgICAgICAgICAgICAgICAgICAmJiBtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiBtU3RhdGUgIT0gU1RBUlRFRCkgewotICAgICAgICAgICAgICAgIC8vIFdlIG1heSBiZSBpbiAiVU5JTklUSUFMSVpFRCIgc3RhdGUgYWxyZWFkeSB3aXRob3V0IHRoZQorICAgICAgICAgICAgaWYgKCEobUZsYWdzICYga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZCkgJiYgbVN0YXRlICE9IElOSVRJQUxJWkVECisgICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmICFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGJlIGluICJVTklOSVRJQUxJWkVEIiBzdGF0ZSBhbHJlYWR5IGFuZAorICAgICAgICAgICAgICAgIC8vIGFsc28gc2h1dGRvd24gdGhlIGVuY29kZXIvZGVjb2RlciB3aXRob3V0IHRoZQogICAgICAgICAgICAgICAgIC8vIGNsaWVudCBiZWluZyBhd2FyZSBvZiB0aGlzIGlmIG1lZGlhIHNlcnZlciBkaWVkIHdoaWxlCiAgICAgICAgICAgICAgICAgLy8gd2Ugd2VyZSBiZWluZyBzdG9wcGVkLiBUaGUgY2xpZW50IHdvdWxkIGFzc3VtZSB0aGF0CiAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgc3RvcCgpIHJldHVybmVkLCBpdCB3b3VsZCBiZSBzYWZlIHRvIGNhbGwgcmVsZWFzZSgpCiAgICAgICAgICAgICAgICAgLy8gYW5kIGl0IHNob3VsZCBiZSBpbiB0aGlzIGNhc2UsIG5vIGhhcm0gdG8gYWxsb3cgYSByZWxlYXNlKCkKICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhbHJlYWR5IHVuaW5pdGlhbGl6ZWQuCi0gICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5IHN0b3BwaW5nIGEgc3RvcHBlZCBNZWRpYUNvZGVjIHNob3VsZCBiZSBiZW5pZ24uCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJlcnIiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID09IHRhcmdldFN0YXRlID8gT0sgOiBJTlZBTElEX09QRVJBVElPTik7Ci0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU3RhdGUgPT0gdGFyZ2V0U3RhdGUgPyBPSyA6IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTEwODcsNiArMTM2Miw5IEBACiAgICAgICAgICAgICAgICAgLy8gSXQncyBkZWFkLCBKaW0uIERvbid0IGV4cGVjdCBpbml0aWF0ZVNodXRkb3duIHRvIHlpZWxkCiAgICAgICAgICAgICAgICAgLy8gYW55IHVzZWZ1bCByZXN1bHRzIG5vdy4uLgogICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTA2LDExICsxMzg0LDE1IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1IYXZlSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVJbnB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIHdpdGggaW5wdXQgc3VyZmFjZSIpOwotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTExMjIsOSArMTQwNCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZW91dFVzIiwgJnRpbWVvdXRVcykpOwogCiAgICAgICAgICAgICBpZiAodGltZW91dFVzID09IDBsbCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIC1FQUdBSU4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMTUzLDkgKzE0MzMsNyBAQAogCiAgICAgICAgICAgICBDSEVDSyhtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZUlucHV0UmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVJbnB1dFJlcGx5SUQsIC1FQUdBSU4pOwogCiAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZzsKICAgICAgICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKQEAgLTExNjcsMTkgKzE0NDUsMTcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25RdWV1ZUlucHV0QnVmZmVyKG1zZyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTExODgsNiArMTQ2NCwxMiBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKHJlcGx5SUQsIHRydWUgLyogbmV3IHJlcXVlc3QgKi8pKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTk2LDkgKzE0NzgsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVvdXRVcyIsICZ0aW1lb3V0VXMpKTsKIAogICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA9PSAwbGwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCAtRUFHQUlOKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTIyNyw5ICsxNTA3LDcgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVPdXRwdXRSZXBseUlELCAtRUFHQUlOKTsKIAogICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nOwogICAgICAgICAgICAgbURlcXVldWVPdXRwdXRSZXBseUlEID0gMDsKQEAgLTEyNDEsMTkgKzE1MTksMTcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25SZWxlYXNlT3V0cHV0QnVmZmVyKG1zZyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTEyNjIsMTEgKzE1MzgsMTEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTI4MCwxMSArMTU1NiwxMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzE0LDE1ICsxNTkwLDE2IEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1SZXBseUlEID0gcmVwbHlJRDsKKyAgICAgICAgICAgIC8vIFRPRE86IHNraXAgZmx1c2hpbmcgaWYgYWxyZWFkeSBGTFVTSEVECiAgICAgICAgICAgICBzZXRTdGF0ZShGTFVTSElORyk7CiAKICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRmx1c2goKTsKQEAgLTEzMzAsMjMgKzE2MDcsMjggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdEdldElucHV0Rm9ybWF0OgogICAgICAgICBjYXNlIGtXaGF0R2V0T3V0cHV0Rm9ybWF0OgogICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0KKyAgICAgICAgICAgICAgICAobXNnLT53aGF0KCkgPT0ga1doYXRHZXRPdXRwdXRGb3JtYXQgPyBtT3V0cHV0Rm9ybWF0IDogbUlucHV0Rm9ybWF0KTsKKwogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKChtU3RhdGUgIT0gU1RBUlRFRCAmJiBtU3RhdGUgIT0gRkxVU0hJTkcpCi0gICAgICAgICAgICAgICAgICAgIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKQotICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKChtU3RhdGUgIT0gQ09ORklHVVJFRCAmJiBtU3RhdGUgIT0gU1RBUlRJTkcgJiYKKyAgICAgICAgICAgICAgICAgbVN0YXRlICE9IFNUQVJURUQgJiYgbVN0YXRlICE9IEZMVVNISU5HICYmCisgICAgICAgICAgICAgICAgIG1TdGF0ZSAhPSBGTFVTSEVEKQorICAgICAgICAgICAgICAgICAgICB8fCBmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzcyLDEwICsxNjU0LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1Db21wb25lbnROYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEzOTUsMTAgKzE2NzQsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblNldFBhcmFtZXRlcnMocGFyYW1zKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDIxLDE0ICsxNjk3LDE0IEBACiAgICAgICAgICsraTsKICAgICB9CiAKLSAgICBBTE9HVigiRm91bmQgJXUgcGllY2VzIG9mIGNvZGVjIHNwZWNpZmljIGRhdGEuIiwgbUNTRC5zaXplKCkpOworICAgIEFMT0dWKCJGb3VuZCAlenUgcGllY2VzIG9mIGNvZGVjIHNwZWNpZmljIGRhdGEuIiwgbUNTRC5zaXplKCkpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpxdWV1ZUNTRElucHV0QnVmZmVyKHNpemVfdCBidWZmZXJJbmRleCkgewogICAgIENIRUNLKCFtQ1NELmVtcHR5KCkpOwogCi0gICAgQnVmZmVySW5mbyAqaW5mbyA9Ci0gICAgICAgICZtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGJ1ZmZlckluZGV4KTsKKyAgICBjb25zdCBCdWZmZXJJbmZvICppbmZvID0KKyAgICAgICAgJm1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLml0ZW1BdChidWZmZXJJbmRleCk7CiAKICAgICBzcDxBQnVmZmVyPiBjc2QgPSAqbUNTRC5iZWdpbigpOwogICAgIG1DU0QuZXJhc2UobUNTRC5iZWdpbigpKTsKQEAgLTE0NjMsMTggKzE3MzksMjMgQEAKICAgICAgICAgbUNyeXB0by5jbGVhcigpOwogICAgICAgICBzZXROYXRpdmVXaW5kb3coTlVMTCk7CiAKKyAgICAgICAgbUlucHV0Rm9ybWF0LmNsZWFyKCk7CiAgICAgICAgIG1PdXRwdXRGb3JtYXQuY2xlYXIoKTsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZDsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ1N0aWNreUVycm9yOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNFbmNvZGVyOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnR2F0aGVyQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0FzeW5jOworICAgICAgICBtU3RpY2t5RXJyb3IgPSBPSzsKIAogICAgICAgICBtQWN0aXZpdHlOb3RpZnkuY2xlYXIoKTsKKyAgICAgICAgbUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgfQogCiAgICAgaWYgKG5ld1N0YXRlID09IFVOSU5JVElBTElaRUQpIHsKLSAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgLy8gcmV0dXJuIGFueSBzdHJhZ2dsaW5nIGJ1ZmZlcnMsIGUuZy4gaWYgd2UgZ290IGhlcmUgb24gYW4gZXJyb3IKKyAgICAgICAgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKIAogICAgICAgICAvLyBUaGUgY29tcG9uZW50IGlzIGdvbmUsIG1lZGlhc2VydmVyJ3MgcHJvYmFibHkgYmFjayB1cCBhbHJlYWR5CiAgICAgICAgIC8vIGJ1dCBzaG91bGQgZGVmaW5pdGVseSBiZSBiYWNrIHVwIHNob3VsZCB3ZSB0cnkgdG8gaW5zdGFudGlhdGUKQEAgLTE0ODUsNiArMTc2Niw4IEBACiAgICAgbVN0YXRlID0gbmV3U3RhdGU7CiAKICAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKKworICAgIHVwZGF0ZUJhdHRlcnlTdGF0KCk7CiB9CiAKIHZvaWQgTWVkaWFDb2RlYzo6cmV0dXJuQnVmZmVyc1RvQ29kZWMoKSB7CkBAIC0xNDk0LDYgKzE3NzcsNyBAQAogCiB2b2lkIE1lZGlhQ29kZWM6OnJldHVybkJ1ZmZlcnNUb0NvZGVjT25Qb3J0KGludDMyX3QgcG9ydEluZGV4KSB7CiAgICAgQ0hFQ0socG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCB8fCBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKIAogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqYnVmZmVycyA9ICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKIApAQCAtMTUzMiw2ICsxODE2LDggQEAKICAgICAgICAgICAgIENIRUNLKGluZm8tPm1Ob3RpZnkgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZpbmZvLT5tTm90aWZ5KSk7CiAKKyAgICAgICAgICAgIGluZm8tPm1Gb3JtYXQgPQorICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSA/IG1JbnB1dEZvcm1hdCA6IG1PdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2hfYmFjayhpKTsKIAogICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC0xNjQ4LDExICsxOTM0LDE1IEBACiAgICAgICAgIGluZm8tPm1EYXRhLT5zZXRSYW5nZSgwLCByZXN1bHQpOwogICAgIH0KIAorICAgIC8vIHN5bmNocm9uaXphdGlvbiBib3VuZGFyeSBmb3IgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CiAgICAgcmVwbHktPnBvc3QoKTsKIAogICAgIGluZm8tPm1Ob3RpZnkgPSBOVUxMOwotICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNjY2LDcgKzE5NTYsNyBAQAogICAgICAgICByZW5kZXIgPSAwOwogICAgIH0KIAotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTE2ODAsMTggKzE5NzAsNDAgQEAKICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CiAgICAgfQogCisgICAgLy8gc3luY2hyb25pemF0aW9uIGJvdW5kYXJ5IGZvciBnZXRCdWZmZXJBbmRGb3JtYXQKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CisgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgfQorCiAgICAgaWYgKHJlbmRlciAmJiBpbmZvLT5tRGF0YSAhPSBOVUxMICYmIGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkgewogICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQzMigicmVuZGVyIiwgdHJ1ZSk7CiAKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKSB7CisgICAgICAgICAgICBpbmZvLT5tTm90aWZ5LT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCB0aW1lc3RhbXBOcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpdCBzZWVtcyBsaWtlIHdlIHNob3VsZCB1c2UgdGhlIHRpbWVzdGFtcAorICAgICAgICAgICAgLy8gaW4gdGhlIChtZWRpYSlidWZmZXIgYXMgaXQgcG90ZW50aWFsbHkgY2FtZSBmcm9tCisgICAgICAgICAgICAvLyBhbiBpbnB1dCBzdXJmYWNlLCBidXQgd2UgZGlkIG5vdCBwcm9wYWdhdGUgaXQgcHJpb3IgdG8KKyAgICAgICAgICAgIC8vIEFQSSAyMC4gIFBlcmhhcHMgY2hlY2sgZm9yIHRhcmdldCBTREsgdmVyc2lvbi4KKyNpZiAwCisgICAgICAgICAgICBpZiAoaW5mby0+bURhdGEtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZXN0YW1wTnMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInVzaW5nIGJ1ZmZlciBQVFMgb2YgJSIgUFJJZDY0LCB0aW1lc3RhbXBOcyk7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMgKj0gMTAwMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisKICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbVNvZnRSZW5kZXJlci0+cmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+ZGF0YSgpLCBpbmZvLT5tRGF0YS0+c2l6ZSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wTnMsIE5VTEwsIGluZm8tPm1Gb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW5mby0+bU5vdGlmeS0+cG9zdCgpOwogICAgIGluZm8tPm1Ob3RpZnkgPSBOVUxMOwotICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNzEwLDcgKzIwMjIsMjIgQEAKIAogICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpbmRleCk7CiAgICAgQ0hFQ0soIWluZm8tPm1Pd25lZEJ5Q2xpZW50KTsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IHRydWU7CisKKyAgICAgICAgLy8gc2V0IGltYWdlLWRhdGEKKyAgICAgICAgaWYgKGluZm8tPm1Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgICAgICAgICAgaWYgKGluZm8tPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0UmVjdCgiY3JvcC1yZWN0IiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiBpbmRleDsKIH0KQEAgLTE3NDgsMTYgKzIwNzUsMTAwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6Om9uSW5wdXRCdWZmZXJBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICB3aGlsZSAoKGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleElucHV0KSkgPj0gMCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbUNhbGxiYWNrLT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0lOUFVUX0FWQUlMQUJMRSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICB3aGlsZSAoKGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleE91dHB1dCkpID49IDApIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9CisgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uaXRlbUF0KGluZGV4KS5tRGF0YTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfQVZBSUxBQkxFKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgib2Zmc2V0IiwgYnVmZmVyLT5vZmZzZXQoKSk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICAgICAgaW50MzJfdCBvbXhGbGFnczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigib214RmxhZ3MiLCAmb214RmxhZ3MpKTsKKworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChvbXhGbGFncyAmIE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FOworICAgICAgICB9CisgICAgICAgIGlmIChvbXhGbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRzsKKyAgICAgICAgfQorICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpvbkVycm9yKHN0YXR1c190IGVyciwgaW50MzJfdCBhY3Rpb25Db2RlLCBjb25zdCBjaGFyICpkZXRhaWwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9FUlJPUik7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCBhY3Rpb25Db2RlKTsKKworICAgICAgICBpZiAoZGV0YWlsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6Om9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCgpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQpOworICAgICAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKKwogdm9pZCBNZWRpYUNvZGVjOjpwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCkgewogICAgIGlmIChtQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKChtRmxhZ3MgJiAoa0ZsYWdTdGlja3lFcnJvcgorICAgIGJvb2wgaXNFcnJvck9yT3V0cHV0Q2hhbmdlZCA9CisgICAgICAgICAgICAobUZsYWdzICYgKGtGbGFnU3RpY2t5RXJyb3IKICAgICAgICAgICAgICAgICAgICAgfCBrRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSkKKyAgICAgICAgICAgICAgICAgICAgfCBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQpKTsKKworICAgIGlmIChpc0Vycm9yT3JPdXRwdXRDaGFuZ2VkCiAgICAgICAgICAgICB8fCAhbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lbXB0eSgpCiAgICAgICAgICAgICB8fCAhbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZW1wdHkoKSkgeworICAgICAgICBtQWN0aXZpdHlOb3RpZnktPnNldEludDMyKCJpbnB1dC1idWZmZXJzIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSk7CisKKyAgICAgICAgaWYgKGlzRXJyb3JPck91dHB1dENoYW5nZWQpIHsKKyAgICAgICAgICAgIC8vIHdlIHdhbnQgY29uc3VtZXIgdG8gZGVxdWV1ZSBhcyBtYW55IHRpbWVzIGFzIGl0IGNhbgorICAgICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLCBJTlQzMl9NQVgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigib3V0cHV0LWJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxQb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOworICAgICAgICB9CiAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+cG9zdCgpOwogICAgICAgICBtQWN0aXZpdHlOb3RpZnkuY2xlYXIoKTsKICAgICB9CkBAIC0xODE4LDQgKzIyMjksMzQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlQmF0dGVyeVN0YXQoKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBDT05GSUdVUkVEICYmICFtQmF0dGVyeVN0YXROb3RpZmllZCkgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgICAgIG1Jc1ZpZGVvID0gbWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIik7CisKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworCisgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0YXJ0VmlkZW8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVTdGFydEF1ZGlvKCk7CisgICAgICAgIH0KKworICAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCAmJiBtQmF0dGVyeVN0YXROb3RpZmllZCkgeworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisKKyAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RvcFZpZGVvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RvcEF1ZGlvKCk7CisgICAgICAgIH0KKworICAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZCA9IGZhbHNlOworICAgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBiNzRiMmUyLi41YjhiZTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0xOCwxMiArMTgsMTkgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxsaWJleHBhdC9leHBhdC5oPgpAQCAtMzIsMzAgKzM5LDEyOSBAQAogCiBzdGF0aWMgTXV0ZXggc0luaXRNdXRleDsKIAotLy8gc3RhdGljCi1NZWRpYUNvZGVjTGlzdCAqTWVkaWFDb2RlY0xpc3Q6OnNDb2RlY0xpc3Q7CitzdGF0aWMgTWVkaWFDb2RlY0xpc3QgKmdDb2RlY0xpc3QgPSBOVUxMOwogCiAvLyBzdGF0aWMKLWNvbnN0IE1lZGlhQ29kZWNMaXN0ICpNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKSB7CitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0OworCisvLyBzdGF0aWMKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldExvY2FsSW5zdGFuY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHNJbml0TXV0ZXgpOwogCi0gICAgaWYgKHNDb2RlY0xpc3QgPT0gTlVMTCkgewotICAgICAgICBzQ29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0OworICAgIGlmIChnQ29kZWNMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZ0NvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICAgICAgaWYgKGdDb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CisgICAgICAgICAgICBzQ29kZWNMaXN0ID0gZ0NvZGVjTGlzdDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBzQ29kZWNMaXN0LT5pbml0Q2hlY2soKSA9PSBPSyA/IHNDb2RlY0xpc3QgOiBOVUxMOworICAgIHJldHVybiBzQ29kZWNMaXN0OworfQorCitzdGF0aWMgTXV0ZXggc1JlbW90ZUluaXRNdXRleDsKKworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c1JlbW90ZUxpc3Q7CisKKy8vIHN0YXRpYworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNSZW1vdGVJbml0TXV0ZXgpOworICAgIGlmIChzUmVtb3RlTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOworICAgICAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gc2VydmljZS0+Z2V0Q29kZWNMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gaWYgZmFpbGVkIHRvIGdldCByZW1vdGUgbGlzdCwgY3JlYXRlIGxvY2FsIGxpc3QKKyAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gZ2V0TG9jYWxJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzUmVtb3RlTGlzdDsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KCkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCkgewotICAgIEZJTEUgKmZpbGUgPSBmb3BlbigiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIiwgInIiKTsKKyAgICBwYXJzZVRvcExldmVsWE1MRmlsZSgiL2V0Yy9tZWRpYV9jb2RlY3MueG1sIik7Cit9CiAKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZS4iKTsKK3ZvaWQgTWVkaWFDb2RlY0xpc3Q6OnBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKmNvZGVjc194bWwpIHsKKyAgICAvLyBnZXQgaHJlZl9iYXNlCisgICAgY2hhciAqaHJlZl9iYXNlX2VuZCA9IHN0cnJjaHIoY29kZWNzX3htbCwgJy8nKTsKKyAgICBpZiAoaHJlZl9iYXNlX2VuZCAhPSBOVUxMKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IEFTdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7IC8vIGtlZXBpbmcgdGhpcyBoZXJlIGZvciBzYWZldHkKKyAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOworICAgIG1EZXB0aCA9IDA7CisKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIG1Jbml0Q2hlY2sgPSBjbGllbnQuY29ubmVjdCgpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbU9NWCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKKyAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7CisgICAgbU9NWC5jbGVhcigpOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHBhcnNlWE1MRmlsZShmaWxlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gbUNvZGVjSW5mb3Muc2l6ZSgpOyBpLS0gPiAwOykgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoaSkuZ2V0KCk7CisKKyAgICAgICAgaWYgKGluZm8ubUNhcHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIE5vIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvbXBvbmVudD8/PworICAgICAgICAgICAgQUxPR1coIkNvbXBvbmVudCAlcyBkb2VzIG5vdCBzdXBwb3J0IGFueSB0eXBlIG9mIG1lZGlhPyIsCisgICAgICAgICAgICAgICAgICBpbmZvLm1OYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICBtQ29kZWNJbmZvcy5yZW1vdmVBdChpKTsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgaW5mby5tQ2Fwcy5zaXplKCk7ICsrdHlwZV9peCkgeworICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZSA9IGluZm8ubUNhcHMua2V5QXQodHlwZV9peCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPSBpbmZvLm1DYXBzLnZhbHVlQXQodHlwZV9peCk7CisKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgY29kZWMgaW5mbyBmb3IgJXM6ICVzIiwgaW5mby5tTmFtZS5jX3N0cigpLCBtaW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBmbGFncz0lZCIsIGNhcHMtPmdldEZsYWdzKCkpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvckZvcm1hdHM7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygmY29sb3JGb3JtYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY29sb3JGb3JtYXRzLnNpemUoKTsgaXgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoY29sb3JGb3JtYXRzLml0ZW1BdChpeCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgY29sb3JzPVslc10iLCBuaWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsPiBwcm9maWxlTGV2ZWxzOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBuaWNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcHJvZmlsZUxldmVscy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnBsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlTGV2ZWxzLml0ZW1BdChpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZChwbC5tUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQocGwubUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGxldmVscz1bJXNdIiwgbmljZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KIAogI2lmIDAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0luZm9zLnNpemUoKTsgKytpKSB7CkBAIC03NSw5ICsxODEsNiBAQAogICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOwogICAgIH0KICNlbmRpZgotCi0gICAgZmNsb3NlKGZpbGUpOwotICAgIGZpbGUgPSBOVUxMOwogfQogCiBNZWRpYUNvZGVjTGlzdDo6fk1lZGlhQ29kZWNMaXN0KCkgewpAQCAtODcsMTAgKzE5MCwxNCBAQAogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoRklMRSAqZmlsZSkgewotICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX1RPUExFVkVMOwotICAgIG1EZXB0aCA9IDA7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOworCisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOwogICAgIENIRUNLKHBhcnNlciAhPSBOVUxMKTsKQEAgLTEwMyw3ICsyMTAsNyBAQAogICAgIHdoaWxlIChtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOwogICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gWE1MX0dldEJ1ZmZlcigpIik7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTUsOCArMjIyLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKDo6WE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKQotICAgICAgICAgICAgICAgICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTI4LDI1ICsyMzYsOCBAQAogCiAgICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KGkpOwotCi0gICAgICAgICAgICBpZiAoaW5mby0+bVR5cGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBObyB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQ/Pz8KLQotICAgICAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSBvZiBtZWRpYT8iLAotICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1OYW1lLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwotICAgICAgICBtQ29kZWNRdWlya3MuY2xlYXIoKTsKLSAgICB9CisgICAgZmNsb3NlKGZpbGUpOworICAgIGZpbGUgPSBOVUxMOwogfQogCiAvLyBzdGF0aWMKQEAgLTE2MCwxMiArMjUxLDY1IEBACiAgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0xpc3QgKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBOVUxMOworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBocmVmID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCisgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCisgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKKyAgICAgICAgaWYgKGhyZWZbaV0gPT0gJy4nIHx8IGhyZWZbaV0gPT0gJ18nIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJzAnICYmIGhyZWZbaV0gPD0gJzknKSB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdBJyAmJiBocmVmW2ldIDw9ICdaJykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgQVN0cmluZyBmaWxlbmFtZSA9IGhyZWY7CisgICAgaWYgKCFmaWxlbmFtZS5zdGFydHNXaXRoKCJtZWRpYV9jb2RlY3NfIikgfHwKKyAgICAgICAgIWZpbGVuYW1lLmVuZHNXaXRoKCIueG1sIikpIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBmaWxlbmFtZS5pbnNlcnQobUhyZWZCYXNlLCAwKTsKKworICAgIHBhcnNlWE1MRmlsZShmaWxlbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGJvb2wgaW5UeXBlID0gdHJ1ZTsKKworICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IGluY2x1ZGVYTUxGaWxlKGF0dHJzKTsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKKyAgICAgICAgICAgIG1QYXN0U2VjdGlvbnMucHVzaChtQ3VycmVudFNlY3Rpb24pOworICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOworICAgICAgICB9CisgICAgICAgICsrbURlcHRoOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgogICAgICAgICB7CkBAIC0yMDYsNiArMzUwLDI1IEBACiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFF1aXJrKGF0dHJzKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVHlwZSIpKSB7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUl9UWVBFIDogU0VDVElPTl9FTkNPREVSX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluVHlwZSA9IGZhbHNlOworICAgICAgICAvLyBmYWxsIHRocm91Z2gKKworICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUl9UWVBFOgorICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUl9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgbGltaXRzIGFuZCBmZWF0dXJlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiB0eXBlCisgICAgICAgICAgICBib29sIG91dHNpZGUgPSAhaW5UeXBlICYmICFtQ3VycmVudEluZm8tPm1IYXNTb2xlTWltZTsKKyAgICAgICAgICAgIGlmIChvdXRzaWRlICYmICghc3RyY21wKG5hbWUsICJMaW1pdCIpIHx8ICFzdHJjbXAobmFtZSwgIkZlYXR1cmUiKSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIkxpbWl0IikpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkTGltaXQoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJGZWF0dXJlIikpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gYWRkRmVhdHVyZShhdHRycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjM5LDEwICs0MDIsMjUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CiAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTEsNiArNDI5LDE3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKICAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mby0+Y29tcGxldGUoKTs7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJJbmNsdWRlIikgJiYgbVBhc3RTZWN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gbVBhc3RTZWN0aW9ucy50b3AoKTsKKyAgICAgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnBvcCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI5MiwyMyArNDgxLDM3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGFkZE1lZGlhQ29kZWMoZW5jb2RlciwgbmFtZSwgdHlwZSk7Ci0KKyAgICBtQ3VycmVudEluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm8obmFtZSwgZW5jb2RlciwgdHlwZSk7CisgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQorICAgIC8vIGZhaWwuICBPbmx5IGxpc3QgdGhlIGNvZGVjIGlmIHRoaXMgc3VjY2VlZHMuCisgICAgLy8gSG93ZXZlciwga2VlcCBtQ3VycmVudEluZm8gb2JqZWN0IGFyb3VuZCB1bnRpbCBwYXJzaW5nCisgICAgLy8gb2YgZnVsbCBjb2RlYyBpbmZvIGlzIGNvbXBsZXRlZC4KKyAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyh0eXBlKSA9PSBPSykgeworICAgICAgICBtQ29kZWNJbmZvcy5wdXNoX2JhY2sobUN1cnJlbnRJbmZvKTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE1lZGlhQ29kZWNMaXN0OjphZGRNZWRpYUNvZGVjKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpIHsKLSAgICBtQ29kZWNJbmZvcy5wdXNoKCk7Ci0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bU5hbWUgPSBuYW1lOwotICAgIGluZm8tPm1Jc0VuY29kZXIgPSBlbmNvZGVyOwotICAgIGluZm8tPm1UeXBlcyA9IDA7Ci0gICAgaW5mby0+bVF1aXJrcyA9IDA7Ci0KLSAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZFR5cGUodHlwZSk7CitzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBjaGFyICp0eXBlKSB7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQorCisgICAgQUxPR1YoImluaXRpYWxpemVDYXBhYmlsaXRpZXMgJXM6JXMiLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLCB0eXBlKTsKKworICAgIENvZGVjQ2FwYWJpbGl0aWVzIGNhcHM7CisgICAgc3RhdHVzX3QgZXJyID0gUXVlcnlDb2RlYygKKyAgICAgICAgICAgIG1PTVgsCisgICAgICAgICAgICBtQ3VycmVudEluZm8tPm1OYW1lLmNfc3RyKCksCisgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tSXNFbmNvZGVyLAorICAgICAgICAgICAgJmNhcHMpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gbUN1cnJlbnRJbmZvLT5pbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNhcHMpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKSB7CkBAIC0zMzMsMjQgKzUzNiw3IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHVpbnQzMl90IGJpdDsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUNvZGVjUXVpcmtzLmluZGV4T2ZLZXkobmFtZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBiaXQgPSBtQ29kZWNRdWlya3Muc2l6ZSgpOwotCi0gICAgICAgIGlmIChiaXQgPT0gMzIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJUb28gbWFueSBkaXN0aW5jdCBxdWlyayBuYW1lcyBpbiBjb25maWd1cmF0aW9uLiIpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvZGVjUXVpcmtzLmFkZChuYW1lLCBiaXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpdCA9IG1Db2RlY1F1aXJrcy52YWx1ZUF0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBDb2RlY0luZm8gKmluZm8gPSAmbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChtQ29kZWNJbmZvcy5zaXplKCkgLSAxKTsKLSAgICBpbmZvLT5tUXVpcmtzIHw9IDF1bCA8PCBiaXQ7Ci0KKyAgICBtQ3VycmVudEluZm8tPmFkZFF1aXJrKG5hbWUpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzc2LDU3ICs1NjIsMjgwIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIGFkZFR5cGUobmFtZSk7CisgICAgc3RhdHVzX3QgcmV0ID0gbUN1cnJlbnRJbmZvLT5hZGRNaW1lKG5hbWUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKKyAgICAvLyBUaGUgbmV4dCBzdGVwIGludm9sdmVzIHRyeWluZyB0byBsb2FkIHRoZSBjb2RlYywgd2hpY2ggbWF5CisgICAgLy8gZmFpbC4gIEhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgKGJ5IG5vdCByZXBvcnRpbmcgc3VjaCBtaW1lKS4KKyAgICBpZiAoaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhuYW1lKSAhPSBPSykgeworICAgICAgICBtQ3VycmVudEluZm8tPnJlbW92ZU1pbWUobmFtZSk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6YWRkVHlwZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgdWludDMyX3QgYml0OwotICAgIHNzaXplX3QgaW5kZXggPSBtVHlwZXMuaW5kZXhPZktleShuYW1lKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGJpdCA9IG1UeXBlcy5zaXplKCk7Ci0KLSAgICAgICAgaWYgKGJpdCA9PSAzMikgewotICAgICAgICAgICAgQUxPR1coIlRvbyBtYW55IGRpc3RpbmN0IHR5cGUgbmFtZXMgaW4gY29uZmlndXJhdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1UeXBlcy5hZGQobmFtZSwgYml0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBiaXQgPSBtVHlwZXMudmFsdWVBdChpbmRleCk7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bVR5cGVzIHw9IDF1bCA8PCBiaXQ7Ci19Ci0KKy8vIGxlZ2FjeSBtZXRob2QgZm9yIG5vbi1hZHZhbmNlZCBjb2RlY3MKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5VHlwZSgKICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCkgY29uc3QgewotICAgIHNzaXplX3QgdHlwZUluZGV4ID0gbVR5cGVzLmluZGV4T2ZLZXkodHlwZSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFkdmFuY2VkRmVhdHVyZXNbXSA9IHsKKyAgICAgICAgImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIiwKKyAgICAgICAgImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siLAorICAgIH07CiAKLSAgICBpZiAodHlwZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9CisgICAgc2l6ZV90IG51bUNvZGVjcyA9IG1Db2RlY0luZm9zLnNpemUoKTsKKyAgICBmb3IgKDsgc3RhcnRJbmRleCA8IG51bUNvZGVjczsgKytzdGFydEluZGV4KSB7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KS5nZXQoKTsKIAotICAgIHVpbnQzMl90IHR5cGVNYXNrID0gMXVsIDw8IG1UeXBlcy52YWx1ZUF0KHR5cGVJbmRleCk7CisgICAgICAgIGlmIChpbmZvLmlzRW5jb2RlcigpICE9IGVuY29kZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yKHR5cGUpOworICAgICAgICBpZiAoY2FwYWJpbGl0aWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZGV0YWlscyA9IGNhcGFiaWxpdGllcy0+Z2V0RGV0YWlscygpOwogCi0gICAgd2hpbGUgKHN0YXJ0SW5kZXggPCBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KHN0YXJ0SW5kZXgpOwotCi0gICAgICAgIGlmIChpbmZvLm1Jc0VuY29kZXIgPT0gZW5jb2RlciAmJiAoaW5mby5tVHlwZXMgJiB0eXBlTWFzaykpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OworICAgICAgICBpbnQzMl90IHJlcXVpcmVkOworICAgICAgICBib29sIGlzQWR2YW5jZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IEFSUkFZX1NJWkUoYWR2YW5jZWRGZWF0dXJlcyk7IGl4KyspIHsKKyAgICAgICAgICAgIGlmIChkZXRhaWxzLT5maW5kSW50MzIoYWR2YW5jZWRGZWF0dXJlc1tpeF0sICZyZXF1aXJlZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlzQWR2YW5jZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgKytzdGFydEluZGV4OworICAgICAgICBpZiAoIWlzQWR2YW5jZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIC1FTk9FTlQ7CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0YXR1c190IGxpbWl0RXJyb3IoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUuY19zdHIoKSwgbXNnKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0YXR1c190IGxpbWl0SW52YWxpZEF0dHIoQVN0cmluZyBuYW1lLCBjb25zdCBjaGFyICphdHRyLCBBU3RyaW5nIHZhbHVlKSB7CisgICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICBhdHRyLCB2YWx1ZS5jX3N0cigpKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0cmlidXRlcyB3aXRoIHZhbHVlcworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiaW4iKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtYXgiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJtaW4iKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZSIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInJhbmdlcyIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInNjYWxlIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoYXR0cnNbaV0sIGF0dHJzW2kgKyAxXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgQVN0cmluZyBuYW1lOworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJuYW1lIiwgJm5hbWUpKSB7CisgICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gc2l6ZSwgYmxvY2tzLCBiaXRyYXRlLCBmcmFtZS1yYXRlLCBibG9ja3MtcGVyLXNlY29uZCwgYXNwZWN0LXJhdGlvOiByYW5nZQorICAgIC8vIHF1YWxpdHk6IHJhbmdlICsgZGVmYXVsdCArIFtzY2FsZV0KKyAgICAvLyBjb21wbGV4aXR5OiByYW5nZSArIGRlZmF1bHQKKyAgICBib29sIGZvdW5kOworCisgICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIgfHwgbmFtZSA9PSAiYml0cmF0ZSIgfHwgbmFtZSA9PSAiYmxvY2stY291bnQiCisgICAgICAgICAgICB8fCBuYW1lID09ICJibG9ja3MtcGVyLXNlY29uZCIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIKKyAgICAgICAgICAgIHx8IG5hbWUgPT0gImZyYW1lLXJhdGUiIHx8IG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gInNpemUiKSB7CisgICAgICAgIEFTdHJpbmcgbWluLCBtYXg7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoIm1pbiIsICZtaW4pICYmIG1zZy0+ZmluZFN0cmluZygibWF4IiwgJm1heCkpIHsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKKyAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpIHx8IG1zZy0+Y29udGFpbnMoInZhbHVlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzICdtaW4nIGFuZCAnbWF4JyBhcyB3ZWxsIGFzICdyYW5nZScgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIid2YWx1ZScgYXR0cmlidXRlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSB8fCBtc2ctPmNvbnRhaW5zKCJtYXgiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBvbmx5ICdtaW4nIG9yICdtYXgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZFN0cmluZygidmFsdWUiLCAmbWF4KSkgeworICAgICAgICAgICAgbWluID0gbWF4OworICAgICAgICAgICAgbWluLmFwcGVuZCgiLSIpOworICAgICAgICAgICAgbWluLmFwcGVuZChtYXgpOworICAgICAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoInJhbmdlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAiaGFzIGJvdGggJ3JhbmdlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmFuZ2UiLCBtaW4pOworICAgICAgICB9CisKKyAgICAgICAgQVN0cmluZyByYW5nZSwgc2NhbGUgPSAibGluZWFyIiwgZGVmLCBpbl87CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJyYW5nZSIsICZyYW5nZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJ3aXRoIG5vICdyYW5nZScsICd2YWx1ZScgb3IgJ21pbicvJ21heCcgYXR0cmlidXRlcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgXgorICAgICAgICAgICAgICAgIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiZGVmYXVsdCIsICZkZWYpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIsIGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPSAicXVhbGl0eSIgJiYgbXNnLT5maW5kU3RyaW5nKCJzY2FsZSIsICZzY2FsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSBeIChmb3VuZCA9IG1zZy0+ZmluZFN0cmluZygiaW4iLCAmaW5fKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIiwgZm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUgPT0gImFzcGVjdC1yYXRpbyIpIHsKKyAgICAgICAgICAgIGlmICghKGluXyA9PSAicGl4ZWxzIikgJiYgIShpbl8gPT0gImJsb2NrcyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0SW52YWxpZEF0dHIobmFtZSwgImluIiwgaW5fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluXy5lcmFzZSg1LCAxKTsgLy8gKHBpeGVsfGJsb2NrKS1hc3BlY3QtcmF0aW8KKyAgICAgICAgICAgIGluXy5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIGluXy5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBuYW1lID0gaW5fOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IikgeworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwoInF1YWxpdHktc2NhbGUiLCBzY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gInF1YWxpdHkiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgICAgICB0YWcuYXBwZW5kKCItZGVmYXVsdCIpOworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCBkZWYpOworICAgICAgICB9CisgICAgICAgIEFTdHJpbmcgdGFnID0gbmFtZTsKKyAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlIik7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgcmFuZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTdHJpbmcgbWF4LCB2YWx1ZSwgcmFuZ2VzOworICAgICAgICBpZiAobXNnLT5jb250YWlucygiZGVmYXVsdCIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJkZWZhdWx0Iik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygiaW4iKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiaW4iKTsKKyAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAiY2hhbm5lbC1jb3VudCIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWF4IiwgZm91bmQpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoIm1pbiIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJtaW4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJyYW5nZSIpOworICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJzYW1wbGUtcmF0ZSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInJhbmdlcyIsICZyYW5nZXMpKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2VzIiwgZm91bmQpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoInNjYWxlIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInNjYWxlIik7CisgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImFsaWdubWVudCIgfHwgbmFtZSA9PSAiYmxvY2stc2l6ZSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJnZhbHVlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInZhbHVlIiwgZm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1heC5zaXplKCkpIHsKKyAgICAgICAgICAgIEFTdHJpbmcgdGFnID0gIm1heC0iOworICAgICAgICAgICAgdGFnLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgbWF4KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYW5nZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgICAgICB0YWcuYXBwZW5kKCItcmFuZ2VzIik7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0ICclcyciLCBuYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIGJvb2wgcGFyc2VCb29sZWFuKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBpZiAoIXN0cmNhc2VjbXAocywgInRydWUiKSB8fCAhc3RyY2FzZWNtcChzLCAieWVzIikgfHwgIXN0cmNhc2VjbXAocywgInkiKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2hhciAqZW5kOworICAgIHVuc2lnbmVkIGxvbmcgcmVzID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisgICAgcmV0dXJuICpzICE9ICdcMCcgJiYgKmVuZCA9PSAnXDAnICYmIHJlcyA+IDA7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBpbnQzMl90IG9wdGlvbmFsID0gLTE7CisgICAgaW50MzJfdCByZXF1aXJlZCA9IC0xOworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gTlVMTDsKKworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdHRyaWJ1dGVzIHdpdGggdmFsdWVzCisgICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBuYW1lID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSAoaW50KXBhcnNlQm9vbGVhbihhdHRyc1tpICsgMV0pOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJvcHRpb25hbCIpKSB7CisgICAgICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1tpICsgMV07CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGlzIGJvdGgvbmVpdGhlciBvcHRpb25hbCBhbmQgcmVxdWlyZWQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKChvcHRpb25hbCAhPSAtMSB8fCByZXF1aXJlZCAhPSAtMSkgJiYgKHZhbHVlICE9IE5VTEwpKSB7CisgICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaGFzIGJvdGggYSB2YWx1ZSBhbmQgb3B0aW9uYWwvcmVxdWlyZWQgYXR0cmlidXRlIiwgbmFtZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRmVhdHVyZShuYW1lLCB2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGRGZWF0dXJlKG5hbWUsIChyZXF1aXJlZCA9PSAxKSB8fCAob3B0aW9uYWwgPT0gMCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHNzaXplX3QgTWVkaWFDb2RlY0xpc3Q6OmZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaSk7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvICZpbmZvID0gKm1Db2RlY0luZm9zLml0ZW1BdChpKS5nZXQoKTsKIAogICAgICAgICBpZiAoaW5mby5tTmFtZSA9PSBuYW1lKSB7CiAgICAgICAgICAgICByZXR1cm4gaTsKQEAgLTQ0MCwxMDggKzg0OSw0IEBACiAgICAgcmV0dXJuIG1Db2RlY0luZm9zLnNpemUoKTsKIH0KIAotY29uc3QgY2hhciAqTWVkaWFDb2RlY0xpc3Q6OmdldENvZGVjTmFtZShzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0gICAgcmV0dXJuIGluZm8ubU5hbWUuY19zdHIoKTsKLX0KLQotYm9vbCBNZWRpYUNvZGVjTGlzdDo6aXNFbmNvZGVyKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLSAgICByZXR1cm4gaW5mby5tSXNFbmNvZGVyOwotfQotCi1ib29sIE1lZGlhQ29kZWNMaXN0Ojpjb2RlY0hhc1F1aXJrKAotICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnF1aXJrTmFtZSkgY29uc3QgewotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLQotICAgIGlmIChpbmZvLm1RdWlya3MgIT0gMCkgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUNvZGVjUXVpcmtzLmluZGV4T2ZLZXkocXVpcmtOYW1lKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5mby5tUXVpcmtzICYgKDF1bCA8PCBtQ29kZWNRdWlya3MudmFsdWVBdChpbmRleCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmdldFN1cHBvcnRlZFR5cGVzKAotICAgICAgICBzaXplX3QgaW5kZXgsIFZlY3RvcjxBU3RyaW5nPiAqdHlwZXMpIGNvbnN0IHsKLSAgICB0eXBlcy0+Y2xlYXIoKTsKLQotICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVR5cGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGVNYXNrID0gMXVsIDw8IG1UeXBlcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmIChpbmZvLm1UeXBlcyAmIHR5cGVNYXNrKSB7Ci0gICAgICAgICAgICB0eXBlcy0+cHVzaChtVHlwZXMua2V5QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6Z2V0Q29kZWNDYXBhYmlsaXRpZXMoCi0gICAgICAgIHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqdHlwZSwKLSAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMsCi0gICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cywKLSAgICAgICAgdWludDMyX3QgKmZsYWdzKSBjb25zdCB7Ci0gICAgcHJvZmlsZUxldmVscy0+Y2xlYXIoKTsKLSAgICBjb2xvckZvcm1hdHMtPmNsZWFyKCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIENvZGVjQ2FwYWJpbGl0aWVzIGNhcHM7Ci0gICAgZXJyID0gUXVlcnlDb2RlYygKLSAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgICAgIGluZm8ubU5hbWUuY19zdHIoKSwgdHlwZSwgaW5mby5tSXNFbmNvZGVyLCAmY2Fwcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZzcmMgPSBjYXBzLm1Qcm9maWxlTGV2ZWxzLml0ZW1BdChpKTsKLQotICAgICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOwotICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBzcmMubVByb2ZpbGU7Ci0gICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzcmMubUxldmVsOwotICAgICAgICBwcm9maWxlTGV2ZWxzLT5wdXNoKHByb2ZpbGVMZXZlbCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBzLm1Db2xvckZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29sb3JGb3JtYXRzLT5wdXNoKGNhcHMubUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOwotICAgIH0KLQotICAgICpmbGFncyA9IGNhcHMubUZsYWdzOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVjZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTAsMCArMSw4OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY1NvdXJjZSIKKyNkZWZpbmUgREVCVUdfRFJJRlRfVElNRSAwCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBQdWxsZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgc3RhdHVzX3Qgc3RhcnQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIHBhdXNlKCk7CisgICAgdm9pZCByZXN1bWUoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB+UHVsbGVyKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0U3RhcnQgPSAnbXN0YScsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRQdWxsLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgICAgICBrV2hhdFJlc3VtZSwKKyAgICB9OworCisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBpbnQzMl90IG1QdWxsR2VuZXJhdGlvbjsKKyAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbVBhdXNlZDsKKyAgICBib29sIG1SZWFjaGVkRU9TOworCisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzY2hlZHVsZVB1bGwoKTsKKyAgICB2b2lkIGhhbmRsZUVPUygpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHVsbGVyKTsKK307CisKK01lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlcigpKSwKKyAgICAgIG1QdWxsR2VuZXJhdGlvbigwKSwKKyAgICAgIG1Jc0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJwdWxsX2xvb3BlciIpOworfQorCitNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6On5QdWxsZXIoKSB7CisgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgbUxvb3Blci0+c3RvcCgpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c3RhcnQoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBzdGFydCIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgIG1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIG1Ob3RpZnkgPSBub3RpZnk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOworICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgbWV0YSk7CisgICAgcmV0dXJuIHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnN0b3AoKSB7CisgICAgLy8gU3RvcCBzb3VyY2UgZnJvbSBjYWxsZXIncyB0aHJlYWQgaW5zdGVhZCBvZiBwdWxsZXIncyBsb29wZXIuCisgICAgLy8gbVNvdXJjZS0+c3RvcCgpIGlzIHRocmVhZC1zYWZlLCBkb2luZyBpdCBvdXRzaWRlIHRoZSBwdWxsZXIncworICAgIC8vIGxvb3BlciBhbGxvd3MgdXMgdG8gYXQgbGVhc3Qgc3RvcCBpZiBzb3VyY2UgZ2V0cyBzdHVjay4KKyAgICAvLyBJZiBzb3VyY2UgZ2V0cyBzdHVjayBpbiByZWFkKCksIHRoZSBsb29wZXIgd291bGQgbmV2ZXIKKyAgICAvLyBiZSBhYmxlIHRvIHByb2Nlc3MgdGhlIHN0b3AoKSwgd2hpY2ggY291bGQgbGVhZCB0byBBTlIuCisKKyAgICBBTE9HVigic291cmNlICglcykgc3RvcHBpbmciLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICBtU291cmNlLT5zdG9wKCk7CisgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnBhdXNlKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpyZXN1bWUoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzY2hlZHVsZVB1bGwoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGwsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUHVsbEdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6aGFuZGxlRU9TKCkgeworICAgIGlmICghbVJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoInB1bGxlciAoJXMpIHBvc3RpbmcgRU9TIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldFBvaW50ZXIoImFjY2Vzc1VuaXQiLCBOVUxMKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJtZXRhIiwgJm9iaikpOworCisgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICAgICAgeworICAgICAgICAgICAgKyttUHVsbEdlbmVyYXRpb247CisKKyAgICAgICAgICAgIGhhbmRsZUVPUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UHVsbDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUHVsbEdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtYnVmKTsKKworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0cmVhbSBlbmRlZCwgbWJ1ZiAlcCIsIG1idWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCByZWFkaW5nIHN0cmVhbS4iLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworCisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJhY2Nlc3NVbml0IiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgICAgICB7CisgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlY1NvdXJjZT4gTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8TWVkaWFDb2RlY1NvdXJjZT4gbWVkaWFTb3VyY2UgPQorICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNTb3VyY2UobG9vcGVyLCBmb3JtYXQsIHNvdXJjZSwgZmxhZ3MpOworCisgICAgaWYgKG1lZGlhU291cmNlLT5pbml0KCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhU291cmNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6c3RhcnQoTWV0YURhdGEqIHBhcmFtcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgbXNnLT5zZXRPYmplY3QoIm1ldGEiLCBwYXJhbXMpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0b3AoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIHN0YXR1c190IGVyciA9IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IobXNnKTsKKworICAgIC8vIG1QdWxsZXItPnN0b3AoKSBuZWVkcyB0byBiZSBkb25lIG91dHNpZGUgTWVkaWFDb2RlY1NvdXJjZSdzIGxvb3BlciwKKyAgICAvLyBhcyBpdCBjb250YWlucyBhIHN5bmNocm9ub3VzIGNhbGwgdG8gc3RvcCB0aGUgdW5kZXJseWluZyBNZWRpYVNvdXJjZSwKKyAgICAvLyB3aGljaCBvZnRlbiB3YWl0cyBmb3IgYWxsIG91dHN0YW5kaW5nIE1lZGlhQnVmZmVycyB0byByZXR1cm4sIGJ1dAorICAgIC8vIE1lZGlhQnVmZmVycyBhcmUgb25seSByZXR1cm5lZCB3aGVuIE1lZGlhQ29kZWNTb3VyY2UgbG9vcGVyIGdldHMKKyAgICAvLyB0byBwcm9jZXNzIHRoZW0uCisKKyAgICBpZiAobVB1bGxlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJwdWxsZXIgKCVzKSBzdG9wcGluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICBtUHVsbGVyLT5zdG9wKCk7CisgICAgICAgIEFMT0dJKCJwdWxsZXIgKCVzKSBzdG9wcGVkIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cGF1c2UoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IE1lZGlhQ29kZWNTb3VyY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHsKKyAgICBDSEVDSyhtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKTsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIqKiBidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zKiAvKiBvcHRpb25zICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKworICAgICpidWZmZXIgPSBOVUxMOworICAgIHdoaWxlIChtT3V0cHV0QnVmZmVyUXVldWUuc2l6ZSgpID09IDAgJiYgIW1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBtT3V0cHV0QnVmZmVyQ29uZC53YWl0KG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICB9CisgICAgaWYgKCFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgKmJ1ZmZlciA9ICptT3V0cHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1PdXRwdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gbUVycm9yQ29kZTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcigwKTsKKyAgICBidWZmZXItPnJlbGVhc2UoKTsKK30KKworTWVkaWFDb2RlY1NvdXJjZTo6TWVkaWFDb2RlY1NvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1Mb29wZXIobG9vcGVyKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KSwKKyAgICAgIG1NZXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVN0b3BwaW5nKGZhbHNlKSwKKyAgICAgIG1Eb01vcmVXb3JrUGVuZGluZyhmYWxzZSksCisgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMoLTFsbCksCisgICAgICBtRW5jb2RlclJlYWNoZWRFT1MoZmFsc2UpLAorICAgICAgbUVycm9yQ29kZShPSykgeworICAgIENIRUNLKG1Mb29wZXIgIT0gTlVMTCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLmNfc3RyKCksIDYpKSB7CisgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICBtUHVsbGVyID0gbmV3IFB1bGxlcihzb3VyY2UpOworICAgIH0KK30KKworTWVkaWFDb2RlY1NvdXJjZTo6fk1lZGlhQ29kZWNTb3VyY2UoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKKworICAgIG1Db2RlY0xvb3Blci0+c3RvcCgpOworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjppbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6aW5pdEVuY29kZXIoKSB7CisgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPih0aGlzKTsKKyAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisKKyAgICBtQ29kZWNMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoImNvZGVjX2xvb3BlciIpOworICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoKTsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9NRVRBREFUQV9JTlBVVCkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIsIDEpOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLCAxKTsKKyAgICB9CisKKyAgICBBU3RyaW5nIG91dHB1dE1JTUU7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvdXRwdXRNSU1FKSk7CisKKyAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKKyAgICAgICAgICAgIG1Db2RlY0xvb3Blciwgb3V0cHV0TUlNRS5jX3N0cigpLCB0cnVlIC8qIGVuY29kZXIgKi8pOworCisgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgQUxPR1YoIm91dHB1dCBmb3JtYXQgaXMgJyVzJyIsIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUVuY29kZXItPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgIE5VTEwgLyogbmF0aXZlV2luZG93ICovLAorICAgICAgICAgICAgICAgIE5VTEwgLyogY3J5cHRvICovLAorICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUVuY29kZXItPmdldE91dHB1dEZvcm1hdCgmbU91dHB1dEZvcm1hdCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1PdXRwdXRGb3JtYXQsIG1NZXRhKTsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIENIRUNLKG1Jc1ZpZGVvKTsKKworICAgICAgICBlcnIgPSBtRW5jb2Rlci0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZtR3JhcGhpY0J1ZmZlclByb2R1Y2VyKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gbUVuY29kZXItPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbUVuY29kZXItPmdldElucHV0QnVmZmVycygmbUVuY29kZXJJbnB1dEJ1ZmZlcnMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZtRW5jb2Rlck91dHB1dEJ1ZmZlcnMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1FbmNvZGVyUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1FcnJvckNvZGUgPSBPSzsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKKyAgICBtRW5jb2Rlci5jbGVhcigpOworCisgICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gKm1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FbmNvZGVySW5wdXRCdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoaSk7CisgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKKyAgICB9CisKKyAgICBtRW5jb2RlcklucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1FbmNvZGVyT3V0cHV0QnVmZmVycy5jbGVhcigpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnNpZ25hbEVPUyhzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoIW1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HVigiZW5jb2RlciAoJXMpIHJlYWNoZWQgRU9TIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgICAgICAgICAvLyByZWxlYXNlIGFsbCB1bnJlYWQgbWVkaWEgYnVmZmVycworICAgICAgICAgICAgZm9yIChMaXN0PE1lZGlhQnVmZmVyKj46Oml0ZXJhdG9yIGl0ID0gbU91dHB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IG1PdXRwdXRCdWZmZXJRdWV1ZS5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICAgICAgICAgIG1FbmNvZGVyUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgICAgICBtRXJyb3JDb2RlID0gZXJyOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvbmQuc2lnbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICByZWxlYXNlRW5jb2RlcigpOworICAgIH0KKyAgICBpZiAobVN0b3BwaW5nICYmIG1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgLy8gcG9zdGluZyByZXBseSB0byBldmVyeW9uZSB0aGF0J3Mgd2FpdGluZworICAgICAgICBMaXN0PHVpbnQzMl90Pjo6aXRlcmF0b3IgaXQ7CisgICAgICAgIGZvciAoaXQgPSBtU3RvcFJlcGx5SURRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IG1TdG9wUmVwbHlJRFF1ZXVlLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KCppdCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0b3BSZXBseUlEUXVldWUuY2xlYXIoKTsKKyAgICAgICAgbVN0b3BwaW5nID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnN1c3BlbmQoKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCB0cnVlKTsKKyAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6cmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgIGlmIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwKSB7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCBza2lwRnJhbWVzQmVmb3JlVXMpOworICAgICAgICB9CisgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnNjaGVkdWxlRG9Nb3JlV29yaygpIHsKKyAgICBpZiAobURvTW9yZVdvcmtQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSB0cnVlOworCisgICAgaWYgKG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPT0gTlVMTCkgeworICAgICAgICBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID0gbmV3IEFNZXNzYWdlKAorICAgICAgICAgICAgICAgIGtXaGF0RW5jb2RlckFjdGl2aXR5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICB9CisgICAgbUVuY29kZXItPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRW5jb2RlckFjdGl2aXR5Tm90aWZ5KTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKSB7CisgICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAmJiAhbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyKiBtYnVmID0gKm1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmVyYXNlKG1JbnB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCkpOworCisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCA9ICptQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCk7CisgICAgICAgIG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZXJhc2UobUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDBsbDsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgICAgICAgICAvLyBwdXNoIGRlY29kaW5nIHRpbWUgZm9yIHZpZGVvLCBvciBkcmlmdCB0aW1lIGZvciBhdWRpbworICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgbURlY29kaW5nVGltZVF1ZXVlLnB1c2hfYmFjayh0aW1lVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZiBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFNhbXBsZVRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBkcmlmdFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleURyaWZ0VGltZSwgJmRyaWZ0VGltZVVzKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHJpZnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpZnRUaW1lVXMgPSB0aW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgLSBkcmlmdFRpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbURyaWZ0VGltZVF1ZXVlLnB1c2hfYmFjayhkcmlmdFRpbWVVcyk7CisjZW5kaWYgLy8gREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplID0gbWJ1Zi0+c2l6ZSgpOworCisgICAgICAgICAgICBtZW1jcHkobUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIG1idWYtPmRhdGEoKSwgc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIC8vIHZpZGVvIGVuY29kZXIgd2lsbCByZWxlYXNlIE1lZGlhQnVmZmVyIHdoZW4gZG9uZQorICAgICAgICAgICAgICAgIC8vIHdpdGggdW5kZXJseWluZyBkYXRhLgorICAgICAgICAgICAgICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPnNldE1lZGlhQnVmZmVyQmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1idWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCAwLCBzaXplLCB0aW1lVXMsIGZsYWdzKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpkb01vcmVXb3JrKGludDMyX3QgbnVtSW5wdXQsIGludDMyX3QgbnVtT3V0cHV0KSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICB3aGlsZSAobnVtSW5wdXQtLSA+IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmJ1ZmZlckluZGV4KTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLnB1c2hfYmFjayhidWZmZXJJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBmZWVkRW5jb2RlcklucHV0QnVmZmVycygpOworICAgIH0KKworICAgIHdoaWxlIChudW1PdXRwdXQtLSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4OworICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICZidWZmZXJJbmRleCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IG91dGJ1ZiA9IG1FbmNvZGVyT3V0cHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpOworCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihvdXRidWYtPnNpemUoKSk7CisgICAgICAgICAgICBtZW1jcHkobWJ1Zi0+ZGF0YSgpLCBvdXRidWYtPmRhdGEoKSwgb3V0YnVmLT5zaXplKCkpOworCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3JhcGhpY0J1ZmZlclNvdXJjZSBpcyBzdXBwb3NlZCB0byBkaXNjYXJkIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWZvcmUgc3RhcnQsIGFuZCBvZmZzZXQgdGltZVVzIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNvZGluZyB0aW1lIGZvciBzdXJmYWNlIHNvdXJjZSBpcyB1bmF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBwcmVzZW50YXRpb24gdGltZSBmb3Igbm93LiBNYXkgbmVlZCB0byBtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIGludG8gTWVkaWFDb2RlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIW1EZWNvZGluZ1RpbWVRdWV1ZS5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzID0gKihtRGVjb2RpbmdUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVjb2RpbmdUaW1lUXVldWUuZXJhc2UobURlY29kaW5nVGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCBkZWNvZGluZ1RpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlt2aWRlb10gdGltZSAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSwgZHRzL3B0cyBkaWZmICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZGVjb2RpbmdUaW1lVXMgLSB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworI2lmIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIW1EcmlmdFRpbWVRdWV1ZS5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpZnRUaW1lVXMgPSAqKG1EcmlmdFRpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbURyaWZ0VGltZVF1ZXVlLmVyYXNlKG1EcmlmdFRpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEcmlmdFRpbWUsIGRyaWZ0VGltZVVzKTsKKyNlbmRpZiAvLyBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbYXVkaW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGRyaWZ0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZHJpZnRUaW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1idWYtPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgbWJ1Zi0+YWRkX3JlZigpOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PdXRwdXRCdWZmZXJMb2NrKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKG1idWYpOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUVuY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySW5kZXgpOworCisgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6b25TdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1TdG9wcGluZykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHdoaWxlIHdlJ3JlIHN0b3BwaW5nIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgQUxPR0koIk1lZGlhQ29kZWNTb3VyY2UgKCVzKSByZXN1bWluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgcmVzdW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOworICAgICAgICAgICAgbVB1bGxlci0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgICAgICBzdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdW1lKHN0YXJ0VGltZVVzKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdFB1bGxlck5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgIGVyciA9IG1QdWxsZXItPnN0YXJ0KHBhcmFtcywgbm90aWZ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgc3RhcnRlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICBjYXNlIGtXaGF0UHVsbGVyTm90aWZ5OgorICAgIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImFjY2Vzc1VuaXQiLCAodm9pZCoqKSZtYnVmKSk7CisKKyAgICAgICAgaWYgKG1idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInB1bGxlciAoJXMpIHJlYWNoZWQgRU9TIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICBzaWduYWxFT1MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiZ290IG1zZyAnJXMnIGFmdGVyIGVuY29kZXIgc2h1dGRvd24uIiwKKyAgICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5wdXNoX2JhY2sobWJ1Zik7CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRFbmNvZGVyQWN0aXZpdHk6CisgICAgeworICAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IG51bUlucHV0LCBudW1PdXRwdXQ7CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5wdXQtYnVmZmVycyIsICZudW1JbnB1dCkpIHsKKyAgICAgICAgICAgIG51bUlucHV0ID0gSU5UMzJfTUFYOworICAgICAgICB9CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm91dHB1dC1idWZmZXJzIiwgJm51bU91dHB1dCkpIHsKKyAgICAgICAgICAgIG51bU91dHB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IGRvTW9yZVdvcmsobnVtSW5wdXQsIG51bU91dHB1dCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZWFjaGVkIEVPUywgb3IgZXJyb3IKKyAgICAgICAgICAgIHNpZ25hbEVPUyhlcnIpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKyAgICAgICAgTWV0YURhdGEgKnBhcmFtcyA9IHN0YXRpY19jYXN0PE1ldGFEYXRhICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIG9uU3RhcnQocGFyYW1zKSk7CisgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICB7CisgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgaWYgKG1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSByZWFjaGVkIEVPUywgcmVwbHkgYW5kIHJldHVybiBub3cKKyAgICAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgYWxyZWFkeSBzdG9wcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtU3RvcFJlcGx5SURRdWV1ZS5wdXNoX2JhY2socmVwbHlJRCk7CisgICAgICAgIGlmIChtU3RvcHBpbmcpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgd2UncmUgYWxyZWFkeSBzdG9wcGluZywgcmVwbHkgd2lsbCBiZSBwb3N0ZWQKKyAgICAgICAgICAgIC8vIHRvIGFsbCB3aGVuIHdlJ3JlIHN0b3BwZWQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1TdG9wcGluZyA9IHRydWU7CisKKyAgICAgICAgLy8gaWYgdXNpbmcgc3VyZmFjZSwgc2lnbmFsIHNvdXJjZSBFT1MgYW5kIHdhaXQgZm9yIEVPUyB0byBjb21lIGJhY2suCisgICAgICAgIC8vIG90aGVyd2lzZSwgcmVsZWFzZSBlbmNvZGVyIGFuZCBwb3N0IEVPUyBpZiBoYXZlbid0IGRvbmUgYWxyZWFkeQorICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICAgICAgbUVuY29kZXItPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpZ25hbEVPUygpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0UGF1c2U6CisgICAgeworICAgICAgICBpZiAobUZsYWdzICYmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIHN1c3BlbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtUHVsbGVyLT5wYXVzZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKaW5kZXggMzQwY2JhNy4uZDQ4ZGQ4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiA9ICJ2aWRlby9tcGVnMiI7CkBAIC0zNiw2ICszNyw3IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyA9ICJhdWRpby9vcHVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKQEAgLTU2LDUgKzU4LDcgQEAKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQID0gInRleHQvM2dwcC10dCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCA9ICJhcHBsaWNhdGlvbi94LXN1YnJpcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCA9ICJ0ZXh0L3Z0dCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDggPSAidGV4dC9jZWEtNjA4IjsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggZDg3ZTkxMC4uYzdjNmYzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYU11eGVyIgorCisjaW5jbHVkZSAid2VibS9XZWJtV3JpdGVyLmgiCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KQEAgLTM2LDE5ICszOSwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGNvbnN0IGNoYXIgKnBhdGgsIE91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkgeworICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180KSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIocGF0aCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihwYXRoKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQotCiB9CiAKIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CiAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKGZkKTsKKyAgICB9CisKKyAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CiAgICAgICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpAQCAtMTA5LDggKzEyMywxMyBAQAogICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKS4iKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBpZiAobUZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgeworICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgLm1wNCBvdXRwdXQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBBTE9HVigiU2V0dGluZyBsb2NhdGlvbjogbGF0aXR1ZGUgPSAlZCwgbG9uZ2l0dWRlID0gJWQiLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKLSAgICByZXR1cm4gbVdyaXRlci0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TVBFRzRXcml0ZXIqPihtV3JpdGVyLmdldCgpKS0+c2V0R2VvRGF0YShsYXRpdHVkZSwgbG9uZ2l0dWRlKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFNdXhlcjo6c3RhcnQoKSB7CkBAIC0xNTcsNyArMTc2LDcgQEAKICAgICB9CiAKICAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tMaXN0LnNpemUoKSkgewotICAgICAgICBBTE9HRSgiV3JpdGVTYW1wbGVEYXRhKCkgZ2V0IGFuIGludmFsaWQgaW5kZXggJWQiLCB0cmFja0luZGV4KTsKKyAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGdldCBhbiBpbnZhbGlkIGluZGV4ICV6dSIsIHRyYWNrSW5kZXgpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAppbmRleCBmZDBlNzljLi41NzY0NzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiwxOSBAQAogICAgIG1PcHRpb25zID0gMDsKICAgICBtU2Vla1RpbWVVcyA9IDA7CiAgICAgbUxhdGVuZXNzVXMgPSAwOworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vbkJsb2NraW5nOwogfQogCiB2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggMDZlMmQ0My4uYmQwYTQxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdUNhY2hlZFNvdXJjZTIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0xMzUsNyArMTM3LDcgQEAKIH0KIAogdm9pZCBQYWdlQ2FjaGU6OmNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImNvcHkgZnJvbSAlZCBzaXplICVkIiwgZnJvbSwgc2l6ZSk7CisgICAgQUxPR1YoImNvcHkgZnJvbSAlenUgc2l6ZSAlenUiLCBmcm9tLCBzaXplKTsKIAogICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTg5LDYgKzE5MSw3IEBACiAgICAgICBtRmluYWxTdGF0dXMoT0spLAogICAgICAgbUxhc3RBY2Nlc3NQb3MoMCksCiAgICAgICBtRmV0Y2hpbmcodHJ1ZSksCisgICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSksCiAgICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSwKICAgICAgIG1OdW1SZXRyaWVzTGVmdChrTWF4TnVtUmV0cmllcyksCiAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMoa0RlZmF1bHRIaWdoV2F0ZXJUaHJlc2hvbGQpLApAQCAtMjEzLDcgKzIxNiwxNCBAQAogCiAgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVDYWNoZWRTb3VyY2UyIik7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwotICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAvLyBTaW5jZSBpdCBtYXkgbm90IGJlIG9idmlvdXMgd2h5IG91ciBsb29wZXIgdGhyZWFkIG5lZWRzIHRvIGJlCisgICAgLy8gYWJsZSB0byBjYWxsIGludG8gamF2YSBzaW5jZSBpdCBkb2Vzbid0IGFwcGVhciB0byBkbyBzbyBhdCBhbGwuLi4KKyAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbiBtYXkgYmUgKGFuZCBtb3N0IGxpa2VseSBpcykgaW1wbGVtZW50ZWQgaW4gSkFWQQorICAgIC8vIGFuZCBhIGxvY2FsIEpBVkEgSUJpbmRlciB3aWxsIGNhbGwgZGlyZWN0bHkgaW50byBKTkkgbWV0aG9kcy4KKyAgICAvLyBTbyB3aGVuZXZlciB3ZSBjYWxsIERhdGFTb3VyY2U6OnJlYWRBdCBpdCBtYXkgZW5kIHVwIGluIGEgY2FsbCB0bworICAgIC8vIElNZWRpYUhUVFBDb25uZWN0aW9uOjpyZWFkQXQgYW5kIHRoZXJlZm9yZSBjYWxsIGJhY2sgaW50byBKQVZBLgorICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywgdHJ1ZSAvKiBjYW5DYWxsSmF2YSAqLyk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOwpAQCAtMjM1LDYgKzI0NSwyNyBAQAogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3RpbmcgSFRUUEJhc2VkU291cmNlIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIC8vIHNldCBtRGlzY29ubmVjdGluZyB0byB0cnVlLCBpZiBhIGZldGNoIHJldHVybnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoaXMsIHRoZSBzb3VyY2Ugd2lsbCBiZSBtYXJrZWQgYXMgRU9TLgorICAgICAgICAgICAgbURpc2Nvbm5lY3RpbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNpZ25hbCBtQ29uZGl0aW9uIHNvIHRoYXQgdGhlIHBlbmRpbmcgcmVhZEF0KCkKKyAgICAgICAgICAgIC8vIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuCisgICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwbGljaXRseSBkaXNjb25uZWN0IGZyb20gdGhlIHNvdXJjZSwgdG8gYWxsb3cgYW55CisgICAgICAgIC8vIHBlbmRpbmcgcmVhZHMgdG8gcmV0dXJuIG1vcmUgcHJvbXB0bHkKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKICAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewogICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CkBAIC0yOTgsNyArMzI5LDExIEBACiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgICAgICBpZiAoZXJyID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IGVyciA9PSAtRVBJUEUpIHsKKyAgICAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOworICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgewogICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgbGlrZWx5IHRvIGdvIGF3YXkgZXZlbiBpZiB3ZQogICAgICAgICAgICAgLy8gcmV0cnksIGkuZS4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgb3Igc2ltaWxhci4KICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CkBAIC0zMTgsNyArMzUzLDE0IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKG4gPCAwKSB7CisgICAgaWYgKG4gPT0gMCB8fCBtRGlzY29ubmVjdGluZykgeworICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOworCisgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKKyAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CiAgICAgICAgIG1GaW5hbFN0YXR1cyA9IG47CiAgICAgICAgIGlmIChuID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IG4gPT0gLUVQSVBFKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCkBAIC0zMjYsMTQgKzM2OCw3IEBACiAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlZCwgJWQgcmV0cmllcyBsZWZ0IiwgbiwgbU51bVJldHJpZXNMZWZ0KTsKLSAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKLSAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOwotCi0gICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7Ci0gICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0KKyAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlemQsICVkIHJldHJpZXMgbGVmdCIsIG4sIG1OdW1SZXRyaWVzTGVmdCk7CiAgICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgewpAQCAtNDIxLDYgKzQ1NiwxMCBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CiAKQEAgLTQ1NywxNiArNDk2LDE5IEBACiAgICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKICAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7CiAKLSAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlZCIsIG1DYWNoZS0+dG90YWxTaXplKCkpOworICAgIEFMT0dJKCJyZXN0YXJ0aW5nIHByZWZldGNoZXIsIHRvdGFsU2l6ZSA9ICV6dSIsIG1DYWNoZS0+dG90YWxTaXplKCkpOwogICAgIG1GZXRjaGluZyA9IHRydWU7CiB9CiAKIHNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKIAotICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkQXQgb2Zmc2V0ICVsbGQsIHNpemUgJXp1Iiwgb2Zmc2V0LCBzaXplKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KIAogICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCiAKQEAgLTQ4OCwxMCArNTMwLDE1IEBACiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOwogICAgIG1zZy0+cG9zdCgpOwogCi0gICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKSB7CisgICAgd2hpbGUgKG1Bc3luY1Jlc3VsdCA9PSBOVUxMICYmICFtRGlzY29ubmVjdGluZykgewogICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KIAorICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICBtQXN5bmNSZXN1bHQuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCiAgICAgaW50MzJfdCByZXN1bHQ7CiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0LT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKIApAQCAtNTMyLDcgKzU3OSw3IEBACiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIENIRUNLX0xFKHNpemUsIChzaXplX3QpbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKTsKIAotICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlZCIsIG9mZnNldCwgc2l6ZSk7CisgICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC02NzIsNyArNzE5LDcgQEAKICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMgPSBrRGVmYXVsdEtlZXBBbGl2ZUludGVydmFsVXM7CiAgICAgfQogCi0gICAgQUxPR1YoImxvd3dhdGVyID0gJWQgYnl0ZXMsIGhpZ2h3YXRlciA9ICVkIGJ5dGVzLCBrZWVwYWxpdmUgPSAlbGxkIHVzIiwKKyAgICBBTE9HVigibG93d2F0ZXIgPSAlenUgYnl0ZXMsIGhpZ2h3YXRlciA9ICV6dSBieXRlcywga2VlcGFsaXZlID0gJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMsCiAgICAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMsCiAgICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDdiYzdkYTIuLmYyNGNmM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC01OCw3ICs1OCw5IEBACiB9CiAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7CkBAIC02Niw3ICs2OCw3IEBACiAgICAgfQogCiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkocGF0aCwgaGVhZGVycyk7CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHBhdGgsIGhlYWRlcnMpOwogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVOT0VOVDsKQEAgLTM4Nyw3ICszODksNyBAQAogICAgICAgICAgICAgICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IGVycjsKIAogICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tRmluYWxSZXN1bHQgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVhZCBvbiB0cmFjayAlZCBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWFkIG9uIHRyYWNrICV6dSBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1UcmFja0luZGV4LCBlcnIpOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKaW5kZXggNzJmMjMwNi4uY2EwMzFhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCkBAIC0xNiw2ICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk9NWENsaWVudCIKKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtNzMsNiArNzgsMTAgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUsCiAgICAgICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlR3JhcGhpY0J1ZmZlcnMoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKIApAQCAtMTY1LDcgKzE3NCwxNCBAQAogCiAvLyBzdGF0aWMKIGJvb2wgTXV4T01YOjpDYW5MaXZlTG9jYWxseShjb25zdCBjaGFyICpuYW1lKSB7CisjaWZkZWYgX19MUDY0X18KKyAgICAodm9pZCluYW1lOyAvLyBkaXNhYmxlIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZworICAgIC8vIDY0IGJpdCBwcm9jZXNzZXMgYWx3YXlzIHJ1biBPTVggcmVtb3RlIG9uIE1lZGlhU2VydmVyCisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICAvLyAzMiBiaXQgcHJvY2Vzc2VzIHJ1biBvbmx5IE9NWC5nb29nbGUuKiBjb21wb25lbnRzIGxvY2FsbHkKICAgICByZXR1cm4gIXN0cm5jYXNlY21wKG5hbWUsICJPTVguZ29vZ2xlLiIsIDExKTsKKyNlbmRpZgogfQogCiBjb25zdCBzcDxJT01YPiAmTXV4T01YOjpnZXRPTVgobm9kZV9pZCBub2RlKSBjb25zdCB7CkBAIC0yNzksNiArMjk1LDEzIEBACiAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBlbmFibGUsIG1heEZyYW1lV2lkdGgsIG1heEZyYW1lSGVpZ2h0KTsKIH0KIAorc3RhdHVzX3QgTXV4T01YOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlLCBwb3J0SW5kZXgsIGVuYWJsZSwgYXVkaW9Id1N5bmMsIHNpZGViYW5kSGFuZGxlKTsKK30KKwogc3RhdHVzX3QgTXV4T01YOjplbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmVuYWJsZUdyYXBoaWNCdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggY2VmYTI0OC4uYTg4MDZjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtMTgsNiArMTgsMTEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhDb2RlYyIKKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFbmNvZGVyLmgiCkBAIC0zMCw2ICszNSw3IEBACiAjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTk2LDYgKzEwMiw3IEBACiAKICNkZWZpbmUgQ09ERUNfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ09ERUNfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ09ERUNfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29tcG9uZW50TmFtZSwgIyNfX1ZBX0FSR1NfXykKIAogc3RydWN0IE9NWENvZGVjT2JzZXJ2ZXIgOiBwdWJsaWMgQm5PTVhPYnNlcnZlciB7CkBAIC0xMjksNiArMTM2LDcgQEAKIAogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShzaXplb2YoT01YX1BUUikgPT0gNCk7IC8vIGNoZWNrIE9NWF9QVFIgaXMgNCBieXRlcy4KICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gMTsKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CkBAIC0xOTAsNyArMTk4LDcgQEAKICAgICAgICAgVmVjdG9yPENvZGVjTmFtZUFuZFF1aXJrcz4gKm1hdGNoaW5nQ29kZWNzKSB7CiAgICAgbWF0Y2hpbmdDb2RlY3MtPmNsZWFyKCk7CiAKLSAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIwNiw3ICsyMTQsOSBAQAogCiAgICAgICAgIGluZGV4ID0gbWF0Y2hJbmRleCArIDE7CiAKLSAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSA9IGxpc3QtPmdldENvZGVjTmFtZShtYXRjaEluZGV4KTsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8obWF0Y2hJbmRleCk7CisgICAgICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBpbmZvLT5nZXRDb2RlY05hbWUoKTsKIAogICAgICAgICAvLyBJZiBhIHNwZWNpZmljIGNvZGVjIGlzIHJlcXVlc3RlZCwgc2tpcCB0aGUgbm9uLW1hdGNoaW5nIG9uZXMuCiAgICAgICAgIGlmIChtYXRjaENvbXBvbmVudE5hbWUgJiYgc3RyY21wKGNvbXBvbmVudE5hbWUsIG1hdGNoQ29tcG9uZW50TmFtZSkpIHsKQEAgLTIyNCw3ICsyMzQsNyBAQAogICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1hdGNoaW5nQ29kZWNzLT5hZGQoKTsKICAgICAgICAgICAgIENvZGVjTmFtZUFuZFF1aXJrcyAqZW50cnkgPSAmbWF0Y2hpbmdDb2RlY3MtPmVkaXRJdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgZW50cnktPm1OYW1lID0gU3RyaW5nOChjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGVudHJ5LT5tUXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGxpc3QsIG1hdGNoSW5kZXgpOworICAgICAgICAgICAgZW50cnktPm1RdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MoaW5mbyk7CiAKICAgICAgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIHF1aXJrcyAweCUwOHgiLAogICAgICAgICAgICAgICAgICAgZW50cnktPm1OYW1lLnN0cmluZygpLCBlbnRyeS0+bVF1aXJrcyk7CkBAIC0yMzgsMTggKzI0OCwxNSBAQAogCiAvLyBzdGF0aWMKIHVpbnQzMl90IE9NWENvZGVjOjpnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0LCBzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvKSB7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSkgewogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOwogICAgIH0KLSAgICBpZiAobGlzdC0+Y29kZWNIYXNRdWlyaygKLSAgICAgICAgICAgICAgICBpbmRleCwgIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKKyAgICBpZiAoaW5mby0+aGFzUXVpcmsoIm91dHB1dC1idWZmZXJzLWFyZS11bnJlYWRhYmxlIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZTsKICAgICB9CiAKQEAgLTI1OCw4ICsyNjUsNyBAQAogCiAvLyBzdGF0aWMKIGJvb2wgT01YQ29kZWM6OmZpbmRDb2RlY1F1aXJrcyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCB1aW50MzJfdCAqcXVpcmtzKSB7Ci0gICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLQorICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI3MCw3ICsyNzYsOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhsaXN0LCBpbmRleCk7CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOworICAgIENIRUNLKGluZm8gIT0gTlVMTCk7CisgICAgKnF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhpbmZvKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzc0LDYgKzM4Miw1NyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0dXNfdCBPTVhDb2RlYzo6cGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgLy8gdmVyaWZ5IG1pbmltdW0gc2l6ZSBhbmQgY29uZmlndXJhdGlvblZlcnNpb24gPT0gMS4KKyAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAqcHJvZmlsZSA9IChwdHJbMV0gJiAzMSk7CisgICAgKmxldmVsID0gcHRyWzEyXTsKKworICAgIHB0ciArPSAyMjsKKyAgICBzaXplIC09IDIyOworCisgICAgc2l6ZV90IG51bW9mQXJyYXlzID0gKGNoYXIpcHRyWzBdOworICAgIHB0ciArPSAxOworICAgIHNpemUgLT0gMTsKKyAgICBzaXplX3QgaiA9IDAsIGkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1vZkFycmF5czsgaSsrKSB7CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBzaXplIC09IDE7CisKKyAgICAgICAgLy8gTnVtIG9mIG5hbHMKKyAgICAgICAgc2l6ZV90IG51bW9mTmFscyA9IFUxNl9BVChwdHIpOworICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgIGZvciAoaiA9IDA7aiA8IG51bW9mTmFscztqKyspIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBzaXplIC09IDI7CisKKyAgICAgICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKHB0ciwgbGVuZ3RoKTsKKworICAgICAgICAgICAgcHRyICs9IGxlbmd0aDsKKyAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgT01YQ29kZWM6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAogICAgICAgICB1bnNpZ25lZCAqcHJvZmlsZSwgdW5zaWduZWQgKmxldmVsKSB7CkBAIC00ODYsMTEgKzU0NSwzMiBAQAogICAgICAgICAgICAgQ09ERUNfTE9HSSgKICAgICAgICAgICAgICAgICAgICAgIkFWQyBwcm9maWxlID0gJXUgKCVzKSwgbGV2ZWwgPSAldSIsCiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwgbGV2ZWwpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIEhFVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorCisgICAgICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCBsZXZlbDsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgJnByb2ZpbGUsICZsZXZlbCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBIRVZDIGNvZGVjIHNwZWNpZmljIGRhdGEuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ09ERUNfTE9HSSgKKyAgICAgICAgICAgICAgICAgICAgIkhFVkMgcHJvZmlsZSA9ICV1ICwgbGV2ZWwgPSAldSIsCisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKICAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOwogCiAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKICAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODA4LDYgKzg4OCw4IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CisgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0hFVkM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewpAQCAtOTEyLDcgKzk5NCw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBPTVhfVTMyIHJldCA9IGZyYW1lUmF0ZSAqIGlGcmFtZXNJbnRlcnZhbCAtIDE7Ci0gICAgQ0hFQ0socmV0ID4gMSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTIwMyw2ICsxMjg0LDggQEAKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSEVWQzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIG1pbWUpKSB7CkBAIC0xMzg5LDEyICsxNDcyLDE2IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMWFsYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIiwgInZpZGVvX2VuY29kZXIuaGV2YyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKQEAgLTE0NjQsNyArMTU1MSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+ZnJlZU5vZGUobU5vZGUpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1Ob2RlID0gTlVMTDsKKyAgICBtTm9kZSA9IDA7CiAgICAgc2V0U3RhdGUoREVBRCk7CiAKICAgICBjbGVhckNvZGVjU3BlY2lmaWNEYXRhKCk7CkBAIC0xNjE3LDE1ICsxNzA0LDE1IEBACiAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgICAgIGlmICghKG1PTVhMaXZlc0xvY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgZG9lcyBub3QgZmlsbCBpbiB0aGUgYnVmZmVyIHB0ciBhdCB0aGlzIHRpbWUsCi0gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBkZWZlciBjcmVhdGluZyB0aGUgTWVkaWFCdWZmZXIgdW50aWwgcmVjZWl2aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IEZJTExfQlVGRkVSX0RPTkUgbm90aWZpY2F0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoaW5mby5tRGF0YSwgaW5mby5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFpbCBkZWZlcnJlZCBNZWRpYUJ1ZmZlciBjcmVhdGlvbiB1bnRpbCBGSUxMX0JVRkZFUl9ET05FOworICAgICAgICAgICAgLy8gdGhpcyBsZWdhY3kgbW9kZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobU9NWExpdmVzTG9jYWxseQorICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cykKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGVCdWZmZXJzT25Qb3J0IGNhbm5vdCBkZWZlciBidWZmZXIgYWxsb2NhdGlvbiIpOworCisgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihpbmZvLm1EYXRhLCBpbmZvLm1TaXplKTsKKyAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2goaW5mbyk7CkBAIC0xNzk2LDIyICsxODgzLDQyIEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KKyAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgc3VyZmFjZSBpcyBjb250cm9sbGVkIGJ5IGFwcCAobmF0aXZlIHdpbmRvdworICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBmb3IgdGhlIGNhc2Ugd2hlbiBzdXJmYWNlIGlzIG5vdCBjb250cm9sbGVkIGJ5IGFwcCkKKyAgICAvLyBGSVhNRTI6IFRoaXMgbWVhbnMgdGhhdCBtaW5VbmRlcWV1ZXVkQnVmcyBjYW4gYmUgMSBsYXJnZXIgdGhhbiByZXBvcnRlZAorICAgIC8vIEZvciBub3csIHRyeSB0byBhbGxvY2F0ZSAxIG1vcmUgYnVmZmVyLCBidXQgZG9uJ3QgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwKIAotICAgIC8vIFhYWDogSXMgdGhpcyB0aGUgcmlnaHQgbG9naWMgdG8gdXNlPyAgSXQncyBub3QgY2xlYXIgdG8gbWUgd2hhdCB0aGUgT01YCi0gICAgLy8gYnVmZmVyIGNvdW50cyByZWZlciB0byAtIGhvdyBkbyB0aGV5IGFjY291bnQgZm9yIHRoZSByZW5kZXJlciBob2xkaW5nIG9uCi0gICAgLy8gdG8gYnVmZmVycz8KLSAgICBpZiAoZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA8IGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcykgewotICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0gZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzOworICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgYWxsb2NhdGlvbiB3aGlsZSBhbHNvIHRyeWluZyB0byByZWR1Y2Ugc3RhcnZhdGlvbgorICAgIC8vCisgICAgLy8gMS4gYWxsb2NhdGUgYXQgbGVhc3QgbkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgLSB0aGF0IGlzIHRoZQorICAgIC8vICAgIG1pbmltdW0gbmVlZGVkIGZvciB0aGUgY29uc3VtZXIgdG8gYmUgYWJsZSB0byB3b3JrCisgICAgLy8gMi4gdHJ5IHRvIGFsbG9jYXRlIHR3byAoMikgYWRkaXRpb25hbCBidWZmZXJzIHRvIHJlZHVjZSBzdGFydmF0aW9uIGZyb20KKyAgICAvLyAgICB0aGUgY29uc3VtZXIKKyAgICAvLyAgICBwbHVzIGFuIGV4dHJhIGJ1ZmZlciB0byBhY2NvdW50IGZvciBpbmNvcnJlY3QgbWluVW5kZXF1ZXVlZEJ1ZnMKKyAgICBDT0RFQ19MT0dJKCJPTVgtYnVmZmVyczogbWluPSV1IGFjdHVhbD0ldSB1bmRlcT0lZCsxIiwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4sIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIG1pblVuZGVxdWV1ZWRCdWZzKTsKKworICAgIGZvciAoT01YX1UzMiBleHRyYUJ1ZmZlcnMgPSAyICsgMTsgLyogY29uZGl0aW9uIGluc2lkZSBsb29wICovOyBleHRyYUJ1ZmZlcnMtLSkgeworICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0KKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcyArIGV4dHJhQnVmZmVyczsKICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IG5ld0J1ZmZlckNvdW50OwogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKIAotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJXUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtaW5VbmRlcXVldWVkQnVmcyArPSBleHRyYUJ1ZmZlcnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIENPREVDX0xPR1coInNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICV1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisgICAgQ09ERUNfTE9HSSgiT01YLWJ1ZmZlcnM6IG1pbj0ldSBhY3R1YWw9JXUgdW5kZXE9JWQrMSIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBtaW5VbmRlcXVldWVkQnVmcyk7CiAKICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKQEAgLTIyMDQsMjIgKzIzMTEsNiBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSAhPSBTSFVUVElOR19ET1dOKSB7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSwgKGludClFTkFCTEVEKTsKIAotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tTWVkaWFCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtT01YTGl2ZXNMb2NhbGx5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHFjb20gdmlkZW8gZGVjb2RlcnMgb24gTmV4dXMgZG9uJ3QgYWN0dWFsbHkgYWxsb2NhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBtZW1vcnkgb24gYSBjYWxsIHRvIE9NWF9BbGxvY2F0ZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgInBCdWZmZXIiIG1lbWJlciBvZiB0aGUgT01YX0JVRkZFUkhFQURFUlRZUEUKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIGlzIG9ubHkgZmlsbGVkIGluIGxhdGVyLgotCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5kYXRhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IGluZm8tPm1NZWRpYUJ1ZmZlcjsKICAgICAgICAgICAgICAgICBib29sIGlzR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpICE9IE5VTEw7CiAKQEAgLTIyNTQsMTAgKzIzNDUsNiBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUpOwotCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5QnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwpAQCAtMjQxMiwxMiArMjQ5OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExLCBkYXRhMik7CiAKICAgICAgICAgICAgIGlmIChkYXRhMiA9PSAwIHx8IGRhdGEyID09IE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgbUZpbGxlZEJ1ZmZlcnMgaXMgZW1wdHkgb3Igbm90Ci0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCBpcyBub3QgbWVhbnQgZm9yIHJlYWxsb2NhdGluZwotICAgICAgICAgICAgICAgIC8vIHRoZSBvdXRwdXQgYnVmZmVycy4KLSAgICAgICAgICAgICAgICBpZiAoZGF0YTEgPT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtRmlsbGVkQnVmZmVycy5lbXB0eSgpKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb25Qb3J0U2V0dGluZ3NDaGFuZ2VkKGRhdGExKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YTEgPT0ga1BvcnRJbmRleE91dHB1dCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AgfHwKQEAgLTI4MTEsNyArMjg5Miw3IEBACiB2b2lkIE9NWENvZGVjOjpvblBvcnRTZXR0aW5nc0NoYW5nZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICBDT0RFQ19MT0dWKCJQT1JUX1NFVFRJTkdTX0NIQU5HRUQoJWxkKSIsIHBvcnRJbmRleCk7CiAKLSAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClFWEVDVVRJTkcpOworICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IEVYRUNVVElOR19UT19JRExFKTsKICAgICBDSEVDS19FUShwb3J0SW5kZXgsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOwogICAgIENIRUNLKCFtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFBlbmRpbmcpOwogCkBAIC0yOTkzLDcgKzMwNzQsOCBAQAogCiAgICAgICAgIHNpemVfdCBzaXplID0gc3BlY2lmaWMtPm1TaXplOwogCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1NSU1FKQorICAgICAgICBpZiAoKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbU1JTUUpIHx8CisgICAgICAgICAgICAgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbU1JTUUpKQogICAgICAgICAgICAgICAgICYmICEobVF1aXJrcyAmIGtXYW50c05BTEZyYWdtZW50cykpIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtOQUxTdGFydENvZGVbNF0gPQogICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKQEAgLTQxMjgsNiArNDIxMCw3IEBACiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTVAzIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdTQkMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1ZPUkJJUyIsCisgICAgICAgICJPTVhfQVVESU9fQ29kaW5nT1BVUyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nV01BIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdSQSIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nTUlESSIsCkBAIC00NjU3LDYgKzQ3NDAsOCBAQAogICAgIH0KIAogICAgIC8vIENvbG9yIGZvcm1hdCBxdWVyeQorICAgIC8vIHJldHVybiBjb2xvcnMgaW4gdGhlIG9yZGVyIHJlcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50CisgICAgLy8gcHJlZml4ICJmbGV4aWJsZSIgc3RhbmRhcmQgb25lcyB3aXRoIHRoZSBmbGV4aWJsZSBlcXVpdmFsZW50CiAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHBvcnRGb3JtYXQ7CiAgICAgSW5pdE9NWFBhcmFtcygmcG9ydEZvcm1hdCk7CiAgICAgcG9ydEZvcm1hdC5uUG9ydEluZGV4ID0gIWlzRW5jb2RlciA/IDEgOiAwOwpAQCAtNDY2Nyw2ICs0NzUyLDIxIEBACiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgT01YX1UzMiBmbGV4aWJsZUVxdWl2YWxlbnQ7CisgICAgICAgIGlmIChBQ29kZWM6OmlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgb214LCBub2RlLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCwgJmZsZXhpYmxlRXF1aXZhbGVudCkpIHsKKyAgICAgICAgICAgIGJvb2wgbWFya2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHMtPm1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2Fwcy0+bUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkgPT0gZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1hcmtlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWFya2VkKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoKGZsZXhpYmxlRXF1aXZhbGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgY2Fwcy0+bUNvbG9yRm9ybWF0cy5wdXNoKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGYzZWViMDMuLjgyMWJkODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcApAQCAtMzIwLDI1ICszMjAsMjkgQEAKICAgICB9CiAKICAgICBzaXplX3QgbGVmdCA9IDA7Ci0gICAgc2l6ZV90IHJpZ2h0ID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICBzaXplX3QgY2VudGVyID0gbGVmdCAvIDIgKyByaWdodCAvIDIgKyAobGVmdCAmIHJpZ2h0ICYgMSk7CisgICAgc2l6ZV90IHJpZ2h0X3BsdXNfb25lID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICBzaXplX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKIAogICAgICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChjZW50ZXIpOwogCiAgICAgICAgIGlmICh0aW1lVXMgPCBlbnRyeS5tVGltZVVzKSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHRpbWVVcyA+IGVudHJ5Lm1UaW1lVXMpIHsKICAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgbGVmdCA9IGNlbnRlcjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGxlZnQgPT0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkpIHsKKyAgICAgICAgLS1sZWZ0OworICAgIH0KKwogICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGxlZnQpOwogCi0gICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJWQgLyAlZCBhdCBvZmZzZXQgJWxsZCIsCisgICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJXp1IC8gJXp1IGF0IG9mZnNldCAlbGxkIiwKICAgICAgICAgIGxlZnQsIG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpLCBlbnRyeS5tUGFnZU9mZnNldCk7CiAKICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KGVudHJ5Lm1QYWdlT2Zmc2V0KTsKQEAgLTM4MSw3ICszODUsNyBAQAogICAgIHNzaXplX3QgbjsKICAgICBpZiAoKG4gPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSkKICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJWQgYnl0ZXMiLAorICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCBvZmZzZXQsIG4pOwogCiAgICAgICAgIGlmIChuIDwgMCkgewpAQCAtNTA1LDcgKzUwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUpOwogCiAgICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KXBhY2tldFNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IDB4JTAxNmxseCwgZ290ICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IDB4JTAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCBkYXRhT2Zmc2V0LCBuKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CkBAIC01NDYsNyArNTUwLDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJWQiLCBuKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKIAogICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CkBAIC01OTAsNyArNTk0LDcgQEAKICAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAxKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOwpAQCAtNjAxLDcgKzYwNSw3IEBACiAgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMyk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKQEAgLTYxMiw3ICs2MTYsNyBAQAogICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDUpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CkBAIC05MDMsNyArOTA3LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICVkIiwgZmxhY1NpemUpOworICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKIAogICAgIHVpbnQzMl90IHBpY1R5cGU7CiAgICAgdWludDMyX3QgdHlwZUxlbjsKQEAgLTk1Myw3ICs5NTcsNyBAQAogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlZCB0cmFpbGluZyBieXRlcyIsCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAogICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CiAKICAgICBmaWxlTWV0YS0+c2V0RGF0YSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcAppbmRleCBlYWU3MjFiLi4yNzQ4MzQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0xMzMsNyArMTMzLDggQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKChlcnIgPSBmaW5kU2FtcGxlVGltZShzYW1wbGVJbmRleCwgJm1DdXJyZW50U2FtcGxlVGltZSkpICE9IE9LKSB7CisgICAgaWYgKChlcnIgPSBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZtQ3VycmVudFNhbXBsZVRpbWUsICZtQ3VycmVudFNhbXBsZUR1cmF0aW9uKSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoImZpbmRTYW1wbGVUaW1lIHJldHVybiBlcnJvciIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTI4NSw4ICsyODYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRTYW1wbGVUaW1lKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUpIHsKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbikgewogICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgewogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTMwOSw2ICszMTAsOCBAQAogCiAgICAgKnRpbWUgKz0gbVRhYmxlLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOwogCisgICAgKmR1cmF0aW9uID0gbVRUU0R1cmF0aW9uOworCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggOGRmYTM2NS4uYmRkNmQ1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcApAQCAtNTM0LDgzICs1MzQsNzIgQEAKIH0KIAogc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKIAogICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVNhbXBsZVNpemVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgdWludDMyX3QgY2VudGVyID0gKGxlZnQgKyByaWdodCkgLyAyOwotICAgICAgICB1aW50MzJfdCBjZW50ZXJUaW1lID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubUNvbXBvc2l0aW9uVGltZTsKKyAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TYW1wbGVTaXplczsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CisgICAgICAgIHVpbnQ2NF90IGNlbnRlclRpbWUgPQorICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjZW50ZXIsIHNjYWxlX251bSwgc2NhbGVfZGVuKTsKIAogICAgICAgICBpZiAocmVxX3RpbWUgPCBjZW50ZXJUaW1lKSB7Ci0gICAgICAgICAgICByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwogICAgICAgICB9IGVsc2UgaWYgKHJlcV90aW1lID4gY2VudGVyVGltZSkgewogICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubVNhbXBsZUluZGV4OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGxlZnQgPT0gbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1sZWZ0OwotICAgIH0KLQogICAgIHVpbnQzMl90IGNsb3Nlc3RJbmRleCA9IGxlZnQ7CiAKKyAgICBpZiAoY2xvc2VzdEluZGV4ID09IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0gZWxzZSBpZiAoY2xvc2VzdEluZGV4ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgcmV0dXJuIGZpcnN0IHNhbXBsZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOworICAgIH0KKwogICAgIHN3aXRjaCAoZmxhZ3MpIHsKICAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKICAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGNsb3Nlc3RJbmRleCA+IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gcmVxX3RpbWUpIHsKLSAgICAgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChjbG9zZXN0SW5kZXggKyAxIDwgbU51bVNhbXBsZVNpemVzCi0gICAgICAgICAgICAgICAgICAgICYmIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IHJlcV90aW1lKSB7Ci0gICAgICAgICAgICAgICAgKytjbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLKGZsYWdzID09IGtGbGFnQ2xvc2VzdCk7Ci0KLSAgICAgICAgICAgIGlmIChjbG9zZXN0SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgbGVmdCBuZWlnaGJvdXIgYW5kIHBpY2sgY2xvc2VzdC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNkaWZmMSA9Ci0gICAgICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1Db21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUpOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgYWJzZGlmZjIgPQotICAgICAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4IC0gMV0ubUNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWJzZGlmZjEgPiBhYnNkaWZmMikgewotICAgICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBjbG9zZXN0SW5kZXggLSAxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBpY2sgY2xvc2VzdCBiYXNlZCBvbiB0aW1lc3RhbXAuIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CisgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4LCBzY2FsZV9udW0sIHNjYWxlX2RlbiksIHJlcV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lLCBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCAtIDEsIHNjYWxlX251bSwgc2NhbGVfZGVuKSkpIHsKKyAgICAgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubVNhbXBsZUluZGV4OwotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02MzIsMTA5ICs2MjEsODUgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBsZWZ0ID0gMDsKLSAgICB1aW50MzJfdCByaWdodCA9IG1OdW1TeW5jU2FtcGxlczsKLSAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0KSAvIDI7CisgICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU3luY1NhbXBsZXM7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOwogICAgICAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2NlbnRlcl07CiAKICAgICAgICAgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA8IHgpIHsKLSAgICAgICAgICAgIHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRfc2FtcGxlX2luZGV4ID4geCkgewogICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0geDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChsZWZ0ID09IG1OdW1TeW5jU2FtcGxlcykgewogICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgewogICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGFmdGVyIHRoZSBsYXN0IG9uZTogJWQiLCBsZWZ0KTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KLSAgICAgICAgbGVmdCA9IGxlZnQgLSAxOworICAgICAgICBmbGFncyA9IGtGbGFnQmVmb3JlOworICAgIH0KKyAgICBlbHNlIGlmIChsZWZ0ID09IDApIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQmVmb3JlKSB7CisgICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYmVmb3JlIHRoZSBmaXJzdCBvbmU6ICVkIiwgbGVmdCk7CisKKyAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcworICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCBzZWVrIHRvIGZpcnN0IHN5bmMKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKICAgICB9CiAKLSAgICAvLyBOb3cgc3NpW2xlZnRdIGlzIHRoZSBzeW5jIHNhbXBsZSBpbmRleCBqdXN0IGJlZm9yZSAob3IgYXQpCi0gICAgLy8gc3RhcnRfc2FtcGxlX2luZGV4LgotICAgIC8vIEFsc28gc3RhcnRfc2FtcGxlX2luZGV4IDwgc3NpW2xlZnQgKyAxXSwgaWYgbGVmdCArIDEgPCBtTnVtU3luY1NhbXBsZXMuCi0KLSAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOwotCi0gICAgaWYgKGxlZnQgKyAxIDwgbU51bVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgIHVpbnQzMl90IHkgPSBtU3luY1NhbXBsZXNbbGVmdCArIDFdOwotCi0gICAgICAgIC8vIG91ciBzYW1wbGUgbGllcyBiZXR3ZWVuIHN5bmMgc2FtcGxlcyB4IGFuZCB5LgotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHN0YXJ0X3NhbXBsZV9pbmRleCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IHhfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHkpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgeV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHhfdGltZSwgc2FtcGxlX3RpbWUpCi0gICAgICAgICAgICAgICAgPiBhYnNfZGlmZmVyZW5jZSh5X3RpbWUsIHNhbXBsZV90aW1lKSkgewotICAgICAgICAgICAgLy8gUGljayB0aGUgc3luYyBzYW1wbGUgY2xvc2VzdCAodGltZXdpc2UpIHRvIHRoZSBzdGFydC1zYW1wbGUuCi0gICAgICAgICAgICB4ID0geTsKLSAgICAgICAgICAgICsrbGVmdDsKLSAgICAgICAgfQotICAgIH0KLQorICAgIC8vIE5vdyBzc2lbbGVmdCAtIDFdIDwoPSkgc3RhcnRfc2FtcGxlX2luZGV4IDw9IHNzaVtsZWZ0XQogICAgIHN3aXRjaCAoZmxhZ3MpIHsKICAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHggPiBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhsZWZ0ID4gMCk7Ci0KLSAgICAgICAgICAgICAgICB4ID0gbVN5bmNTYW1wbGVzW2xlZnQgLSAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh4ID4gc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBvZiBzeW5jIHNhbXBsZSBpbmRpY2VzIHdhcyBub3Qgc29ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0tbGVmdDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeCA8IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChsZWZ0ICsgMSA+PSBtTnVtU3luY1NhbXBsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4ID0gbVN5bmNTYW1wbGVzW2xlZnQgKyAxXTsKLQotICAgICAgICAgICAgICAgIGlmICh4IDwgc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0YWJsZSBvZiBzeW5jIHNhbXBsZSBpbmRpY2VzIHdhcyBub3Qgc29ydGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5LgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQogICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIHJvdXRlIGlzIG5vdCB1c2VkLCBidXQgaW1wbGVtZW50IGl0IG5vbmV0aGVsZXNzCisgICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzdGFydF9zYW1wbGVfaW5kZXgpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworCisgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CisgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KKyAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZShzYW1wbGVfdGltZSwgbG93ZXJfdGltZSkpIHsKKyAgICAgICAgICAgICAgICAtLWxlZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAotICAgICpzYW1wbGVfaW5kZXggPSB4OwotCisgICAgKnNhbXBsZV9pbmRleCA9IG1TeW5jU2FtcGxlc1tsZWZ0XTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc5Miw3ICs3NTcsOCBAQAogICAgICAgICBvZmY2NF90ICpvZmZzZXQsCiAgICAgICAgIHNpemVfdCAqc2l6ZSwKICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlKSB7CisgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN0YXR1c190IGVycjsKQEAgLTgzNCw2ICs4MDAsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChzYW1wbGVEdXJhdGlvbikgeworICAgICAgICAqc2FtcGxlRHVyYXRpb24gPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZUR1cmF0aW9uKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCmluZGV4IDc3Mzg1NGYuLmUyZTZkNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFNraXBDdXRCdWZmZXI6OlNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCkgewotICAgIG1Gcm9udFBhZGRpbmcgPSBza2lwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CiAgICAgbUJhY2tQYWRkaW5nID0gY3V0OwogICAgIG1Xcml0ZUhlYWQgPSAwOwogICAgIG1SZWFkSGVhZCA9IDA7CkBAIC05NCw2ICs5NCw3IEBACiAKIHZvaWQgU2tpcEN1dEJ1ZmZlcjo6Y2xlYXIoKSB7CiAgICAgbVdyaXRlSGVhZCA9IG1SZWFkSGVhZCA9IDA7CisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwOwogfQogCiB2b2lkIFNraXBDdXRCdWZmZXI6OndyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGYzZmMzZjYuLjQ0NDlkNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIApAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgLy8gY291bGRuJ3Qgb3BlbiBpdCBsb2NhbGx5LCBtYXliZSB0aGUgbWVkaWEgc2VydmVyIGNhbj8KLSAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKTsKKyAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBwYXRoKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCAweDdmZmZmZmZmZmZmZmZmZkwpOwogICAgICAgICBjbG9zZShmZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGU0ZDNjNzkuLjEwMWZjOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xNiwxMSArMTYsMTQgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIgorCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CkBAIC0yOSw2ICszMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MSw3ICs1NSw5IEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CiAKICAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKQEAgLTU5LDcgKzY1LDcgQEAKICAgICBkZWxldGUgbUFsYnVtQXJ0OwogICAgIG1BbGJ1bUFydCA9IE5VTEw7CiAKLSAgICBtU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmksIGhlYWRlcnMpOworICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOwogCiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSBmb3IgJyVzJy4iLCB1cmkpOwpAQCAtODQsNyArOTAsNyBAQAogICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewogICAgIGZkID0gZHVwKGZkKTsKIAotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogCiAgICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7CiAgICAgbU1ldGFEYXRhLmNsZWFyKCk7CkBAIC0yMzksNyArMjQ1LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzLCBtaW1lID0gJXMiLAorICAgICAgICAgICAgQUxPR1YoInRodW1iTmFpbFRpbWUgPSAlIiBQUklkNjQgIiB1cywgdGltZVVzID0gJSIgUFJJZDY0ICIgdXMsIG1pbWUgPSAlcyIsCiAgICAgICAgICAgICAgICAgIHRodW1iTmFpbFRpbWUsIHRpbWVVcywgbWltZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjIsNyArMzI4LDcgQEAKIFZpZGVvRnJhbWUgKlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAogICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikgewogCi0gICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlbGxkIHVzIG9wdGlvbjogJWQiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiAlIiBQUklkNjQgIiB1cyBvcHRpb246ICVkIiwgdGltZVVzLCBvcHRpb24pOwogCiAgICAgaWYgKG1FeHRyYWN0b3IuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigibm8gZXh0cmFjdG9yLiIpOwpAQCAtNDQ1LDMzICs0NTEsNTkgQEAKICAgICBzdHJ1Y3QgTWFwIHsKICAgICAgICAgaW50IGZyb207CiAgICAgICAgIGludCB0bzsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICB7IGtLZXlNSU1FVHlwZSwgTUVUQURBVEFfS0VZX01JTUVUWVBFIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSIH0sCi0gICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0gfSwKLSAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNUIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCBNRVRBREFUQV9LRVlfQVVUSE9SIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIgfSwKLSAgICAgICAgeyBrS2V5RGF0ZSwgTUVUQURBVEFfS0VZX0RBVEUgfSwKLSAgICAgICAgeyBrS2V5R2VucmUsIE1FVEFEQVRBX0tFWV9HRU5SRSB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgTUVUQURBVEFfS0VZX1RJVExFIH0sCi0gICAgICAgIHsga0tleVllYXIsIE1FVEFEQVRBX0tFWV9ZRUFSIH0sCi0gICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OIH0sCi0gICAgICAgIHsga0tleUxvY2F0aW9uLCBNRVRBREFUQV9LRVlfTE9DQVRJT04gfSwKKyAgICAgICAgeyBrS2V5TUlNRVR5cGUsIE1FVEFEQVRBX0tFWV9NSU1FVFlQRSwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCBNRVRBREFUQV9LRVlfQ0RfVFJBQ0tfTlVNQkVSLCAidHJhY2tudW1iZXIiIH0sCisgICAgICAgIHsga0tleURpc2NOdW1iZXIsIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwgImRpc2NudW1iZXIiIH0sCisgICAgICAgIHsga0tleUFsYnVtLCBNRVRBREFUQV9LRVlfQUxCVU0sICJhbGJ1bSIgfSwKKyAgICAgICAgeyBrS2V5QXJ0aXN0LCBNRVRBREFUQV9LRVlfQVJUSVNULCAiYXJ0aXN0IiB9LAorICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNULCAiYWxidW1hcnRpc3QiIH0sCisgICAgICAgIHsga0tleUF1dGhvciwgTUVUQURBVEFfS0VZX0FVVEhPUiwgTlVMTCB9LAorICAgICAgICB7IGtLZXlDb21wb3NlciwgTUVUQURBVEFfS0VZX0NPTVBPU0VSLCAiY29tcG9zZXIiIH0sCisgICAgICAgIHsga0tleURhdGUsIE1FVEFEQVRBX0tFWV9EQVRFLCBOVUxMIH0sCisgICAgICAgIHsga0tleUdlbnJlLCBNRVRBREFUQV9LRVlfR0VOUkUsICJnZW5yZSIgfSwKKyAgICAgICAgeyBrS2V5VGl0bGUsIE1FVEFEQVRBX0tFWV9USVRMRSwgInRpdGxlIiB9LAorICAgICAgICB7IGtLZXlZZWFyLCBNRVRBREFUQV9LRVlfWUVBUiwgInllYXIiIH0sCisgICAgICAgIHsga0tleVdyaXRlciwgTUVUQURBVEFfS0VZX1dSSVRFUiwgIndyaXRlciIgfSwKKyAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgImNvbXBpbGF0aW9uIiB9LAorICAgICAgICB7IGtLZXlMb2NhdGlvbiwgTUVUQURBVEFfS0VZX0xPQ0FUSU9OLCBOVUxMIH0sCiAgICAgfTsKKwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yICpkZXRlY3RvciA9IG5ldyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CiAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrTWFwW2ldLmZyb20sICZ2YWx1ZSkpIHsKLSAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtpXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgaWYgKGtNYXBbaV0ubmFtZSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCB0byBjaGFyc2V0IGRldGVjdG9yCisgICAgICAgICAgICAgICAgZGV0ZWN0b3ItPmFkZFRhZyhrTWFwW2ldLm5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYWRkIHRvIG91dHB1dCBsaXN0CisgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2ldLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBkZXRlY3Rvci0+ZGV0ZWN0QW5kQ29udmVydCgpOworICAgIGludCBzaXplID0gZGV0ZWN0b3ItPnNpemUoKTsKKyAgICBpZiAoc2l6ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICAgICAgZGV0ZWN0b3ItPmdldFRhZyhpLCAmbmFtZSwgJnZhbHVlKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga051bU1hcEVudHJpZXM7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm5hbWUgJiYgIXN0cmNtcChrTWFwW2pdLm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtqXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgZGV0ZWN0b3I7CisKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgc2l6ZV90IGRhdGFTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKaW5kZXggNjg2ZDAzYS4uNGUxYzY1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtNTQsOSArNTYsOSBAQAogICAgICAgICBBTE9HRSgiSW52YWxpZCBkaW1lbnNpb25zICVkeCVkIiwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiB8CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKTsKIAogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IGNvbXBvc2VyKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwpAQCAtNjgsNyArNzAsNyBAQAogICAgIHdwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlN1cmZhY2VNZWRpYVNvdXJjZTogZXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CkBAIC0xMDgsNyArMTEwLDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIG1CdWZmZXJRdWV1ZS0+ZHVtcChyZXN1bHQsICIiKTsKKyAgICBtQ29uc3VtZXItPmR1bXAocmVzdWx0LCAiIik7CiB9CiAKIHN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c2V0RnJhbWVSYXRlKGludDMyX3QgZnBzKQpAQCAtMTY2LDcgKzE2OCw3IEBACiAgICAgQ0hFQ0tfR1QobU1heEFjcXVpcmVkQnVmZmVyQ291bnQsIDEpOwogCiAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE3OSw3ICsxODEsNyBAQAogfQogCiBzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KSB7Ci0gICAgQUxPR1YoInNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoJWQpIiwgY291bnQpOworICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCV6dSkiLCBjb3VudCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIENIRUNLX0dUKGNvdW50LCAxKTsKQEAgLTIwNSw4ICsyMDcsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgd2hpbGUgKG1OdW1QZW5kaW5nQnVmZmVycyA+IDApIHsKLSAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICVkIGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKKyAgICAgICAgQUxPR0koIlN0aWxsIHdhaXRpbmcgZm9yICV6dSBidWZmZXJzIHRvIGJlIHJldHVybmVkLiIsCiAgICAgICAgICAgICAgICAgbU51bVBlbmRpbmdCdWZmZXJzKTsKIAogI2lmIERFQlVHX1BFTkRJTkdfQlVGRkVSUwpAQCAtMjE4LDExICsyMjMsOSBAQAogICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKICAgICB9CiAKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiB9CiAKIHNwPE1ldGFEYXRhPiBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpCkBAIC0yNjgsNyArMjcxLDcgQEAKICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwogICAgIG1lbWNweShkYXRhICsgNCwgJmJ1ZmZlckhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwogCi0gICAgQUxPR1YoImhhbmRsZSA9ICVwLCAsIG9mZnNldCA9ICVkLCBsZW5ndGggPSAlZCIsCisgICAgQUxPR1YoImhhbmRsZSA9ICVwLCAsIG9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1IiwKICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgKCpidWZmZXIpLT5yYW5nZV9sZW5ndGgoKSwgKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSk7CiB9CiAKQEAgLTI5Miw3ICsyOTUsNyBAQAogICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQogICAgIHdoaWxlIChtU3RhcnRlZCkgewogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHF1ZXVlZAogICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKQEAgLTMxNSw3ICszMTgsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lTnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLm1UaW1lc3RhbXAgPCBtU3RhcnRUaW1lTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZnJhbWUgcHJlZGF0ZXMgc3RhcnQgb2YgcmVjb3JkLCBkaXNjYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsIEVHTF9OT19ESVNQTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTM2Miw3ICszNjUsNyBAQAogICAgICgqYnVmZmVyKS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgKCpidWZmZXIpLT5hZGRfcmVmKCk7CiAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCk7Ci0gICAgQUxPR1YoIkZyYW1lcyBlbmNvZGVkID0gJWQsIHRpbWVzdGFtcCA9ICVsbGQsIHRpbWUgZGlmZiA9ICVsbGQiLAorICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgdGltZSBkaWZmID0gJSIgUFJJZDY0LAogICAgICAgICAgICAgbU51bUZyYW1lc0VuY29kZWQsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCwKICAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCAtIHByZXZUaW1lU3RhbXAgLyAxMDAwKTsKIApAQCAtNDE1LDcgKzQxOCw3IEBACiAgICAgICAgICAgICBBTE9HVigiU2xvdCAlZCByZXR1cm5lZCwgbWF0Y2hlcyBoYW5kbGUgPSAlcCIsIGlkLAogICAgICAgICAgICAgICAgICAgICBtU2xvdHNbaWRdLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUpOwogCi0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaWQsIG1TbG90c1tpZF0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAogICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOwogCkBAIC00NzYsNCArNDc5LDggQEAKICAgICB9CiB9CiAKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HX0FTU0VSVChmYWxzZSwgIlN1cmZhY2VNZWRpYVNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKwogfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCmluZGV4IDNkMmViMWYuLjFmZGIyNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcApAQCAtMTcsNyArMTcsMTEgQEAKICN1bmRlZiBfX1NUUklDVF9BTlNJX18KICNkZWZpbmUgX19TVERJTlRfTElNSVRTCiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJUaW1lZEV2ZW50UXVldWUiCkBAIC0yNiw5ICszMCw2IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oIgogCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtMjU4LDcgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgc3RhdGljIGludDY0X3Qga01heFRpbWVvdXRVcyA9IDEwMDAwMDAwbGw7ICAvLyAxMCBzZWNzCiAgICAgICAgICAgICAgICAgYm9vbCB0aW1lb3V0Q2FwcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGRlbGF5X3VzID4ga01heFRpbWVvdXRVcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiZGVsYXlfdXMgZXhjZWVkcyBtYXggdGltZW91dDogJWxsZCB1cyIsIGRlbGF5X3VzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImRlbGF5X3VzIGV4Y2VlZHMgbWF4IHRpbWVvdXQ6ICUiIFBSSWQ2NCAiIHVzIiwgZGVsYXlfdXMpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIG5ldmVyIGJsb2NrIGZvciBtb3JlIHRoYW4gMTAgc2VjcywgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIHNwbGl0IHVwIHRoZSBmdWxsIHRpbWVvdXQgaW50byBjaHVua3Mgb2YKQEAgLTMzNyw3ICszMzgsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIlRpbWVkRXZlbnRRdWV1ZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7ICAgIC8vIG5vdCBvbmV3YXkKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwpAQCAtMzYyLDcgKzM2Myw3IEBACiAgICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IDApOwogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCk7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDApOyAgLy8gbm90IG9uZXdheQogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgICAgIH0KICAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAyMTZhMzI5Li4yNWFmYzViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0xNywxMSArMTcsMTMgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtODMsNiArODUsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwogICAgIH0KIAorICAgIGludCBhdmdCaXRSYXRlOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdmdCaXRSYXRlKSkgeworICAgICAgICBtc2ctPnNldEludDMyKCJiaXQtcmF0ZSIsIGF2Z0JpdFJhdGUpOworICAgIH0KKwogICAgIGludDMyX3QgaXNTeW5jOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKSAmJiBpc1N5bmMgIT0gMCkgewogICAgICAgICBtc2ctPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7CkBAIC0xMDIsNiArMTA5LDI1IEBACiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItd2lkdGgiLCBzYXJXaWR0aCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItaGVpZ2h0Iiwgc2FySGVpZ2h0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBjb2xvckZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIGlmIChtZXRhLT5maW5kUmVjdChrS2V5Q3JvcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcEJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UmVjdCgiY3JvcCIsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwpAQCAtMTI4LDYgKzE1NCwxMSBAQAogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0FEVFMsICZpc0FEVFMpKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJpcy1hZHRzIiwgdHJ1ZSk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgYWFjUHJvZmlsZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKQEAgLTEzNSw2ICsxNjYsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBtYXhJbnB1dFNpemUpOwogICAgIH0KIAorICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICBtc2ctPnNldEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICB9CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC0yMTYsNiArMjUyLDU2IEBACiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMSIsIGJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIENIRUNLKHNpemUgPj0gNyk7CisgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClwdHJbMF0sIDF1KTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdICYgMzE7CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgPSBwdHJbMTJdOworICAgICAgICBwdHIgKz0gMjI7CisgICAgICAgIHNpemUgLT0gMjI7CisKKworICAgICAgICBzaXplX3QgbnVtb2ZBcnJheXMgPSAoY2hhcilwdHJbMF07CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBzaXplIC09IDE7CisgICAgICAgIHNpemVfdCBqID0gMCwgaSA9IDA7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMTAyNCk7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bW9mQXJyYXlzOyBpKyspIHsKKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworCisgICAgICAgICAgICAvL051bSBvZiBuYWxzCisgICAgICAgICAgICBzaXplX3QgbnVtb2ZOYWxzID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtb2ZOYWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhzaXplID49IDIpOworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKKworICAgICAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICAgICAgICAgIENIRUNLKHNpemUgPj0gbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpICsgNCwgcHRyLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkgKyA0ICsgbGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKwogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwogICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwpAQCAtMjUxLDYgKzMzNywxMyBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleU9wdXNIZWFkZXIsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTI3Nyw3ICszNzAsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QwLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTMwOCw3ICs0MDEsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZXJlIGNhbid0IGJlIGFub3RoZXIgcGFyYW0gaGVyZSwgc28gdXNlIGFsbCB0aGUgcmVzdAogICAgICAgICAgICAgICAgIGkgPSBjc2QxLT5zaXplKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJWQsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJibG9jayBhdCAlenUsIGxhc3Qgd2FzICVkIiwgaSwgbGFzdHBhcmFtb2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChsYXN0cGFyYW1vZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpIC0gbGFzdHBhcmFtb2Zmc2V0OwogICAgICAgICAgICAgICAgIGF2Y2NbYXZjY2lkeCsrXSA9IHNpemUgPj4gODsKQEAgLTQwMSw2ICs0OTQsMjUgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgc2FyV2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgc2FySGVpZ2h0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JvcFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BCb3R0b20pKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKSB7CkBAIC00NTIsNiArNTY0LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoInRpbWUtc2NhbGUiLCAmdGltZVNjYWxlKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCB0aW1lU2NhbGUpOworICAgIH0KKwogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQogCiAjaWYgMApAQCAtNTIzLDYgKzY0MCw3IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICAgICAgQVVESU9fRk9STUFUX0FNUl9XQiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgMCwgQVVESU9fRk9STUFUX0lOVkFMSUQgfQogfTsKIApAQCAtNTQwLDEwICs2NTgsNDYgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCitzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgeworICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQWFjUHJvZmlsZVR5cGU7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCBwcm9maWxlTG9va3VwW10gPSB7CisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTUFJTn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1NTUn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTFRQfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMX0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgIEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEV9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVSTEMsICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VSTEN9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExELCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMn0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfRUxEfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3ROdWxsLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ30sCit9OworCit2b2lkIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KCBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSkKK3sKK2NvbnN0IHN0cnVjdCBhYWNfZm9ybWF0X2NvbnZfdCogcCA9ICZwcm9maWxlTG9va3VwWzBdOworICAgIHdoaWxlIChwLT5lQWFjUHJvZmlsZVR5cGUgIT0gT01YX0FVRElPX0FBQ09iamVjdE51bGwpIHsKKyAgICAgICAgaWYgKGVBYWNQcm9maWxlID09IHAtPmVBYWNQcm9maWxlVHlwZSkgeworICAgICAgICAgICAgZm9ybWF0ID0gcC0+Zm9ybWF0OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICsrcDsKKyAgICB9CisgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0FBQzsKKyAgICByZXR1cm47Cit9CisKIGJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAogICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwpAQCAtNTYyLDE1ICs3MTYsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIGNoZWNrIHdoZXRoZXIgaXQgaXMgRUxEL0xEIGNvbnRlbnQgLT4gbm8gb2ZmbG9hZGluZwotICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBkZXBlbmQgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4gbWFwTWltZVRvQXVkaW9Gb3JtYXQoKSBzaG91bGQgdXNlIHRoZQotICAgIC8vIG1ldGFkYXRhIHRvIHJlZmluZSB0aGUgQUFDIGZvcm1hdCBhbmQgdGhlIGF1ZGlvIEhBTCBzaG91bGQgb25seSBsaXN0IHN1cHBvcnRlZCBwcm9maWxlcy4KKyAgICAvLyBSZWRlZmluZSBhYWMgZm9ybWF0IGFjY29yZGluZyB0byBpdHMgcHJvZmlsZQorICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBpZiAoYWFjYW90ID09IDIzIHx8IGFhY2FvdCA9PSAzOSApIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgaXMgRUxEL0xEIGNvbnRlbnQiLCBtaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKQEAgLTYxNSw1ICs3NjUsNDAgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorQVN0cmluZyB1cmlEZWJ1Z1N0cmluZyhjb25zdCBBU3RyaW5nICZ1cmksIGJvb2wgaW5jb2duaXRvKSB7CisgICAgaWYgKGluY29nbml0bykgeworICAgICAgICByZXR1cm4gQVN0cmluZygiPFVSSSBzdXBwcmVzc2VkPiIpOworICAgIH0KKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmxvZy11cmkiLCBwcm9wLCAiZmFsc2UiKSAmJgorICAgICAgICAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjbXAocHJvcCwgInRydWUiKSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNjaGVtZQorICAgIEFTdHJpbmcgc2NoZW1lOworICAgIGNvbnN0IGNoYXIgKmNoYXJzID0gdXJpLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cmkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciBjID0gY2hhcnNbaV07CisgICAgICAgIGlmICghaXNhc2NpaShjKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcrJyB8fCBjID09ICcuJyB8fCBjID09Jy0nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc6JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2NoZW1lID0gQVN0cmluZyh1cmksIDAsIGkpOworICAgICAgICBzY2hlbWUuYXBwZW5kKCI6Ly88c3VwcHJlc3NlZD4iKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtZTsKKyAgICB9CisgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKaW5kZXggYWY4NThiOS4uZTk4OGY2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJWQlJJU2Vla2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9WQlJJU2Vla2VyLmgiCkBAIC03NSw3ICs3OCw3IEBACiAgICAgc2l6ZV90IGVudHJ5U2l6ZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMl0pOwogICAgIHNpemVfdCBzY2FsZSA9IFUxNl9BVCgmdmJyaUhlYWRlclsyMF0pOwogCi0gICAgQUxPR1YoIiVkIGVudHJpZXMsIHNjYWxlPSVkLCBzaXplX3Blcl9lbnRyeT0lZCIsCisgICAgQUxPR1YoIiV6dSBlbnRyaWVzLCBzY2FsZT0lenUsIHNpemVfcGVyX2VudHJ5PSV6dSIsCiAgICAgICAgICBudW1FbnRyaWVzLAogICAgICAgICAgc2NhbGUsCiAgICAgICAgICBlbnRyeVNpemUpOwpAQCAtMTE5LDcgKzEyMiw3IEBACiAKICAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7CiAKLSAgICAgICAgQUxPR1YoImVudHJ5ICMlZDogJXUgb2Zmc2V0IDB4JTAxNmxseCIsIGksIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBBTE9HVigiZW50cnkgIyV6dTogJXUgb2Zmc2V0IDB4JTAxNmxseCIsIGksIG51bUJ5dGVzLCBvZmZzZXQpOwogICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXM7CiAgICAgfQogCkBAIC0xNjAsNyArMTYzLDcgQEAKICAgICAgICAgKnBvcyArPSBtU2VnbWVudHMuaXRlbUF0KHNlZ21lbnRJbmRleCsrKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlbGxkIHVzID0+IDB4JTAxNmxseCIsICp0aW1lVXMsICpwb3MpOworICAgIEFMT0dWKCJnZXRPZmZzZXRGb3JUaW1lICUiIFBSSWQ2NCAiIHVzID0+IDB4JTAxNmxseCIsICp0aW1lVXMsICpwb3MpOwogCiAgICAgKnRpbWVVcyA9IG5vd1VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAppbmRleCBmZTkwNThiLi5hNGE2NTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTQxNCw3ICs0MTQsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogKG1CaXRzUGVyU2FtcGxlID4+IDMpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPiBtU2l6ZSkgeworICAgICAgICBpZiAocG9zID4gKG9mZjY0X3QpbVNpemUpIHsKICAgICAgICAgICAgIHBvcyA9IG1TaXplOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zICsgbU9mZnNldDsKQEAgLTQzOSw2ICs0MzksMTAgQEAKICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtYXhCeXRlc0F2YWlsYWJsZTsKICAgICB9CiAKKyAgICAvLyByZWFkIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBhdWRpbyB1bml0IGZyYW1lcy4KKyAgICBjb25zdCBzaXplX3QgaW5wdXRVbml0RnJhbWVTaXplID0gbU51bUNoYW5uZWxzICogbUJpdHNQZXJTYW1wbGUgLyA4OworICAgIG1heEJ5dGVzVG9SZWFkIC09IG1heEJ5dGVzVG9SZWFkICUgaW5wdXRVbml0RnJhbWVTaXplOworCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CiAgICAgICAgIC8vIE1pY3Jvc29mdCBwYWNrcyAyIGZyYW1lcyBpbnRvIDY1IGJ5dGVzLCByYXRoZXIgdGhhbiB1c2luZyBzZXBhcmF0ZSAzMy1ieXRlIGZyYW1lcywKICAgICAgICAgLy8gc28gcmVhZCBtdWx0aXBsZXMgb2YgNjUsIGFuZCB1c2Ugc21hbGxlciBidWZmZXJzIHRvIGFjY291bnQgZm9yIH4xMDoxIGV4cGFuc2lvbiByYXRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKaW5kZXggYzZhYzBkYS4uMzhhMWY2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCkBAIC00MCw2ICs0MCwyNSBAQAogICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOwogfQogCitzaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFKGJyKTsKKworICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtKGNvZGVOdW0gLyAyKTsKK30KKworc3RhdGljIHZvaWQgc2tpcFNjYWxpbmdMaXN0KEFCaXRSZWFkZXIgKmJyLCBzaXplX3Qgc2l6ZU9mU2NhbGluZ0xpc3QpIHsKKyAgICBzaXplX3QgbGFzdFNjYWxlID0gODsKKyAgICBzaXplX3QgbmV4dFNjYWxlID0gODsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVPZlNjYWxpbmdMaXN0OyArK2opIHsKKyAgICAgICAgaWYgKG5leHRTY2FsZSAhPSAwKSB7CisgICAgICAgICAgICBzaWduZWQgZGVsdGFfc2NhbGUgPSBwYXJzZVNFKGJyKTsKKyAgICAgICAgICAgIG5leHRTY2FsZSA9IChsYXN0U2NhbGUgKyBkZWx0YV9zY2FsZSArIDI1NikgJSAyNTY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0U2NhbGUgPSAobmV4dFNjYWxlID09IDApID8gbGFzdFNjYWxlIDogbmV4dFNjYWxlOworICAgIH0KK30KKwogLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgogdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LApAQCAtNjMsNyArODIsMjQgQEAKICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2x1bWFfbWludXM4CiAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4CiAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gcXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnCi0gICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDB1KTsgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKKworICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0KKworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiB0aGUgY29kZSBiZWxvdyBoYXMgbm90IGV2ZXIgYmVlbiBleGVyY2lzZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIHJlYWwtd29ybGQgZXhhbXBsZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0NHg0W2ldLDE2LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgMTYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q4eDhbaS02XSw2NCwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDY0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5ZTNmZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAotICAgICAgICBEYXRhVXJpU291cmNlLmNwcCBcCi0gICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwIFwKLSAgICAgICAgc3VwcG9ydC5jcHAgXAotICAgICAgICBjaHJvbWl1bV9odHRwX3N0dWIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0gICAgICAgIGV4dGVybmFsL2Nocm9taXVtIFwKLSAgICAgICAgZXh0ZXJuYWwvY2hyb21pdW0vYW5kcm9pZAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0bHBvcnQgXAotICAgICAgICBsaWJjaHJvbWl1bV9uZXQgXAotICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYmN1dGlscyBcCi0gICAgICAgIGxpYmxvZyBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBcCi0gICAgICAgIGxpYmRybWZyYW1ld29yawotCi1pbmNsdWRlIGV4dGVybmFsL3N0bHBvcnQvbGlic3RscG9ydC5tawotCi1MT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLWVuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1YzI4MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNocm9taXVtSFRUUERhdGFTb3VyY2UiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgInN1cHBvcnQuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1DaHJvbWl1bUhUVFBEYXRhU291cmNlOjpDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1TdGF0ZShESVNDT05ORUNURUQpLAotICAgICAgbURlbGVnYXRlKG5ldyBTZkRlbGVnYXRlKSwKLSAgICAgIG1DdXJyZW50T2Zmc2V0KDApLAotICAgICAgbUlPUmVzdWx0KE9LKSwKLSAgICAgIG1Db250ZW50U2l6ZSgtMSksCi0gICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKLSAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKLSAgICBtRGVsZWdhdGUtPnNldE93bmVyKHRoaXMpOwotfQotCi1DaHJvbWl1bUhUVFBEYXRhU291cmNlOjp+Q2hyb21pdW1IVFRQRGF0YVNvdXJjZSgpIHsKLSAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICBkZWxldGUgbURlbGVnYXRlOwotICAgIG1EZWxlZ2F0ZSA9IE5VTEw7Ci0KLSAgICBjbGVhckRSTVN0YXRlX2woKTsKLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdWlkX3QgdWlkOwotICAgIGlmIChnZXRVSUQoJnVpZCkpIHsKLSAgICAgICAgbURlbGVnYXRlLT5zZXRVSUQodWlkKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCAiY29ubmVjdCBvbiBiZWhhbGYgb2YgdWlkICVkIiwgdWlkKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGNvbm5lY3RfbCh1cmksIGhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmNvbm5lY3RfbCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgewotICAgICAgICBkaXNjb25uZWN0X2woKTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLAotICAgICAgICAgICAgICAgICJjb25uZWN0IHRvIDxVUkwgc3VwcHJlc3NlZD4gQCVsbGQiLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgICBtVVJJID0gdXJpOwotICAgIG1Db250ZW50VHlwZSA9IFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotCi0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBtSGVhZGVycyA9ICpoZWFkZXJzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IZWFkZXJzLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVElORzsKLSAgICBtQ29udGVudFNpemUgPSAtMTsKLSAgICBtQ3VycmVudE9mZnNldCA9IG9mZnNldDsKLQotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVDb25uZWN0aW9uKG1VUkkuY19zdHIoKSwgJm1IZWFkZXJzLCBvZmZzZXQpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBDT05ORUNUSU5HIHx8IG1TdGF0ZSA9PSBESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1TdGF0ZSA9PSBDT05ORUNURUQgPyBPSyA6IG1JT1Jlc3VsdDsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvblJlZGlyZWN0KGNvbnN0IGNoYXIgKnVybCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVVSSSA9IHVybDsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgaW50NjRfdCBjb250ZW50U2l6ZSwgY29uc3QgY2hhciAqY29udGVudFR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIGluaXRpYXRlZCBkaXNjb25uZWN0aW9uLgotICAgICAgICBDSEVDS19FUShtU3RhdGUsIERJU0NPTk5FQ1RJTkcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgIG1Db250ZW50U2l6ZSA9IChjb250ZW50U2l6ZSA8IDApID8gLTEgOiBjb250ZW50U2l6ZSArIG1DdXJyZW50T2Zmc2V0OwotICAgIG1Db250ZW50VHlwZSA9IFN0cmluZzgoY29udGVudFR5cGUpOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0KLSAgICAvLyBtVVJJLmNsZWFyKCk7Ci0KLSAgICBtSU9SZXN1bHQgPSBlcnI7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGRpc2Nvbm5lY3RfbCgpOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmRpc2Nvbm5lY3RfbCgpIHsKLSAgICBpZiAobVN0YXRlID09IERJU0NPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN0YXRlID0gRElTQ09OTkVDVElORzsKLSAgICBtSU9SZXN1bHQgPSAtRUlOVFI7Ci0KLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlRGlzY29ubmVjdCgpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBESVNDT05ORUNUSU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RFRCA/IE9LIDogTk9fSU5JVDsKLX0KLQotc3NpemVfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSNpZiAwCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LmRpc2FibGUtbmV0IiwgdmFsdWUsIDApCi0gICAgICAgICAgICAmJiAoIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikgfHwgIXN0cmNtcCh2YWx1ZSwgIjEiKSkpIHsKLSAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiU2ltdWxhdGluZyB0aGF0IHRoZSBuZXR3b3JrIGlzIGRvd24uIik7Ci0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAob2Zmc2V0ICE9IG1DdXJyZW50T2Zmc2V0KSB7Ci0gICAgICAgIEFTdHJpbmcgdG1wID0gbVVSSTsKLSAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gdG1wSGVhZGVycyA9IG1IZWFkZXJzOwotCi0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RfbCh0bXAuY19zdHIoKSwgJnRtcEhlYWRlcnMsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TdGF0ZSA9IFJFQURJTkc7Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotCi0gICAgd2hpbGUgKG1TdGF0ZSA9PSBSRUFESU5HKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG1JT1Jlc3VsdCA8IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSU9SZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKLSAgICAgICAgaW50NjRfdCBkZWxheVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwotCi0gICAgICAgIC8vIFRoZSByZWFkIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgbUlPUmVzdWx0IGNvbnRhaW5zCi0gICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobUlPUmVzdWx0LCBkZWxheVVzKTsKLQotICAgICAgICBtQ3VycmVudE9mZnNldCArPSBtSU9SZXN1bHQ7Ci0gICAgICAgIHJldHVybiBtSU9SZXN1bHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVSUk9SX0lPOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUlPUmVzdWx0ID0gc2l6ZTsKLQotICAgIGlmIChtU3RhdGUgPT0gUkVBRElORykgewotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Db250ZW50U2l6ZSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgICpzaXplID0gbUNvbnRlbnRTaXplOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi11aW50MzJfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpmbGFncygpIHsKLSAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpJbml0aWF0ZVJlYWQoCi0gICAgICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1lLT5pbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6aW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgbURlbGVnYXRlLT5pbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25EaXNjb25uZWN0Q29tcGxldGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClESVNDT05ORUNUSU5HKTsKLQotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICAvLyBtVVJJLmNsZWFyKCk7Ci0gICAgbUlPUmVzdWx0ID0gLUVOT1RDT05OOwotCi0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotc3A8RGVjcnlwdEhhbmRsZT4gQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgLyogTm90ZSBpZiByZWRpcmVjdCBvY2N1cnMsIG1VcmkgaXMgdGhlIHJlZGlyZWN0IHVyaSBpbnN0ZWFkIG9mIHRoZQotICAgICAgICAgKiBvcmlnaW5hbCBvbmUKLSAgICAgICAgICovCi0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICBTdHJpbmc4KG1VUkkuY19zdHIoKSksIG1pbWUpOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXREcm1JbmZvKAotICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwotICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKLX0KLQotU3RyaW5nOCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXRVcmkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBTdHJpbmc4KG1VUkkuY19zdHIoKSk7Ci19Ci0KLVN0cmluZzggQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtQ29udGVudFR5cGU7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y2xlYXJEUk1TdGF0ZV9sKCkgewotICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKLSAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7Ci0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtVVJJLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlJlY29ubmVjdGluZy4uLiIpOwotICAgIHN0YXR1c190IGVyciA9IGNvbm5lY3RfbChtVVJJLmNfc3RyKCksICZtSGVhZGVycywgb2Zmc2V0KTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgIlJlY29ubmVjdCBmYWlsZWQgdy8gZXJyIDB4JTA4eCIsIGVycik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgcmV0dXJuIFNmRGVsZWdhdGU6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0RhdGFVcmlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9EYXRhVXJpU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmM2ZhMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0RhdGFVcmlTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0RhdGFVcmlTb3VyY2UuaD4KLQotI2luY2x1ZGUgPG5ldC9iYXNlL2RhdGFfdXJsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xldXJsL3NyYy9ndXJsLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EYXRhVXJpU291cmNlOjpEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgOgotICAgIG1EYXRhVXJpKHVyaSksCi0gICAgbUluaXRlZChOT19JTklUKSB7Ci0KLSAgICAvLyBDb3B5MTogY29uc3QgY2hhciAqdXJpIC0+IFN0cmluZzggbURhdGFVcmkuCi0gICAgc3RkOjpzdHJpbmcgbWltZVR5cGVTdHIsIHVudXNlZENoYXJzZXRTdHIsIGRhdGFTdHI7Ci0gICAgLy8gQ29weTI6IFN0cmluZzggbURhdGFVcmkgLT4gc3RkOjpzdHJpbmcKLSAgICBjb25zdCBib29sIHJldCA9IG5ldDo6RGF0YVVSTDo6UGFyc2UoCi0gICAgICAgICAgICBHVVJMKHN0ZDo6c3RyaW5nKG1EYXRhVXJpLnN0cmluZygpKSksCi0gICAgICAgICAgICAmbWltZVR5cGVTdHIsICZ1bnVzZWRDaGFyc2V0U3RyLCAmZGF0YVN0cik7Ci0gICAgLy8gQ29weTM6IHN0ZDo6c3RyaW5nIGRhdGFTdHIgLT4gQVN0cmluZyBtRGF0YQotICAgIG1EYXRhLnNldFRvKGRhdGFTdHIuZGF0YSgpLCBkYXRhU3RyLmxlbmd0aCgpKTsKLSAgICBtSW5pdGVkID0gcmV0ID8gT0sgOiBVTktOT1dOX0VSUk9SOwotCi0gICAgLy8gVGhlIGNocm9taXVtIGRhdGEgdXJsIGltcGxlbWVudGF0aW9uIGRlZmF1bHRzIHRvIHVzaW5nICJ0ZXh0L3BsYWluIgotICAgIC8vIGlmIG5vIG1pbWUgdHlwZSBpcyBzcGVjaWZpZWQuIFdlIHByZWZlciB0byBsZWF2ZSB0aGlzIHVuc3BlY2lmaWVkCi0gICAgLy8gaW5zdGVhZCwgc2luY2UgdGhlIG1pbWUgdHlwZSBpcyBzbmlmZmVkIGluIG1vc3QgY2FzZXMuCi0gICAgaWYgKG1pbWVUeXBlU3RyICE9ICJ0ZXh0L3BsYWluIikgewotICAgICAgICBtTWltZVR5cGUgPSBtaW1lVHlwZVN0ci5jX3N0cigpOwotICAgIH0KLX0KLQotc3NpemVfdCBEYXRhVXJpU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKm91dCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUluaXRlZCAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRlZDsKLSAgICB9Ci0KLSAgICBjb25zdCBvZmY2NF90IGxlbmd0aCA9IG1EYXRhLnNpemUoKTsKLSAgICBpZiAob2Zmc2V0ID49IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpkYXRhQnVmID0gbURhdGEuY19zdHIoKTsKLSAgICBjb25zdCBzaXplX3QgYnl0ZXNUb0NvcHkgPQotICAgICAgICAgICAgb2Zmc2V0ICsgc2l6ZSA+PSBsZW5ndGggPyAobGVuZ3RoIC0gb2Zmc2V0KSA6IHNpemU7Ci0KLSAgICBpZiAoYnl0ZXNUb0NvcHkgPiAwKSB7Ci0gICAgICAgIG1lbWNweShvdXQsIGRhdGFCdWYgKyBvZmZzZXQsIGJ5dGVzVG9Db3B5KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnl0ZXNUb0NvcHk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWY2ZGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi0jaW5jbHVkZSA8aW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL0RhdGFVcmlTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1IVFRQQmFzZSAqY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBuZXcgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci19Ci0KLXN0YXR1c190IFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgcmV0dXJuIENocm9taXVtSFRUUERhdGFTb3VyY2U6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgewotICAgIHJldHVybiBuZXcgRGF0YVVyaVNvdXJjZSh1cmkpOwotfQotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNDg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNocm9taXVtSFRUUERhdGFTb3VyY2VTdXBwb3J0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJzdXBwb3J0LmgiCi0KLSNpbmNsdWRlICJhbmRyb2lkL25ldC9hbmRyb2lkX25ldHdvcmtfbGlicmFyeV9pbXBsLmgiCi0jaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvY2VydF92ZXJpZmllci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2Nvb2tpZV9tb25zdGVyLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvaG9zdF9yZXNvbHZlci5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL3NzbF9jb25maWdfc2VydmljZS5oIgotI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfYXV0aF9oYW5kbGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJuZXQvaHR0cC9odHRwX2NhY2hlLmgiCi0jaW5jbHVkZSAibmV0L3Byb3h5L3Byb3h5X2NvbmZpZ19zZXJ2aWNlX2FuZHJvaWQuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggaW50ZXJmYWNlIGRlZmluZWQgaW4gSUF1ZGlvU2VydmljZS5haWRsCi1jbGFzcyBJQXVkaW9TZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvU2VydmljZSk7Ci0KLSAgICB2aXJ0dWFsIGludCB2ZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkgPSAwOwotfTsKLQotY2xhc3MgQnBBdWRpb1NlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvU2VydmljZT4KLXsKLXB1YmxpYzoKLSAgICBCcEF1ZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9TZXJ2aWNlPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCB2ZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjZXJ0X2NoYWluLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgLy8gVGhlIHZlY3RvciBvZiBzdGQ6OnN0cmluZyB3ZSBnZXQgaXNuJ3QgcmVhbGx5IGEgdmVjdG9yIG9mIHN0cmluZ3MsCi0gICAgICAgIC8vIGJ1dCByYXRoZXIgYSB2ZWN0b3Igb2YgYmluYXJ5IGNlcnRpZmljYXRlIGRhdGEuIElmIHdlIHRyeSB0byBwYXNzCi0gICAgICAgIC8vIGl0IHRvIEphdmEgbGFuZ3VhZ2UgY29kZSBhcyBhIHN0cmluZywgaXQgZW5kcyB1cCBtYW5nbGVkIG9uIHRoZSBvdGhlcgotICAgICAgICAvLyBzaWRlLCBzbyBzZW5kIHRoZW0gYXMgYnl0ZXMgaW5zdGVhZC4KLSAgICAgICAgLy8gU2luY2Ugd2UgY2FuJ3Qgc2VuZCBhbiBhcnJheSBvZiBieXRlIGFycmF5cywgc2VuZCBhIHNpbmdsZSBhcnJheSwKLSAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSBzcGxpdCBvdXQgYnkgdGhlIHJlY2lwaWVudC4KLQotICAgICAgICBpbnQgbnVtY2VydHMgPSBjZXJ0X2NoYWluLnNpemUoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG51bWNlcnRzKTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1jZXJ0czsgaSsrKSB7Ci0gICAgICAgICAgICB0b3RhbCArPSBjZXJ0X2NoYWluW2ldLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgYnl0ZXNpemUgPSB0b3RhbCArIG51bWNlcnRzICogNDsKLSAgICAgICAgdWludDhfdCAqYnl0ZXMgPSAodWludDhfdCopIG1hbGxvYyhieXRlc2l6ZSk7Ci0gICAgICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgICAgIHJldHVybiA1OyAvLyBTU0xfSU5WQUxJRAotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlZCBjZXJ0czogJWQgLT4gJWQiLCBudW1jZXJ0cywgdG90YWwsIGJ5dGVzaXplKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1jZXJ0czsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGNlcnRzaXplID0gY2VydF9jaGFpbltpXS5zaXplKCk7Ci0gICAgICAgICAgICAvLyBzdG9yZSB0aGlzIGluIGEga25vd24gb3JkZXIsIHdoaWNoIGp1c3QgaGFwcGVucyB0byBtYXRjaCB0aGUgZGVmYXVsdAotICAgICAgICAgICAgLy8gYnl0ZSBvcmRlciBvZiBhIGphdmEgQnl0ZUJ1ZmZlcgotICAgICAgICAgICAgaW50MzJfdCBiaWdzaXplID0gaHRvbmwoY2VydHNpemUpOwotICAgICAgICAgICAgQUxPR1YoImNlcnQgJWQsIHNpemUgJWQiLCBpLCBjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoYnl0ZXMgKyBvZmZzZXQsICZiaWdzaXplLCBzaXplb2YoYmlnc2l6ZSkpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihiaWdzaXplKTsKLSAgICAgICAgICAgIG1lbWNweShieXRlcyArIG9mZnNldCwgY2VydF9jaGFpbltpXS5kYXRhKCksIGNlcnRzaXplKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBjZXJ0c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBkYXRhLndyaXRlQnl0ZUFycmF5KGJ5dGVzaXplLCBieXRlcyk7Ci0gICAgICAgIGZyZWUoYnl0ZXMpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoaG9zdG5hbWUuY19zdHIoKSkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYoU3RyaW5nMTYoYXV0aF90eXBlLmNfc3RyKCkpKTsKLQotICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgaWYgKHJlbW90ZSgpLT50cmFuc2FjdChJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLCBkYXRhLCAmcmVwbHkpICE9IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgfHwgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSA8IDAgfHwgcmVwbHkucmVhZEludDMyKCZyZXN1bHQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTsgLy8gU1NMX0lOVkFMSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1NlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1NlcnZpY2UiKTsKLQotCi1zdGF0aWMgTXV0ZXggZ05ldHdvcmtUaHJlYWRMb2NrOwotc3RhdGljIGJhc2U6OlRocmVhZCAqZ05ldHdvcmtUaHJlYWQgPSBOVUxMOwotc3RhdGljIHNjb3BlZF9yZWZwdHI8U2ZSZXF1ZXN0Q29udGV4dD4gZ1JlcUNvbnRleHQ7Ci1zdGF0aWMgc2NvcGVkX3B0cjxuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcj4gZ05ldHdvcmtDaGFuZ2VOb3RpZmllcjsKLQotYm9vbCBsb2dNZXNzYWdlSGFuZGxlcigKLSAgICAgICAgaW50IHNldmVyaXR5LAotICAgICAgICBjb25zdCBjaGFyKiBmaWxlLAotICAgICAgICBpbnQgbGluZSwKLSAgICAgICAgc2l6ZV90IG1lc3NhZ2Vfc3RhcnQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBpbnQgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfVkVSQk9TRTsKLSAgICBzd2l0Y2goc2V2ZXJpdHkpIHsKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19GQVRBTDoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfRkFUQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgbG9nZ2luZzo6TE9HX0VSUk9SX1JFUE9SVDoKLSAgICBjYXNlIGxvZ2dpbmc6OkxPR19FUlJPUjoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfRVJST1I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgbG9nZ2luZzo6TE9HX1dBUk5JTkc6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1dBUk47Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFuZHJvaWRTZXZlcml0eSA9IEFORFJPSURfTE9HX1ZFUkJPU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBhbmRyb2lkX3ByaW50TG9nKGFuZHJvaWRTZXZlcml0eSwgImNocm9taXVtLWxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgICAgICAgICAgICAgIiVzOiVkOiAlcyIsIGZpbGUsIGxpbmUsIHN0ci5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cnVjdCBBdXRvUHJpb3JpdHlTYXZlciB7Ci0gICAgQXV0b1ByaW9yaXR5U2F2ZXIoKQotICAgICAgICA6IG1USUQoYW5kcm9pZEdldFRpZCgpKSwKLSAgICAgICAgICBtUHJldlByaW9yaXR5KGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eShtVElEKSkgewotICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkobVRJRCwgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpOwotICAgIH0KLQotICAgIH5BdXRvUHJpb3JpdHlTYXZlcigpIHsKLSAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KG1USUQsIG1QcmV2UHJpb3JpdHkpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBwaWRfdCBtVElEOwotICAgIGludCBtUHJldlByaW9yaXR5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQXV0b1ByaW9yaXR5U2F2ZXIpOwotfTsKLQotc3RhdGljIHZvaWQgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ05ldHdvcmtUaHJlYWRMb2NrKTsKLQotICAgIGlmIChnTmV0d29ya1RocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbnkgdGhyZWFkcyBzcGF3bmVkIGJ5IHRoZSBjaHJvbWl1bSBmcmFtZXdvcmsgYXJlCi0gICAgICAgIC8vIHJ1bm5pbmcgYXQgbm9ybWFsIHByaW9yaXR5IGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGlzIHRocmVhZCdzLgotICAgICAgICBBdXRvUHJpb3JpdHlTYXZlciBzYXZlcjsKLQotICAgICAgICBnTmV0d29ya1RocmVhZCA9IG5ldyBiYXNlOjpUaHJlYWQoIm5ldHdvcmsiKTsKLSAgICAgICAgYmFzZTo6VGhyZWFkOjpPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIG9wdGlvbnMubWVzc2FnZV9sb29wX3R5cGUgPSBNZXNzYWdlTG9vcDo6VFlQRV9JTzsKLSAgICAgICAgQ0hFQ0soZ05ldHdvcmtUaHJlYWQtPlN0YXJ0V2l0aE9wdGlvbnMob3B0aW9ucykpOwotCi0gICAgICAgIGdSZXFDb250ZXh0ID0gbmV3IFNmUmVxdWVzdENvbnRleHQ7Ci0KLSAgICAgICAgZ05ldHdvcmtDaGFuZ2VOb3RpZmllci5yZXNldChuZXQ6Ok5ldHdvcmtDaGFuZ2VOb3RpZmllcjo6Q3JlYXRlKCkpOwotCi0gICAgICAgIG5ldDo6QW5kcm9pZE5ldHdvcmtMaWJyYXJ5OjpSZWdpc3RlclNoYXJlZEluc3RhbmNlKAotICAgICAgICAgICAgICAgIG5ldyBTZk5ldHdvcmtMaWJyYXJ5KTsKLSAgICAgICAgbG9nZ2luZzo6U2V0TG9nTWVzc2FnZUhhbmRsZXIobG9nTWVzc2FnZUhhbmRsZXIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgTVlfTE9HSShjb25zdCBjaGFyICpzKSB7Ci0gICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiJXMiLCBzKTsKLX0KLQotc3RhdGljIHZvaWQgTVlfTE9HVihjb25zdCBjaGFyICpzKSB7Ci0jaWYgIWRlZmluZWQoTE9HX05ERUJVRykgfHwgTE9HX05ERUJVRyA9PSAwCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCAiJXMiLCBzKTsKLSNlbmRpZgotfQotCi1TZk5ldExvZzo6U2ZOZXRMb2coKQotICAgIDogbU5leHRJRCgxKSB7Ci19Ci0KLXZvaWQgU2ZOZXRMb2c6OkFkZEVudHJ5KAotICAgICAgICBFdmVudFR5cGUgdHlwZSwKLSAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzICZ0aW1lLAotICAgICAgICBjb25zdCBTb3VyY2UgJnNvdXJjZSwKLSAgICAgICAgRXZlbnRQaGFzZSBwaGFzZSwKLSAgICAgICAgRXZlbnRQYXJhbWV0ZXJzICpwYXJhbXMpIHsKLSNpZiAwCi0gICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIkFkZEVudHJ5IHRpbWU9JXMgdHlwZT0lcyBzb3VyY2U9JXMgcGhhc2U9JXNcbiIsCi0gICAgICAgICAgICAgICAgVGlja0NvdW50VG9TdHJpbmcodGltZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICBFdmVudFR5cGVUb1N0cmluZyh0eXBlKSwKLSAgICAgICAgICAgICAgICBTb3VyY2VUeXBlVG9TdHJpbmcoc291cmNlLnR5cGUpLAotICAgICAgICAgICAgICAgIEV2ZW50UGhhc2VUb1N0cmluZyhwaGFzZSkpLmNfc3RyKCkpOwotI2VuZGlmCi19Ci0KLXVpbnQzMiBTZk5ldExvZzo6TmV4dElEKCkgewotICAgIHJldHVybiBtTmV4dElEKys7Ci19Ci0KLW5ldDo6TmV0TG9nOjpMb2dMZXZlbCBTZk5ldExvZzo6R2V0TG9nTGV2ZWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIExPR19CQVNJQzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZSZXF1ZXN0Q29udGV4dDo6U2ZSZXF1ZXN0Q29udGV4dCgpIHsKLSAgICBtVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCk7Ci0KLSAgICBzZXRfbmV0X2xvZyhuZXcgU2ZOZXRMb2coKSk7Ci0KLSAgICBzZXRfaG9zdF9yZXNvbHZlcigKLSAgICAgICAgbmV0OjpDcmVhdGVTeXN0ZW1Ib3N0UmVzb2x2ZXIoCi0gICAgICAgICAgICAgICAgbmV0OjpIb3N0UmVzb2x2ZXI6OmtEZWZhdWx0UGFyYWxsZWxpc20sCi0gICAgICAgICAgICAgICAgTlVMTCAvKiByZXNvbHZlcl9wcm9jICovLAotICAgICAgICAgICAgICAgIG5ldF9sb2coKSkpOwotCi0gICAgc2V0X3NzbF9jb25maWdfc2VydmljZSgKLSAgICAgICAgbmV0OjpTU0xDb25maWdTZXJ2aWNlOjpDcmVhdGVTeXN0ZW1TU0xDb25maWdTZXJ2aWNlKCkpOwotCi0gICAgbVByb3h5Q29uZmlnU2VydmljZSA9IG5ldyBuZXQ6OlByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQ7Ci0KLSAgICBzZXRfcHJveHlfc2VydmljZShuZXQ6OlByb3h5U2VydmljZTo6Q3JlYXRlV2l0aG91dFByb3h5UmVzb2x2ZXIoCi0gICAgICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UsIG5ldF9sb2coKSkpOwotCi0gICAgc2V0X2h0dHBfdHJhbnNhY3Rpb25fZmFjdG9yeShuZXcgbmV0OjpIdHRwQ2FjaGUoCi0gICAgICAgICAgICBob3N0X3Jlc29sdmVyKCksCi0gICAgICAgICAgICBuZXcgbmV0OjpDZXJ0VmVyaWZpZXIoKSwKLSAgICAgICAgICAgIGRuc3JyX3Jlc29sdmVyKCksCi0gICAgICAgICAgICBkbnNfY2VydF9jaGVja2VyKCksCi0gICAgICAgICAgICBwcm94eV9zZXJ2aWNlKCksCi0gICAgICAgICAgICBzc2xfY29uZmlnX3NlcnZpY2UoKSwKLSAgICAgICAgICAgIG5ldDo6SHR0cEF1dGhIYW5kbGVyRmFjdG9yeTo6Q3JlYXRlRGVmYXVsdChob3N0X3Jlc29sdmVyKCkpLAotICAgICAgICAgICAgbmV0d29ya19kZWxlZ2F0ZSgpLAotICAgICAgICAgICAgbmV0X2xvZygpLAotICAgICAgICAgICAgTlVMTCkpOyAgLy8gYmFja2VuZF9mYWN0b3J5Ci0KLSAgICBzZXRfY29va2llX3N0b3JlKG5ldyBuZXQ6OkNvb2tpZU1vbnN0ZXIoTlVMTCwgTlVMTCkpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyAmU2ZSZXF1ZXN0Q29udGV4dDo6R2V0VXNlckFnZW50KGNvbnN0IEdVUkwgJnVybCkgY29uc3QgewotICAgIHJldHVybiBtVXNlckFnZW50OwotfQotCi1zdGF0dXNfdCBTZlJlcXVlc3RDb250ZXh0Ojp1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Qcm94eUNvbmZpZ0xvY2spOwotCi0gICAgaWYgKGhvc3QgPT0gTlVMTCB8fCAqaG9zdCA9PSAnXDAnKSB7Ci0gICAgICAgIE1ZX0xPR1YoInVwZGF0ZVByb3h5Q29uZmlnIE5VTEwiKTsKLQotICAgICAgICBzdGQ6OnN0cmluZyBwcm94eTsKLSAgICAgICAgc3RkOjpzdHJpbmcgZXhMaXN0OwotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLT5VcGRhdGVQcm94eVNldHRpbmdzKHByb3h5LCBleExpc3QpOwotICAgIH0gZWxzZSB7Ci0jaWYgIWRlZmluZWQoTE9HX05ERUJVRykgfHwgTE9HX05ERUJVRyA9PSAwCi0gICAgICAgIExPR19QUkkoQU5EUk9JRF9MT0dfVkVSQk9TRSwgTE9HX1RBRywKLSAgICAgICAgICAgICAgICAidXBkYXRlUHJveHlDb25maWcgJXM6JWQsIGV4Y2x1ZGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0jZW5kaWYKLQotICAgICAgICBzdGQ6OnN0cmluZyBwcm94eSA9IFN0cmluZ1ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KS5jX3N0cigpOwotICAgICAgICBzdGQ6OnN0cmluZyBleExpc3QgPSBleGNsdXNpb25MaXN0OwotICAgICAgICBtUHJveHlDb25maWdTZXJ2aWNlLT5VcGRhdGVQcm94eVNldHRpbmdzKHByb3h5LCBleExpc3QpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZOZXR3b3JrTGlicmFyeTo6U2ZOZXR3b3JrTGlicmFyeSgpIHt9Ci0KLVNmTmV0d29ya0xpYnJhcnk6OlZlcmlmeVJlc3VsdCBTZk5ldHdvcmtMaWJyYXJ5OjpWZXJpZnlYNTA5Q2VydENoYWluKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGF1dGhfdHlwZSkgewotCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigiYXVkaW8iKSk7Ci0gICAgaWYgKGJpbmRlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJUaHJlYWQgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGF1ZGlvIHNlcnZpY2UiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxJQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvU2VydmljZT4oYmluZGVyKTsKLSAgICAgICAgaW50IGNvZGUgPSBzZXJ2aWNlLT52ZXJpZnlYNTA5Q2VydENoYWluKGNlcnRfY2hhaW4sIGhvc3RuYW1lLCBhdXRoX3R5cGUpOwotICAgICAgICBBTE9HVigidmVyaWZpZWQ6ICVkIiwgY29kZSk7Ci0gICAgICAgIGlmIChjb2RlID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX09LOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMikgeyAvLyBTU0xfSURNSVNNQVRDSAotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9CQURfSE9TVE5BTUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAzKSB7IC8vIFNTTF9VTlRSVVNURUQKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfTk9fVFJVU1RFRF9ST09UOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWRVJJRllfSU5WT0NBVElPTl9FUlJPUjsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2ZEZWxlZ2F0ZTo6U2ZEZWxlZ2F0ZSgpCi0gICAgOiBtT3duZXIoTlVMTCksCi0gICAgICBtVVJMUmVxdWVzdChOVUxMKSwKLSAgICAgIG1SZWFkQnVmZmVyKG5ldyBuZXQ6OklPQnVmZmVyV2l0aFNpemUoODE5MikpLAotICAgICAgbU51bUJ5dGVzUmVhZCgwKSwKLSAgICAgIG1OdW1CeXRlc1RvdGFsKDApLAotICAgICAgbURhdGFEZXN0aW5hdGlvbihOVUxMKSwKLSAgICAgIG1BdEVPUyhmYWxzZSkgewotICAgIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKTsKLX0KLQotU2ZEZWxlZ2F0ZTo6flNmRGVsZWdhdGUoKSB7Ci0gICAgQ0hFQ0sobVVSTFJlcXVlc3QgPT0gTlVMTCk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgU2ZEZWxlZ2F0ZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKTsKLQotICAgIHJldHVybiBnUmVxQ29udGV4dC0+dXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6c2V0T3duZXIoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqb3duZXIpIHsKLSAgICBtT3duZXIgPSBvd25lcjsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpzZXRVSUQodWlkX3QgdWlkKSB7Ci0gICAgZ1JlcUNvbnRleHQtPnNldFVJRCh1aWQpOwotfQotCi1ib29sIFNmRGVsZWdhdGU6OmdldFVJRCh1aWRfdCAqdWlkKSBjb25zdCB7Ci0gICAgcmV0dXJuIGdSZXFDb250ZXh0LT5nZXRVSUQodWlkKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblJlY2VpdmVkUmVkaXJlY3QoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGNvbnN0IEdVUkwgJm5ld191cmwsIGJvb2wgKmRlZmVyX3JlZGlyZWN0KSB7Ci0gICAgTVlfTE9HVigiT25SZWNlaXZlZFJlZGlyZWN0Iik7Ci0gICAgbU93bmVyLT5vblJlZGlyZWN0KG5ld191cmwuc3BlYygpLmNfc3RyKCkpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uQXV0aFJlcXVpcmVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OkF1dGhDaGFsbGVuZ2VJbmZvICphdXRoX2luZm8pIHsKLSAgICBNWV9MT0dWKCJPbkF1dGhSZXF1aXJlZCIpOwotCi0gICAgaW5oZXJpdGVkOjpPbkF1dGhSZXF1aXJlZChyZXF1ZXN0LCBhdXRoX2luZm8pOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6U1NMQ2VydFJlcXVlc3RJbmZvICpjZXJ0X3JlcXVlc3RfaW5mbykgewotICAgIE1ZX0xPR1YoIk9uQ2VydGlmaWNhdGVSZXF1ZXN0ZWQiKTsKLQotICAgIGluaGVyaXRlZDo6T25DZXJ0aWZpY2F0ZVJlcXVlc3RlZChyZXF1ZXN0LCBjZXJ0X3JlcXVlc3RfaW5mbyk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25TU0xDZXJ0aWZpY2F0ZUVycm9yKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgY2VydF9lcnJvciwgbmV0OjpYNTA5Q2VydGlmaWNhdGUgKmNlcnQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk9uU1NMQ2VydGlmaWNhdGVFcnJvciBjZXJ0X2Vycm9yPSVkXG4iLCBjZXJ0X2Vycm9yKTsKLQotICAgIGluaGVyaXRlZDo6T25TU0xDZXJ0aWZpY2F0ZUVycm9yKHJlcXVlc3QsIGNlcnRfZXJyb3IsIGNlcnQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uR2V0Q29va2llcyhuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpIHsKLSAgICBNWV9MT0dWKCJPbkdldENvb2tpZXMiKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblNldENvb2tpZSgKLSAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCi0gICAgICAgIGNvbnN0IG5ldDo6Q29va2llT3B0aW9ucyAmb3B0aW9ucywKLSAgICAgICAgYm9vbCBibG9ja2VkX2J5X3BvbGljeSkgewotICAgIE1ZX0xPR1YoIk9uU2V0Q29va2llIik7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25SZXNwb25zZVN0YXJ0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KSB7Ci0gICAgaWYgKHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpICE9IG5ldDo6VVJMUmVxdWVzdFN0YXR1czo6U1VDQ0VTUykgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICVkIGFuZCBvc19lcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5vc19lcnJvcigpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZChFUlJPUl9JTyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1SYW5nZVJlcXVlc3RlZCAmJiByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSAhPSAyMDYpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJXZSByZXF1ZXN0ZWQgYSBjb250ZW50IHJhbmdlLCBidXQgc2VydmVyIGRpZG4ndCAiCi0gICAgICAgICAgICAgICAgICAgICJzdXBwb3J0IHRoYXQuIChyZXNwb25kZWQgd2l0aCAlZCkiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoLUVQSVBFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoKHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpIC8gMTAwKSAhPSAyKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHJlc3BvbmRlZCB3aXRoIGh0dHAgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE1ZX0xPR1YoIk9uUmVzcG9uc2VTdGFydGVkIik7Ci0KLSAgICBzdGQ6OnN0cmluZyBoZWFkZXJzOwotICAgIHJlcXVlc3QtPkdldEFsbFJlc3BvbnNlSGVhZGVycygmaGVhZGVycyk7Ci0KLSAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigicmVzcG9uc2UgaGVhZGVyczogJXMiLCBoZWFkZXJzLmNfc3RyKCkpLmNfc3RyKCkpOwotCi0gICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGU7Ci0gICAgcmVxdWVzdC0+R2V0UmVzcG9uc2VIZWFkZXJCeU5hbWUoIkNvbnRlbnQtVHlwZSIsICZjb250ZW50VHlwZSk7Ci0KLSAgICBtT3duZXItPm9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICAgICAgcmVxdWVzdC0+R2V0RXhwZWN0ZWRDb250ZW50U2l6ZSgpLCBjb250ZW50VHlwZS5jX3N0cigpKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblJlYWRDb21wbGV0ZWQobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYnl0ZXNfcmVhZCkgewotICAgIGlmIChieXRlc19yZWFkID09IC0xKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiT25SZWFkQ29tcGxldGVkLCByZWFkIGZhaWxlZCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJPblJlYWRDb21wbGV0ZWQsIHJlYWQgJWQgYnl0ZXMiLCBieXRlc19yZWFkKS5jX3N0cigpKTsKLQotICAgIGlmIChieXRlc19yZWFkIDwgMCkgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlJlYWQgZmFpbGVkIHcvIHN0YXR1cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA9PSAwKSB7Ci0gICAgICAgIG1BdEVPUyA9IHRydWU7Ci0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKG1OdW1CeXRlc1JlYWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ0hFQ0tfR1QoYnl0ZXNfcmVhZCwgMCk7Ci0gICAgQ0hFQ0tfTEUobU51bUJ5dGVzUmVhZCArIGJ5dGVzX3JlYWQsIG1OdW1CeXRlc1RvdGFsKTsKLQotICAgIG1lbWNweSgodWludDhfdCAqKW1EYXRhRGVzdGluYXRpb24gKyBtTnVtQnl0ZXNSZWFkLAotICAgICAgICAgICBtUmVhZEJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICBieXRlc19yZWFkKTsKLQotICAgIG1OdW1CeXRlc1JlYWQgKz0gYnl0ZXNfcmVhZDsKLQotICAgIHJlYWRNb3JlKHJlcXVlc3QpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnJlYWRNb3JlKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCkgewotICAgIHdoaWxlIChtTnVtQnl0ZXNSZWFkIDwgbU51bUJ5dGVzVG90YWwpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBtTnVtQnl0ZXNUb3RhbCAtIG1OdW1CeXRlc1JlYWQ7Ci0gICAgICAgIGlmIChjb3B5ID4gbVJlYWRCdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgY29weSA9IG1SZWFkQnVmZmVyLT5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbjsKLSAgICAgICAgaWYgKHJlcXVlc3QtPlJlYWQobVJlYWRCdWZmZXIsIGNvcHksICZuKSkgewotICAgICAgICAgICAgTVlfTE9HVihTdHJpbmdQcmludGYoIlJlYWQgJWQgYnl0ZXMgZGlyZWN0bHkuIiwgbikuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIENIRUNLX0xFKChzaXplX3QpbiwgY29weSk7Ci0KLSAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKW1EYXRhRGVzdGluYXRpb24gKyBtTnVtQnl0ZXNSZWFkLAotICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgbik7Ci0KLSAgICAgICAgICAgIG1OdW1CeXRlc1JlYWQgKz0gbjsKLQotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNWV9MT0dWKCJyZWFkTW9yZSBwZW5kaW5nIHJlYWQiKTsKLQotICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpICE9IG5ldDo6VVJMUmVxdWVzdFN0YXR1czo6SU9fUEVORElORykgewotICAgICAgICAgICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3QgcmVhZCBmYWlsZWQgdy8gc3RhdHVzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLnN0YXR1cygpKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKEVSUk9SX0lPKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKG1OdW1CeXRlc1JlYWQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlQ29ubmVjdGlvbigKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBHVVJMIHVybCh1cmkpOwotCi0gICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7Ci0gICAgbG9vcC0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAotICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICB1cmwsCi0gICAgICAgICAgICAgICAgaGVhZGVycywKLSAgICAgICAgICAgICAgICBvZmZzZXQpKTsKLQotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZUNvbm5lY3Rpb25XcmFwcGVyKAotICAgICAgICBTZkRlbGVnYXRlICptZSwgR1VSTCB1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIG1lLT5vbkluaXRpYXRlQ29ubmVjdGlvbih1cmwsIGhlYWRlcnMsIG9mZnNldCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IEdVUkwgJnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmV4dHJhLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ID09IE5VTEwpOwotCi0gICAgbVVSTFJlcXVlc3QgPSBuZXcgbmV0OjpVUkxSZXF1ZXN0KHVybCwgdGhpcyk7Ci0gICAgbUF0RU9TID0gZmFsc2U7Ci0KLSAgICBtUmFuZ2VSZXF1ZXN0ZWQgPSBmYWxzZTsKLQotICAgIGlmIChvZmZzZXQgIT0gMCB8fCBleHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnMgPQotICAgICAgICAgICAgbVVSTFJlcXVlc3QtPmV4dHJhX3JlcXVlc3RfaGVhZGVycygpOwotCi0gICAgICAgIGlmIChvZmZzZXQgIT0gMCkgewotICAgICAgICAgICAgaGVhZGVycy5BZGRIZWFkZXJGcm9tU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlJhbmdlOiBieXRlcz0lbGxkLSIsIG9mZnNldCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIG1SYW5nZVJlcXVlc3RlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0cmEgIT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYS0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBU3RyaW5nIHM7Ci0gICAgICAgICAgICAgICAgcy5hcHBlbmQoZXh0cmEtPmtleUF0KGkpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChleHRyYS0+dmFsdWVBdChpKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBoZWFkZXJzLkFkZEhlYWRlckZyb21TdHJpbmcocy5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1VUkxSZXF1ZXN0LT5TZXRFeHRyYVJlcXVlc3RIZWFkZXJzKGhlYWRlcnMpOwotICAgIH0KLQotICAgIG1VUkxSZXF1ZXN0LT5zZXRfY29udGV4dChnUmVxQ29udGV4dCk7Ci0KLSAgICBtVVJMUmVxdWVzdC0+U3RhcnQoKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjppbml0aWF0ZURpc2Nvbm5lY3QoKSB7Ci0gICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7Ci0gICAgbG9vcC0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAotICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIsIHRoaXMpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSkgewotICAgIG1lLT5vbkluaXRpYXRlRGlzY29ubmVjdCgpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVEaXNjb25uZWN0KCkgewotICAgIGlmIChtVVJMUmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtVVJMUmVxdWVzdC0+Q2FuY2VsKCk7Ci0KLSAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgbU93bmVyLT5vbkRpc2Nvbm5lY3RDb21wbGV0ZSgpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE1lc3NhZ2VMb29wICpsb29wID0gZ05ldHdvcmtUaHJlYWQtPm1lc3NhZ2VfbG9vcCgpOwotICAgIGxvb3AtPlBvc3RUYXNrKAotICAgICAgICAgICAgRlJPTV9IRVJFLAotICAgICAgICAgICAgTmV3UnVubmFibGVGdW5jdGlvbigKLSAgICAgICAgICAgICAgICAmU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZVJlYWRXcmFwcGVyLCB0aGlzLCBkYXRhLCBzaXplKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlUmVhZFdyYXBwZXIoCi0gICAgICAgIFNmRGVsZWdhdGUgKm1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIG1lLT5vbkluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIENIRUNLKG1VUkxSZXF1ZXN0ICE9IE5VTEwpOwotCi0gICAgbU51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgbU51bUJ5dGVzVG90YWwgPSBzaXplOwotICAgIG1EYXRhRGVzdGluYXRpb24gPSBkYXRhOwotCi0gICAgaWYgKG1BdEVPUykgewotICAgICAgICBtT3duZXItPm9uUmVhZENvbXBsZXRlZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlYWRNb3JlKG1VUkxSZXF1ZXN0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1YTFkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTVVBQT1JUX0hfCi0KLSNkZWZpbmUgU1VQUE9SVF9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJuZXQvYmFzZS9uZXRfbG9nLmgiCi0jaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0X2NvbnRleHQuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9hbmRyb2lkX25ldHdvcmtfbGlicmFyeS5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2lvX2J1ZmZlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIG5ldCB7Ci0gICAgc3RydWN0IFByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQ7Ci19OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTZk5ldExvZyA6IHB1YmxpYyBuZXQ6Ok5ldExvZyB7Ci0gICAgU2ZOZXRMb2coKTsKLQotICAgIHZpcnR1YWwgdm9pZCBBZGRFbnRyeSgKLSAgICAgICAgICAgIEV2ZW50VHlwZSB0eXBlLAotICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzICZ0aW1lLAotICAgICAgICAgICAgY29uc3QgU291cmNlICZzb3VyY2UsCi0gICAgICAgICAgICBFdmVudFBoYXNlIHBoYXNlLAotICAgICAgICAgICAgRXZlbnRQYXJhbWV0ZXJzICpwYXJhbXMpOwotCi0gICAgdmlydHVhbCB1aW50MzIgTmV4dElEKCk7Ci0gICAgdmlydHVhbCBMb2dMZXZlbCBHZXRMb2dMZXZlbCgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHVpbnQzMiBtTmV4dElEOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZOZXRMb2cpOwotfTsKLQotc3RydWN0IFNmUmVxdWVzdENvbnRleHQgOiBwdWJsaWMgbmV0OjpVUkxSZXF1ZXN0Q29udGV4dCB7Ci0gICAgU2ZSZXF1ZXN0Q29udGV4dCgpOwotCi0gICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyAmR2V0VXNlckFnZW50KGNvbnN0IEdVUkwgJnVybCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbVByb3h5Q29uZmlnTG9jazsKLQotICAgIHN0ZDo6c3RyaW5nIG1Vc2VyQWdlbnQ7Ci0gICAgbmV0OjpQcm94eUNvbmZpZ1NlcnZpY2VBbmRyb2lkICptUHJveHlDb25maWdTZXJ2aWNlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZSZXF1ZXN0Q29udGV4dCk7Ci19OwotCi0vLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBodHRwcyBzdXBwb3J0LCB3ZSBkb24ndCByZWFsbHkgdmVyaWZ5IGNlcnRpZmljYXRlcywKLS8vIHdlIGFjY2VwdCBhbnl0aGluZy4uLgotc3RydWN0IFNmTmV0d29ya0xpYnJhcnkgOiBwdWJsaWMgbmV0OjpBbmRyb2lkTmV0d29ya0xpYnJhcnkgewotICAgIFNmTmV0d29ya0xpYnJhcnkoKTsKLQotICAgIHZpcnR1YWwgVmVyaWZ5UmVzdWx0IFZlcmlmeVg1MDlDZXJ0Q2hhaW4oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXV0aF90eXBlKTsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZk5ldHdvcmtMaWJyYXJ5KTsKLX07Ci0KLXN0cnVjdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOwotCi1zdHJ1Y3QgU2ZEZWxlZ2F0ZSA6IHB1YmxpYyBuZXQ6OlVSTFJlcXVlc3Q6OkRlbGVnYXRlIHsKLSAgICBTZkRlbGVnYXRlKCk7Ci0gICAgdmlydHVhbCB+U2ZEZWxlZ2F0ZSgpOwotCi0gICAgdm9pZCBpbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZvaWQgaW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0gICAgdm9pZCBpbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBzZXRPd25lcihDaHJvbWl1bUhUVFBEYXRhU291cmNlICptT3duZXIpOwotCi0gICAgLy8gR2V0cyB0aGUgVUlEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MKLSAgICBib29sIGdldFVJRCh1aWRfdCAqdWlkKSBjb25zdDsKLQotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZWNlaXZlZFJlZGlyZWN0KAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBjb25zdCBHVVJMICZuZXdfdXJsLCBib29sICpkZWZlcl9yZWRpcmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25BdXRoUmVxdWlyZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6QXV0aENoYWxsZW5nZUluZm8gKmF1dGhfaW5mbyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpTU0xDZXJ0UmVxdWVzdEluZm8gKmNlcnRfcmVxdWVzdF9pbmZvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblNTTENlcnRpZmljYXRlRXJyb3IoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBjZXJ0X2Vycm9yLCBuZXQ6Olg1MDlDZXJ0aWZpY2F0ZSAqY2VydCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25HZXRDb29raWVzKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBibG9ja2VkX2J5X3BvbGljeSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25TZXRDb29raWUoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29va2llX2xpbmUsCi0gICAgICAgICAgICBjb25zdCBuZXQ6OkNvb2tpZU9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgICAgICBib29sIGJsb2NrZWRfYnlfcG9saWN5KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBEZWxlZ2F0ZSBpbmhlcml0ZWQ7Ci0KLSAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptT3duZXI7Ci0KLSAgICBuZXQ6OlVSTFJlcXVlc3QgKm1VUkxSZXF1ZXN0OwotICAgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcldpdGhTaXplPiBtUmVhZEJ1ZmZlcjsKLQotICAgIHNpemVfdCBtTnVtQnl0ZXNSZWFkOwotICAgIHNpemVfdCBtTnVtQnl0ZXNUb3RhbDsKLSAgICB2b2lkICptRGF0YURlc3RpbmF0aW9uOwotCi0gICAgYm9vbCBtUmFuZ2VSZXF1ZXN0ZWQ7Ci0gICAgYm9vbCBtQXRFT1M7Ci0KLSAgICB2b2lkIHJlYWRNb3JlKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIoCi0gICAgICAgICAgICBTZkRlbGVnYXRlICptZSwKLSAgICAgICAgICAgIEdVUkwgdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlRGlzY29ubmVjdFdyYXBwZXIoU2ZEZWxlZ2F0ZSAqbWUpOwotCi0gICAgc3RhdGljIHZvaWQgT25Jbml0aWF0ZVJlYWRXcmFwcGVyKAotICAgICAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgb25Jbml0aWF0ZUNvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCBHVVJMICZ1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZvaWQgb25Jbml0aWF0ZURpc2Nvbm5lY3QoKTsKLSAgICB2b2lkIG9uSW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmRGVsZWdhdGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTVVBQT1JUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cF9zdHViLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YTg3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBib29sIGdGaXJzdCA9IHRydWU7Ci1zdGF0aWMgdm9pZCAqZ0hhbmRsZTsKLXN0YXRpYyBNdXRleCBnTGliTXV0ZXg7Ci0KLUhUVFBCYXNlICooKmdMaWJfY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSkodWludDMyX3QgZmxhZ3MpOwotRGF0YVNvdXJjZSAqKCpnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UpKGNvbnN0IGNoYXIgKnVyaSk7Ci0KLXN0YXR1c190ICgqZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcpKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1zdGF0aWMgYm9vbCBsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdMaWJNdXRleCk7Ci0gICAgdm9pZCAqc3ltOwotCi0gICAgaWYgKCFnRmlyc3QpIHsKLSAgICAgICAgcmV0dXJuIChnSGFuZGxlICE9IE5VTEwpOwotICAgIH0KLQotICAgIGdGaXJzdCA9IGZhbHNlOwotCi0gICAgZ0hhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cC5zbyIsIFJUTERfTk9XKTsKLSAgICBpZiAoZ0hhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSIpOwotICAgIGlmIChzeW0gPT0gTlVMTCkgewotICAgICAgICBnSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UgPSAoSFRUUEJhc2UgKigqKSh1aW50MzJfdCkpc3ltOwotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgImNyZWF0ZURhdGFVcmlTb3VyY2UiKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlID0gKERhdGFTb3VyY2UgKigqKShjb25zdCBjaGFyICopKXN5bTsKLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWciKTsKLSAgICBpZiAoc3ltID09IE5VTEwpIHsKLSAgICAgICAgZ0hhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ0xpYl9VcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcgPQotICAgICAgICAoc3RhdHVzX3QgKCopKGNvbnN0IGNoYXIgKiwgaW50MzJfdCwgY29uc3QgY2hhciAqKSlzeW07Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotSFRUUEJhc2UgKmNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAoIWxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX2NyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotfQotCi1zdGF0dXNfdCBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIGlmICghbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBnTGliX1VwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgewotICAgIGlmICghbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSh1cmkpOwotfQotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKaW5kZXggZmZhNjRmOS4uYWZiMDBhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawpAQCAtMyw3ICszLDggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgICAgU29mdEFBQzIuY3BwCisgICAgICBTb2Z0QUFDMi5jcHAgXAorICAgICAgRHJjUHJlc01vZGVXcmFwLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCkBAIC0xNyw2ICsxOCw4IEBACiAKIExPQ0FMX0NGTEFHUyA6PQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYkZyYXVuaG9mZXJBQUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDMl9EcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNjQKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTYgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggZDRiMGRlNy4uNDA5MjVmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTE0LDI3ICsxNCwzNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDMiIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEFBQzIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0QUFDMi5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKKyNpbmNsdWRlIDxtYXRoLmg+CisKICNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAyCiAKICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCA2NCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KLSNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA2ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgLTEgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KIC8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01NywxMSArNjUsOSBAQAogICAgICAgbVN0cmVhbUluZm8oTlVMTCksCiAgICAgICBtSXNBRFRTKGZhbHNlKSwKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbU91dHB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKLSAgICAgIG1TYXdJbnB1dEVvcyhmYWxzZSksCi0gICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zKGZhbHNlKSwKLSAgICAgIG1BbmNob3JUaW1lVXMoMCksCi0gICAgICBtTnVtU2FtcGxlc091dHB1dCgwKSwKKyAgICAgIG1MYXN0SW5IZWFkZXIoTlVMTCksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKICAgICBpbml0UG9ydHMoKTsKICAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwpAQCAtNjksNiArNzUsNyBAQAogCiBTb2Z0QUFDMjo6flNvZnRBQUMyKCkgewogICAgIGFhY0RlY29kZXJfQ2xvc2UobUFBQ0RlY29kZXIpOworICAgIGRlbGV0ZSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOwogfQogCiB2b2lkIFNvZnRBQUMyOjppbml0UG9ydHMoKSB7CkBAIC0xMTMsNiArMTIwLDcgQEAKIH0KIAogc3RhdHVzX3QgU29mdEFBQzI6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKICAgICBtQUFDRGVjb2RlciA9IGFhY0RlY29kZXJfT3BlbihUVF9NUDRfQURJRiwgLyogbnVtIGxheWVycyAqLyAxKTsKICAgICBpZiAobUFBQ0RlY29kZXIgIT0gTlVMTCkgewpAQCAtMTIxLDM2ICsxMjksNzMgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IE9LOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZWNvZGVySGFzRGF0YSA9IGZhbHNlOwogCi0gICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbgotICAgIC8vIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXM6CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgPSAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQgKiBrTnVtRGVsYXlCbG9ja3NNYXg7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG5ldyBzaG9ydFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisKKyAgICBpZiAobUFBQ0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaXMgbnVsbC4gVE9ETzogQ2FuIG5vdCBjYWxsIGFhY0RlY29kZXJfU2V0UGFyYW0gaW4gdGhlIGZvbGxvd2luZyBjb2RlIik7CisgICAgfQorCisgICAgLy9hYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX0xJTUlURVJfRU5BQkxFLCAwKTsKKworICAgIC8vaW5pdCBEUkMgd3JhcHBlcgorICAgIG1EcmNXcmFwLnNldERlY29kZXJIYW5kbGUobUFBQ0RlY29kZXIpOworICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworCisgICAgLy8gZm9yIHN0cmVhbXMgdGhhdCBjb250YWluIG1ldGFkYXRhLCB1c2UgdGhlIG1vYmlsZSBwcm9maWxlIERSQyBzZXR0aW5ncyB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzCisgICAgLy8gVE9ETzogY2hhbmdlIHRoZSBEUkMgc2V0dGluZ3MgZGVwZW5kaW5nIG9uIGF1ZGlvIG91dHB1dCBkZXZpY2UgdHlwZSAoSERNSSwgbG9hZHNwZWFrZXIsIGhlYWRwaG9uZSkKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgLy8gICogQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUCiAgICAgaWYgKHByb3BlcnR5X2dldChQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCByZWZMZXZlbCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwgb2YgJWQgaW5zdGVhZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgcmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgcmVmTGV2ZWwpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgcmVmTGV2ZWwsCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgcmVmTGV2ZWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKICAgICB9Ci0gICAgLy8gICogQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQ1VULCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgdW5zaWduZWQgY3V0ID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1dCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgY3V0KTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgY3V0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgY3V0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CiAgICAgfQotICAgIC8vICAqIEFBQ19EUkNfQk9PU1RfRkFDVE9SIChub3RlOiBubyBkZWZhdWx0LCB1c2luZyBjdXQpCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUgogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIHZhbHVlLCBOVUxMKSkgewogICAgICAgICB1bnNpZ25lZCBib29zdCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19CT09TVF9GQUNUT1Igb2YgJWQiLCBib29zdCk7Ci0gICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19EUkNfQk9PU1RfRkFDVE9SLCBib29zdCk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIGJvb3N0LAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsIGJvb3N0KTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgfQorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIHZhbHVlLCBOVUxMKSkgeworICAgICAgICB1bnNpZ25lZCBoZWF2eSA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIGluc3RlYWQgb2YgJWQiLCBoZWF2eSwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksIGhlYXZ5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgfQorICAgIC8vIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVAorICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgdW5zaWduZWQgZW5jb2RlclJlZkxldmVsID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBlbmNvZGVyLXNpZGUgRFJDIHJlZmVyZW5jZSBsZXZlbCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwKKyAgICAgICAgICAgICAgICBlbmNvZGVyUmVmTGV2ZWwsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsIGVuY29kZXJSZWZMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMjMzLDcgKzI3OCw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdEFBQzI6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KQEAgLTI2OSw2ICszMTQsNzEgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgLy8gZm9yIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBvZiB0aGUgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHN0cnVjdHVyZSwKKyAgICAgICAgICAgIC8vIGEgdmFsdWUgb2YgLTEgaW1wbGllcyB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uOgorICAgICAgICAgICAgLy8gICBuTWF4T3V0cHV0Q2hhbm5lbHMgICAgIHVzZXMgZGVmYXVsdCBwbGF0Zm9ybSBwcm9wZXJ0aWVzLCBzZWUgY29uZmlndXJlRG93bm1peCgpCisgICAgICAgICAgICAvLyAgIG5EcmNDdXQgICAgICAgICAgICAgICAgdXNlcyBkZWZhdWx0IHBsYXRmb3JtIHByb3BlcnRpZXMsIHNlZSBpbml0RGVjb2RlcigpCisgICAgICAgICAgICAvLyAgIG5EcmNCb29zdCAgICAgICAgICAgICAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5IZWF2eUNvbXByZXNzaW9uICAgICAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5UYXJnZXRSZWZlcmVuY2VMZXZlbCAgICBpZGVtCisgICAgICAgICAgICAvLyAgIG5FbmNvZGVkVGFyZ2V0TGV2ZWwgICAgICBpZGVtCisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbWF4OworICAgICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gOCkgeyBtYXggPSA4OyB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDYpIHsgbWF4ID0gNjsgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSAyKSB7IG1heCA9IDI7IH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLTEgb3IgMDogZGlzYWJsZSBkb3dubWl4LCAgMTogbW9ubworICAgICAgICAgICAgICAgICAgICBtYXggPSBhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbk1heE91dHB1dENoYW5uZWxzPSVkIiwgbWF4KTsKKyAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIG1heCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHVwZGF0ZURyY1dyYXBwZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0Jvb3N0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQgPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0N1dD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsIGFhY1ByZXNQYXJhbXMtPm5EcmNDdXQpOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5IZWF2eUNvbXByZXNzaW9uPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOworICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuVGFyZ2V0UmVmZXJlbmNlTGV2ZWw9JWQiLCBhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRW5jb2RlZFRhcmdldExldmVsPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgPj0gMCkgeworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAoYWFjUHJlc1BhcmFtcy0+blBDTUxpbWl0ZXJFbmFibGUgIT0gMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVwZGF0ZURyY1dyYXBwZXIpIHsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KQEAgLTI5MCwxOSArNDAwLDEwMCBAQAogICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+IDA7CiB9CiAKLXZvaWQgU29mdEFBQzI6Om1heWJlQ29uZmlndXJlRG93bm1peCgpIGNvbnN0IHsKLSAgICBpZiAobVN0cmVhbUluZm8tPm51bUNoYW5uZWxzID4gMikgewotICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgIGlmICghKHByb3BlcnR5X2dldCgibWVkaWEuYWFjXzUxX291dHB1dF9lbmFibGVkIiwgdmFsdWUsIE5VTEwpICYmCi0gICAgICAgICAgICAgICAgKCFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpKSkgewotICAgICAgICAgICAgQUxPR0koIkRvd25taXhpbmcgbXVsdGljaGFubmVsIEFBQyB0byBzdGVyZW8iKTsKLSAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fT1VUUFVUX0NIQU5ORUxTLCAyKTsKLSAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyA9IDI7Ci0gICAgICAgIH0KK3ZvaWQgU29mdEFBQzI6OmNvbmZpZ3VyZURvd25taXgoKSBjb25zdCB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmICghKHByb3BlcnR5X2dldCgibWVkaWEuYWFjXzUxX291dHB1dF9lbmFibGVkIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpKSB7CisgICAgICAgIEFMT0dJKCJsaW1pdGluZyB0byBzdGVyZW8gb3V0cHV0Iik7CisgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgMik7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBkZWNvZGVyIGNyZWF0ZXMgYSA1LjEgY2hhbm5lbCBkb3dubWl4IHNpZ25hbAorICAgICAgICAvLyBmb3Igc2V2ZW4gYW5kIGVpZ2h0IGNoYW5uZWwgaW5wdXQgc3RyZWFtcy4gVG8gZW5hYmxlIDYuMSBhbmQgNy4xIGNoYW5uZWwgb3V0cHV0CisgICAgICAgIC8vIHVzZSBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIC0xKQogICAgIH0KIH0KIAotdm9pZCBTb2Z0QUFDMjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworYm9vbCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICBpZiAobnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgPCBudW1TYW1wbGVzKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBPVkVSRkxPVyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zKytdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zXSA9IHNhbXBsZXNbaV07CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCArPSBudW1TYW1wbGVzOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworCisgICAgaWYgKG51bVNhbXBsZXMgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkKSB7CisgICAgICAgIEFMT0dFKCJSSU5HIEJVRkZFUiBXT1VMRCBVTkRFUlJVTiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZQorICAgICAgICAgICAgJiYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZhc3RlciBtZW1jb3B5IGxvb3Agd2l0aG91dCBjaGVja3MsIGlmIHRoZSBwcmVjb25kaXRpb25zIGFsbG93IHRoaXMKKyAgICAgICAgaWYgKHNhbXBsZXMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrK107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArPSBudW1TYW1wbGVzOworICAgICAgICB9CisgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigic2xvdyBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygpIik7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgLT0gbnVtU2FtcGxlczsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworaW50MzJfdCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKK30KKworaW50MzJfdCBTb2Z0QUFDMjo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSAtIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKK30KKworCit2b2lkIFNvZnRBQUMyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTMxNCw2NCArNTA1LDY5IEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUlucHV0QnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwotICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgaW5CdWZmZXJbMF0gPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gaGVhZGVyLT5uRmlsbGVkTGVuOwotCi0gICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQotICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKLQotICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOwotCi0gICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKLSAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KLSAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICYmIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgbWF5YmVDb25maWd1cmVEb3dubWl4KCk7Ci0gICAgICAgICAgICBBTE9HSSgiSW5pdGlhbGx5IGNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKLQotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCAobVNhd0lucHV0RW9zICYmICFtU2lnbmFsbGVkT3V0cHV0RW9zKSkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gTlVMTDsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gTlVMTDsKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIG1FbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CiAKLSAgICAgICAgaWYgKGluSGVhZGVyKSB7Ci0gICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNldCIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgIT0gMCkgeworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0NvbmZpZ1JhdyBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOyAvLyBmYWtlIGluY3JlYXNlIG9mIG91dHB1dEJ1ZmZlckNvdW50IHRvIGtlZXAgdGhlIGNvdW50ZXJzIGFsaWduZWQKKworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgY29uZmlndXJlRG93bm1peCgpOworICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgbnVtQ2hhbm5lbHMgYXJlIHZhbGlkLgorICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAmJiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkluaXRpYWxseSBjb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuKSB7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSXNBRFRTKSB7CkBAIC0zODQsNyArNTgwLDcgQEAKICAgICAgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgNykgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIGJ5dGVzLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIGJ5dGVzLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzk3LDkgKzU5Myw5IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgYWFjX2ZyYW1lX2xlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIGJ5dGVzLCBmcmFtZSBzaXplIGFjY29yZGluZyB0byB0aGUgQURUUyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzICV1IGJ5dGVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWQgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQxNSwxNDggKzYxMSwzNjcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgewogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUl9NQUxGT1JNRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQorICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIEVSUk9SX01BTEZPUk1FRCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYnVmZmVyIHNpemUgYW5kIHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKGluQnVmZmVyTGVuZ3RoWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RJbkhlYWRlciAhPSBpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IG1CdWZmZXJUaW1lc3RhbXBzLnRvcCgpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZSArPSBtU3RyZWFtSW5mby0+YWFjU2FtcGxlc1BlckZyYW1lICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGN1cnJlbnRUaW1lKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBpbkhlYWRlcjsKKyAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoaW5IZWFkZXItPm5UaW1lU3RhbXApOworICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5hZGQoaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSAwOwotICAgICAgICB9CiAKLSAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCi0gICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8SU5UX1BDTSAqPigKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOworICAgICAgICAgICAgLy8gRmlsbCBhbmQgZGVjb2RlCisgICAgICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07CiAKLSAgICAgICAgYnl0ZXNWYWxpZFswXSA9IGluQnVmZmVyTGVuZ3RoWzBdOworICAgICAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICBJTlQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwogCi0gICAgICAgIGludCBwcmV2U2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOwotICAgICAgICBpbnQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwotCi0gICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPSBBQUNfREVDX05PVF9FTk9VR0hfQklUUzsKLSAgICAgICAgd2hpbGUgKChieXRlc1ZhbGlkWzBdID4gMCB8fCBtU2F3SW5wdXRFb3MpICYmIGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKLSAgICAgICAgICAgIG1EZWNvZGVySGFzRGF0YSB8PSAoYnl0ZXNWYWxpZFswXSA+IDApOwogICAgICAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOwogCi0gICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkFsbG9jTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewotICAgICAgICAgICAgICAgIGlmIChtU2F3SW5wdXRFb3MgJiYgYnl0ZXNWYWxpZFswXSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2Rlckhhc0RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIG91dCB0aGUgZGVjb2RlcidzIGRlbGF5ZWQgZGF0YSBieSBjYWxsaW5nIERlY29kZUZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgbW9yZSB0aW1lLCB3aXRoIHRoZSBBQUNERUNfRkxVU0ggZmxhZyBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uQWxsb2NMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJIYXNEYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0gICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICAgICAgVUlOVCBpbkJ1ZmZlclVzZWRMZW5ndGggPSBpbkJ1ZmZlckxlbmd0aFswXSAtIGJ5dGVzVmFsaWRbMF07CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnI7CisgICAgICAgICAgICBpbnQgbnVtTG9vcHMgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHJpbmdidWZmZXIiKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIk5vdCBlbm91Z2ggYml0cywgYnl0ZXNWYWxpZCAlZCIsIGJ5dGVzVmFsaWRbMF0pOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzOworICAgICAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CisKKyAgICAgICAgICAgICAgICBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzIC0gbnVtQ29uc3VtZWQ7CisgICAgICAgICAgICAgICAgbnVtTG9vcHMrKzsKKworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGVjb2RlZFNpemVzLmFkZChudW1Db25zdW1lZCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzVmFsaWRbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYnl0ZXNWYWxpZFswXSAhPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dEJ5dGVzID0KKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAweCU0LjR4LCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0bXBPdXRCdWZmZXIsIDAsIG51bU91dEJ5dGVzKTsgLy8gVE9ETzogY2hlY2sgZm9yIG92ZXJmbG93CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEFmdGVyIGFuIGVycm9yLCByZXBsYWNlIHRoZSBsYXN0IGVudHJ5IGluIG1CdWZmZXJTaXplcyB3aXRoIHRoZSBzdW0gb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgPG51bUxvb3BzPiBlbnRyaWVzIGZyb20gbURlY29kZWRTaXplcyB0byByZXN5bmNocm9uaXplIHRoZSBpbi9vdXQgbGlzdHMuCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxvb3BzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gbURlY29kZWRTaXplcy5pdGVtQXQobURlY29kZWRTaXplcy5zaXplKCkgLSBudW1Mb29wcyArIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplcy5hZGQobik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgKiBvciBpbXBsaWNpdGx5LCBhY2NvcmRpbmcgdG8gTVBFRzQgc3BlYy4gQUFDKy9lQUFDKyBpcyBhIGR1YWwKKyAgICAgICAgICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQorICAgICAgICAgICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAorICAgICAgICAgICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZworICAgICAgICAgICAgICAgICAqIFNCUiBjb250ZW50IGluIEFBQyBleHRlbnNpb24gcGF5bG9hZCBzcGVjaWZpYyB0byBTQlIsIGFuZCBoZW5jZQorICAgICAgICAgICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogVGh1cywgd2UgY291bGQgbm90IHNheSBmb3Igc3VyZSB3aGV0aGVyIGEgc3RyZWFtIGlzCisgICAgICAgICAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA8PSAyIHx8IG1PdXRwdXRCdWZmZXJDb3VudCA+IDEpIHsgLy8gVE9ETzogPD0gMQorICAgICAgICAgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgIT0gcHJldlNhbXBsZVJhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTYW1wbGVSYXRlLCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZOdW1DaGFubmVscywgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSB8fCAhbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJbnZhbGlkIEFBQyBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlciAmJiBpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImluSGVhZGVyLT5uRmlsbGVkTGVuID0gJWQiLCBpbkhlYWRlciA/IGluSGVhZGVyLT5uRmlsbGVkTGVuIDogMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFtRW5kT2ZJbnB1dCAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CisgICAgICAgICAgICAvLyBkaXNjYXJkIG91dHB1dERlbGF5IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmIChkaXNjYXJkID4gdG9Db21wZW5zYXRlKSB7CisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZGVkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygwLCBkaXNjYXJkKTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworIAorICAgICAgICAgICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgICAgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnIgPQorICAgICAgICAgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgICAgICAgICBpZiAodG1wT3V0QnVmZmVyU2FtcGxlcyA+IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsIHRtcE91dEJ1ZmZlclNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkIC09IHRtcE91dEJ1ZmZlclNhbXBsZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQotICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA+PSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoaW5IZWFkZXIpIHsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spIHsKLSAgICAgICAgICAgICAgICBVSU5UIGluQnVmZmVyVXNlZExlbmd0aCA9IGluQnVmZmVyTGVuZ3RoWzBdIC0gYnl0ZXNWYWxpZFswXTsKLSAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBpbkJ1ZmZlclVzZWRMZW5ndGg7Ci0gICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gaW5CdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQUFDIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgJWQsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyRXJyKTsKLQotICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsIDAsIG51bU91dEJ5dGVzKTsKLQotICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgotICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLQotICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOwotCi0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKLSAgICAgICAgICogb3IgaW1wbGljaXRseSwgYWNjb3JkaW5nIHRvIE1QRUc0IHNwZWMuIEFBQysvZUFBQysgaXMgYSBkdWFsCi0gICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5Ci0gICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0Ci0gICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZwotICAgICAgICAgKiBTQlIgY29udGVudCBpbiBBQUMgZXh0ZW5zaW9uIHBheWxvYWQgc3BlY2lmaWMgdG8gU0JSLCBhbmQgaGVuY2UKLSAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRodXMsIHdlIGNvdWxkIG5vdCBzYXkgZm9yIHN1cmUgd2hldGhlciBhIHN0cmVhbSBpcwotICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPD0gMikgewotICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICE9IHByZXZTYW1wbGVSYXRlIHx8Ci0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykgewotICAgICAgICAgICAgICAgIG1heWJlQ29uZmlndXJlRG93bm1peCgpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCBpcyBub3QgaGFuZGxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOwotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0sgfHwgbU51bVNhbXBsZXNPdXRwdXQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdsbCBvbmx5IG91dHB1dCBkYXRhIGlmIHdlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGl0IG9yCi0gICAgICAgICAgICAvLyB3ZSd2ZSBwcmV2aW91c2x5IGRlY29kZWQgdmFsaWQgZGF0YSwgaW4gdGhlIGxhdHRlciBjYXNlCi0gICAgICAgICAgICAvLyAoZGVjb2RlIGZhaWxlZCkgd2UnbGwgb3V0cHV0IGEgc2lsZW50IGZyYW1lLgotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtT3V0Qnl0ZXM7CisgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBzYW1wbGVzaXplID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldAorICAgICAgICAgICAgICAgICAgICArIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzYW1wbGVzaXplCisgICAgICAgICAgICAgICAgICAgID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKLSAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ICs9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemU7CisgICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgaW50IG51bVNhbXBsZXMgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzID4gYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSAwOworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSkgewogCisgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcyA9IG51bVNhbXBsZXMgLyAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBzYW1wbGVzIGF2YWlsYWJsZSAoJWQpLCBvciAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywgYXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIGludDY0X3QgKm5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGltZSA9ICpuZXh0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGludDMyX3QgKmN1cnJlbnRCdWZMZWZ0ID0gJm1CdWZmZXJTaXplcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWNvZGVkU2l6ZSA9IG1EZWNvZGVkU2l6ZXMuaXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZFNpemVzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlZCAlZCBvZiAlZCIsIGRlY29kZWRTaXplLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmN1cnJlbnRCdWZMZWZ0ID4gZGVjb2RlZFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdC9pbnRlcnBvbGF0ZSBuZXh0IHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXJyZW50QnVmTGVmdCAtPSBkZWNvZGVkU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhZGp1c3RlZCBuZXh0VGltZVN0YW1wL3NpemUgdG8gJWxsZC8lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHRpbWVzdGFtcCBpbiBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclRpbWVzdGFtcHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZkxlZnQgPSAmbUJ1ZmZlclNpemVzLmVkaXRJdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1vdmVkIHRvIG5leHQgdGltZS9zaXplOiAlbGxkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGxpbWl0IG91dHB1dCBidWZmZXIgc2l6ZSB0byBtYXRjaCBpbnB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5lZCA0ICJzdWIiIGZyYW1lcywgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBtb3N0IDQgZGVjb2RlZCB1bml0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvcHRpb25hbC4gUmVtb3ZlIHRoZSBuZXh0IHRocmVlIGxpbmVzIHRvIGZpbGwgdGhlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHdpdGggYXMgbWFueSB1bml0cyBhcyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigiZ2V0dGluZyAlZCBmcm9tIHJpbmdidWZmZXIiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIG1FbmRPZk91dHB1dCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gY3VycmVudFRpbWU7CisKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICVsbGQgLyAlZCIsIG91dEhlYWRlci0+blRpbWVTdGFtcCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CiAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbUVuZE9mT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZW1wdHkgYmxvY2sgc2lnbmFsaW5nIEVPUworICAgICAgICAgICAgICAgICAgICBtRW5kT2ZPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm91dEhlYWRlci0+bk9mZnNldCAhPSAwIGlzIG5vdCBoYW5kbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KG91dEhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBucyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1CdWZmZXJUaW1lc3RhbXBzLml0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZiBvdXRRdWV1ZSBub3QgZW1wdHkgYnV0IG5vIG1vcmUgb3V0cHV0CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01NjcsMzggKzk4Miw3OSBAQAogICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCiAgICAgICAgIC8vIGRyYWluIGFsbCBleGlzdGluZyBkYXRhCiAgICAgICAgIGRyYWluRGVjb2RlcigpOwotICAgICAgICAvLyBmb3JjZSBkZWNvZGVyIGxvb3AgdG8gZHJvcCB0aGUgZmlyc3QgZGVjb2RlZCBidWZmZXIgYnkgcmVzZXR0aW5nIHRoZXNlIHN0YXRlIHZhcmlhYmxlcywKLSAgICAgICAgLy8gYnV0IG9ubHkgaWYgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkgaGFwcGVuZWQuCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDE7Ci0gICAgICAgICAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7CisgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmNsZWFyKCk7CisgICAgICAgIG1CdWZmZXJTaXplcy5jbGVhcigpOworICAgICAgICBtRGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBhdmFpbDsKKyAgICAgICAgd2hpbGUgKChhdmFpbCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYXZhaWwgPiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgYXZhaWwgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoMCwgYXZhaWwpOworICAgICAgICAgICAgaWYgKG5zICE9IGF2YWlsKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBhIGNvbXBsZXRlIGZyYW1lIG9mIHNhbXBsZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsKICAgICAgICAgfQorICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKICAgICB9CiB9CiAKIHZvaWQgU29mdEFBQzI6OmRyYWluRGVjb2RlcigpIHsKLSAgICAvLyBhIGJ1ZmZlciBiaWcgZW5vdWdoIGZvciA2IGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCi0gICAgc2hvcnQgYnVmIFsyMDQ4KjZdOwotICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICBidWYsIHNpemVvZihidWYpLCBBQUNERUNfRkxVU0ggfCBBQUNERUNfQ0xSSElTVCB8IEFBQ0RFQ19JTlRSKTsKLSAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAotICAgICAgICAgICAgYnVmLCBzaXplb2YoYnVmKSwgQUFDREVDX0ZMVVNIIHwgQUFDREVDX0NMUkhJU1QgfCBBQUNERUNfSU5UUik7Ci0gICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7Ci0gICAgbURlY29kZXJIYXNEYXRhID0gZmFsc2U7CisgICAgaW50MzJfdCBvdXRwdXREZWxheSA9IG1TdHJlYW1JbmZvLT5vdXRwdXREZWxheSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgIC8vIGZsdXNoIGRlY29kZXIgdW50aWwgb3V0cHV0RGVsYXkgaXMgY29tcGVuc2F0ZWQKKyAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIE1BWF9DSEFOTkVMX0NPVU5UIGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCisgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgIHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICB9CiB9CiAKIHZvaWQgU29mdEFBQzI6Om9uUmVzZXQoKSB7CiAgICAgZHJhaW5EZWNvZGVyKCk7CiAgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQogICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKLSAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbU91dHB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CisgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKKyAgICBtRW5kT2ZPdXRwdXQgPSBmYWxzZTsKKyAgICBtQnVmZmVyVGltZXN0YW1wcy5jbGVhcigpOworICAgIG1CdWZmZXJTaXplcy5jbGVhcigpOworICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKwogICAgIC8vIFRvIG1ha2UgdGhlIGNvZGVjIGJlaGF2ZSB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGEgcmVzZXQsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUKICAgICAvLyBzdHJlYW1pbmZvIHN0cnVjdC4gVGhpcyBkb2VzIHRoYXQ6Ci0gICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOworICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsgLy8gVE9ETzogbVN0cmVhbUluZm8gaXMgcmVhZCBvbmx5CiAKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKLSAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKLSAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCBhN2VhMWUyLi5jM2U0NDU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCiAjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NywxOCArNDgsMjIgQEAKICAgICBlbnVtIHsKICAgICAgICAga051bUlucHV0QnVmZmVycyAgICAgICAgPSA0LAogICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyAgICAgICA9IDQsCisgICAgICAgIGtOdW1EZWxheUJsb2Nrc01heCAgICAgID0gOCwKICAgICB9OwogCiAgICAgSEFORExFX0FBQ0RFQ09ERVIgbUFBQ0RlY29kZXI7CiAgICAgQ1N0cmVhbUluZm8gKm1TdHJlYW1JbmZvOwogICAgIGJvb2wgbUlzQURUUzsKLSAgICBib29sIG1EZWNvZGVySGFzRGF0YTsKKyAgICBib29sIG1Jc0ZpcnN0OwogICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50OwogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwotICAgIGJvb2wgbVNhd0lucHV0RW9zOwotICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKLSAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUxhc3RJbkhlYWRlcjsKKyAgICBWZWN0b3I8aW50MzJfdD4gbUJ1ZmZlclNpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBtRGVjb2RlZFNpemVzOworICAgIFZlY3RvcjxpbnQ2NF90PiBtQnVmZmVyVGltZXN0YW1wczsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKQEAgLTY5LDkgKzc0LDIzIEBACiAgICAgdm9pZCBpbml0UG9ydHMoKTsKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgdm9pZCBtYXliZUNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKKyAgICB2b2lkIGNvbmZpZ3VyZURvd25taXgoKSBjb25zdDsKICAgICB2b2lkIGRyYWluRGVjb2RlcigpOwogCisvLyAgICAgIGRlbGF5IGNvbXBlbnNhdGlvbgorICAgIGJvb2wgbUVuZE9mSW5wdXQ7CisgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFBQzIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCmluZGV4IDA1N2M2OWIuLjU4ZWMzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTgyLDYgKzgyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMDYsNiArMTA4LDggQEAKIAogICBMT0NBTF9DRkxBR1MgOj0KIAorICBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiAgIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMTI4LDYgKzEzMiw4IEBACiAKICAgTE9DQUxfQ0ZMQUdTIDo9IC1ET1NDTF9JTVBPUlRfUkVGPQogCisgIExPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYWFjZW5jCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAppbmRleCA2MDkzNjIxLi4zNWFhODgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0QUFDRW5jb2RlcjIuaCIKKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CkBAIC00NCw2ICs0NSw4IEBACiAgICAgICBtTnVtQ2hhbm5lbHMoMSksCiAgICAgICBtU2FtcGxlUmF0ZSg0NDEwMCksCiAgICAgICBtQml0UmF0ZSgwKSwKKyAgICAgIG1TQlJNb2RlKC0xKSwKKyAgICAgIG1TQlJSYXRpbygwKSwKICAgICAgIG1BQUNQcm9maWxlKE9NWF9BVURJT19BQUNPYmplY3RMQyksCiAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKICAgICAgIG1JbnB1dFNpemUoMCksCkBAIC0xNTYsNiArMTU5LDQxIEBACiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICBhYWNQYXJhbXMtPm5GcmFtZUxlbmd0aCA9IDA7CiAKKyAgICAgICAgICAgIHN3aXRjaCAobVNCUk1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogLy8gc2JyIG9uCisgICAgICAgICAgICAgICAgc3dpdGNoIChtU0JSUmF0aW8pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBib3RoIE9NWCBBQUMgdG9vbCBmbGFncworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBzaW5nbGUtcmF0ZSBTQlIgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBkdWFsLXJhdGUgU0JSIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImludmFsaWQgU0JSIHJhdGlvICVkIiwgbVNCUlJhdGlvKTsKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6ICAvLyBzYnIgb2ZmCisgICAgICAgICAgICBjYXNlIC0xOiAvLyBzYnIgdW5kZWZpbmVkCisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIFNCUiBtb2RlICVkIiwgbVNCUk1vZGUpOworICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICB9CisKKworCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0yNDMsNiArMjgxLDIzIEBACiAgICAgICAgICAgICAgICAgbUFBQ1Byb2ZpbGUgPSBhYWNQYXJhbXMtPmVBQUNQcm9maWxlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmICEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSKSkgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gMDsKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSKQorICAgICAgICAgICAgICAgICAgICAmJiAhKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUikpIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IDE7CisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlIpCisgICAgICAgICAgICAgICAgICAgICYmIChhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlIpKSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAxOworICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gLTE7IC8vIGNvZGVjIGRlZmF1bHQgc2JyIG1vZGUKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2V0QXVkaW9QYXJhbXMoKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CkBAIC0zMDUsMTEgKzM2MCwxMSBAQAogfQogCiBzdGF0dXNfdCBTb2Z0QUFDRW5jb2RlcjI6OnNldEF1ZGlvUGFyYW1zKCkgewotICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGJpdHJhdGUgY2hhbmdlCisgICAgLy8gV2UgY2FsbCB0aGlzIHdoZW5ldmVyIHNhbXBsZSByYXRlLCBudW1iZXIgb2YgY2hhbm5lbHMsIGJpdHJhdGUgb3IgU0JSIG1vZGUgY2hhbmdlCiAgICAgLy8gaW4gcmVwb25zZSB0byBzZXRQYXJhbWV0ZXIgY2FsbHMuCiAKLSAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzIiwKLSAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlKTsKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbHMsIG1CaXRSYXRlLCBtU0JSTW9kZSwgbVNCUlJhdGlvKTsKIAogICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwKICAgICAgICAgICAgIGdldEFPVEZyb21Qcm9maWxlKG1BQUNQcm9maWxlKSkpIHsKQEAgLTMzNSw2ICszOTAsMjQgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgaWYgKG1TQlJNb2RlICE9IC0xICYmIG1BQUNQcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RFTEQpIHsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX01PREUsIG1TQlJNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTQlIgcmF0aW8gcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zOgorICAgICAgIDA6IERlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVyZWluIFNCUiByYXRpbyBpcyBjb25maWd1cmVkIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBieQorICAgICAgICAgIHRoZSBGREsuCisgICAgICAgMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpCisgICAgICAgMjogRHVhbHJhdGUgU0JSIChkZWZhdWx0IGZvciBIRS1BQUMpCisgICAgICovCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX1JBVElPLCBtU0JSUmF0aW8pKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaAppbmRleCAyNjAzZjRmLi5iY2U5YzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKQEAgLTUzLDYgKzUzLDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUJpdFJhdGU7CisgICAgT01YX1MzMiBtU0JSTW9kZTsKKyAgICBPTVhfUzMyIG1TQlJSYXRpbzsKICAgICBPTVhfVTMyIG1BQUNQcm9maWxlOwogCiAgICAgYm9vbCBtU2VudENvZGVjU3BlY2lmaWNEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmluZGV4IGNjMDE5MjcuLjFkMDI5ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlICJiYXNpY19vcC5oIgogI2luY2x1ZGUgIm9wZXJfMzJiLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCkBAIC0yNDMsNiArMjQ1LDggQEAKIFdvcmQzMiByc3FydChXb3JkMzIgdmFsdWUsICAgICAvKiE8IE9wZXJhbmQgdG8gc3F1YXJlIHJvb3QgKDAuMCAuLi4gMSkgKi8KICAgICAgICAgICAgICBXb3JkMzIgYWNjdXJhY3kpICAvKiE8IE51bWJlciBvZiB2YWxpZCBiaXRzIHRoYXQgd2lsbCBiZSBjYWxjdWxhdGVkICovCiB7CisgICAgVU5VU0VEKGFjY3VyYWN5KTsKKwogICAgIFdvcmQzMiByb290ID0gMDsKIAlXb3JkMzIgc2NhbGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKaW5kZXggZDFjODYyMS4uNDBkYjkyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJjbW5NZW1vcnkuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyoqCiAqIEluaXQgdGhlIGF1ZGlvIGNvZGVjIG1vZHVsZSBhbmQgcmV0dXJuIGNvZGVjIGhhbmRsZQogKiBccGFyYW0gcGhDb2RlYyBbT1VUXSBSZXR1cm4gdGhlIHZpZGVvIGNvZGVjIGhhbmRsZQpAQCAtNDYsNiArNDgsOCBAQAogCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOwogCWludCBpbnRlck1lbTsKIAorICAgICAgICBVTlVTRUQodlR5cGUpOworCiAJaW50ZXJNZW0gPSAwOwogCWVycm9yID0gMDsKIApAQCAtNDcxLDYgKzQ3NSwxMCBAQAogKi8KIFZPX1UzMiBWT19BUEkgdm9BQUNFbmNHZXRQYXJhbShWT19IQU5ETEUgaENvZGVjLCBWT19TMzIgdVBhcmFtSUQsIFZPX1BUUiBwRGF0YSkKIHsKKyAgICAgICAgVU5VU0VEKGhDb2RlYyk7CisgICAgICAgIFVOVVNFRCh1UGFyYW1JRCk7CisgICAgICAgIFVOVVNFRChwRGF0YSk7CisKIAlyZXR1cm4gVk9fRVJSX05PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKaW5kZXggZmNjMTJkZC4uZDFmZDY0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJxY19kYXRhLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQogCiBzdGF0aWMgY29uc3QgIFdvcmQxNiBnbG9iYWxHYWluT2Zmc2V0ID0gMTAwOwogc3RhdGljIGNvbnN0ICBXb3JkMTYgaWNzUmVzZXJ2ZWRCaXQgICA9IDA7CkBAIC01ODUsNiArNTg2LDggQEAKICAgV29yZDE2IGVsZW1lbnRVc2VkQml0czsKICAgV29yZDE2IGZyYW1lQml0cz0wOwogCisgIFVOVVNFRChhbmNCeXRlcyk7CisKICAgLyogICBzdHJ1Y3QgYml0YnVmZmVyIGJzV3JpdGVDb3B5OyAqLwogICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7CiAgIGlmKHFjT3V0LT5xY0VsZW1lbnQuYWR0c1VzZWQpICAvKiAgd3JpdGUgYWR0cyBoZWFkZXIqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKaW5kZXggNGU5MjE4Yy4uNmYwNjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSAidG5zX2Z1bmMuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHN0YXJ0ICAgICAgIHNob3J0ICAgICAgIHN0b3AgKi8KIHN0YXRpYyBXb3JkMTYgYmxvY2tUeXBlMndpbmRvd1NoYXBlW10gPSB7S0JEX1dJTkRPVyxTSU5FX1dJTkRPVyxTSU5FX1dJTkRPVyxLQkRfV0lORE9XfTsKIApAQCAtMTcwLDcgKzE3Miw5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIFdvcmQxNiBQc3lPdXREZWxldGUoUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCiB7Ci0gIGhQc3lPdXQ9TlVMTDsKKyAgVU5VU0VEKGhQc3lPdXQpOworICBVTlVTRUQocE1lbU9QKTsKKwogICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCmluZGV4IDQ4ZmYzMDAuLmU1ZDc4YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogI2luY2x1ZGUgIm1lbWFsaWduLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQogCiB0eXBlZGVmIGVudW17CiAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKQEAgLTIwNCwxMSArMjA1LDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIFFDRGVsZXRlKFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQogewotCi0gIC8qCi0gICAgIG5vdGhpbmcgdG8gZG8KLSAgKi8KLSAgaFFDPU5VTEw7CisgIFVOVVNFRChoUUMpOworICBVTlVTRUQocE1lbU9QKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwppbmRleCA0NTVhODY0Li41MTcyNjEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAidG5zX2Z1bmMuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKICNkZWZpbmUgVE5TX01PRElGWV9CRUdJTiAgICAgICAgIDI2MDAgIC8qIEh6ICovCiAjZGVmaW5lIFJBVElPX1BBVENIX0xPV0VSX0JPUkRFUiAzODAgICAvKiBIeiAqLwogI2RlZmluZSBUTlNfR0FJTl9USFJFU0gJCQkgMTQxICAgLyogMS40MSoxMDAgKi8KQEAgLTY0Myw2ICs2NDUsOCBAQAogICBXb3JkMzIgaTsKICAgV29yZDMyIHRuc09yZGVyUGx1czEgPSB0bnNPcmRlciArIDE7CiAKKyAgVU5VU0VEKHdpbmRvdyk7CisKICAgYXNzZXJ0KHRuc09yZGVyIDw9IFROU19NQVhfT1JERVIpOyAgICAgIC8qIHJlbW92ZSBhc3NlcnRzIGxhdGVyPyAoYnRnKSAqLwogCiAgIGZvcihpPTA7aTx0bnNPcmRlcjtpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawppbmRleCAzMGNlMjljLi5hMmIzYzhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC02OSw2ICs2OSw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9FWFBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCA4ZDZjNmY4Li5iMDY3NDU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC00Nyw2ICs0Nyw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC02OCw2ICs3MCw4IEBACiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawppbmRleCBmNGU0NjdhLi5hZmMwYjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCkBAIC02OSw2ICs2OSw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTg4LDYgKzkwLDggQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCmluZGV4IDY3NzEwN2YuLmVmZGY5ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCkBAIC01MCw2ICs1MCw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCmluZGV4IGM1YjhlMGMuLjY0ZmU4ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCkBAIC0xMTIsNiArMTEyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMjYsNiArMTI4LDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZSBcCiAJZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCmluZGV4IDg0NTExOTUuLmYyM2I1YTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgLmdsb2JhbCAgRmlsdF82a183a19hc20KICAgICAgICAgICAuZXh0ZXJuICB2b0FXQl9Db3B5CiAgICAgICAgICAgLmV4dGVybiAgZmlyXzZrXzdrCisgICAgICAgICAgLmhpZGRlbiAgZmlyXzZrXzdrCiAKIEZpbHRfNmtfN2tfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCmluZGV4IGFjMmRkMTMuLmRlYjdlZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKIAkgLmdsb2JhbCAgIHByZWRfbHQ0X2FzbQogCSAuZXh0ZXJuICAgaW50ZXI0XzIKKwkgLmhpZGRlbiAgIGludGVyNF8yCiAKIHByZWRfbHQ0X2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwppbmRleCBmYzQyYTAzLi44ZGYwY2FhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwpAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogICAgICAgICAgIC5nbG9iYWwgICBGaWx0XzZrXzdrX2FzbQogICAgICAgICAgIC5leHRlcm4gICBmaXJfNmtfN2sKKyAgICAgICAgICAuaGlkZGVuICAgZmlyXzZrXzdrCiAKIEZpbHRfNmtfN2tfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCmluZGV4IDhkMmFhZjIuLjY3YmUxZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CiAgICAgICAgICAgLmdsb2JhbCAgIHByZWRfbHQ0X2FzbQogICAgICAgICAgIC5leHRlcm4gICBpbnRlcjRfMgorICAgICAgICAgIC5oaWRkZW4gICBpbnRlcjRfMgogCiBwcmVkX2x0NF9hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwppbmRleCA4YzQ3N2NhLi4wYjJlYTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiYWNlbHAuaCIKICNpbmNsdWRlICJoYW1fd2luZC50YWIiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIEF1dG9jb3JyKAogCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IElucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAqLwogCQlXb3JkMTYgbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAsNiArNDIsOCBAQAogCVdvcmQzMiBMX3N1bSwgTF9zdW0xLCBMX3RtcCwgRl9MRU47CiAJV29yZDE2ICpwMSwqcDIsKnAzOwogCWNvbnN0IFdvcmQxNiAqcDQ7CisgICAgICAgIFVOVVNFRChtKTsKKwogCS8qIFdpbmRvd2luZyBvZiBzaWduYWwgKi8KIAlwMSA9IHg7CiAJcDQgPSB2b193aW5kb3c7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKaW5kZXggYWNiYTUzMi4uNGMxZjdkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgInR5cGVkZWYuaCIKICNpbmNsdWRlICJiYXNpY19vcC5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogdm9pZCBDb252b2x2ZSAoCiAJCVdvcmQxNiB4W10sICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkJV29yZDE2IGhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUsNiArMzcsOCBAQAogCVdvcmQzMiAgaSwgbjsKIAlXb3JkMTYgKnRtcEgsKnRtcFg7CiAJV29yZDMyIHM7CisgICAgICAgIFVOVVNFRChMKTsKKwogCWZvciAobiA9IDA7IG4gPCA2NDspCiAJewogCQl0bXBIID0gaCtuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCmluZGV4IDBkNjZjMzEuLmI2NmI1NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKQEAgLTMxLDYgKzMxLDggQEAKICNkZWZpbmUgVVBfU0FNUCAgICAgIDQKICNkZWZpbmUgTF9JTlRFUlBPTDEgIDQKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qIExvY2FsIGZ1bmN0aW9ucyAqLwogCiAjaWZkZWYgQVNNX09QVApAQCAtMTcxLDYgKzE3Myw3IEBACiAJV29yZDMyIGNvcnIsIGV4cF9jb3JyLCBub3JtLCBleHAsIHNjYWxlOwogCVdvcmQxNiBleHBfbm9ybSwgZXhjZltMX1NVQkZSXSwgdG1wOwogCVdvcmQzMiBMX3RtcCwgTF90bXAxLCBMX3RtcDI7CisgICAgICAgIFVOVVNFRChMX3N1YmZyKTsKIAogCS8qIGNvbXB1dGUgdGhlIGZpbHRlcmVkIGV4Y2l0YXRpb24gZm9yIHRoZSBmaXJzdCBkZWxheSB0X21pbiAqLwogCWsgPSAtdF9taW47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKaW5kZXggMWJkYTA1YS4uOTYxYWFkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgIm1hdGhfb3AuaCIKICNpbmNsdWRlICJjbnN0LmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIFN5bl9maWx0KAogCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovCiAJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk1LDYgKzk3LDggQEAKIAlXb3JkMzIgaSxhMDsKIAlXb3JkMzIgTF90bXAsIExfdG1wMTsKIAlXb3JkMTYgKnAxLCAqcDIsICpwMzsKKyAgICAgICAgVU5VU0VEKG0pOworCiAJYTAgPSBhWzBdID4+ICg0ICsgUW5ldyk7ICAgICAgICAgIC8qIGlucHV0IC8gMTYgYW5kID4+UW5ldyAqLwogCS8qIERvIHRoZSBmaWx0ZXJpbmcuICovCiAJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ZvQU1SV0JFbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCmluZGV4IGVhOWRhNTIuLmRmN2I5YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSAibWVtX2FsaWduLmgiCiAjaW5jbHVkZSAiY21uTWVtb3J5LmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCkBAIC0xNjAyLDYgKzE2MDQsOCBAQAogCVZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7CiAjZW5kaWYKIAlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKKyAgICAgICAgVU5VU0VEKHZUeXBlKTsKKwogCWludCBpbnRlck1lbSA9IDA7CiAKIAlpZihwVXNlckRhdGEgPT0gTlVMTCB8fCBwVXNlckRhdGEtPm1lbWZsYWcgIT0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUiB8fCBwVXNlckRhdGEtPm1lbURhdGEgPT0gTlVMTCApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tawppbmRleCAyMmRlZTE1Li44NDRlZjBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKQEAgLTE2LDQgKzE2LDYgQEAKIAkkKExPQ0FMX1BBVEgpL3NyYyBcCiAgCSQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawppbmRleCA3ZDE3YzJhLi41MzdiYTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKQEAgLTMwLDYgKzMwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNjksNCArNzEsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGVuYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCmluZGV4IDg5ZjBmZWQuLmVkM2RjYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKQEAgLTM0LDYgKzM0LDEyIEBACiAKICNpbmNsdWRlICJTb2Z0QVZDRW5jb2Rlci5oIgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0xMDUsNDUgKzExMSwxNSBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLWlubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAotICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdGljIHZvaWQqIE1hbGxvY1dyYXBwZXIoCi0gICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKKyAgICAgICAgdm9pZCAqIC8qIHVzZXJEYXRhICovLCBpbnQzMl90IHNpemUsIGludDMyX3QgLyogYXR0cnMgKi8pIHsKICAgICB2b2lkICpwdHIgPSBtYWxsb2Moc2l6ZSk7CiAgICAgaWYgKHB0cikKICAgICAgICAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CiAgICAgcmV0dXJuIHB0cjsKIH0KIAotc3RhdGljIHZvaWQgRnJlZVdyYXBwZXIodm9pZCAqdXNlckRhdGEsIHZvaWQqIHB0cikgeworc3RhdGljIHZvaWQgRnJlZVdyYXBwZXIodm9pZCAqIC8qIHVzZXJEYXRhICovLCB2b2lkKiBwdHIpIHsKICAgICBmcmVlKHB0cik7CiB9CiAKQEAgLTE3Miw3ICsxNDgsNyBAQAogICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCi0gICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICA6IFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbVZpZGVvV2lkdGgoMTc2KSwKICAgICAgIG1WaWRlb0hlaWdodCgxNDQpLAogICAgICAgbVZpZGVvRnJhbWVSYXRlKDMwKSwKQEAgLTI1NCw5ICsyMzAsMTAgQEAKIAogICAgIG1FbmNQYXJhbXMtPnVzZV9vdmVycnVuX2J1ZmZlciA9IEFWQ19PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCi0gICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKTsKKyAgICAgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQogICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKICAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhICE9IE5VTEwpOwpAQCAtMzQyLDEwICszMTksMTAgQEAKICAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKG1IYW5kbGUpOwogICAgIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICBkZWxldGUgbUlucHV0RnJhbWVEYXRhOworICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICBtSW5wdXRGcmFtZURhdGEgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1TbGljZUdyb3VwOworICAgIGZyZWUobVNsaWNlR3JvdXApOwogICAgIG1TbGljZUdyb3VwID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtRW5jUGFyYW1zOwpAQCAtNzA3LDExICs2ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluQnVmZmVycyA/ICIgdHJ1ZSIgOiAiZmFsc2UiKTsKIAogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CkBAIC03MjIsNyArNjk1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TYXdJbnB1dEVPUykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzk1LDggKzc2OCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBidWZmZXJfaGFuZGxlX3Qgc3JjQnVmZmVyOyAvLyBmb3IgTWV0YURhdGFNb2RlIG9ubHkKLQogICAgICAgICAvLyBHZXQgbmV4dCBpbnB1dCB2aWRlbyBmcmFtZQogICAgICAgICBpZiAobVJlYWR5Rm9yTmV4dEZyYW1lKSB7CiAgICAgICAgICAgICAvLyBTYXZlIHRoZSBpbnB1dCBidWZmZXIgaW5mbyBzbyB0aGF0IGl0IGNhbiBiZQpAQCAtODE3LDcgKzc4OCw3IEBACiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCAgKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuY29kaW5nX3RpbWVzdGFtcCA9IChpbkhlYWRlci0+blRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKLSAgICAgICAgICAgICAgICB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTWV0YURhdGEgYnVmZmVyIGlzIHdyb25nIHNpemUhICIKQEAgLTgyNyw4ICs3OTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFsbG9jRGF0YShpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhLCAobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LCBpbkhlYWRlci0+bkZpbGxlZExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dERhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBleHRyYWN0IGdyYWxsb2MgYnVmZmVyIGluIG1ldGFkYXRhIG1vZGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC04MzcsMTYgKzgxMCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeS9jb252ZXJ0IHBpeGVsIGZvcm1hdCBlbnVtCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSAoY29uc3QgdWludDhfdCAqKWluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IG1JbnB1dEZyYW1lRGF0YTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQ0hFQ0soaW5wdXREYXRhICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMF0gPSBpbnB1dERhdGE7CisgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclswXSA9ICh1aW50OF90ICopaW5wdXREYXRhOwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMV0gPSB2aWRlb0lucHV0LllDYkNyWzBdICsgdmlkZW9JbnB1dC5oZWlnaHQgKiB2aWRlb0lucHV0LnBpdGNoOwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMl0gPSB2aWRlb0lucHV0LllDYkNyWzFdICsKICAgICAgICAgICAgICAgICAgICAgKCh2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2gpID4+IDIpOwpAQCAtODYzLDE0ICs4MzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTkxMCw3ICs4ODEsNiBAQAogICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVyU3RhdHVzID0gJWQgYXQgbGluZSAlZCIsIGVuY29kZXJTdGF0dXMsIF9fTElORV9fKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC05MjAsNyArODkwLDYgQEAKIAogICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAogICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKQEAgLTk2NCw1MCArOTMzLDEwIEBACiB9CiAKIHZvaWQgU29mdEFWQ0VuY29kZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoYnVmZmVyKTsKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQ6ICVwIiwgYnVmZmVyKTsKIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDRW5jb2Rlcjo6Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7Ci0gICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikpIHsKLSAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotfQotCi11aW50OF90ICpTb2Z0QVZDRW5jb2Rlcjo6ZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKSB7Ci0gICAgT01YX1UzMiB0eXBlID0gKihPTVhfVTMyKilkYXRhOwotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgewotICAgICAgICBBTE9HRSgiRGF0YSBwYXNzZWQgaW4gd2l0aCBtZXRhZGF0YSBtb2RlIGRvZXMgbm90IGhhdmUgdHlwZSAiCi0gICAgICAgICAgICAgICAgImtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlICglZCksIGhhcyB0eXBlICVkIGluc3RlYWQiLAotICAgICAgICAgICAgICAgIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGJ1ZmZlcl9oYW5kbGVfdCBpbWdCdWZmZXIgPSAqKGJ1ZmZlcl9oYW5kbGVfdCopKCh1aW50OF90KilkYXRhICsgNCk7Ci0KLSAgICBjb25zdCBSZWN0IHJlY3QobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgdWludDhfdCAqaW1nOwotICAgIHJlcyA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soaW1nQnVmZmVyLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAotICAgICAgICAgICAgcmVjdCwgKHZvaWQqKikmaW1nKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgaW1nQnVmZmVyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmJ1ZmZlciA9IGltZ0J1ZmZlcjsKLSAgICByZXR1cm4gaW1nOwotfQotCi12b2lkIFNvZnRBVkNFbmNvZGVyOjpyZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcikgewotICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS51bmxvY2soYnVmZmVyKTsKLSAgICB9Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaAppbmRleCAyM2Q1ZmYxLi4xMzA1OTNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKQEAgLTIyLDE0ICsyMiwxNCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgotI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgU29mdEFWQ0VuY29kZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50IHsKICAgICBTb2Z0QVZDRW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCkBAIC00NSwxMSArNDUsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgLy8gT3ZlcnJpZGUgU29mdE9NWENvbXBvbmVudCBtZXRob2RzCi0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7Ci0KICAgICAvLyBJbXBsZW1lbnQgTWVkaWFCdWZmZXJPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKIApAQCAtNjcsMTAgKzYyLDYgQEAKICAgICAgICAga051bUJ1ZmZlcnMgPSAyLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleCA9IE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkICsgMQotICAgIH07Ci0KICAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgaW50NjRfdCBtVGltZVVzOwpAQCAtMTA5LDkgKzEwMCw2IEBACiAgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOwogICAgIHZvaWQgcmVsZWFzZU91dHB1dEJ1ZmZlcnMoKTsKIAotICAgIHVpbnQ4X3QqIGV4dHJhY3RHcmFsbG9jRGF0YSh2b2lkICpkYXRhLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7Ci0gICAgdm9pZCByZWxlYXNlR3JhbGxvY0RhdGEoYnVmZmVyX2hhbmRsZV90IGJ1ZmZlcik7Ci0KICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QVZDRW5jb2Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKaW5kZXggYTMzY2I5Mi4uYjAwMTBmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawpAQCAtMTQsNiArMTQsOCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCmluZGV4IGYwMWQ2MDUuLjU5YTExZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCkBAIC05LDYgKzksOCBAQAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9mbGFjL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IGQ3OTcxOTcuLjEzMDEwNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0yNyw2ICsyNywxMiBAQAogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0yNTcsNyArMjYzLDcgQEAKIH0KIAogdm9pZCBTb2Z0RmxhY0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKLSAgICAvL1VOVVNFRF9VTkxFU1NfVkVSQk9TRShwb3J0SW5kZXgpOworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShwb3J0SW5kZXgpOwogICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uUXVldWVGaWxsZWQocG9ydEluZGV4PSVkKSIsIHBvcnRJbmRleCk7CiAKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CkBAIC0zNDMsMTYgKzM0OSwxNyBAQAogICAgIH0KIH0KIAotCiBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAogICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgewotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoYnl0ZXM9JWQsIHNhbXBsZXM9JWQsIGN1cnJfZnJhbWU9JWQpIiwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoY3VycmVudF9mcmFtZSk7CisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwKICAgICAgICAgICAgIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIAogI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgogICAgIGlmIChzYW1wbGVzID09IDApIHsKLSAgICAgICAgQUxPR0koIiBzYXZpbmcgJWQgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOworICAgICAgICBBTE9HSSgiIHNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOwogICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOwogICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKQEAgLTQ0NCw4ICs0NTEsMTIgQEAKIAogLy8gc3RhdGljCiBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgU29mdEZsYWNFbmNvZGVyOjpmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAotICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLCB2b2lkICpjbGllbnRfZGF0YSkgeworICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqIC8qIGVuY29kZXIgKi8sCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSkgewogICAgIHJldHVybiAoKFNvZnRGbGFjRW5jb2RlciopIGNsaWVudF9kYXRhKS0+b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKICAgICAgICAgICAgIGJ1ZmZlciwgYnl0ZXMsIHNhbXBsZXMsIGN1cnJlbnRfZnJhbWUpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawppbmRleCA0YzgwZGE2Li5hMDExMmUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5tawpAQCAtMTQsNCArMTQsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggMjQwYzBjMS4uM2E2OTA5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0xMTcsNyArMTE3LDE0IEBACiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgcG9ydAorICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBtSXNNTGF3ID8gT01YX0FVRElPX1BDTU1vZGVNVUxhdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YX0FVRElPX1BDTU1vZGVBTGF3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgcG9ydAorICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKaW5kZXggNzE2MTNkMi4uMzA4NjhkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCkBAIC05LDYgKzksOCBAQAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9saWJnc20vaW5jCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAoraWZlcSAoJChpZiAkKHdpbGRjYXJkIGV4dGVybmFsL2xpYmhldmMpLDEsMCksMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGliaGV2Y2RlYworTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgOj0gU29mdEhFVkMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChUT1ApL2V4dGVybmFsL2xpYmhldmMvZGVjb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGliaGV2Yy9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnN0YWdlZnJpZ2h0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnV0aWxzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJsb2cKKworIyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY3VycmVudCBhc20gZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgbGluayBlcnJvcjoKKyMgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgZHluYW1pYyByZWxvYyBSX0FSTV9SRUwzMjsgcmVjb21waWxlIHdpdGggLWZQSUMKKyMgQnVnOiAxNjg1MzI5MQorTE9DQUxfTERGTEFHUyA6PSAtV2wsLUJzeW1ib2xpYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjYmE1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApAQCAtMCwwICsxLDc2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEhFVkMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisjaW5jbHVkZSAiaXRocmVhZC5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKKyNpbmNsdWRlICJTb2Z0SEVWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGNvbXBvbmVudE5hbWUgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKKyNkZWZpbmUgY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fQ29kaW5nSEVWQworI2RlZmluZSBDT0RFQ19NSU1FX1RZUEUgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKKworLyoqIEZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8ga2VlcCBjb2RlIHNpbWlsYXIgZm9yIGVhY2ggY29kZWMgKi8KKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGloZXZjZF9jeGFfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaWhldmNkX2N4YV9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpaGV2Y2RfY3hhX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaWhldmNkX2N4YV9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorCisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorfTsKKworU29mdEhFVkM6OlNvZnRIRVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNvbXBvbmVudE5hbWUsIGNvZGluZ1R5cGUsCisgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCisgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywKKyAgICAgICAgICAgIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTWVtUmVjb3JkcyhOVUxMKSwKKyAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1PbXhDb2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1OZXdXaWR0aChtV2lkdGgpLAorICAgICAgbU5ld0hlaWdodChtSGVpZ2h0KSwKKyAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpIHsKKyAgICBpbml0UG9ydHMoa051bUJ1ZmZlcnMsIElOUFVUX0JVRl9TSVpFLCBrTnVtQnVmZmVycywKKyAgICAgICAgICAgIENPREVDX01JTUVfVFlQRSk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEhFVkM6On5Tb2Z0SEVWQygpIHsKKyAgICBBTE9HRCgiSW4gU29mdEhFVkM6On5Tb2Z0SEVWQyIpOworICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dEKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKwordm9pZCBTb2Z0SEVWQzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uIG51bWJlcjogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkl0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfY3RsX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMilzdHJpZGU7CisgICAgc19jdGxfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKworICAgIHNfY3RsX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfY3RsX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKworICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgcnVuLXRpbWUgcGFyYW1ldGVyczogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKyAgICBtUmVjZWl2ZWRFT1MgPSBmYWxzZTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHMsIDAsIHNpemVvZihtVGltZVN0YW1wcykpOworICAgIG1lbXNldChtVGltZVN0YW1wc1ZhbGlkLCAwLCBzaXplb2YobVRpbWVTdGFtcHNWYWxpZCkpOworCisgICAgLyogSW5pdGlhbGl6ZSBib3RoIHN0YXJ0IGFuZCBlbmQgdGltZXMgKi8KKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX2N0bF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiByZXNldDogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKG91dHB1dEJ1ZmZlcldpZHRoKCkpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X2NvcmVzX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX3NldF9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX05VTV9DT1JFUyk7CisgICAgc19zZXRfY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgQUxPR0QoIlNldCBudW1iZXIgb2YgY29yZXMgdG8gJXUiLCBzX3NldF9jb3Jlc19pcC51NF9udW1fY29yZXMpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfc2V0X2NvcmVzX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19zZXRfY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyBudW1iZXIgb2YgY29yZXM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfc2V0X2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc192aWRlb19mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc192aWRlb19mbHVzaF9vcDsKKworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfdmlkZW9fZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIEFMT0dEKCJTZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZSAiKTsKKworICAgIC8qIFNldCB0aGUgZGVjb2RlciBpbiBGbHVzaCBtb2RlLCBzdWJzZXF1ZW50IGRlY29kZSgpIGNhbGxzIHdpbGwgZmx1c2ggKi8KKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc192aWRlb19mbHVzaF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZTogKCVkKSAweCV4Iiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Jc0luRmx1c2ggPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmluaXREZWNvZGVyKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIFVXT1JEMzIgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICBXT1JEMzIgaTRfbGV2ZWw7CisKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICAgIC8qIEluaXRpYWxpemUgbnVtYmVyIG9mIHJlZiBhbmQgcmVvcmRlciBtb2RlcyAoZm9yIEhFVkMpICovCisgICAgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CisgICAgdTRfbnVtX3JlZl9mcmFtZXMgPSAxNjsKKyAgICB1NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDMyX3QgZGlzcGxheVNpemVZID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisKKyAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgeworICAgICAgICBpNF9sZXZlbCA9IDUwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7CisgICAgICAgIGk0X2xldmVsID0gNDA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoOTYwICogNTQwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDMxOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDY0MCAqIDM2MCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAzMDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7CisgICAgICAgIGk0X2xldmVsID0gMjE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAyMDsKKyAgICB9CisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgQUxPR1YoIkdldCBudW1iZXIgb2YgbWVtIHJlY29yZHMiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQqKSZzX251bV9tZW1fcmVjX2lwLAorICAgICAgICAgICAgICAgICh2b2lkKikmc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190KilpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChtTWVtUmVjb3JkcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQobU1lbVJlY29yZHMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmk0X2xldmVsID0gaTRfbGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fZXh0cmFfZGlzcF9idWYgPSAwOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKQorICAgICAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19maWxsX21lbV9pcCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2ZpbGxfbWVtX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0KKyAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgICB7CisgICAgICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICB2b2lkICpkZWNfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gZGlzcGxheUhlaWdodDsKKworICAgICAgICBzX2luaXRfaXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKworICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2Yoc19pbml0X29wKTsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90KiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSBkZWNfZnhuczsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgICAgICBBTE9HRCgiSW5pdGlhbGl6aW5nIGRlY29kZXIiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICh2b2lkICopJnNfaW5pdF9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGluaXQ6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgcGx1Z2luIHN0YXRlICovCisgICAgcmVzZXRQbHVnaW4oKTsKKworICAgIC8qIFNldCB0aGUgcnVuIHRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMoZGlzcGxheVN0cmlkZSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogR2V0IGNvZGVjIHZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBwaWN0dXJlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKKyAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSBmYWxzZTsKKyAgICBtRmx1c2hOZWVkZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpkZUluaXREZWNvZGVyKCkgeworICAgIHNpemVfdCBpOworCisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIEFMT0dEKCJGcmVlaW5nIGNvZGVjIG1lbW9yeSIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtRmx1c2hPdXRCdWZmZXIpOworICAgICAgICBtRmx1c2hPdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpyZUluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldDsKKworICAgIGRlSW5pdERlY29kZXIoKTsKKworICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKKyAgICAgICAgZGVJbml0RGVjb2RlcigpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU29mdEhFVkM6Om9uUmVzZXQoKSB7CisgICAgQUxPR0QoIm9uUmVzZXQgY2FsbGVkIik7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOworCisgICAgcmVzZXREZWNvZGVyKCk7CisgICAgcmVzZXRQbHVnaW4oKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0SEVWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRXaWR0aCA9IG1XaWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRIZWlnaHQgPSBtSGVpZ2h0OworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgaWYgKG1XaWR0aCAhPSBvbGRXaWR0aCB8fCBtSGVpZ2h0ICE9IG9sZEhlaWdodCkgeworICAgICAgICByZUluaXREZWNvZGVyKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgeworICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICBzaXplX3Qgc2l6ZVVWOworICAgIHVpbnQ4X3QgKnBCdWY7CisKKyAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHBzX2RlY19pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKworICAgIC8qIFdoZW4gaW4gZmx1c2ggYW5kIGFmdGVyIEVPUyB3aXRoIHplcm8gYnl0ZSBpbnB1dCwKKyAgICAgKiBpbkhlYWRlciBpcyBzZXQgdG8gemVyby4gSGVuY2UgY2hlY2sgZm9yIG5vbi1udWxsICovCisgICAgaWYgKGluSGVhZGVyKSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSB0aW1lU3RhbXBJeDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY19pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBOVUxMOworICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCisgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOworICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CisKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHJldHVybjsKK30KK3ZvaWQgU29mdEhFVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgLyogT25jZSB0aGUgb3V0cHV0IGJ1ZmZlcnMgYXJlIGZsdXNoZWQsIGlnbm9yZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBoZWxkIGluIGRlY29kZXIgKi8KKyAgICBpZiAoa091dHB1dFBvcnRJbmRleCA9PSBwb3J0SW5kZXgpIHsKKyAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBOVUxMLCBOVUxMLCAwKTsKKworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIGlmICgwID09IHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTb2Z0SEVWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIFVOVVNFRChwb3J0SW5kZXgpOworCisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKKworICAgIC8qIElmIGlucHV0IEVPUyBpcyBzZWVuIGFuZCBkZWNvZGVyIGlzIG5vdCBpbiBmbHVzaCBtb2RlLAorICAgICAqIHNldCB0aGUgZGVjb2RlciBpbiBmbHVzaCBtb2RlLgorICAgICAqIFRoZXJlIGNhbiBiZSBhIGNhc2Ugd2hlcmUgRU9TIGlzIHNlbnQgYWxvbmcgd2l0aCBsYXN0IHBpY3R1cmUgZGF0YQorICAgICAqIEluIHRoYXQgY2FzZSwgb25seSBhZnRlciBkZWNvZGluZyB0aGF0IGlucHV0IGRhdGEsIGRlY29kZXIgaGFzIHRvIGJlCisgICAgICogcHV0IGluIGZsdXNoLiBUaGlzIGNhc2UgaXMgaGFuZGxlZCBoZXJlICAqLworCisgICAgaWYgKG1SZWNlaXZlZEVPUyAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXI7CisKKyAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbzsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcjsKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4OworCisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBpZiAoIW1Jc0luRmx1c2gpIHsKKyAgICAgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKworICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCAmJiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJFT1Mgc2VlbiBvbiBpbnB1dCIpOworICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBhbiBpbml0IHJlcXVpcmVkIGFuZCB0aGUgZGVjb2RlciBpcyBub3QgaW4gZmx1c2ggbW9kZSwKKyAgICAgICAgLy8gdXBkYXRlIG91dHB1dCBwb3J0J3MgZGVmaW5pdGlvbiBhbmQgcmVpbml0aWFsaXplIGRlY29kZXIuCisgICAgICAgIGlmIChtSW5pdE5lZWRlZCAmJiAhbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIGZyZWUgc2xvdCBpbiB0aW1lc3RhbXAgYXJyYXkgdG8gaG9sZCBpbnB1dCB0aW1lc3RhbXAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RJTUVfU1RBTVBTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lU3RhbXBzVmFsaWRbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wSXggPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbdGltZVN0YW1wSXhdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVGltZVN0YW1wc1t0aW1lU3RhbXBJeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKKyAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKKyAgICAgICAgICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOworCisgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBDb21wYXJlIHxzdGF0dXN8IHRvIElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TLCB3aGljaCBpcyBub3Qgb25lIG9mIHRoZQorICAgICAgICAgICAgLy8gSVZfQVBJX0NBTExfU1RBVFVTX1QsIHNlZW1zIGJlIHdyb25nLiBCdXQgdGhpcyBpcyB3aGF0IHRoZSBkZWNvZGVyIHJldHVybnMgcmlnaHQgbm93LgorICAgICAgICAgICAgLy8gVGhlIGRlY29kZXIgc2hvdWxkIGJlIGZpeGVkIHNvIHRoYXQgfHU0X2Vycm9yX2NvZGV8IGluc3RlYWQgb2YgfHN0YXR1c3wgcmV0dXJucworICAgICAgICAgICAgLy8gSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMuCisgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkRGltZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgKChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHx8IChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY19vcC51NF9lcnJvcl9jb2RlKSk7CisgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyAmJiAhbUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpbkhlYWRlciAhPSBOVUxMKSAmJiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGlucHV0IGRpZCBub3QgY29udGFpbiBwaWN0dXJlIGRhdGEsIHRoZW4gaWdub3JlCisgICAgICAgICAgICAgICAgICogdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIENUUyBEZWNvZGVyVGVzdCB0ZXN0Q29kZWNSZXNldHNIRVZDV2l0aG91dFN1cmZhY2UsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgY2hhbmdpbmcgcmVzb2x1dGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBubyBvdXRwdXQgcHJlc2VudCwKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgdGhlIHN3aXRjaGluZyBpcyBkb25lIGFuZCBpdCdzIHJlYWR5IHRvIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCB0aGUgcGx1Z2luLgorICAgICAgICAgICAgaWYgKG1DaGFuZ2luZ1Jlc29sdXRpb24gJiYgIXNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgfHwgcmVzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1tzX2RlY19vcC51NF90c107CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFtzX2RlY19vcC51NF90c10gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCisgICAgICAgICAgICAgICAgICogdGhlbiBjb21lIG91dCBvZiBmbHVzaCBtb2RlICovCisgICAgICAgICAgICAgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogSWYgRU9TIHdhcyByZWNpZXZlZCBvbiBpbnB1dCBwb3J0IGFuZCB0aGVyZSBpcyBubyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2RlYywgdGhlbiBzaWduYWwgRU9TIG9uIG91dHB1dCBwb3J0ICovCisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIG1vcmUgdGhhbiBvbmUgcGljdHVyZSBkYXRhCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEhFVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxZjUyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfSEVWQ19IXworCisjZGVmaW5lIFNPRlRfSEVWQ19IXworCisjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZF9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0aW1lLXN0YW1wIGFycmF5ICovCisjZGVmaW5lIE1BWF9USU1FX1NUQU1QUyA2NAorCisvKiogTWF4aW11bSBudW1iZXIgb2YgY29yZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYyAqLworI2RlZmluZSBDT0RFQ19NQVhfTlVNX0NPUkVTIDQKKworI2RlZmluZSBDT0RFQ19NQVhfV0lEVEggICAgIDE5MjAKKworI2RlZmluZSBDT0RFQ19NQVhfSEVJR0hUICAgIDEwODgKKworLyoqIElucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCitzdHJ1Y3QgU29mdEhFVkM6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0SEVWQyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRIRVZDKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7Citwcml2YXRlOgorICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4CisgICAgfTsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHRvIGJlIHVlc2QgYnkgdGhlIGNvZGVjCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIC8vIEludGVybmFsIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGZsdXNoIG91dCB0aGUgYnVmZmVycyBmcm9tIGRlY29kZXIKKyAgICB1aW50OF90ICptRmx1c2hPdXRCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgb2YgZW50cmllcyBpbiB0aGUgdGltZXN0YW1wIGFycmF5CisgICAgYm9vbCBtVGltZVN0YW1wc1ZhbGlkW01BWF9USU1FX1NUQU1QU107CisKKyAgICAvLyBUaW1lc3RhbXAgYXJyYXkgLSBTaW5jZSBjb2RlYyBkb2VzIG5vdCB0YWtlIDY0IGJpdCB0aW1lc3RhbXBzLAorICAgIC8vIHRoZXkgYXJlIG1haW50YWluZWQgaW4gdGhlIHBsdWdpbgorICAgIE9NWF9TNjQgbVRpbWVTdGFtcHNbTUFYX1RJTUVfU1RBTVBTXTsKKworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1PbXhDb2xvckZvcm1hdDsgICAgLy8gT01YIENvbG9yIGZvcm1hdAorICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OyAgICAgICAgLy8gSXR0aWFtIENvbG9yIGZvcm1hdAorCisgICAgYm9vbCBtSXNJbkZsdXNoOyAgICAgICAgLy8gY29kZWMgaXMgZmx1c2ggbW9kZQorICAgIGJvb2wgbVJlY2VpdmVkRU9TOyAgICAgIC8vIEVPUyBpcyByZWNlaWV2ZWQgb24gaW5wdXQgcG9ydAorICAgIGJvb2wgbUluaXROZWVkZWQ7CisgICAgdWludDMyX3QgbU5ld1dpZHRoOworICAgIHVpbnQzMl90IG1OZXdIZWlnaHQ7CisgICAgLy8gVGhlIGlucHV0IHN0cmVhbSBoYXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudCByZXNvbHV0aW9uLCB3aGljaCBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgLy8gY29kZWMuIFNvIHRoZSBjb2RlYyBpcyBzd2l0Y2hpbmcgdG8gZGVjb2RlIHRoZSBuZXcgcmVzb2x1dGlvbi4KKyAgICBib29sIG1DaGFuZ2luZ1Jlc29sdXRpb247CisgICAgYm9vbCBtRmx1c2hOZWVkZWQ7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlSW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKworICAgIHZvaWQgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTIChTb2Z0SEVWQyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9IRVZDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggYTNkNTc3OS4uMWQyMzJjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDYsNiArNDYsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IDBkMWFiNzEuLjFmNGI2ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTEzNCw2ICsxMzQsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHVpbnQzMl90ICpzdGFydF9jb2RlID0gKHVpbnQzMl90ICopYml0c3RyZWFtOworICAgICAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CisgICAgICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKTsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFdOwpAQCAtMTQxLDcgKzE0Nyw3IEBACiAKICAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gTlVMTDsKIAotICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgaWYgKChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHx8IHZvbEhlYWRlcikgewogICAgICAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gYml0c3RyZWFtOwogICAgICAgICAgICAgICAgIHZvbF9zaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAgICAgICAgICAgICB9CkBAIC0xNTAsNyArMTU2LDggQEAKICAgICAgICAgICAgICAgICAobU1vZGUgPT0gTU9ERV9NUEVHNCkgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOwogCiAgICAgICAgICAgICBCb29sIHN1Y2Nlc3MgPSBQVkluaXRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1XaWR0aCwgbUhlaWdodCwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcldpZHRoKCksIG91dHB1dEJ1ZmZlckhlaWdodCgpLCBtb2RlKTsKIAogICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlBWSW5pdFZpZGVvRGVjb2RlciBmYWlsZWQuIFVuc3VwcG9ydGVkIGNvbnRlbnQ/Iik7CkBAIC0xNjksMjEgKzE3NiwyNiBAQAogCiAgICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZSgoVmlkZW9EZWNDb250cm9scyAqKSBtSGFuZGxlLCAwKTsKIAorICAgICAgICAgICAgYm9vbCBoYXNGcmFtZURhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaGFzRnJhbWVEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSAmJiBwb3J0U2V0dGluZ3NDaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1QRUc0X01PREUgJiYgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFoYXNGcmFtZURhdGEpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKQEAgLTIyMyw3ICsyMzUsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAvLyBIMjYzIGRvZXNuJ3QgaGF2ZSBWT0wgaGVhZGVyLCB0aGUgZnJhbWUgc2l6ZSBpbmZvcm1hdGlvbiBpcyBpbiBzaG9ydCBoZWFkZXIsIGkuZS4gdGhlCisgICAgICAgIC8vIGRlY29kZXIgbWF5IGRldGVjdCBzaXplIGNoYW5nZSBhZnRlciBQVkRlY29kZVZpZGVvRnJhbWUuCisgICAgICAgIGlmIChoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTI2OSw3ICsyODMsNyBAQAogICAgIH0KIH0KIAotYm9vbCBTb2Z0TVBFRzQ6OnBvcnRTZXR0aW5nc0NoYW5nZWQoKSB7Citib29sIFNvZnRNUEVHNDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCkgewogICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OwogICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1IYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOwogCkBAIC0yODIsMjUgKzI5NiwyNCBAQAogICAgIEFMT0dWKCJkaXNwX3dpZHRoID0gJWQsIGRpc3BfaGVpZ2h0ID0gJWQsIGJ1Zl93aWR0aCA9ICVkLCBidWZfaGVpZ2h0ID0gJWQiLAogICAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CiAKLSAgICBpZiAobUNyb3BXaWR0aCAhPSBkaXNwX3dpZHRoCi0gICAgICAgICAgICB8fCBtQ3JvcEhlaWdodCAhPSBkaXNwX2hlaWdodCkgewotICAgICAgICBtQ3JvcExlZnQgPSAwOwotICAgICAgICBtQ3JvcFRvcCA9IDA7Ci0gICAgICAgIG1Dcm9wV2lkdGggPSBkaXNwX3dpZHRoOwotICAgICAgICBtQ3JvcEhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQ7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gYnVmX3dpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IGJ1Zl9oZWlnaHQpIHsKKyAgICAgICAgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wU2V0OwogCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLAotICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCi0gICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKG1Dcm9wV2lkdGggIT0gZGlzcF93aWR0aCB8fCBtQ3JvcEhlaWdodCAhPSBkaXNwX2hlaWdodCkgeworICAgICAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgICAgIG1Dcm9wV2lkdGggPSBkaXNwX3dpZHRoOworICAgICAgICAgICAgbUNyb3BIZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICAgICAgICAgIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcENoYW5nZWQ7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoYnVmX3dpZHRoICE9IG1XaWR0aCB8fCBidWZfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoID0gYnVmX3dpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gYnVmX2hlaWdodDsKLQotICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLQorICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgZmFrZVN0cmlkZSA9IHRydWU7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCwgY3JvcFNldHRpbmdzTW9kZSwgZmFrZVN0cmlkZSk7CisgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfSDI2MykgewogICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOwogCkBAIC0zMDksNyArMzIyLDcgQEAKIAogICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOwogICAgICAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgb3V0cHV0QnVmZmVyV2lkdGgoKSwgb3V0cHV0QnVmZmVySGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgIEgyNjNfTU9ERSkpIHsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTMxOCwxMyArMzMxLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7Ci0KLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcG9ydFdpbGxSZXNldDsKIH0KIAogdm9pZCBTb2Z0TVBFRzQ6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaAppbmRleCBkZTE0YWFmLi44YTA2YTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotICAgIGJvb2wgcG9ydFNldHRpbmdzQ2hhbmdlZCgpOworICAgIGJvb2wgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0TVBFRzQpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCmluZGV4IGIzYzM1MGYuLmIwM2VjOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApAQCAtMTQyNiw3ICsxNDI2LDcgQEAKICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IENhbGNOdW1CaXRzKCh1aW50KXZpZGVvLT5uVG90YWxNQiAtIDEpOyAvKiBvdGhlcndpc2UgY2FsY3VsYXRlIGFib3ZlICovCiAgICAgfQogICAgIHNpemUgPSAoaW50MzIpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKLSAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QICYmIHNpemUgPiB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSkKKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1AgJiYgc2l6ZSA+IHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzLT5zaXplKQogICAgIHsKICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKaW5kZXggODNhMmRkMi4uYzkwMDZkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpAQCAtMzMsNiArMzMsOCBAQAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNzIsNCArNzQsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCmluZGV4IGJmNzdmNGEuLmM4N2QxOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcApAQCAtNDYsNDIgKzQ2LDEyIEBACiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5TdGVwID0gMDsKIH0KIAotaW5saW5lIHN0YXRpYyB2b2lkIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgIHVpbnQ4X3QgKmlueXV2LCB1aW50OF90KiBvdXR5dXYsCi0gICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0KLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweShvdXR5LCBpbnl1diwgb3V0WXNpemUpOwotCi0gICAgLyogVSAmIFYgY29weWluZyAqLwotICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgewotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOwotICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOwotCi0gICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKLSAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7Ci0gICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOwotICAgICAgICB9Ci0gICAgfQotfQotCiBTb2Z0TVBFRzRFbmNvZGVyOjpTb2Z0TVBFRzRFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQotICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgOiBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1FbmNvZGVNb2RlKENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVMpLAogICAgICAgbVZpZGVvV2lkdGgoMTc2KSwKICAgICAgIG1WaWRlb0hlaWdodCgxNDQpLApAQCAtMTQ5LDkgKzExOSwxMCBAQAogICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CiAgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CiAKLSAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgorICAgICAgICAgICAgfHwgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCi0gICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKTsKKyAgICAgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQogICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKICAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhICE9IE5VTEwpOwpAQCAtMjE2LDcgKzE4Nyw3IEBACiAKICAgICBQVkNsZWFuVXBWaWRlb0VuY29kZXIobUhhbmRsZSk7CiAKLSAgICBkZWxldGUgbUlucHV0RnJhbWVEYXRhOworICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICBtSW5wdXRGcmFtZURhdGEgPSBOVUxMOwogCiAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CkBAIC00ODYsNiArNDU3LDE3IEBACiAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogICAgICAgICAgICAgICAgIG1WaWRlb0ZyYW1lUmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPj4gMTY7CiAgICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPSBkZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgJmVkaXRQb3J0SW5mbygwKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSBtVmlkZW9Db2xvckZvcm1hdDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmID0gJmVkaXRQb3J0SW5mbygxKS0+bURlZjsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtVmlkZW9CaXRSYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CiAgICAgICAgICAgICB9CkBAIC02MDcsMTEgKzU4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzID8gIiB0cnVlIiA6ICJmYWxzZSIpOwogCiAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0RnJhbWVEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSBtYWxsb2MoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMyApID4+IDEpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTY3OSw5ICs2NTcsOCBAQAogICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBzcmNCdWZmZXI7IC8vIGZvciBNZXRhRGF0YU1vZGUgb25seQogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7Ci0gICAgICAgICAgICB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewogICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgpAQCAtNjkxLDI0ICs2NjgsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYWxsb2NEYXRhKGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEsIChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMpID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBncmFsbG9jIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIik7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmVyaWZ5L2NvbnZlcnQgcGl4ZWwgZm9ybWF0IGVudW0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IChjb25zdCB1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLCBtSW5wdXRGcmFtZURhdGEsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7CiAKICAgICAgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CkBAIC03MTcsNyArNjk1LDcgQEAKICAgICAgICAgICAgIHZpbi5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCAgKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgIHZpbi5waXRjaCA9ICgobVZpZGVvV2lkdGggKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgIHZpbi50aW1lc3RhbXAgPSAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCi0gICAgICAgICAgICB2aW4ueUNoYW4gPSBpbnB1dERhdGE7CisgICAgICAgICAgICB2aW4ueUNoYW4gPSAodWludDhfdCAqKWlucHV0RGF0YTsKICAgICAgICAgICAgIHZpbi51Q2hhbiA9IHZpbi55Q2hhbiArIHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2g7CiAgICAgICAgICAgICB2aW4udkNoYW4gPSB2aW4udUNoYW4gKyAoKHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2gpID4+IDIpOwogCkBAIC03NDQsNyArNzIyLDYgQEAKIAogICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAogICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKQEAgLTc1OSw0NyArNzM2LDYgQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdE1QRUc0RW5jb2Rlcjo6Z2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7Ci0gICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikpIHsKLSAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7Ci0gICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwotICAgIH0KLSAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotfQotCi11aW50OF90ICpTb2Z0TVBFRzRFbmNvZGVyOjpleHRyYWN0R3JhbGxvY0RhdGEodm9pZCAqZGF0YSwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpIHsKLSAgICBPTVhfVTMyIHR5cGUgPSAqKE9NWF9VMzIqKWRhdGE7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICh0eXBlICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgIEFMT0dFKCJEYXRhIHBhc3NlZCBpbiB3aXRoIG1ldGFkYXRhIG1vZGUgZG9lcyBub3QgaGF2ZSB0eXBlICIKLSAgICAgICAgICAgICAgICAia01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UgKCVkKSwgaGFzIHR5cGUgJWQgaW5zdGVhZCIsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UsIHR5cGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnVmZmVyX2hhbmRsZV90IGltZ0J1ZmZlciA9ICooYnVmZmVyX2hhbmRsZV90KikoKHVpbnQ4X3QqKWRhdGEgKyA0KTsKLQotICAgIGNvbnN0IFJlY3QgcmVjdChtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICB1aW50OF90ICppbWc7Ci0gICAgcmVzID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jayhpbWdCdWZmZXIsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICByZWN0LCAodm9pZCoqKSZpbWcpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqYnVmZmVyID0gaW1nQnVmZmVyOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLXZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6cmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpIHsKLSAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkudW5sb2NrKGJ1ZmZlcik7Ci0gICAgfQotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCBjYzRlYThmLi5iMDYwNWI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKICNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCiAKIApAQCAtMjcsNyArMjcsNyBAQAogCiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKLXN0cnVjdCBTb2Z0TVBFRzRFbmNvZGVyIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdE1QRUc0RW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCkBAIC00MywxMSArNDMsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgLy8gT3ZlcnJpZGUgU29mdE9NWENvbXBvbmVudCBtZXRob2RzCi0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Tb2Z0TVBFRzRFbmNvZGVyKCk7CiAKQEAgLTU2LDEwICs1MSw2IEBACiAgICAgICAgIGtOdW1CdWZmZXJzID0gMiwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEKLSAgICB9OwotCiAgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKQEAgLTkwLDkgKzgxLDYgQEAKICAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNvZGVyKCk7CiAgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOwogCi0gICAgdWludDhfdCogZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKLSAgICB2b2lkIHJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKTsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNEVuY29kZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCmluZGV4IDEzNWM3MTUuLjgyODQ0OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKQEAgLTUwLDYgKzUwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfbXAzZGVjCiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQpAQCAtNjksNiArNzEsOCBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDRkODY0ZGYuLjUzOTYwMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTQ2LDYgKzE0NiwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9NcDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9NUDNUWVBFICptcDNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG1wM1BhcmFtcy0+blBvcnRJbmRleCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtcDNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIG1wM1BhcmFtcy0+bkJpdFJhdGUgPSAwIC8qIHVua25vd24gKi87CisgICAgICAgICAgICBtcDNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIC8vIG90aGVyIGZpZWxkcyBhcmUgZW5jb2Rlci1vbmx5CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKICAgICB9CkBAIC0zMzUsNiArMzUyLDkgQEAKICAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgogICAgICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgICAgIG1TYXdJbnB1dEVvcyA9IGZhbHNlOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKaW5kZXggYjc0Yzg0OS4uMTE0MGVkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucwpAQCAtMzUsNiArMzUsNyBAQAogLnRleHQKIAogLmV4dGVybiBwcW1mU3ludGhXaW4KKy5oaWRkZW4gcHFtZlN5bnRoV2luCiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCA3ZjJjNDZkLi45M2ZmNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTIwLDQgKzIwLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCA0MjNhMDU3Li44Mjg1NzdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMjMsOSArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKLSNpbmNsdWRlICJ2cHgvdnB4X2RlY29kZXIuaCIKLSNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCi0jaW5jbHVkZSAidnB4L3ZwOGR4LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDEsNyArMzgsOCBAQAogICAgICAgICAgICAgTlVMTCAvKiBwcm9maWxlTGV2ZWxzICovLCAwIC8qIG51bVByb2ZpbGVMZXZlbHMgKi8sCiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1Nb2RlKGNvZGluZ1R5cGUgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOCA/IE1PREVfVlA4IDogTU9ERV9WUDkpLAotICAgICAgbUN0eChOVUxMKSB7CisgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbUltZyhOVUxMKSB7CiAgICAgaW5pdFBvcnRzKGtOdW1CdWZmZXJzLCA3NjggKiAxMDI0IC8qIGlucHV0QnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLAogICAgICAgICAgICAgY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDogTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKQEAgLTExOCwzNSArMTE2LDMwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAwKSkgewotICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIik7CisgICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKIAotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKICAgICAgICAgfQogCi0gICAgICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IE5VTEw7Ci0gICAgICAgIHZweF9pbWFnZV90ICppbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcik7CisgICAgICAgIGlmIChtSW1nICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgSU1HX0ZNVF9JNDIwKTsKIAotICAgICAgICBpZiAoaW1nICE9IE5VTEwpIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGltZy0+Zm10LCBJTUdfRk1UX0k0MjApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IGltZy0+ZF93OwotICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gaW1nLT5kX2g7Ci0KLSAgICAgICAgICAgIGlmICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBtV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtSW1nLT5kX3c7CisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtSW1nLT5kX2g7CisgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTU1LDMxICsxNDgsMTYgQEAKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gRU9Tc2VlbiA/IE9NWF9CVUZGRVJGTEFHX0VPUyA6IDA7CiAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbUExBTkVfWV07CiAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbUExBTkVfWV07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbUExBTkVfVV07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbUExBTkVfVl07CisgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IG1JbWctPnN0cmlkZVtQTEFORV9ZXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1BMQU5FX1VdOworICAgICAgICAgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBtSW1nLT5zdHJpZGVbUExBTkVfVl07CisgICAgICAgICAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKIAotICAgICAgICAgICAgICAgIHNyY0xpbmUgKz0gaW1nLT5zdHJpZGVbUExBTkVfWV07Ci0gICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9VXTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOwotCi0gICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9VXTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9WXTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyAvIDIpOwotCi0gICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9WXTsKLSAgICAgICAgICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBtSW1nID0gTlVMTDsKICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKaW5kZXggY2Q1ZWIyOC4uOGY2ODY5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtMjAsNiArMjAsMTAgQEAKIAogI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgU29mdFZQWCA6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKQEAgLTQ3LDYgKzUxLDggQEAKIAogICAgIHZvaWQgKm1DdHg7CiAKKyAgICB2cHhfaW1hZ2VfdCAqbUltZzsKKwogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VlBYKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCmluZGV4IDQwNjBhMGEuLmUyNjUxMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tawpAQCAtMTIsMTAgKzEyLDYgQEAKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAotaWZlcSAoJChUQVJHRVRfREVWSUNFKSwgbWFudGEpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU1VSRkFDRV9JU19CR1IzMgotZW5kaWYKLQogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnZweAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggNWVmZTAyMi4uZWI2MjFkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQogdGVtcGxhdGU8Y2xhc3MgVD4KIHN0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKQEAgLTUxLDEwNyArNTAsMzcgQEAKICAgICByZXR1cm4gY3B1Q29yZUNvdW50OwogfQogCi0KLS8vIFRoaXMgY29sb3IgY29udmVyc2lvbiB1dGlsaXR5IGlzIGNvcGllZCBmcm9tIFNvZnRNUEVHNEVuY29kZXIuY3BwCi1pbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFNlbWlQbGFuYXJUb1BsYW5hcih1aW50OF90ICppbnl1diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHl1diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkgewotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOwotICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRSR0IzMlRvUGxhbmFyKAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdFksIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gICAgQ0hFQ0soKHdpZHRoICYgMSkgPT0gMCk7Ci0gICAgQ0hFQ0soKGhlaWdodCAmIDEpID09IDApOwotCi0gICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0VSArICh3aWR0aCAvIDIpICogKGhlaWdodCAvIDIpOwotCi0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotI2lmZGVmIFNVUkZBQ0VfSVNfQkdSMzIKLSAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgPSBzcmNbNCAqIHhdOwotICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBzcmNbNCAqIHggKyAxXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlZD0gc3JjWzQgKiB4ICsgMl07Ci0jZWxzZQotICAgICAgICAgICAgdW5zaWduZWQgcmVkPSBzcmNbNCAqIHhdOwotICAgICAgICAgICAgdW5zaWduZWQgZ3JlZW4gPSBzcmNbNCAqIHggKyAxXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgPSBzcmNbNCAqIHggKyAyXTsKLSNlbmRpZgotCi0gICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KLSAgICAgICAgICAgICAgICAoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTY7Ci0KLSAgICAgICAgICAgIGRzdFlbeF0gPSBsdW1hOwotCi0gICAgICAgICAgICBpZiAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIFUgPQotICAgICAgICAgICAgICAgICAgICAoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyODsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQotICAgICAgICAgICAgICAgICAgICAoKHJlZCAqIDExMiAtIGdyZWVuICogOTQgLSBibHVlICogMTgpID4+IDgpICsgMTI4OwotCi0gICAgICAgICAgICAgICAgZHN0VVt4IC8gMl0gPSBVOwotICAgICAgICAgICAgICAgIGRzdFZbeCAvIDJdID0gVjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKLSAgICAgICAgICAgIGRzdFUgKz0gd2lkdGggLyAyOwotICAgICAgICAgICAgZHN0ViArPSB3aWR0aCAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMgKz0gNCAqIHdpZHRoOwotICAgICAgICBkc3RZICs9IHdpZHRoOwotICAgIH0KLX0KLQogU29mdFZQWEVuY29kZXI6OlNvZnRWUFhFbmNvZGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtQ29kZWNDb250ZXh0KE5VTEwpLAogICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbihOVUxMKSwKICAgICAgIG1Db2RlY0ludGVyZmFjZShOVUxMKSwKICAgICAgIG1XaWR0aCgxNzYpLAogICAgICAgbUhlaWdodCgxNDQpLAogICAgICAgbUJpdHJhdGUoMTkyMDAwKSwgIC8vIGluIGJwcworICAgICAgbUZyYW1lcmF0ZSgzMCA8PCAxNiksIC8vIGluIFExNiBmb3JtYXQKICAgICAgIG1CaXRyYXRlVXBkYXRlZChmYWxzZSksCiAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlKFZQWF9WQlIpLCAgLy8gdmFyaWFibGUgYml0cmF0ZQotICAgICAgbUZyYW1lRHVyYXRpb25VcygzMzMzMyksICAvLyBEZWZhdWx0cyB0byAzMCBmcHMKICAgICAgIG1EQ1RQYXJ0aXRpb25zKDApLAogICAgICAgbUVycm9yUmVzaWxpZW5jZShPTVhfRkFMU0UpLAogICAgICAgbUNvbG9yRm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAogICAgICAgbUxldmVsKE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMCksCisgICAgICBtS2V5RnJhbWVJbnRlcnZhbCgwKSwKKyAgICAgIG1NaW5RdWFudGl6ZXIoMCksCisgICAgICBtTWF4UXVhbnRpemVyKDApLAorICAgICAgbVRlbXBvcmFsTGF5ZXJzKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUoT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoKDApLAorICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCgwKSwKKyAgICAgIG1MYXN0VGltZXN0YW1wKDB4N0ZGRkZGRkZGRkZGRkZGRkxMKSwKICAgICAgIG1Db252ZXJzaW9uQnVmZmVyKE5VTEwpLAogICAgICAgbUlucHV0RGF0YUlzTWV0YShmYWxzZSksCi0gICAgICBtR3JhbGxvY01vZHVsZShOVUxMKSwKICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZChmYWxzZSkgeworICAgIG1lbXNldChtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgMCwgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0gPSAxMDA7CiAgICAgaW5pdFBvcnRzKCk7CiB9CiAKQEAgLTE4MCw5ICsxMDksOCBAQAogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGlucHV0UG9ydC5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKLSAgICAvLyBmcmFtZVJhdGUgaXMgcmVjaXByb2NhbCBvZiBmcmFtZUR1cmF0aW9uLCB3aGljaCBpcwotICAgIC8vIGluIG1pY3Jvc2Vjb25kcy4gSXQgaXMgYWxzbyBpbiBRMTYgZm9ybWF0LgotICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9ICgxMDAwMDAwL21GcmFtZUR1cmF0aW9uVXMpIDw8IDE2OworICAgIC8vIGZyYW1lUmF0ZSBpcyBpbiBRMTYgZm9ybWF0LgorICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IG1GcmFtZXJhdGU7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CiAgICAgaW5wdXRQb3J0Lm5Qb3J0SW5kZXggPSBrSW5wdXRQb3J0SW5kZXg7CiAgICAgaW5wdXRQb3J0LmVEaXIgPSBPTVhfRGlySW5wdXQ7CkBAIC0yMjAsNyArMTQ4LDcgQEAKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVlA4OwogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7Ci0gICAgb3V0cHV0UG9ydC5uQnVmZmVyU2l6ZSA9IDI1NiAqIDEwMjQ7ICAvLyBhcmJpdHJhcnkKKyAgICBvdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0gMTAyNCAqIDEwMjQ7IC8vIGFyYml0cmFyeQogCiAgICAgYWRkUG9ydChvdXRwdXRQb3J0KTsKIH0KQEAgLTIzNiw3ICsxNjQsOSBAQAogICAgIGlmIChtQ29kZWNJbnRlcmZhY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9Ci0KKyAgICBBTE9HRCgiVlA4OiBpbml0RW5jb2Rlci4gQlJNb2RlOiAldS4gVFNMYXllcnM6ICV6dS4gS0Y6ICV1LiBRUDogJXUgLSAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplcik7CiAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChtQ29kZWNJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAvLyBDb2RlYyBzcGVjaWZpYyBmbGFncwpAQCAtMjc3LDggKzIwNywxMjAgQEAKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLm51bSA9IDE7CiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5kZW4gPSAxMDAwMDAwOwogICAgIC8vIHJjX3RhcmdldF9iaXRyYXRlIGlzIGluIGticHMsIG1CaXRyYXRlIGluIGJwcwotICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUvMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZSArIDUwMCkgLyAxMDAwOwogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2VuZF91c2FnZSA9IG1CaXRyYXRlQ29udHJvbE1vZGU7CisgICAgLy8gRGlzYWJsZSBmcmFtZSBkcm9wIC0gbm90IGFsbG93ZWQgaW4gTWVkaWFDb2RlYyBub3cuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gRGlzYWJsZSBsYWdnZWQgZW5jb2RpbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgICAgIC8vIE1heGltdW0ga2V5IGZyYW1lIGludGVydmFsIC0gZm9yIENCUiBib29zdCB0byAzMDAwCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gMzAwMDsKKyAgICAgICAgLy8gRW5jb2RlciBkZXRlcm1pbmVzIG9wdGltYWwga2V5IGZyYW1lIHBsYWNlbWVudCBhdXRvbWF0aWNhbGx5LgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorCisgICAgLy8gRnJhbWVzIHRlbXBvcmFsIHBhdHRlcm4gLSBmb3Igbm93IFdlYlJUQyBsaWtlIHBhdHRlcm4gaXMgb25seSBzdXBwb3J0ZWQuCisgICAgc3dpdGNoIChtVGVtcG9yYWxMYXllcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICB7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgeworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIldyb25nIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgJXp1IiwgbVRlbXBvcmFsTGF5ZXJzKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGJpdHJhdGUgdmFsdWVzIGZvciBlYWNoIGxheWVyCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfdGFyZ2V0X2JpdHJhdGVbaV0gPQorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgKgorICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gLyAxMDA7CisgICAgfQorICAgIGlmIChtS2V5RnJhbWVJbnRlcnZhbCA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSBtS2V5RnJhbWVJbnRlcnZhbDsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWluX2Rpc3QgPSBtS2V5RnJhbWVJbnRlcnZhbDsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CiAKICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLApAQCAtMjk4LDEzICszNDAsMzkgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciB8fCBtSW5wdXREYXRhSXNNZXRhKSB7Ci0gICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMik7Ci0gICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAvLyBFeHRyYSBDQlIgc2V0dGluZ3MKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgdWludDMyX3QgcmNfbWF4X2ludHJhX3RhcmdldCA9CisgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiAobUZyYW1lcmF0ZSA+PiAxNykgLyAxMDsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8IG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKTsKKyAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKQEAgLTMyNCw3ICszOTIsNyBAQAogICAgIH0KIAogICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQ29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7CiAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKICAgICB9CiAKQEAgLTM2MSw5ICs0MjksNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGZyb20gbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgLy8gQWxzbyBjb252ZXJ0aW5nIHRvIFExNiBmb3JtYXQKLSAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAoMTAwMDAwMC9tRnJhbWVEdXJhdGlvblVzKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSBtRnJhbWVyYXRlOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1ZQODsKQEAgLTQxMSw2ICs0NzcsMjQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOiB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqdnA4QW5kcm9pZFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW07CisKKyAgICAgICAgICAgICAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9IG1UZW1wb3JhbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPSBtVGVtcG9yYWxMYXllcnM7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDogewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnByb2ZpbGVBbmRMZXZlbCA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW07CkBAIC00OTcsMTEgKzU4MSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSAqKXBhcmFtKTsKIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjoKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW0pOworCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW0pOwogCi0gICAgICAgIGNhc2UgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQ6CisgICAgICAgIGNhc2Uga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RvcmVNZXRhRGF0YUluQnVmZmVycwogICAgICAgICAgICAgY29uc3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyAqc3RvcmVQYXJhbSA9CkBAIC02MTAsNiArNjk4LDUwIEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpIHsKKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lICYmCisgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gIT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID4gT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPiB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCisgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUgPSB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuOworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50OworICAgIH0gZWxzZSBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IDA7CisgICAgfQorICAgIC8vIENoZWNrIHRoZSBiaXRyYXRlIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIGxheWVycyBpcyBpbiBpbmNyZWFzaW5nIG9yZGVyCisgICAgaWYgKG1UZW1wb3JhbExheWVycyA+IDEpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGVtcG9yYWxMYXllcnMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpICsgMV0gPD0KKyAgICAgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgYml0cmF0ZSByYXRpbyAtIHNob3VsZCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUtleUZyYW1lSW50ZXJ2YWwgPSB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbDsKKyAgICBtTWluUXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplcjsKKyAgICBtTWF4UXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplcjsKKyAgICBtZW1jcHkobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgQUxPR0QoIlZQODogaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zLiBCUk1vZGU6ICV1LiBUUzogJXp1LiBLRjogJXUuIgorICAgICAgICAgICIgUVA6ICV1IC0gJXUgQlIwOiAldS4gQlIxOiAldS4gQlIyOiAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplciwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0sCisgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMV0sIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzJdKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KSB7CkBAIC02NjAsOSArNzkyLDcgQEAKICAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICAgICAgLy8geEZyYW1lcmF0ZSBjb21lcyBpbiBRMTYgZm9ybWF0LCBpbiBmcmFtZXMgcGVyIHNlY29uZCB1bml0Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwotICAgICAgICAvLyBmcmFtZSBkdXJhdGlvbiBpcyBpbiBtaWNyb3NlY29uZHMKLSAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDAwMDAwL2ZyYW1lcmF0ZSk7CisgICAgICAgIG1GcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKIAogICAgICAgICBpZiAocG9ydC0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CiAgICAgICAgICAgICBwb3J0LT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8CkBAIC02NzUsNyArODA1LDcgQEAKICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKLSAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbUNvbG9yRm9ybWF0OwogICAgICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTY4NCw2ICs4MTQsMTMgQEAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfSBlbHNlIGlmIChwb3J0LT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgbUJpdHJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIG1XaWR0aCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gbUJpdHJhdGU7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CkBAIC03MTAsNiArODQ3LDc0IEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBTb2Z0VlBYRW5jb2Rlcjo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgrKzsKKyAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGJyZWFrIGhlcmUuCisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CiAKIHZvaWQgU29mdFZQWEVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKICAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKQEAgLTc0OSw1MSArOTU0LDMzIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICB1aW50OF90ICpzb3VyY2UgPQorICAgICAgICBjb25zdCB1aW50OF90ICpzb3VyY2UgPQogICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldDsKIAogICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgewotICAgICAgICAgICAgQ0hFQ0tfR0UoaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sCi0gICAgICAgICAgICAgICAgICAgICA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwotCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJUeXBlID0gKih1aW50MzJfdCAqKXNvdXJjZTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJ1ZmZlclR5cGUsIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKTsKLQotICAgICAgICAgICAgaWYgKG1HcmFsbG9jTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBod19nZXRfbW9kdWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbUdyYWxsb2NNb2R1bGUpKTsKKyAgICAgICAgICAgIHNvdXJjZSA9IGV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciwgbVdpZHRoICogbUhlaWdodCAqIDMgLyAyLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBleHRyYWN0IGdyYWxsb2MgYnVmZmVyIGluIG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdCBncmFsbG9jX21vZHVsZV90ICpncm1vZHVsZSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKiltR3JhbGxvY01vZHVsZTsKLQotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNvdXJjZSArIDQpOwotCi0gICAgICAgICAgICB2b2lkICpiaXRzOwotICAgICAgICAgICAgQ0hFQ0tfRVEoMCwKLSAgICAgICAgICAgICAgICAgICAgIGdybW9kdWxlLT5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgIGdybW9kdWxlLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1XaWR0aCwgbUhlaWdodCwgJmJpdHMpKTsKLQotICAgICAgICAgICAgQ29udmVydFJHQjMyVG9QbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYml0cywgbUNvbnZlcnNpb25CdWZmZXIsIG1XaWR0aCwgbUhlaWdodCk7Ci0KLSAgICAgICAgICAgIHNvdXJjZSA9IG1Db252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICBDSEVDS19FUSgwLCBncm1vZHVsZS0+dW5sb2NrKGdybW9kdWxlLCBoYW5kbGUpKTsKICAgICAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKLSAgICAgICAgICAgIENvbnZlcnRTZW1pUGxhbmFyVG9QbGFuYXIoCisgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAogICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIG1Db252ZXJzaW9uQnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOwogCiAgICAgICAgICAgICBzb3VyY2UgPSBtQ29udmVyc2lvbkJ1ZmZlcjsKICAgICAgICAgfQogICAgICAgICB2cHhfaW1hZ2VfdCByYXdfZnJhbWU7CiAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCBtV2lkdGgsIG1IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsICh1aW50OF90ICopc291cmNlKTsKIAogICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUtleUZyYW1lUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CiAgICAgICAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQgPSBmYWxzZTsKQEAgLTgxNCwxMSArMTAwMSwxOCBAQAogICAgICAgICAgICAgbUJpdHJhdGVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KTEwMDAwMDAgPDwgMTYpIC8gbUZyYW1lcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZSgKICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICZyYXdfZnJhbWUsCiAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAsICAvLyBpbiB0aW1lYmFzZSB1bml0cwotICAgICAgICAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMsICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cworICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cwogICAgICAgICAgICAgICAgIGZsYWdzLCAgLy8gZnJhbWUgZmxhZ3MKICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOyAgLy8gZW5jb2RpbmcgZGVhZGxpbmUKICAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKQEAgLTg1NywxNiArMTA1MSw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCAwNzY4MzBmLi5mNGMxNTY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogCiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CkBAIC01OSw3ICs1OSw3IEBACiAvLyAgICAtIE9NWCB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZQogLy8gZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZCB0byAxLzEwMDAwMDAKIAotc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFhFbmNvZGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTg3LDEwICs4Nyw0NCBAQAogICAgIC8vIGVuY29kaW5nIG9mIHRoZSBmcmFtZQogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJpdmF0ZToKKyAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAvLyB1cGRhdGUgbGFzdC4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAvLyBnb2xkZW4gd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZiA9IDEwLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAvLyBCYXNlIGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgIC8vIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWYgPSA2LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAvLyB0aGUgc2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW4gPSAyLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3kgPSAxLAorICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICB9OworICAgIGVudW0geworICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgIH07CisKICAgICAvLyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgcGVyIHBvcnQKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga051bUJ1ZmZlcnMgPSA0OwogCkBAIC0xMzAsMTYgKzE2NCwxNSBAQAogICAgIC8vIFRhcmdldCBiaXRyYXRlIHNldCBmb3IgdGhlIGVuY29kZXIsIGluIGJpdHMgcGVyIHNlY29uZC4KICAgICB1aW50MzJfdCBtQml0cmF0ZTsKIAorICAgIC8vIFRhcmdldCBmcmFtZXJhdGUgc2V0IGZvciB0aGUgZW5jb2Rlci4KKyAgICB1aW50MzJfdCBtRnJhbWVyYXRlOworCiAgICAgLy8gSWYgYSByZXF1ZXN0IGZvciBhIGNoYW5nZSBpdCBiaXRyYXRlIGhhcyBiZWVuIHJlY2VpdmVkLgogICAgIGJvb2wgbUJpdHJhdGVVcGRhdGVkOwogCiAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQogICAgIHZweF9yY19tb2RlIG1CaXRyYXRlQ29udHJvbE1vZGU7CiAKLSAgICAvLyBGcmFtZSBkdXJhdGlvbiBpcyB0aGUgcmVjaXByb2NhbCBvZiBmcmFtZXJhdGUsIGRlbm90ZWQKLSAgICAvLyBpbiBtaWNyb3NlY29uZHMKLSAgICB1aW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwotCiAgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCiAgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgogICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCkBAIC0xNjAsNiArMTkzLDM2IEBACiAgICAgLy8gc29tZXRoaW5nIGVsc2UuCiAgICAgT01YX1ZJREVPX1ZQOExFVkVMVFlQRSBtTGV2ZWw7CiAKKyAgICAvLyBLZXkgZnJhbWUgaW50ZXJ2YWwgaW4gZnJhbWVzCisgICAgdWludDMyX3QgbUtleUZyYW1lSW50ZXJ2YWw7CisKKyAgICAvLyBNaW5pbXVtIChiZXN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICB1aW50MzJfdCBtTWF4UXVhbnRpemVyOworCisgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgLy8gVGVtcG9yYWwgbGF5ZXIgYml0cmFyZSByYXRpbyBpbiBwZXJjZW50YWdlCisgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKworICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgLy8gRnJhbWUgdHlwZSB0ZW1wb3JhbCBwYXR0ZXJuCisgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICBPTVhfVElDS1MgbUxhc3RUaW1lc3RhbXA7CisKICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gY29udmVydCBzZW1pCiAgICAgLy8gcGxhbmFyIHl1djQyMCB0byBwbGFuYXIgZm9ybWF0CiAgICAgLy8gSXQgaXMgb25seSBhbGxvY2F0ZWQgaWYgaW5wdXQgZm9ybWF0IGlzCkBAIC0xNjcsNyArMjMwLDYgQEAKICAgICB1aW50OF90KiBtQ29udmVyc2lvbkJ1ZmZlcjsKIAogICAgIGJvb2wgbUlucHV0RGF0YUlzTWV0YTsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbUdyYWxsb2NNb2R1bGU7CiAKICAgICBib29sIG1LZXlGcmFtZVJlcXVlc3RlZDsKIApAQCAtMTg1LDYgKzI0Nyw5IEBACiAgICAgLy8gZHRvci4KICAgICBzdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOwogCisgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGdldEVuY29kZUZsYWdzKCk7CisKICAgICAvLyBIYW5kbGVzIHBvcnQgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gY29sb3IgZm9ybWF0cwogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KTsKQEAgLTIwNiw2ICsyNzEsMTAgQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogdnA4UGFyYW1zKTsKIAorICAgIC8vIEhhbmRsZXMgQW5kcm9pZCB2cDggc3BlY2lmaWMgcGFyYW1ldGVycy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpOworCiAgICAgLy8gVXBkYXRlcyBlbmNvZGVyIHByb2ZpbGUKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcHJvZmlsZUFuZExldmVsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcAppbmRleCBhN2JkZTk3Li4xNjgyMDhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC01OCw3ICs1OCw2IEBACiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKLSAgICAgIG1QaWN0dXJlU2l6ZShtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpLAogICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKICAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCiAgICAgICBtUGljSWQoMCksCkBAIC0xMTgsNyArMTE3LDcgQEAKICAgICB9CiAKICAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CiAgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCiAgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKIApAQCAtMTYxLDE3ICsxNjAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BQYXJhbXMoZGVjb2RlckluZm8pOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGRlY29kZXJJbmZvLnBpY1dpZHRoLCBkZWNvZGVySW5mby5waWNIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgewogCkBAIC0xOTksOCArMTk1LDcgQEAKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKLSAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQpIHsKLSAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMTUsNDQgKzIxMCwzNCBAQAogICAgIH0KIH0KIAotYm9vbCBTb2Z0QVZDOjpoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pIHsKLSAgICBpZiAobVdpZHRoICE9IGluZm8tPnBpY1dpZHRoIHx8IG1IZWlnaHQgIT0gaW5mby0+cGljSGVpZ2h0KSB7Ci0gICAgICAgIG1XaWR0aCAgPSBpbmZvLT5waWNXaWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGluZm8tPnBpY0hlaWdodDsKLSAgICAgICAgbVBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIHJldHVybiB0cnVlOworU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBTb2Z0QVZDOjpoYW5kbGVDcm9wUGFyYW1zKAorICAgICAgICBjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKSB7CisgICAgaWYgKCFkZWNJbmZvLmNyb3BwaW5nRmxhZykgeworICAgICAgICByZXR1cm4ga0Nyb3BVblNldDsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU29mdEFWQzo6aGFuZGxlQ3JvcFJlY3RFdmVudChjb25zdCBDcm9wUGFyYW1zICpjcm9wKSB7Ci0gICAgaWYgKG1Dcm9wTGVmdCAhPSBjcm9wLT5jcm9wTGVmdE9mZnNldCB8fAotICAgICAgICBtQ3JvcFRvcCAhPSBjcm9wLT5jcm9wVG9wT2Zmc2V0IHx8Ci0gICAgICAgIG1Dcm9wV2lkdGggIT0gY3JvcC0+Y3JvcE91dFdpZHRoIHx8Ci0gICAgICAgIG1Dcm9wSGVpZ2h0ICE9IGNyb3AtPmNyb3BPdXRIZWlnaHQpIHsKLSAgICAgICAgbUNyb3BMZWZ0ID0gY3JvcC0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgICAgIG1Dcm9wVG9wID0gY3JvcC0+Y3JvcFRvcE9mZnNldDsKLSAgICAgICAgbUNyb3BXaWR0aCA9IGNyb3AtPmNyb3BPdXRXaWR0aDsKLSAgICAgICAgbUNyb3BIZWlnaHQgPSBjcm9wLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLAotICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsIE5VTEwpOwotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgIGNvbnN0IENyb3BQYXJhbXMmIGNyb3AgPSBkZWNJbmZvLmNyb3BQYXJhbXM7CisgICAgaWYgKG1Dcm9wTGVmdCA9PSBjcm9wLmNyb3BMZWZ0T2Zmc2V0ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3AuY3JvcFRvcE9mZnNldCAmJgorICAgICAgICBtQ3JvcFdpZHRoID09IGNyb3AuY3JvcE91dFdpZHRoICYmCisgICAgICAgIG1Dcm9wSGVpZ2h0ID09IGNyb3AuY3JvcE91dEhlaWdodCkgeworICAgICAgICByZXR1cm4ga0Nyb3BTZXQ7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKworICAgIG1Dcm9wTGVmdCA9IGNyb3AuY3JvcExlZnRPZmZzZXQ7CisgICAgbUNyb3BUb3AgPSBjcm9wLmNyb3BUb3BPZmZzZXQ7CisgICAgbUNyb3BXaWR0aCA9IGNyb3AuY3JvcE91dFdpZHRoOworICAgIG1Dcm9wSGVpZ2h0ID0gY3JvcC5jcm9wT3V0SGVpZ2h0OworICAgIHJldHVybiBrQ3JvcENoYW5nZWQ7CiB9CiAKIHZvaWQgU29mdEFWQzo6c2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpIHsKICAgICBDSEVDSyhtRmlyc3RQaWN0dXJlID09IE5VTEwpOwogICAgIG1GaXJzdFBpY3R1cmVJZCA9IHBpY0lkOwogCi0gICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W21QaWN0dXJlU2l6ZV07Ci0gICAgbWVtY3B5KG1GaXJzdFBpY3R1cmUsIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgdWludDMyX3QgcGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W3BpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgcGljdHVyZVNpemUpOwogfQogCiB2b2lkIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKQEAgLTI2Myw5ICsyNDgsMTcgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CiAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKLSAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7Ci0gICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworCisgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSBzcmNZICsgbVdpZHRoICogbUhlaWdodDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNWID0gc3JjVSArIG1XaWR0aCAqIG1IZWlnaHQgLyA0OworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbVdpZHRoOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbVdpZHRoIC8gMjsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IHNyY1VTdHJpZGU7CisgICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7CisKICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbShwaWNJZCk7CiAgICAgZGVsZXRlIGhlYWRlcjsKICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaAppbmRleCBlZTY5OTI2Li4wNjkxMDdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKQEAgLTU1LDggKzU1LDYgQEAKIAogICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKIAotICAgIHVpbnQzMl90IG1QaWN0dXJlU2l6ZTsKLQogICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7CiAgICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7CiAKQEAgLTc1LDggKzczLDcgQEAKICAgICB2b2lkIGRyYWluQWxsT3V0cHV0QnVmZmVycyhib29sIGVvcyk7CiAgICAgdm9pZCBkcmFpbk9uZU91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKTsKICAgICB2b2lkIHNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpZElkLCB1aW50OF90ICpkYXRhKTsKLSAgICBib29sIGhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyogY3JvcCk7Ci0gICAgYm9vbCBoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pOworICAgIENyb3BTZXR0aW5nc01vZGUgaGFuZGxlQ3JvcFBhcmFtcyhjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwppbmRleCAwNzNkYmJhLi5iY2M2YjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCkBAIC0xMCw2ICsxMCwyMiBAQAogICAgIC5mcHUgbmVvbgogICAgIC50ZXh0CiAKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCiAgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgogYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXI6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwppbmRleCA0NGViNDI4Li41YmM3ODc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKQEAgLTIwLDYgKzIwLDE0IEBACiAgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgogCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorCiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKICAgICAuYnl0ZSAgMCwgMiwgMCwgMgogICAgIC5ieXRlICAyLCAxLCAyLCAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwppbmRleCAyYmI0YzRkLi41MjRhM2YwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJoMjY0YnNkX2RlY29kZXIuaCIKICNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVmVyc2lvbiBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTczLDYgKzc1LDcgQEAKICNlbmRpZgogCiB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykgeworICAgIFVOVVNFRChzdHJpbmcpOwogfQogCiB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKaW5kZXggYzk0ODc3Ni4uYjQwOWEwNiAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMKQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJhcm1WQy5oIgogI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTM2LDcgKzIxMzgsOCBAQAogICBpMzIgY2VudGVyLAogICBpMzIgcmlnaHQpCiB7Ci0KKyAgICBVTlVTRUQobGVmdCk7CisgICAgVU5VU0VEKHJpZ2h0KTsKICAgICBBU1NFUlQocmVmKTsKICAgICBBU1NFUlQoZmlsbCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYwppbmRleCBhN2M2ZjY0Li4yMzQwMWM2IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCkBAIC00Nyw2ICs0Nyw4IEBACiAjaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgogI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQwNyw2ICsxNDA5LDcgQEAKICAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKICAgICBpMzIgaXZhbHVlOwogICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07CisgICAgVU5VU0VEKG5hbFVuaXRUeXBlKTsKIAogLyogQ29kZSAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjViMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzljNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0T3B1cy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGV4dGVybmFsL2xpYm9wdXMvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJvcHVzIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X29wdXNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODA4NGFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE9wdXMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0T3B1cy5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRPcHVzOjpTb2Z0T3B1cygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQorICAgIDogU2ltcGxlU29mdE9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1EZWNvZGVyKE5VTEwpLAorICAgICAgbUhlYWRlcihOVUxMKSwKKyAgICAgIG1Db2RlY0RlbGF5KDApLAorICAgICAgbVNlZWtQcmVSb2xsKDApLAorICAgICAgbUFuY2hvclRpbWVVcygwKSwKKyAgICAgIG1OdW1GcmFtZXNPdXRwdXQoMCksCisgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpIHsKKyAgICBpbml0UG9ydHMoKTsKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworfQorCitTb2Z0T3B1czo6flNvZnRPcHVzKCkgeworICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAobUhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtSGVhZGVyOworICAgICAgICBtSGVhZGVyID0gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE9wdXM6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAwOworICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSA5NjAgKiA2OworICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOworICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKKyAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0KKyAgICAgICAgY29uc3RfY2FzdDxjaGFyICo+KE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9CisgICAgICAgIChPTVhfQVVESU9fQ09ESU5HVFlQRSlPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM7CisKKyAgICBhZGRQb3J0KGRlZik7CisKKyAgICBkZWYublBvcnRJbmRleCA9IDE7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OworICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKKyAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CisgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRPcHVzOjppbml0RGVjb2RlcigpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdE9wdXM6OmludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG9wdXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7CisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkJpdFJhdGUgPSAwOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IGtSYXRlOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpyb2xlUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoY29uc3QgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKG9wdXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK2Jvb2wgU29mdE9wdXM6OmlzQ29uZmlndXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlucHV0QnVmZmVyQ291bnQgPj0gMTsKK30KKworc3RhdGljIHVpbnQxNl90IFJlYWRMRTE2KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICBpZiAocmVhZF9vZmZzZXQgKyAxID4gZGF0YV9zaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK3N0YXRpYyBib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIC8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKworICAgIC8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworCisgICAgLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKyAgICAvLyBiZXlvbmQgdGhlIGFsd2F5cyBwcmVzZW50IHxrT3B1c0hlYWRlclNpemV8IGJ5dGVzIG9mIGRhdGEuIFRoZSBtYXBwaW5nCisgICAgLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworICAgIC8vIHZhbHVlczoKKyAgICAvLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KKyAgICAvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKyAgICAvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisgICAgLy8gICAgICAgICAgICAgdmFsdWVzLgorICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSBrT3B1c0hlYWRlclNpemU7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDE7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0ga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ICsgMjsKKworICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclNpemUpIHsKKyAgICAgICAgQUxPR1YoIkhlYWRlciBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPmNoYW5uZWxzID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCk7CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8PSAwIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCB3cm9uZyBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQpOworICAgIGhlYWRlci0+Z2Fpbl9kYiA9IHN0YXRpY19jYXN0PGludDE2X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJHYWluT2Zmc2V0KSk7CisgICAgaGVhZGVyLT5jaGFubmVsX21hcHBpbmcgPSAqKGRhdGEgKyBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0KTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCk7CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9ICooZGF0YSArIGtPcHVzSGVhZGVyTnVtQ291cGxlZE9mZnNldCk7CisgICAgaWYgKGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXItPmNoYW5uZWxzOyArK2kpCisgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbaV0gPSAqKGRhdGEgKyBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCBrUmF0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIGtSYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBTb2Z0T3B1czo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOworCisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGhlYWRlci0+cEJ1ZmZlciArIGhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBoZWFkZXItPm5GaWxsZWRMZW47CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIENIRUNLKG1IZWFkZXIgPT0gTlVMTCk7CisgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKKyAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKKyAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKGRhdGEsIHNpemUsIG1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNpbmcgT3B1cyBIZWFkZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKworICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLT5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGhlYWRlci0+cEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5uT2Zmc2V0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhdGUpOworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICB9CisKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworCisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHNlZWtpbmcgdG8gemVybywgfG1Db2RlY0RlbGF5fCBzYW1wbGVzIGhhcyB0byBiZSBkaXNjYXJkZWQKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB8bVNlZWtQcmVSb2xsfCBzYW1wbGVzIChhcyB3ZSB3b3VsZCB3aGVuIHNlZWtpbmcgdG8gYW55CisgICAgICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgICAgIGlmIChpbkhlYWRlci0+blRpbWVTdGFtcCA9PSAwKSB7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKworICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBudW1GcmFtZXMgLT0gbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gbVNhbXBsZXNUb0Rpc2NhcmQgKiBzaXplb2YoaW50MTZfdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXItPmNoYW5uZWxzOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbUFuY2hvclRpbWVVcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlOworCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOworCisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBtQW5jaG9yVGltZVVzID0gMDsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjpvblJlc2V0KCkgeworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUhlYWRlcjsKKyAgICAgICAgbUhlYWRlciA9IE5VTEw7CisgICAgfQorCisgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgaWYgKHBvcnRJbmRleCAhPSAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UpIHsKKyAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBV0FJVElOR19ESVNBQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soIWVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0VOQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSwgKGludClBV0FJVElOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIENIRUNLKGVuYWJsZWQpOworICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0T3B1cyhuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZjY1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoZSBPcHVzIHNwZWNpZmljYXRpb24gaXMgcGFydCBvZiBJRVRGIFJGQyA2NzE2OgorICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjcxNgorICovCisKKyNpZm5kZWYgU09GVF9PUFVTX0hfCisKKyNkZWZpbmUgU09GVF9PUFVTX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgaW50IGNoYW5uZWxzOworICBpbnQgc2tpcF9zYW1wbGVzOworICBpbnQgY2hhbm5lbF9tYXBwaW5nOworICBpbnQgbnVtX3N0cmVhbXM7CisgIGludCBudW1fY291cGxlZDsKKyAgaW50MTZfdCBnYWluX2RiOworICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitzdHJ1Y3QgU29mdE9wdXMgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdE9wdXMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRPcHVzKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1CdWZmZXJzID0gNCwKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA5NjAgKiA2CisgICAgfTsKKworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOworICAgIE9wdXNIZWFkZXIgKm1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9wdXMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX09QVVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tawppbmRleCBmZTkwYTAzLi44NzA4MGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCkBAIC04LDYgKzgsOCBAQAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tawppbmRleCAyMjMyMzUzLi4yMTdhNmQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKQEAgLTE2LDQgKzE2LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDc3ZjIxYjcuLjE4OTliNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KQEAgLTMzLDM0ICszMyw3MSBAQAogICAgIHJldHVybiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHByb3AsIE5VTEwpID4gMCk7CiB9CiAKLVNvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKLSAgICA6IG1Db252ZXJ0ZXIoTlVMTCksCitzdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgeworICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7Cit9CisKK1NvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykKKyAgICA6IG1Db2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0VW51c2VkKSwKKyAgICAgIG1Db252ZXJ0ZXIoTlVMTCksCiAgICAgICBtWVVWTW9kZShOb25lKSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnRtcCkpOwotICAgIG1Db2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSl0bXA7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApLAorICAgICAgbUNyb3BMZWZ0KDApLAorICAgICAgbUNyb3BUb3AoMCksCisgICAgICBtQ3JvcFJpZ2h0KDApLAorICAgICAgbUNyb3BCb3R0b20oMCksCisgICAgICBtQ3JvcFdpZHRoKDApLAorICAgICAgbUNyb3BIZWlnaHQoMCkgeworfQogCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOworU29mdHdhcmVSZW5kZXJlcjo6flNvZnR3YXJlUmVuZGVyZXIoKSB7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CiAKLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAmbUNyb3BMZWZ0LCAmbUNyb3BUb3AsICZtQ3JvcFJpZ2h0LCAmbUNyb3BCb3R0b20pKSB7Ci0gICAgICAgIG1Dcm9wTGVmdCA9IG1Dcm9wVG9wID0gMDsKLSAgICAgICAgbUNyb3BSaWdodCA9IG1XaWR0aCAtIDE7Ci0gICAgICAgIG1Dcm9wQm90dG9tID0gbUhlaWdodCAtIDE7Cit2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQ0hFQ0soZm9ybWF0ICE9IE5VTEwpOworCisgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CisKKyAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisKKyAgICBpbnQzMl90IGNyb3BMZWZ0TmV3LCBjcm9wVG9wTmV3LCBjcm9wUmlnaHROZXcsIGNyb3BCb3R0b21OZXc7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgImNyb3AiLCAmY3JvcExlZnROZXcsICZjcm9wVG9wTmV3LCAmY3JvcFJpZ2h0TmV3LCAmY3JvcEJvdHRvbU5ldykpIHsKKyAgICAgICAgY3JvcExlZnROZXcgPSBjcm9wVG9wTmV3ID0gMDsKKyAgICAgICAgY3JvcFJpZ2h0TmV3ID0gd2lkdGhOZXcgLSAxOworICAgICAgICBjcm9wQm90dG9tTmV3ID0gaGVpZ2h0TmV3IC0gMTsKICAgICB9CiAKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvbG9yRm9ybWF0KSA9PSBjb2xvckZvcm1hdE5ldyAmJgorICAgICAgICBtV2lkdGggPT0gd2lkdGhOZXcgJiYKKyAgICAgICAgbUhlaWdodCA9PSBoZWlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BMZWZ0ID09IGNyb3BMZWZ0TmV3ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3BUb3BOZXcgJiYKKyAgICAgICAgbUNyb3BSaWdodCA9PSBjcm9wUmlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BCb3R0b20gPT0gY3JvcEJvdHRvbU5ldykgeworICAgICAgICAvLyBOb3RoaW5nIGNoYW5nZWQsIG5vIG5lZWQgdG8gcmVzZXQgcmVuZGVyZXIuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOworICAgIG1XaWR0aCA9IHdpZHRoTmV3OworICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbUNyb3BMZWZ0ID0gY3JvcExlZnROZXc7CisgICAgbUNyb3BUb3AgPSBjcm9wVG9wTmV3OworICAgIG1Dcm9wUmlnaHQgPSBjcm9wUmlnaHROZXc7CisgICAgbUNyb3BCb3R0b20gPSBjcm9wQm90dG9tTmV3OworCiAgICAgbUNyb3BXaWR0aCA9IG1Dcm9wUmlnaHQgLSBtQ3JvcExlZnQgKyAxOwogICAgIG1Dcm9wSGVpZ2h0ID0gbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDE7CiAKLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCiAgICAgaW50IGhhbEZvcm1hdDsKICAgICBzaXplX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKIApAQCAtMTA2LDEyICsxNDMsMjkgQEAKICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVykpOwogCiAgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PwotICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgYnVmV2lkdGgsCi0gICAgICAgICAgICAgICAgYnVmSGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCkpOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CiAKKyAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKKyAgICBjcm9wLmxlZnQgPSBtQ3JvcExlZnQ7CisgICAgY3JvcC50b3AgPSBtQ3JvcFRvcDsKKyAgICBjcm9wLnJpZ2h0ID0gbUNyb3BSaWdodCArIDE7CisgICAgY3JvcC5ib3R0b20gPSBtQ3JvcEJvdHRvbSArIDE7CisgICAgQUxPR1YoInNldHRpbmcgY3JvcDogWyVkLCAlZCwgJWQsICVkXSBmb3Igc2l6ZSBbJXp1LCAlenVdIiwKKyAgICAgICAgICBjcm9wLmxlZnQsIGNyb3AudG9wLCBjcm9wLnJpZ2h0LCBjcm9wLmJvdHRvbSwgYnVmV2lkdGgsIGJ1ZkhlaWdodCk7CisKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZjcm9wKSk7CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CiAgICAgdWludDMyX3QgdHJhbnNmb3JtOwogICAgIHN3aXRjaCAocm90YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CkBAIC0xMjEsMjQgKzE3NSwxNSBAQAogICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKICAgICB9CiAKLSAgICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pKTsKLSAgICB9Ci19Ci0KLVNvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgewotICAgIGRlbGV0ZSBtQ29udmVydGVyOwotICAgIG1Db252ZXJ0ZXIgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgewotICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0gICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiB9CiAKIHZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKSB7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAvKnNpemUqLywgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICAgICAgdm9pZCogLypwbGF0Zm9ybVByaXZhdGUqLywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIHsKKyAgICByZXNldEZvcm1hdElmQ2hhbmdlZChmb3JtYXQpOworCiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwogICAgIGludCBlcnI7CiAgICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCkBAIC0yMzAsNiArMjc1LDExIEBACiAKICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CiAKKyAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICB0aW1lc3RhbXBOcykpICE9IDApIHsKKyAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgfQorCiAgICAgaWYgKChlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBidWYsCiAgICAgICAgICAgICAtMSkpICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTkwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCkBAIC0wLDAgKzEsOTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC0zMjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCw5NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZWYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTAsMCArMSwxMDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CisgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS05ODMwNDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKworICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTI4MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iODk2eDg5NiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xNDg1IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAKaW5kZXggNTQ5OWMzMi4uYmViNWNjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAgICAgICBtTnVtQml0c0xlZnQoMCkgewogfQogCitBQml0UmVhZGVyOjp+QUJpdFJlYWRlcigpIHsKK30KKwogdm9pZCBBQml0UmVhZGVyOjpmaWxsUmVzZXJ2b2lyKCkgewogICAgIENIRUNLX0dUKG1TaXplLCAwdSk7CiAKQEAgLTk5LDQgKzEwMiw2OSBAQAogICAgIHJldHVybiBtRGF0YSAtIChtTnVtQml0c0xlZnQgKyA3KSAvIDg7CiB9CiAKK05BTEJpdFJlYWRlcjo6TkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogQUJpdFJlYWRlcihkYXRhLCBzaXplKSwKKyAgICAgIG1OdW1aZXJvcygwKSB7Cit9CisKK2Jvb2wgTkFMQml0UmVhZGVyOjphdExlYXN0TnVtQml0c0xlZnQoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICAvLyBjaGVjayBhZ2FpbnN0IHJhdyBzaXplIGFuZCByZXNlcnZvaXIgYml0cyBmaXJzdAorICAgIHNpemVfdCBudW1CaXRzID0gbnVtQml0c0xlZnQoKTsKKyAgICBpZiAobiA+IG51bUJpdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgbnVtQml0c1JlbWFpbmluZyA9IG4gLSBtTnVtQml0c0xlZnQ7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1TaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtRGF0YTsKKyAgICBpbnQzMl90IG51bVplcm9zID0gbU51bVplcm9zOworICAgIHdoaWxlIChzaXplID4gMCAmJiBudW1CaXRzUmVtYWluaW5nID4gMCkgeworICAgICAgICBib29sIGlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUgPSAobnVtWmVyb3MgPj0gMiAmJiAqZGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKmRhdGEgPT0gMCkgeworICAgICAgICAgICAgKytudW1aZXJvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSkgeworICAgICAgICAgICAgbnVtQml0c1JlbWFpbmluZyAtPSA4OworICAgICAgICB9CisKKyAgICAgICAgKytkYXRhOworICAgICAgICAtLXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIChudW1CaXRzUmVtYWluaW5nIDw9IDApOworfQorCit2b2lkIE5BTEJpdFJlYWRlcjo6ZmlsbFJlc2Vydm9pcigpIHsKKyAgICBDSEVDS19HVChtU2l6ZSwgMHUpOworCisgICAgbVJlc2Vydm9pciA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChtU2l6ZSA+IDAgJiYgaSA8IDQpIHsKKyAgICAgICAgYm9vbCBpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlID0gKG1OdW1aZXJvcyA+PSAyICYmICptRGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKm1EYXRhID09IDApIHsKKyAgICAgICAgICAgICsrbU51bVplcm9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorICAgICAgICBpZiAoIWlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUpIHsKKyAgICAgICAgICAgIG1SZXNlcnZvaXIgPSAobVJlc2Vydm9pciA8PCA4KSB8ICptRGF0YTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgICsrbURhdGE7CisgICAgICAgIC0tbVNpemU7CisgICAgfQorCisgICAgbU51bUJpdHNMZWZ0ID0gOCAqIGk7CisgICAgbVJlc2Vydm9pciA8PD0gMzIgLSBtTnVtQml0c0xlZnQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAppbmRleCA2MTczZGI0Li5iMjE0ODcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFMb29wZXIuaCIKICNpbmNsdWRlICJBTWVzc2FnZS5oIgorI2luY2x1ZGUgIk1lZGlhQnVmZmVyQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFCdWZmZXI6OkFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQotICAgIDogbURhdGEobWFsbG9jKGNhcGFjaXR5KSksCisgICAgOiBtTWVkaWFCdWZmZXJCYXNlKE5VTEwpLAorICAgICAgbURhdGEobWFsbG9jKGNhcGFjaXR5KSksCiAgICAgICBtQ2FwYWNpdHkoY2FwYWNpdHkpLAogICAgICAgbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbVJhbmdlTGVuZ3RoKGNhcGFjaXR5KSwKQEAgLTMyLDcgKzM0LDggQEAKIH0KIAogQUJ1ZmZlcjo6QUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtRGF0YShkYXRhKSwKKyAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCisgICAgICBtRGF0YShkYXRhKSwKICAgICAgIG1DYXBhY2l0eShjYXBhY2l0eSksCiAgICAgICBtUmFuZ2VPZmZzZXQoMCksCiAgICAgICBtUmFuZ2VMZW5ndGgoY2FwYWNpdHkpLApAQCAtNDAsNiArNDMsMTQgQEAKICAgICAgIG1Pd25zRGF0YShmYWxzZSkgewogfQogCisvLyBzdGF0aWMKK3NwPEFCdWZmZXI+IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCit7CisgICAgc3A8QUJ1ZmZlcj4gcmVzID0gbmV3IEFCdWZmZXIoY2FwYWNpdHkpOworICAgIG1lbWNweShyZXMtPmRhdGEoKSwgZGF0YSwgY2FwYWNpdHkpOworICAgIHJldHVybiByZXM7Cit9CisKIEFCdWZmZXI6On5BQnVmZmVyKCkgewogICAgIGlmIChtT3duc0RhdGEpIHsKICAgICAgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKQEAgLTUxLDYgKzYyLDggQEAKICAgICBpZiAobUZhcmV3ZWxsICE9IE5VTEwpIHsKICAgICAgICAgbUZhcmV3ZWxsLT5wb3N0KCk7CiAgICAgfQorCisgICAgc2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogfQogCiB2b2lkIEFCdWZmZXI6OnNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CkBAIC03Miw1ICs4NSwxOSBAQAogICAgIHJldHVybiBtTWV0YTsKIH0KIAorTWVkaWFCdWZmZXJCYXNlICpBQnVmZmVyOjpnZXRNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5hZGRfcmVmKCk7CisgICAgfQorICAgIHJldHVybiBtTWVkaWFCdWZmZXJCYXNlOworfQorCit2b2lkIEFCdWZmZXI6OnNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5yZWxlYXNlKCk7CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlckJhc2UgPSBtZWRpYUJ1ZmZlcjsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKaW5kZXggZjdhMDBkOC4uNWY3YzcwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCkBAIC01MSw3ICs1MSw3IEBACiBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKIH0KIAotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwogCiAgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCBlYmY5ZDhkLi44OGIxYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTY4LDE0ICs2OCwxNCBAQAogCiBBTG9vcGVyOjpBTG9vcGVyKCkKICAgICA6IG1SdW5uaW5nTG9jYWxseShmYWxzZSkgeworICAgIC8vIGNsZWFuIHVwIHN0YWxlIEFIYW5kbGVycy4gRG9pbmcgaXQgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBkZXN0cnVjdG9yIGF2b2lkcworICAgIC8vIHRoZSBzaWRlIGVmZmVjdCBvZiBvYmplY3RzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdW5yZWdpc3RlciBmdW5jdGlvbiByZWN1cnNpdmVseS4KKyAgICBnTG9vcGVyUm9zdGVyLnVucmVnaXN0ZXJTdGFsZUhhbmRsZXJzKCk7CiB9CiAKIEFMb29wZXI6On5BTG9vcGVyKCkgewogICAgIHN0b3AoKTsKLQotICAgIC8vIFNpbmNlIHRoaXMgbG9vcGVyIGlzICJkZWFkIiAob3IgYXMgZ29vZCBhcyBkZWFkIGJ5IG5vdyksCi0gICAgLy8gaGF2ZSBBTG9vcGVyUm9zdGVyIHVucmVnaXN0ZXIgYW55IGhhbmRsZXJzIHN0aWxsIHJlZ2lzdGVyZWQgZm9yIGl0LgotICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKTsKKyAgICAvLyBzdGFsZSBBSGFuZGxlcnMgYXJlIG5vdyBjbGVhbmVkIHVwIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbmV4dCBBTG9vcGVyIHRvIGNvbWUgYWxvbmcKIH0KIAogdm9pZCBBTG9vcGVyOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDBjMTgxZmYuLmUwZGM3NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtNzIsNTAgKzcyLDQwIEBACiB9CiAKIHZvaWQgQUxvb3BlclJvc3Rlcjo6dW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworICAgIFZlY3RvcjxzcDxBTG9vcGVyPiA+IGFjdGl2ZUxvb3BlcnM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgJ2xvb3BlcicgbWlnaHQgYmUgdGhlIG9ubHkgc3A8PiBrZWVwaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBhbGl2ZS4gVG8gcHJldmVudCBpdCBmcm9tIGdvaW5nIG91dCBvZiBzY29wZQorICAgICAgICAgICAgICAgIC8vIGFuZCBoYXZpbmcgfkFMb29wZXIgY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiByZWN1cnNpdmVseQorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRlYWRsb2NraW5nIGJlY2F1c2Ugb2YgdGhlIEF1dG9sb2NrIGFib3ZlLCBhZGQKKyAgICAgICAgICAgICAgICAvLyBpdCB0byBhIFZlY3RvciB3aGljaCB3aWxsIGdvIG91dCBvZiBzY29wZSBhZnRlciB0aGUgbG9jaworICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHJlbGVhc2VkLgorICAgICAgICAgICAgICAgIGFjdGl2ZUxvb3BlcnMuYWRkKGxvb3Blcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcG9zdE1lc3NhZ2VfbChtc2csIGRlbGF5VXMpOwotfQogCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0TWVzc2FnZV9sKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSAnJXMnLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iLAotICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOwogCiAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQotCiAgICAgbG9vcGVyLT5wb3N0KG1zZywgZGVsYXlVcyk7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2OSwxOCArMTU5LDIzIEBACiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7CisKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgc3RpbGwgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCisgICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7CisgICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgdWludDMyX3QgcmVwbHlJRCA9IG1OZXh0UmVwbHlJRCsrOwogCiAgICAgbXNnLT5zZXRJbnQzMigicmVwbHlJRCIsIHJlcGx5SUQpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gcG9zdE1lc3NhZ2VfbChtc2csIDAgLyogZGVsYXlVcyAqLyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KKyAgICBsb29wZXItPnBvc3QobXNnLCAwIC8qIGRlbGF5VXMgKi8pOwogCiAgICAgc3NpemVfdCBpbmRleDsKICAgICB3aGlsZSAoKGluZGV4ID0gbVJlcGxpZXMuaW5kZXhPZktleShyZXBseUlEKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IGRjNDJmOTEuLjc5NWU4YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0xNCw2ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBTWVzc2FnZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBEVU1QX1NUQVRTCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCiAjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC02MCwxMiArNjUsMTQgQEAKIHZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKICAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBkZWxldGVbXSBpdGVtLT5tTmFtZTsKKyAgICAgICAgaXRlbS0+bU5hbWUgPSBOVUxMOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0KICAgICBtTnVtSXRlbXMgPSAwOwogfQogCi12b2lkIEFNZXNzYWdlOjpmcmVlSXRlbShJdGVtICppdGVtKSB7Cit2b2lkIEFNZXNzYWdlOjpmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pIHsKICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6CiAgICAgICAgIHsKQEAgLTg4LDI1ICs5NSw4NSBAQAogICAgIH0KIH0KIAotQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjphbGxvY2F0ZUl0ZW0oY29uc3QgY2hhciAqbmFtZSkgewotICAgIG5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7CisjaWZkZWYgRFVNUF9TVEFUUworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBtTnVtSXRlbXMgJiYgbUl0ZW1zW2ldLm1OYW1lICE9IG5hbWUpIHsKLSAgICAgICAgKytpOworTXV0ZXggZ0xvY2s7CitzdGF0aWMgaW50MzJfdCBnRmluZEl0ZW1DYWxscyA9IDE7CitzdGF0aWMgaW50MzJfdCBnRHVwQ2FsbHMgPSAxOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VOdW1JdGVtcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZUR1cEl0ZW1zID0gMDsKK3N0YXRpYyBpbnQzMl90IGdMYXN0Q2hlY2tlZCA9IC0xOworCitzdGF0aWMgdm9pZCByZXBvcnRTdGF0cygpIHsKKyAgICBpbnQzMl90IHRpbWUgPSAoQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApOworICAgIGlmICh0aW1lIC8gMTAwMCAhPSBnTGFzdENoZWNrZWQgLyAxMDAwKSB7CisgICAgICAgIGdMYXN0Q2hlY2tlZCA9IHRpbWU7CisgICAgICAgIEFMT0dJKCJjYWxsZWQgZmluZEl0ZW1JeCAlenUgdGltZXMgKGZvciBsZW49JS4xZiBpPSUuMWYvJS4xZiBtZW0pIGR1cCAlenUgdGltZXMgKGZvciBsZW49JS4xZikiLAorICAgICAgICAgICAgICAgIGdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0R1cENhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlRHVwSXRlbXMgLyAoZmxvYXQpZ0R1cENhbGxzKTsKKyAgICAgICAgZ0ZpbmRJdGVtQ2FsbHMgPSBnRHVwQ2FsbHMgPSAxOworICAgICAgICBnQXZlcmFnZU51bUl0ZW1zID0gZ0F2ZXJhZ2VOdW1DaGVja3MgPSBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IGdBdmVyYWdlRHVwSXRlbXMgPSAwOworICAgICAgICBnTGFzdENoZWNrZWQgPSB0aW1lOwogICAgIH0KK30KKyNlbmRpZgogCitpbmxpbmUgc2l6ZV90IEFNZXNzYWdlOjpmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0IHsKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgc2l6ZV90IG1lbWNoZWNrcyA9IDA7CisjZW5kaWYKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7IGkgPCBtTnVtSXRlbXM7IGkrKykgeworICAgICAgICBpZiAobGVuICE9IG1JdGVtc1tpXS5tTmFtZUxlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgICAgICsrbWVtY2hlY2tzOworI2VuZGlmCisgICAgICAgIGlmICghbWVtY21wKG1JdGVtc1tpXS5tTmFtZSwgbmFtZSwgbGVuKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgRFVNUF9TVEFUUworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgKytnRmluZEl0ZW1DYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIGdBdmVyYWdlTnVtTWVtQ2hlY2tzICs9IG1lbWNoZWNrczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgKz0gaTsKKyAgICAgICAgcmVwb3J0U3RhdHMoKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gaTsKK30KKworLy8gYXNzdW1lcyBpdGVtJ3MgbmFtZSB3YXMgdW5pbml0aWFsaXplZCBvciBOVUxMCit2b2lkIEFNZXNzYWdlOjpJdGVtOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKKyAgICBtTmFtZUxlbmd0aCA9IGxlbjsKKyAgICBtTmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOworICAgIG1lbWNweSgodm9pZCopbU5hbWUsIG5hbWUsIGxlbiArIDEpOworfQorCitBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgbGVuKTsKICAgICBJdGVtICppdGVtOwogCiAgICAgaWYgKGkgPCBtTnVtSXRlbXMpIHsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1OdW1JdGVtcyA8IGtNYXhOdW1JdGVtcyk7CiAgICAgICAgIGkgPSBtTnVtSXRlbXMrKzsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0KLSAgICAgICAgaXRlbS0+bU5hbWUgPSBuYW1lOworICAgICAgICBpdGVtLT5zZXROYW1lKG5hbWUsIGxlbik7CiAgICAgfQogCiAgICAgcmV0dXJuIGl0ZW07CkBAIC0xMTQsMTkgKzE4MSwyMCBAQAogCiBjb25zdCBBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmZpbmRJdGVtKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBUeXBlIHR5cGUpIGNvbnN0IHsKLSAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwogCi0gICAgICAgIGlmIChpdGVtLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwotICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK2Jvb2wgQU1lc3NhZ2U6OmNvbnRhaW5zKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICByZXR1cm4gaSA8IG1OdW1JdGVtczsKK30KKwogI2RlZmluZSBCQVNJQ19UWVBFKE5BTUUsRklFTEROQU1FLFRZUEVOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBBTWVzc2FnZTo6c2V0IyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FIHZhbHVlKSB7ICAgICAgICAgICAgXAogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTYwLDYgKzIyOCwxMSBAQAogICAgIGl0ZW0tPnUuc3RyaW5nVmFsdWUgPSBuZXcgQVN0cmluZyhzLCBsZW4gPCAwID8gc3RybGVuKHMpIDogbGVuKTsKIH0KIAordm9pZCBBTWVzc2FnZTo6c2V0U3RyaW5nKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBU3RyaW5nICZzKSB7CisgICAgc2V0U3RyaW5nKG5hbWUsIHMuY19zdHIoKSwgcy5zaXplKCkpOworfQorCiB2b2lkIEFNZXNzYWdlOjpzZXRPYmplY3RJbnRlcm5hbCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKSB7CiAgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKQEAgLTI3OCwxMSArMzUxLDIwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShtV2hhdCwgbVRhcmdldCk7CiAgICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CiAKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICArK2dEdXBDYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VEdXBJdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIHJlcG9ydFN0YXRzKCk7CisgICAgfQorI2VuZGlmCisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKmZyb20gPSAmbUl0ZW1zW2ldOwogICAgICAgICBJdGVtICp0byA9ICZtc2ctPm1JdGVtc1tpXTsKIAotICAgICAgICB0by0+bU5hbWUgPSBmcm9tLT5tTmFtZTsKKyAgICAgICAgdG8tPnNldE5hbWUoZnJvbS0+bU5hbWUsIGZyb20tPm1OYW1lTGVuZ3RoKTsKICAgICAgICAgdG8tPm1UeXBlID0gZnJvbS0+bVR5cGU7CiAKICAgICAgICAgc3dpdGNoIChmcm9tLT5tVHlwZSkgewpAQCAtNDAzLDcgKzQ4NSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihpdGVtLnUucmVmVmFsdWUpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+ZGF0YSgpICE9IE5VTEwgJiYgYnVmZmVyLT5zaXplKCkgPD0gNjQpIHsKICAgICAgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCJCdWZmZXIgJXMgPSB7XG4iLCBpdGVtLm1OYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIGluZGVudCArIDQsICZ0bXApOwogICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRlbnQoJnRtcCwgaW5kZW50ICsgMik7CkBAIC00NTMsMTEgKzUzNSwxMSBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uod2hhdCk7CiAKICAgICBtc2ctPm1OdW1JdGVtcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKLQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNnLT5tTnVtSXRlbXM7ICsraSkgewogICAgICAgICBJdGVtICppdGVtID0gJm1zZy0+bUl0ZW1zW2ldOwogCi0gICAgICAgIGl0ZW0tPm1OYW1lID0gQUF0b21pemVyOjpBdG9taXplKHBhcmNlbC5yZWFkQ1N0cmluZygpKTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHBhcmNlbC5yZWFkQ1N0cmluZygpOworICAgICAgICBpdGVtLT5zZXROYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7CiAgICAgICAgIGl0ZW0tPm1UeXBlID0gc3RhdGljX2Nhc3Q8VHlwZT4ocGFyY2VsLnJlYWRJbnQzMigpKTsKIAogICAgICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBiNmIyMWYxLi45ODM1Y2EzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCkBAIC00OCw2ICs1MCwxMyBAQAogICAgIHNldFRvKHMsIHNpemUpOwogfQogCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IFN0cmluZzggJmZyb20pCisgICAgOiBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUFsbG9jU2l6ZSgxKSB7CisgICAgc2V0VG8oZnJvbS5zdHJpbmcoKSwgZnJvbS5sZW5ndGgoKSk7Cit9CisKIEFTdHJpbmc6OkFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSkKICAgICA6IG1EYXRhKE5VTEwpLAogICAgICAgbVNpemUoMCksCkBAIC0yOTgsNiArMzA3LDE0IEBACiAgICAgcmV0dXJuIHN0cmNtcChtRGF0YSwgb3RoZXIubURhdGEpOwogfQogCitpbnQgQVN0cmluZzo6Y29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyY2FzZWNtcChtRGF0YSwgb3RoZXIubURhdGEpOworfQorCitib29sIEFTdHJpbmc6OmVxdWFsc0lnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZUlnbm9yZUNhc2Uob3RoZXIpID09IDA7Cit9CisKIHZvaWQgQVN0cmluZzo6dG9sb3dlcigpIHsKICAgICBtYWtlTXV0YWJsZSgpOwogCkBAIC0zMjAsNiArMzM3LDM1IEBACiAgICAgcmV0dXJuICFzdHJjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKIH0KIAorYm9vbCBBU3RyaW5nOjpzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gIXN0cm5jYXNlY21wKG1EYXRhLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKTsKK30KKworYm9vbCBBU3RyaW5nOjplbmRzV2l0aElnbm9yZUNhc2UoY29uc3QgY2hhciAqc3VmZml4KSBjb25zdCB7CisgICAgc2l6ZV90IHN1ZmZpeExlbiA9IHN0cmxlbihzdWZmaXgpOworCisgICAgaWYgKG1TaXplIDwgc3VmZml4TGVuKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIXN0cmNhc2VjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKK30KKworLy8gc3RhdGljCitBU3RyaW5nIEFTdHJpbmc6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICByZXR1cm4gQVN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKSksIHNpemUpOworfQorCitzdGF0dXNfdCBBU3RyaW5nOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgQ0hFQ0tfTEUobVNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oSU5UMzJfTUFYKSk7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplKTsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IHBhcmNlbC0+d3JpdGUobURhdGEsIG1TaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogQVN0cmluZyBTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsKICAgICB2YV9saXN0IGFwOwogICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IGQ1ZmI0ZTAuLmRjZjViZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTMzLDYgKzMzLDEwIEBACiAKICAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CisKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzEsNyArNzUsNyBAQAogICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CiAgICAgICAgICAgICBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7CiAKLSAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfSAKKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQogICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KIAogICAgICAgICAgICAgYWNjdW0gPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAorICAgICAgICBIVFRQSGVscGVyLmNwcCAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgICAgICBsaWJtZWRpYQorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9odHRwX3N1cHBvcnQKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODQ1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBIZWxwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJIVFRQSGVscGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgorI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPElNZWRpYUhUVFBTZXJ2aWNlPiBDcmVhdGVIVFRQU2VydmljZUluQ3VycmVudEphdmFDb250ZXh0KCkgeworICAgIGlmIChBbmRyb2lkUnVudGltZTo6Z2V0SmF2YVZNKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCBjYWxsZWQgb3V0c2lkZSAiCisgICAgICAgICAgICAgICJKQVZBIGVudmlyb25tZW50LiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gY2xhenooCisgICAgICAgICAgICBlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKSk7CisgICAgQ0hFQ0soY2xhenouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0SUQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiPGluaXQ+IiwgIigpViIpOworICAgIENIRUNLKGNvbnN0cnVjdElEICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VPYmooCisgICAgICAgICAgICBlbnYsIGVudi0+TmV3T2JqZWN0KGNsYXp6LmdldCgpLCBjb25zdHJ1Y3RJRCkpOworCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgIGlmIChodHRwU2VydmljZU9iai5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIGptZXRob2RJRCBhc0JpbmRlcklEID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenouZ2V0KCksICJhc0JpbmRlciIsICIoKUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7CisgICAgICAgIENIRUNLKGFzQmluZGVySUQgIT0gTlVMTCk7CisKKyAgICAgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VCaW5kZXJPYmooCisgICAgICAgICAgICAgICAgZW52LCBlbnYtPkNhbGxPYmplY3RNZXRob2QoaHR0cFNlcnZpY2VPYmouZ2V0KCksIGFzQmluZGVySUQpKTsKKyAgICAgICAgQ0hFQ0soaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgICAgIGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkpOworCisgICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorCisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY1JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKaW5kZXggMTNjYWM2ZC4uOGFlZjExNQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2lmbmRlZiBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2RlZmluZSBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKworc3A8SU1lZGlhSFRUUFNlcnZpY2U+IENyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBIVFRQX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjk5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKKyAgICBtSW5pdENoZWNrID0gT0s7Cit9CisKK01lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKKyAgICBjbGVhckRSTVN0YXRlX2woKTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KHVyaSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKyAgICBtTGFzdFVSSSA9IHVyaTsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IE9LOworfQorCit1aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKy8vIERSTS4uLgorCitzcDxEZWNyeXB0SGFuZGxlPiBNZWRpYUhUVFA6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CisgICAgfQorCisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBtRHJtTWFuYWdlckNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgICAgIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSksIG1pbWUpOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKK30KKwordm9pZCBNZWRpYUhUVFA6OmdldERybUluZm8oCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCBmMzUyOWY5Li5lOGQ1NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTEzLDYgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJjcnlwdG8gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDZkNDhhYjcuLmZiYTZiMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtNDcsNDAgKzUwLDM5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIExpdmVTZXNzaW9uOjpMaXZlU2Vzc2lvbigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UodHJ1ZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgIEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCkpLAotICAgICAgbVByZXZCYW5kd2lkdGhJbmRleCgtMSksCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChtSFRUUFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgICBtQ3VyQmFuZHdpZHRoSW5kZXgoLTEpLAogICAgICAgbVN0cmVhbU1hc2soMCksCiAgICAgICBtTmV3U3RyZWFtTWFzaygwKSwKICAgICAgIG1Td2FwTWFzaygwKSwKICAgICAgIG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24oMCksCiAgICAgICBtU3dpdGNoR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDBsbCksCiAgICAgICBtUmVhbFRpbWVCYXNlVXMoMGxsKSwKICAgICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1Td2l0Y2hJblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCgwKSwKLSAgICAgIG1TZWVrUmVwbHlJRCgwKSB7Ci0gICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBtSFRUUERhdGFTb3VyY2UtPnNldFVJRChtVUlEKTsKLSAgICB9CisgICAgICBtU2Vla1JlcGx5SUQoMCksCisgICAgICBtRmlyc3RUaW1lVXNWYWxpZChmYWxzZSksCisgICAgICBtRmlyc3RUaW1lVXMoMCksCisgICAgICBtTGFzdFNlZWtUaW1lVXMoMCkgewogCiAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gU3RyZWFtSXRlbSgiYXVkaW8iKTsKICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBTdHJlYW1JdGVtKCJ2aWRlbyIpOwogICAgIG1TdHJlYW1zW2tTdWJ0aXRsZUluZGV4XSA9IFN0cmVhbUl0ZW0oInN1YnRpdGxlcyIpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIG1EaXNjb250aW51aXRpZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKICAgICAgICAgbVBhY2tldFNvdXJjZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKICAgICAgICAgbVBhY2tldFNvdXJjZXMyLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7CisgICAgICAgIG1CdWZmZXJpbmdbaV0gPSBmYWxzZTsKICAgICB9CiB9CiAKQEAgLTExMywzMSArMTE1LDkwIEBACiAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgfQogCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlICA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3Ioc3RyZWFtKTsKKyAgICBpZiAoZGlzY29udGludWl0eVF1ZXVlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAvLyBzZWVraW5nLCB0cmFjayBzd2l0Y2hpbmcKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKQorICAgICAgICAgICAgICAgICYmIGV4dHJhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgLy8gc2Vla2luZyBvbmx5CisgICAgICAgICAgICBtTGFzdFNlZWtUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKKyAgICB9CisKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihzdHJlYW0pOwogCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOwogICAgIGlmICghcGFja2V0U291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnVmZmVyaW5nW2lkeF0pIHsKKyAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzCisgICAgICAgICAgICAgICAgfHwgcGFja2V0U291cmNlLT5pc0ZpbmlzaGVkKDApCisgICAgICAgICAgICAgICAgfHwgcGFja2V0U291cmNlLT5nZXRFc3RpbWF0ZWREdXJhdGlvblVzKCkgPiAxMDAwMDAwMGxsKSB7CisgICAgICAgICAgICBtQnVmZmVyaW5nW2lkeF0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnVmZmVyaW5nW2lkeF0pIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgY291bnRlcnBhcnQKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBvdGhlclNvdXJjZTsKKyAgICB1aW50MzJfdCBtYXNrID0gbU5ld1N0cmVhbU1hc2sgJiBtU3RyZWFtTWFzazsKKyAgICB1aW50MzJfdCBmZXRjaGVyc01hc2sgID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgZmV0Y2hlck1hc2sgPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCk7CisgICAgICAgIGZldGNoZXJzTWFzayB8PSBmZXRjaGVyTWFzazsKKyAgICB9CisgICAgbWFzayAmPSBmZXRjaGVyc01hc2s7CisgICAgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX0FVRElPICYmIChtYXNrICYgU1RSRUFNVFlQRV9WSURFTykpIHsKKyAgICAgICAgb3RoZXJTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX1ZJREVPKTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1ZJREVPICYmIChtYXNrICYgU1RSRUFNVFlQRV9BVURJTykpIHsKKyAgICAgICAgb3RoZXJTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKTsKKyAgICB9CisgICAgaWYgKG90aGVyU291cmNlICE9IE5VTEwgJiYgIW90aGVyU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewogICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQgPT0gT0sgPyAtRUFHQUlOIDogZmluYWxSZXN1bHQ7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyID0gcGFja2V0U291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAorICAgIHNpemVfdCBzdHJlYW1JZHg7CiAgICAgY29uc3QgY2hhciAqc3RyZWFtU3RyOwogICAgIHN3aXRjaCAoc3RyZWFtKSB7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtBdWRpb0luZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gImF1ZGlvIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICBzdHJlYW1JZHggPSBrVmlkZW9JbmRleDsKICAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJ2aWRlbyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtTdWJ0aXRsZUluZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gInN1YnMiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KIAorICAgIFN0cmVhbUl0ZW0mIHN0cm0gPSBtU3RyZWFtc1tzdHJlYW1JZHhdOwogICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgIC8vIGFkYXB0aXZlIHN0cmVhbWluZywgZGlzY29udGludWl0aWVzIGluIHRoZSBwbGF5bGlzdAogICAgICAgICBpbnQzMl90IHR5cGU7CiAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKIApAQCAtMTUyLDEwICsyMTMsNyBAQAogICAgICAgICAgICAgICBleHRyYSA9PSBOVUxMID8gIk5VTEwiIDogZXh0cmEtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgaW50MzJfdCBzd2FwOwotICAgICAgICBpZiAodHlwZSA9PSBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgJiYgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCAmc3dhcCkKLSAgICAgICAgICAgICAgICAmJiBzd2FwKSB7Ci0KKyAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2FwUGFja2V0U291cmNlIiwgJnN3YXApICYmIHN3YXApIHsKICAgICAgICAgICAgIGludDMyX3Qgc3dpdGNoR2VuZXJhdGlvbjsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgJnN3aXRjaEdlbmVyYXRpb24pKTsKICAgICAgICAgICAgIHsKQEAgLTE2OCwxNiArMjI2LDc1IEBACiAgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXEgPSBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxOworICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRUaW1lVXM7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoc2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKHNlcSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcSArPSAxOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzIC0gZmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5hZGQoc2VxLCBvZmZzZXRUaW1lVXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKKwogICAgICAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gfHwgc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8pIHsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gMDsKICAgICAgICAgICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAgJnRpbWVVcykpOwotICAgICAgICAgICAgQUxPR1YoIlslc10gcmVhZCBidWZmZXIgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsIHN0cmVhbVN0ciwgdGltZVVzKTsKKyAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSA9IGRpc2NvbnRpbnVpdHlTZXE7CiAKKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyVXM7IC8vIGFwcHJveGltYXRlIHNhbXBsZSBkdXJhdGlvbgorICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPiBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyVXMgPSB0aW1lVXMgLSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyVXMgPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzID0gZHVyVXM7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NhcmQiLCAmZGlzY2FyZCkgJiYgZGlzY2FyZCkgeworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5hZGQoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RybS5tTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSBmaXJzdFRpbWVVcykgeworICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVVcyArPSBtTGFzdFNlZWtUaW1lVXM7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoZGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHRpbWVVcyArPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3IoZGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHJlYWQgYnVmZmVyIGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLCBzdHJlYW1TdHIsIHRpbWVVcyk7CisgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAgdGltZVVzKTsKICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gdGltZVVzOwogICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgaW50MzJfdCBzdWJ0aXRsZUdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN1YnRpdGxlR2VuZXJhdGlvbiIsICZzdWJ0aXRsZUdlbmVyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICYmIHN1YnRpdGxlR2VuZXJhdGlvbiAhPSBtU3VidGl0bGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH07CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAidHJhY2tJbmRleCIsIG1QbGF5bGlzdC0+Z2V0U2VsZWN0ZWRJbmRleCgpKTsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50NjQoImJhc2VVcyIsIG1SZWFsVGltZUJhc2VVcyk7CkBAIC0yMzYsMTAgKzM1Myw2IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKIAotICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgQ0hFQ0socmVzcG9uc2UgPT0gbVNlZWtSZXBseSAmJiAwICE9IG1TZWVrUmVwbHlJRCk7Ci0gICAgbVNlZWtSZXBseS5jbGVhcigpOwotICAgIG1TZWVrUmVwbHlJRCA9IDA7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMjY1LDEyICszNzgsMTYgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2VlazoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmbVNlZWtSZXBseUlEKSk7CisgICAgICAgICAgICB1aW50MzJfdCBzZWVrUmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnNlZWtSZXBseUlEKSk7CisgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSBzZWVrUmVwbHlJRDsKKyAgICAgICAgICAgIG1TZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2Vlayhtc2cpOwogCi0gICAgICAgICAgICBtU2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI5Myw3ICs0MTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGludWF0aW9uICE9IE5VTEwpIHsKQEAgLTMwMyw3ICs0MjIsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtU2Vla1JlcGx5ICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzMwLDYgKzQ1MiwyMyBAQAogCiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJYWFggUmVjZWl2ZWQgZXJyb3IgJWQgZnJvbSBQbGF5bGlzdEZldGNoZXIuIiwgZXJyKTsKIAorICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgRU9TIG9uIHN1YnRpdGxlIHRyYWNrcyBpbmRlcGVuZGVudGx5CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gJiYgbXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UGxheWxpc3RGZXRjaGVyPiAmZmV0Y2hlciA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBmZXRjaGVyLT5nZXRTdHJlYW1UeXBlTWFzaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTVRZUEVfU1VCVElUTEVTKS0+c2lnbmFsRU9TKGVycik7OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTM1NSw2ICs0OTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB1cmk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpOwogCisgICAgICAgICAgICAgICAgICAgIGlmIChtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIHVyaSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgRmV0Y2hlckluZm8gKmluZm8gPSAmbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVGb3IodXJpKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUlzUHJlcGFyZWQgPSB0cnVlOwogCkBAIC00MTEsNyArNTU0LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aCgpOworICAgICAgICAgICAgb25DaGVja0JhbmR3aWR0aChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNDQ0LDYgKzU4NywxOSBAQAogICAgICAgICAgICAgb25Td2FwcGVkKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDaGVja1N3aXRjaERvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQ2hlY2tTd2l0Y2hEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTd2l0Y2hEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblN3aXRjaERvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ2Nyw2ICs2MjMsMjEgQEAKICAgICByZXR1cm4gKFN0cmVhbVR5cGUpKDEgPDwgaWR4KTsKIH0KIAorLy8gc3RhdGljCitzc2l6ZV90IExpdmVTZXNzaW9uOjp0eXBlVG9JbmRleChpbnQzMl90IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfTsKKyAgICByZXR1cm4gLTE7Cit9CisKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIEFTdHJpbmcgdXJsOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJsIiwgJnVybCkpOwpAQCAtNDgxLDExICs2NTIsOCBAQAogICAgICAgICBoZWFkZXJzID0gTlVMTDsKICAgICB9CiAKLSNpZiAxCi0gICAgQUxPR0koIm9uQ29ubmVjdCA8VVJMIHN1cHByZXNzZWQ+Iik7Ci0jZWxzZQotICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmwuY19zdHIoKSk7Ci0jZW5kaWYKKyAgICAvLyBUT0RPIGN1cnJlbnRseSB3ZSBkb24ndCBrbm93IGlmIHdlIGFyZSBjb21pbmcgaGVyZSBmcm9tIGluY29nbml0byBtb2RlCisgICAgQUxPR0koIm9uQ29ubmVjdCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICBtTWFzdGVyVVJMID0gdXJsOwogCkBAIC00OTMsNyArNjYxLDcgQEAKICAgICBtUGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpLCBOVUxMIC8qIGN1clBsYXlsaXN0SGFzaCAqLywgJmR1bW15KTsKIAogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCA8VVJMIHN1cHByZXNzZWQ+LiIpOworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAlcy4iLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgICAgIHBvc3RQcmVwYXJlZChFUlJPUl9JTyk7CiAgICAgICAgIHJldHVybjsKQEAgLTU0NSw4ICs3MTMsOSBAQAogICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtKTsKICAgICB9CiAKKyAgICBtUGxheWxpc3QtPnBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIDBsbCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgdHJ1ZSAvKiBwaWNrVHJhY2sgKi8pOworICAgICAgICAgICAgMGxsIC8qIHRpbWVVcyAqLywgaW5pdGlhbEJhbmR3aWR0aEluZGV4LCBmYWxzZSAvKiBwaWNrVHJhY2sgKi8pOwogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpmaW5pc2hEaXNjb25uZWN0KCkgewpAQCAtNTU4LDYgKzcyNyw5IEBACiAgICAgLy8gKGZpbmlzaERpc2Nvbm5lY3QsIG9uRmluaXNoRGlzY29ubmVjdDIpCiAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKKyAgICAvLyBjYW5jZWwgc3dpdGNoIGRvd24gbW9uaXRvcgorICAgIG1Td2l0Y2hEb3duTW9uaXRvci5jbGVhcigpOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CiAgICAgfQpAQCAtNjAwLDcgKzc3Miw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigic3dpdGNoR2VuZXJhdGlvbiIsIG1Td2l0Y2hHZW5lcmF0aW9uKTsKIAogICAgIEZldGNoZXJJbmZvIGluZm87Ci0gICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmkpOworICAgIGluZm8ubUZldGNoZXIgPSBuZXcgUGxheWxpc3RGZXRjaGVyKG5vdGlmeSwgdGhpcywgdXJpLCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKICAgICBpbmZvLm1EdXJhdGlvblVzID0gLTFsbDsKICAgICBpbmZvLm1Jc1ByZXBhcmVkID0gZmFsc2U7CiAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSBmYWxzZTsKQEAgLTY4MCw3ICs4NTIsNyBAQAogCiAgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwogICAgIC8vIGFkanVzdCByYW5nZV9sZW5ndGggaWYgb25seSByZWFkaW5nIHBhcnRpYWwgYmxvY2sKLSAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUgPCByYW5nZV9sZW5ndGgpKSB7CisgICAgaWYgKGJsb2NrX3NpemUgPiAwICYmIChyYW5nZV9sZW5ndGggPT0gLTEgfHwgKGludDY0X3QpKGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZSkgPCByYW5nZV9sZW5ndGgpKSB7CiAgICAgICAgIHJhbmdlX2xlbmd0aCA9IGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZTsKICAgICB9CiAgICAgZm9yICg7OykgewpAQCAtODM0LDE0ICsxMDA2LDIyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBDb25zaWRlciBvbmx5IDgwJSBvZiB0aGUgYXZhaWxhYmxlIGJhbmR3aWR0aCB1c2FibGUuCi0gICAgICAgIGJhbmR3aWR0aEJwcyA9IChiYW5kd2lkdGhCcHMgKiA4KSAvIDEwOwotCiAgICAgICAgIC8vIFBpY2sgdGhlIGhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbSBiZWxvdyBvciBlcXVhbCB0byBlc3RpbWF0ZWQgYmFuZHdpZHRoLgogCiAgICAgICAgIGluZGV4ID0gbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSAtIDE7Ci0gICAgICAgIHdoaWxlIChpbmRleCA+IDAgJiYgbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChpbmRleCkubUJhbmR3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IChzaXplX3QpYmFuZHdpZHRoQnBzKSB7CisgICAgICAgIHdoaWxlIChpbmRleCA+IDApIHsKKyAgICAgICAgICAgIC8vIGNvbnNpZGVyIG9ubHkgODAlIG9mIHRoZSBhdmFpbGFibGUgYmFuZHdpZHRoLCBidXQgaWYgd2UgYXJlIHN3aXRjaGluZyB1cCwKKyAgICAgICAgICAgIC8vIGJlIGV2ZW4gbW9yZSBjb25zZXJ2YXRpdmUgKDcwJSkgdG8gYXZvaWQgb3ZlcmVzdGltYXRpbmcgYW5kIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAvLyBzd2l0Y2hpbmcgYmFjay4KKyAgICAgICAgICAgIHNpemVfdCBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGJhbmR3aWR0aEJwczsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICAgICAgICAgIGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMgKiA3IC8gMTA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMgKiA4IC8gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChpbmRleCkubUJhbmR3aWR0aCA8PSBhZGp1c3RlZEJhbmR3aWR0aEJwcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgfQogICAgIH0KQEAgLTg1NCwyMCArMTAzNCwyMCBAQAogICAgIC8vIHRvIGxvd2VzdCkKICAgICBjb25zdCBzaXplX3Qga01pbkluZGV4ID0gMDsKIAotICAgIHN0YXRpYyBzc2l6ZV90IG1QcmV2QmFuZHdpZHRoSW5kZXggPSAtMTsKKyAgICBzdGF0aWMgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXggPSAtMTsKIAogICAgIHNpemVfdCBpbmRleDsKLSAgICBpZiAobVByZXZCYW5kd2lkdGhJbmRleCA8IDApIHsKKyAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgewogICAgICAgICBpbmRleCA9IGtNaW5JbmRleDsKICAgICB9IGVsc2UgaWYgKHVuaWZvcm1SYW5kKCkgPCAwLjUpIHsKLSAgICAgICAgaW5kZXggPSAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXg7CisgICAgICAgIGluZGV4ID0gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBtUHJldkJhbmR3aWR0aEluZGV4ICsgMTsKKyAgICAgICAgaW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXggKyAxOwogICAgICAgICBpZiAoaW5kZXggPT0gbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSkgewogICAgICAgICAgICAgaW5kZXggPSBrTWluSW5kZXg7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVByZXZCYW5kd2lkdGhJbmRleCA9IGluZGV4OworICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IGluZGV4OwogI2VsaWYgMAogICAgIC8vIFBpY2sgdGhlIGhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbSBiZWxvdyBvciBlcXVhbCB0byAxLjIgTWJpdC9zZWMKIApAQCAtODk4LDE1ICsxMDc4LDM0IEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCitpbnQ2NF90IExpdmVTZXNzaW9uOjpsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpIHsKKyAgICBzcDxBTWVzc2FnZT4gYXVkaW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgIGludDY0X3QgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gLTEsIHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzID0gLTE7CisgICAgaWYgKGF1ZGlvTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmbWluU2VnbWVudFN0YXJ0VGltZVVzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9NZXRhID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgIGlmICh2aWRlb01ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgdmlkZW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ2aWRlb1NlZ21lbnRTdGFydFRpbWVVcykpIHsKKyAgICAgICAgaWYgKG1pblNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPCBtaW5TZWdtZW50U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgIG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIG1pblNlZ21lbnRTdGFydFRpbWVVczsKK30KKwogc3RhdHVzX3QgTGl2ZVNlc3Npb246Om9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzLCBnZXRCYW5kd2lkdGhJbmRleCgpKTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbih0aW1lVXMsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwogICAgIH0KLQotICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0IHsKQEAgLTkzMywxNCArMTEzMiwzNCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTGl2ZVNlc3Npb246OmdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKK3NpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpOworICAgIH0KK30KKworc3A8QU1lc3NhZ2U+IExpdmVTZXNzaW9uOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICsrbVN1YnRpdGxlR2VuZXJhdGlvbjsKICAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWxpc3QtPnNlbGVjdFRyYWNrKGluZGV4LCBzZWxlY3QpOwogICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24sIGlkKCkpKS0+cG9zdCgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbiwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImJhbmR3aWR0aEluZGV4IiwgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigicGlja1RyYWNrIiwgc2VsZWN0KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC05NjcsMTUgKzExODYsMTEgQEAKICAgICBDSEVDSyghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpOwogICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKIAotICAgIG1QcmV2QmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKKyAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKIAogICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uID0+IHRpbWVVczolIiBQUklkNjQgIiB1cywgYndJbmRleDolenUsIHBpY2tUcmFjazolZCIsCiAgICAgICAgICAgdGltZVVzLCBiYW5kd2lkdGhJbmRleCwgcGlja1RyYWNrKTsKIAotICAgIGlmIChwaWNrVHJhY2spIHsKLSAgICAgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwotICAgIH0KLQogICAgIENIRUNLX0xUKGJhbmR3aWR0aEluZGV4LCBtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpKTsKICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdChiYW5kd2lkdGhJbmRleCk7CiAKQEAgLTk5OCwxNCArMTIxMywxNSBAQAogCiAgICAgICAgIC8vIElmIHdlJ3JlIHNlZWtpbmcgYWxsIGN1cnJlbnQgZmV0Y2hlcnMgYXJlIGRpc2NhcmRlZC4KICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICAgICAgLy8gZGVsYXkgZmV0Y2hlciByZW1vdmFsCi0gICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOworICAgICAgICAgICAgLy8gZGVsYXkgZmV0Y2hlciByZW1vdmFsIGlmIG5vdCBwaWNraW5nIHRyYWNrcworICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBwaWNrVHJhY2s7CiAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewogICAgICAgICAgICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGluZGV4VG9UeXBlKGopOwogICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIHR5cGUpICYmIHVyaSA9PSBVUklzW2pdKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VtZU1hc2sgfD0gdHlwZTsKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayAmPSB+dHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwMTksMTYgKzEyMzUsMTcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBtc2c7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIHN3aXRjaGluZy4KKyAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBub3Qgc2Vla2luZy4KICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMsIGlkKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24yLCBpZCgpKTsKICAgICB9CiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOwogICAgIG1zZy0+c2V0SW50MzIoInJlc3VtZU1hc2siLCByZXN1bWVNYXNrKTsKKyAgICBtc2ctPnNldEludDMyKCJwaWNrVHJhY2siLCBwaWNrVHJhY2spOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIGlmIChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpIHsKKyAgICAgICAgaWYgKChzdHJlYW1NYXNrIHwgcmVzdW1lTWFzaykgJiBpbmRleFRvVHlwZShpKSkgewogICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgVVJJc1tpXS5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNDUsMTQgKzEyNjIsMjAgQEAKIAogICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKICAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOwogICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOworICAgICAgICAgICAgbVNlZWtSZXBseS5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNoYW5nZUNvbmZpZ3VyYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGdldEJhbmR3aWR0aEluZGV4KCkpOworICAgICAgICBpbnQzMl90IHBpY2tUcmFjayA9IDAsIGJhbmR3aWR0aEluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICBtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjayk7CisgICAgICAgIG1zZy0+ZmluZEludDMyKCJiYW5kd2lkdGhJbmRleCIsICZiYW5kd2lkdGhJbmRleCk7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyByZXRyeSBpbiAxIHNlYwogICAgIH0KQEAgLTEwNjMsOCArMTI4NiwxNCBAQAogCiAgICAgLy8gQWxsIGZldGNoZXJzIGFyZSBlaXRoZXIgc3VzcGVuZGVkIG9yIGhhdmUgYmVlbiByZW1vdmVkIG5vdy4KIAotICAgIHVpbnQzMl90IHN0cmVhbU1hc2s7CisgICAgdWludDMyX3Qgc3RyZWFtTWFzaywgcmVzdW1lTWFzazsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKKworICAgIC8vIGN1cnJlbnRseSBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIGlzIG9ubHkgY2FsbGVkIGZvciBzZWVraW5nOworICAgIC8vIHJlbW92ZSB0aGUgZm9sbG93aW5nIENIRUNLIGlmIHVzaW5nIGl0IGVsc2Ugd2hlcmUuCisgICAgQ0hFQ0tfRVEocmVzdW1lTWFzaywgMCk7CisgICAgc3RyZWFtTWFzayB8PSByZXN1bWVNYXNrOwogCiAgICAgQVN0cmluZyBVUklzW2tNYXhTdHJlYW1zXTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKQEAgLTExMjEsMjMgKzEzNTAsMzUgQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopJnN0cmVhbU1hc2spKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdW1lTWFzayIsIChpbnQzMl90ICopJnJlc3VtZU1hc2spKTsKIAorICAgIGludDY0X3QgdGltZVVzOworICAgIGludDMyX3QgcGlja1RyYWNrOworICAgIGJvb2wgc3dpdGNoaW5nID0gZmFsc2U7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjaykpOworCisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBpZiAoIXBpY2tUcmFjaykgeworICAgICAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3REZXF1ZXVlZFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVhbFRpbWVCYXNlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gdGltZVVzOworICAgIH0KKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewogICAgICAgICBpZiAoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSB7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1VcmkpKTsKKyAgICAgICAgICAgIGlmIChzd2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1OZXdVcmkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKG1TdHJlYW1zW2ldLnVyaUtleSgpLmNfc3RyKCksICZtU3RyZWFtc1tpXS5tVXJpKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBib29sIHN3aXRjaGluZyA9IGZhbHNlOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIHRpbWVVcyA9IG1MYXN0RGVxdWV1ZWRUaW1lVXM7Ci0gICAgICAgIHN3aXRjaGluZyA9IHRydWU7CisgICAgbU5ld1N0cmVhbU1hc2sgPSBzdHJlYW1NYXNrIHwgcmVzdW1lTWFzazsKKyAgICBpZiAoc3dpdGNoaW5nKSB7CisgICAgICAgIG1Td2FwTWFzayA9IG1TdHJlYW1NYXNrICYgfnJlc3VtZU1hc2s7CiAgICAgfQotICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7Ci0KLSAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2s7CiAKICAgICAvLyBPZiBhbGwgZXhpc3RpbmcgZmV0Y2hlcnM6CiAgICAgLy8gKiBSZXN1bWUgZmV0Y2hlcnMgdGhhdCBhcmUgc3RpbGwgbmVlZGVkIGFuZCBhc3NpZ24gdGhlbSBvcmlnaW5hbCBwYWNrZXQgc291cmNlcy4KQEAgLTExNTAsNiArMTM5MSwxNiBAQAogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtNYXhTdHJlYW1zOyArK2opIHsKICAgICAgICAgICAgIGlmICgocmVzdW1lTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gbVN0cmVhbXNbal0ubVVyaSkgewogICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicXVldWVpbmcgZHVtbXkgZGlzY29udGludWl0eSBmb3Igc3RyZWFtIHR5cGUgJWQiLCBpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExNzcsNDMgKzE0MjgsODYgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFTdHJpbmcgdXJpOwotICAgICAgICB1cmkgPSBtU3RyZWFtc1tpXS5tVXJpOworICAgICAgICB1cmkgPSBzd2l0Y2hpbmcgPyBtU3RyZWFtc1tpXS5tTmV3VXJpIDogbVN0cmVhbXNbaV0ubVVyaTsKIAogICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGZldGNoZXIgPSBhZGRGZXRjaGVyKHVyaS5jX3N0cigpKTsKICAgICAgICAgQ0hFQ0soZmV0Y2hlciAhPSBOVUxMKTsKIAogICAgICAgICBpbnQzMl90IGxhdGVzdFNlcSA9IC0xOwotICAgICAgICBpbnQ2NF90IGxhdGVzdFRpbWVVcyA9IDBsbDsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xOworICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcSA9IC0xOwogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tNYXhTdHJlYW1zXTsKIAorICAgICAgICBpZiAoaSA9PSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRSSUNLWTogbG9vcGluZyBmcm9tIGkgYXMgZWFybGllciBzdHJlYW1zIGFyZSBhbHJlYWR5IHJlbW92ZWQgZnJvbSBzdHJlYW1NYXNrCiAgICAgICAgIGZvciAoc2l6ZV90IGogPSBpOyBqIDwga01heFN0cmVhbXM7ICsraikgewotICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBtU3RyZWFtc1tqXS5tVXJpKSB7CisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZzdHJlYW1VcmkgPSBzd2l0Y2hpbmcgPyBtU3RyZWFtc1tqXS5tTmV3VXJpIDogbVN0cmVhbXNbal0ubVVyaTsKKyAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGopKSAmJiB1cmkgPT0gc3RyZWFtVXJpKSB7CiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKIAotICAgICAgICAgICAgICAgIGlmICghc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdGltZVVzOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgZXh0cmEsIHRydWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZSwgc2VxOwotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNyY1RpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RNZXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzcmNTZWdtZW50U3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhID0gc291cmNlc1tqXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmICFtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigic2VxIiwgJnNlcSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcSA+IGxhdGVzdFNlcSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFNlcSA9IHNlcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdG1wVXM7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0bXBVcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzIDwgMCB8fCB0bXBVcyA8IHN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0bXBVczsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnNyY1RpbWVVcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY1RpbWVVcyA+IGxhdGVzdFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFRpbWVVcyA9IHNyY1RpbWVVczsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdG1wVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50U3RhcnRUaW1lVXMgPCAwIHx8IHRtcFVzIDwgc2VnbWVudFN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gdG1wVXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJnNlcSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPCAwIHx8IHNlcSA8IGRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5U2VxID0gc2VxOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzMi52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4dHJhU3RyZWFtcyA9IG1OZXdTdHJlYW1NYXNrICYgKH5tU3RyZWFtTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVN0cmVhbXMgJiBpbmRleFRvVHlwZShqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKiBzd2FwID0gKi8gZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHRyYWNrLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYmVmb3JlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSBrU3VidGl0bGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwgTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZywgcXVldWUgZGlzY29udGludWl0aWVzIGFmdGVyIHJlc3VtZQorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzMi52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXh0cmFTdHJlYW1zID0gbU5ld1N0cmVhbU1hc2sgJiAofm1TdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYVN0cmVhbXMgJiBpbmRleFRvVHlwZShqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPnF1ZXVlQWNjZXNzVW5pdChjcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoLypzd2FwKi8gZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTIyNSwxNCArMTUxOSwxNiBAQAogICAgICAgICAgICAgICAgIHNvdXJjZXNba0F1ZGlvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1ZpZGVvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1N1YnRpdGxlSW5kZXhdLAotICAgICAgICAgICAgICAgIHRpbWVVcywKLSAgICAgICAgICAgICAgICBsYXRlc3RUaW1lVXMgLyogbWluIHN0YXJ0IHRpbWUodXMpICovLAotICAgICAgICAgICAgICAgIGxhdGVzdFNlcSA+PSAwID8gbGF0ZXN0U2VxICsgMSA6IC0xIC8qIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBoaW50ICovICk7CisgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPCAwID8gbUxhc3RTZWVrVGltZVVzIDogc3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzLAorICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlTZXEsCisgICAgICAgICAgICAgICAgc3dpdGNoaW5nKTsKICAgICB9CiAKICAgICAvLyBBbGwgZmV0Y2hlcnMgaGF2ZSBub3cgYmVlbiBzdGFydGVkLCB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UKICAgICAvLyBoYXMgY29tcGxldGVkLgogCisgICAgY2FuY2VsQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwogICAgIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwogCiAgICAgQUxPR1YoIlhYWCBjb25maWd1cmF0aW9uIGNoYW5nZSBjb21wbGV0ZWQuIik7CkBAIC0xMjU3LDggKzE1NTMsMTcgQEAKIAogICAgIGludDMyX3Qgc3RyZWFtOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW0iLCAmc3RyZWFtKSk7Ci0gICAgbVN3YXBNYXNrIHw9IHN0cmVhbTsKLSAgICBpZiAobVN3YXBNYXNrICE9IG1TdHJlYW1NYXNrKSB7CisKKyAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7CisgICAgQ0hFQ0soaWR4ID49IDApOworICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLCBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICB9CisgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOworICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOworCisgICAgbVN3YXBNYXNrICY9IH5zdHJlYW07CisgICAgaWYgKG1Td2FwTWFzayAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEyNjgsMTUgKzE1NzMsNjUgQEAKICAgICAgICAgU3RyZWFtVHlwZSBleHRyYVN0cmVhbSA9IChTdHJlYW1UeXBlKSAoZXh0cmFTdHJlYW1zICYgfihleHRyYVN0cmVhbXMgLSAxKSk7CiAgICAgICAgIHN3YXBQYWNrZXRTb3VyY2UoZXh0cmFTdHJlYW0pOwogICAgICAgICBleHRyYVN0cmVhbXMgJj0gfmV4dHJhU3RyZWFtOworCisgICAgICAgIGlkeCA9IHR5cGVUb0luZGV4KGV4dHJhU3RyZWFtKTsKKyAgICAgICAgQ0hFQ0soaWR4ID49IDApOworICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICBleHRyYVN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CiAgICAgfQogCiAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKIH0KIAordm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja1N3aXRjaERvd24oKSB7CisgICAgaWYgKG1Td2l0Y2hEb3duTW9uaXRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaSkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisKKyAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtZXRhLT5maW5kSW50MzIoInRhcmdldER1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uKSApIHsKKyAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gcGFja2V0U291cmNlLT5nZXRFc3RpbWF0ZWREdXJhdGlvblVzKCk7CisgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvbiAqIDEwMDAwMDBsbDsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IHRhcmdldER1cmF0aW9uVXMgLyAzKSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN3aXRjaERvd24sIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246Om9uU3dpdGNoRG93bigpIHsKKyAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MgfHwgbVN3aXRjaEluUHJvZ3Jlc3MgfHwgbUN1ckJhbmR3aWR0aEluZGV4ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOworICAgIGlmIChiYW5kd2lkdGhJbmRleCA8IG1DdXJCYW5kd2lkdGhJbmRleCkgeworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xLCBiYW5kd2lkdGhJbmRleCwgZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMSwgbUN1ckJhbmR3aWR0aEluZGV4IC0gMSwgZmFsc2UpOworfQorCiAvLyBNYXJrIHN3aXRjaCBkb25lIHdoZW46Ci0vLyAgIDEuIGFsbCBvbGQgYnVmZmVycyBhcmUgc3dhcHBlZCBvdXQsIEFORAotLy8gICAyLiBhbGwgb2xkIGZldGNoZXJzIGFyZSByZW1vdmVkLgorLy8gICAxLiBhbGwgb2xkIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgb3V0CiB2b2lkIExpdmVTZXNzaW9uOjp0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpIHsKKyAgICBpZiAoIW1Td2l0Y2hJblByb2dyZXNzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBib29sIG5lZWRUb1JlbW92ZUZldGNoZXJzID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGlmIChtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubVRvQmVSZW1vdmVkKSB7CkBAIC0xMjg0LDEwICsxNjM5LDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSBtU3RyZWFtTWFzaykgeworCisgICAgaWYgKCFuZWVkVG9SZW1vdmVGZXRjaGVycyAmJiBtU3dhcE1hc2sgPT0gMCkgeworICAgICAgICBBTE9HSSgibVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZSIpOwogICAgICAgICBtU3RyZWFtTWFzayA9IG1OZXdTdHJlYW1NYXNrOwogICAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICBtU3dhcE1hc2sgPSAwOwogICAgIH0KIH0KIApAQCAtMTMwNiw2ICsxNjYyLDI4IEBACiAgICAgbVN3aXRjaEdlbmVyYXRpb24rKzsKICAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgIG1Td2FwTWFzayA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRmV0Y2hlckluZm8mIGluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5mby5tVG9CZVJlbW92ZWQpIHsKKyAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKCFtU3RyZWFtc1tpXS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNzaXplX3QgaiA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShtU3RyZWFtc1tpXS5tTmV3VXJpKTsKKyAgICAgICAgICAgIGlmIChqIDwgMCkgeworICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1OZXdVcmkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaik7CisgICAgICAgICAgICBpbmZvLm1GZXRjaGVyLT5zdG9wQXN5bmMoKTsKKyAgICAgICAgICAgIG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbXNBdChqKTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1OZXdVcmkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYm9vbCBMaXZlU2Vzc2lvbjo6Y2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KSB7CkBAIC0xMzEzLDMzICsxNjkxLDI5IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobVByZXZCYW5kd2lkdGhJbmRleCA8IDApIHsKKyAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAoYmFuZHdpZHRoSW5kZXggPT0gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4KSB7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4ID09IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4KSB7CisgICAgfSBlbHNlIGlmIChiYW5kd2lkdGhJbmRleCA+IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4KSB7CiAgICAgICAgIHJldHVybiBjYW5Td2l0Y2hVcCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KIAotdm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja0JhbmR3aWR0aCgpIHsKK3ZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tCYW5kd2lkdGgoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOwogICAgIGlmIChjYW5Td2l0Y2hCYW5kd2lkdGhUbyhiYW5kd2lkdGhJbmRleCkpIHsKICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgYmFuZHdpZHRoSW5kZXgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOworICAgICAgICAvLyBDb21lIGJhY2sgYW5kIGNoZWNrIGFnYWluIDEwIHNlY29uZHMgbGF0ZXIgaW4gY2FzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIG5vdy4KKyAgICAgICAgLy8gSWYgd2UgRE8gY2hhbmdlIGNvbmZpZ3VyYXRpb24sIG9uY2UgdGhhdCBjb21wbGV0ZXMgaXQnbGwgc2NoZWR1bGUgYSBuZXcKKyAgICAgICAgLy8gY2hlY2sgYmFuZHdpZHRoIGV2ZW50IHdpdGggYW4gaW5jcmVtZW50ZWQgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbi4KKyAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDAwbGwpOwogICAgIH0KLQotICAgIC8vIEhhbmRsaW5nIHRoZSBrV2hhdENoZWNrQmFuZHdpZHRoIGV2ZW4gaGVyZSBkb2VzIF9ub3RfIGF1dG9tYXRpY2FsbHkKLSAgICAvLyBzY2hlZHVsZSBhbm90aGVyIG9uZSBvbiByZXR1cm4sIG9ubHkgYW4gZXhwbGljaXQgY2FsbCB0bwotICAgIC8vIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCB3aWxsIGRvIHRoYXQuCi0gICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgb25seSBvbmUgY29uZmlndXJhdGlvbiBjaGFuZ2UgaXMgb25nb2luZyBhdCBhbnkKLSAgICAvLyBvbmUgdGltZSwgb25jZSB0aGF0IGNvbXBsZXRlcyBpdCdsbCBzY2hlZHVsZSBhbm90aGVyIGNoZWNrIGJhbmR3aWR0aAotICAgIC8vIGV2ZW50LgogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpwb3N0UHJlcGFyZWQoc3RhdHVzX3QgZXJyKSB7CkBAIC0xMzU2LDYgKzE3MzAsOSBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOworCisgICAgbVN3aXRjaERvd25Nb25pdG9yID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tTd2l0Y2hEb3duLCBpZCgpKTsKKyAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IDNmOGZlZTUuLjdhYWNjYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMjgsNiArMjgsNyBAQAogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKIHN0cnVjdCBIVFRQQmFzZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBMaXZlRGF0YVNvdXJjZTsKIHN0cnVjdCBNM1VQYXJzZXI7CiBzdHJ1Y3QgUGxheWxpc3RGZXRjaGVyOwpAQCAtNDAsNyArNDEsOCBAQAogICAgIH07CiAgICAgTGl2ZVNlc3Npb24oCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLCB1aWRfdCB1aWQgPSAwKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICBlbnVtIFN0cmVhbUluZGV4IHsKICAgICAgICAga0F1ZGlvSW5kZXggICAgPSAwLApAQCAtNjgsNyArNzAsOCBAQAogICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdDsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3Q7CisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKIAogICAgIGJvb2wgaXNTZWVrYWJsZSgpIGNvbnN0OwpAQCAtMTA1LDYgKzEwOCw4IEBACiAgICAgICAgIGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMgICAgICAgPSAnY2hDMycsCiAgICAgICAgIGtXaGF0RmluaXNoRGlzY29ubmVjdDIgICAgICAgICAgPSAnZmluMicsCiAgICAgICAgIGtXaGF0U3dhcHBlZCAgICAgICAgICAgICAgICAgICAgPSAnc3dhcCcsCisgICAgICAgIGtXaGF0Q2hlY2tTd2l0Y2hEb3duICAgICAgICAgICAgPSAnY2tTRCcsCisgICAgICAgIGtXaGF0U3dpdGNoRG93biAgICAgICAgICAgICAgICAgPSAnc0R3bicsCiAgICAgfTsKIAogICAgIHN0cnVjdCBCYW5kd2lkdGhJdGVtIHsKQEAgLTEyMSw5ICsxMjYsMjAgQEAKIAogICAgIHN0cnVjdCBTdHJlYW1JdGVtIHsKICAgICAgICAgY29uc3QgY2hhciAqbVR5cGU7Ci0gICAgICAgIEFTdHJpbmcgbVVyaTsKLSAgICAgICAgU3RyZWFtSXRlbSgpIDogbVR5cGUoIiIpIHt9Ci0gICAgICAgIFN0cmVhbUl0ZW0oY29uc3QgY2hhciAqdHlwZSkgOiBtVHlwZSh0eXBlKSB7fQorICAgICAgICBBU3RyaW5nIG1VcmksIG1OZXdVcmk7CisgICAgICAgIHNpemVfdCBtQ3VyRGlzY29udGludWl0eVNlcTsKKyAgICAgICAgaW50NjRfdCBtTGFzdERlcXVldWVkVGltZVVzOworICAgICAgICBpbnQ2NF90IG1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgU3RyZWFtSXRlbSgpCisgICAgICAgICAgICA6IG1UeXBlKCIiKSwKKyAgICAgICAgICAgICAgbUN1ckRpc2NvbnRpbnVpdHlTZXEoMCksCisgICAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMCksCisgICAgICAgICAgICAgIG1MYXN0U2FtcGxlRHVyYXRpb25VcygwKSB7fQorICAgICAgICBTdHJlYW1JdGVtKGNvbnN0IGNoYXIgKnR5cGUpCisgICAgICAgICAgICA6IG1UeXBlKHR5cGUpLAorICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKKyAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKKyAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CiAgICAgICAgIEFTdHJpbmcgdXJpS2V5KCkgewogICAgICAgICAgICAgQVN0cmluZyBrZXkobVR5cGUpOwogICAgICAgICAgICAga2V5LmFwcGVuZCgiVVJJIik7CkBAIC0xMzQsMTAgKzE1MCwxMCBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7CisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKIAogICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKKyAgICBib29sIG1CdWZmZXJpbmdba01heFN0cmVhbXNdOwogCiAgICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwpAQCAtMTQ1LDcgKzE2MSw3IEBACiAgICAgQVN0cmluZyBtTWFzdGVyVVJMOwogCiAgICAgVmVjdG9yPEJhbmR3aWR0aEl0ZW0+IG1CYW5kd2lkdGhJdGVtczsKLSAgICBzc2l6ZV90IG1QcmV2QmFuZHdpZHRoSW5kZXg7CisgICAgc3NpemVfdCBtQ3VyQmFuZHdpZHRoSW5kZXg7CiAKICAgICBzcDxNM1VQYXJzZXI+IG1QbGF5bGlzdDsKIApAQCAtMTYxLDYgKzE3Nyw3IEBACiAgICAgLy8gd2UgdXNlIHRoaXMgdG8gdHJhY2sgcmVjb25maWd1cmF0aW9uIHByb2dyZXNzLgogICAgIHVpbnQzMl90IG1Td2FwTWFzazsKIAorICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbURpc2NvbnRpbnVpdGllczsKICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzOwogICAgIC8vIEEgc2Vjb25kIHNldCBvZiBwYWNrZXQgc291cmNlcyB0aGF0IGJ1ZmZlciBjb250ZW50IGZvciB0aGUgdmFyaWFudCB3ZSdyZSBzd2l0Y2hpbmcgdG8uCiAgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtUGFja2V0U291cmNlczI7CkBAIC0xNzIsNiArMTg5LDcgQEAKIAogICAgIGludDMyX3QgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1Td2l0Y2hHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVN1YnRpdGxlR2VuZXJhdGlvbjsKIAogICAgIHNpemVfdCBtQ29udGludWF0aW9uQ291bnRlcjsKICAgICBzcDxBTWVzc2FnZT4gbUNvbnRpbnVhdGlvbjsKQEAgLTE4NSw2ICsyMDMsMTMgQEAKICAgICB1aW50MzJfdCBtRGlzY29ubmVjdFJlcGx5SUQ7CiAgICAgdWludDMyX3QgbVNlZWtSZXBseUlEOwogCisgICAgYm9vbCBtRmlyc3RUaW1lVXNWYWxpZDsKKyAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKKyAgICBpbnQ2NF90IG1MYXN0U2Vla1RpbWVVczsKKyAgICBzcDxBTWVzc2FnZT4gbVN3aXRjaERvd25Nb25pdG9yOworICAgIEtleWVkVmVjdG9yPHNpemVfdCwgaW50NjRfdD4gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXM7CisgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXM7CisKICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGFkZEZldGNoZXIoY29uc3QgY2hhciAqdXJpKTsKIAogICAgIHZvaWQgb25Db25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTIxNiw5ICsyNDEsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpOwogCiAgICAgc2l6ZV90IGdldEJhbmR3aWR0aEluZGV4KCk7CisgICAgaW50NjRfdCBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOwogCiAgICAgc3RhdGljIGludCBTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqLCBjb25zdCBCYW5kd2lkdGhJdGVtICopOwogICAgIHN0YXRpYyBTdHJlYW1UeXBlIGluZGV4VG9UeXBlKGludCBpZHgpOworICAgIHN0YXRpYyBzc2l6ZV90IHR5cGVUb0luZGV4KGludDMyX3QgdHlwZSk7CiAKICAgICB2b2lkIGNoYW5nZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjayA9IGZhbHNlKTsKQEAgLTIyNiw2ICsyNTMsOCBAQAogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24zKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uU3dhcHBlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNoZWNrU3dpdGNoRG93bigpOworICAgIHZvaWQgb25Td2l0Y2hEb3duKCk7CiAgICAgdm9pZCB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOwogCiAgICAgdm9pZCBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKQEAgLTIzNyw3ICsyNjYsNyBAQAogICAgIHZvaWQgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKICAgICBib29sIGNhblN3aXRjaEJhbmR3aWR0aFRvKHNpemVfdCBiYW5kd2lkdGhJbmRleCk7Ci0gICAgdm9pZCBvbkNoZWNrQmFuZHdpZHRoKCk7CisgICAgdm9pZCBvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgZmluaXNoRGlzY29ubmVjdCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCAyMGMzYTc2Li4xNjUxZGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgpAQCAtNTgsOCArNTksOCBAQAogCiAgICAgdm9pZCBwaWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOwotICAgIHZvaWQgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhR3JvdXAoKTsKQEAgLTE1Niw4ICsxNTcsOCBAQAogfQogCiBzdGF0dXNfdCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKLSAgICBpZiAobVR5cGUgIT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgIEFMT0dFKCJvbmx5IHNlbGVjdCBzdWJ0aXRpbGUgdHJhY2tzIGZvciBub3chIik7CisgICAgaWYgKG1UeXBlICE9IFRZUEVfU1VCUyAmJiBtVHlwZSAhPSBUWVBFX0FVRElPKSB7CisgICAgICAgIEFMT0dFKCJvbmx5IHNlbGVjdCBzdWJ0aXRpbGUvYXVkaW8gdHJhY2tzIGZvciBub3chIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE3MCw1MSArMTcxLDU4IEBACiAgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGFscmVhZHkgc2VsZWN0ZWQiLCBpbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJzZWxlY3RlZCB0cmFjayAlZCIsIGluZGV4KTsKKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSBpbmRleDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggIT0gKHNzaXplX3QpaW5kZXgpIHsKICAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlZCIsIGluZGV4KTsKKyAgICAgICAgQUxPR1YoInVuc2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwogICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFJdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gMiBmaWVsZHMKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBNZWRpYSAmaXRlbSA9IG1NZWRpYUl0ZW1zLml0ZW1BdChpKTsKLSAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9IGl0ZW0ubUxhbmd1YWdlLmVtcHR5KCkgPyAidW5kIiA6IGl0ZW0ubUxhbmd1YWdlLmNfc3RyKCk7Ci0gICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcpKTsKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICAvLyBUTy1ETzogcGFzcyBpbiBhIE1lZGlhRm9ybWF0IGluc3RlYWQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19BVVRPU0VMRUNUKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMighIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfREVGQVVMVCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0ZPUkNFRCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzaXplX3QgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpjb3VudFRyYWNrcygpIGNvbnN0IHsKICAgICByZXR1cm4gbU1lZGlhSXRlbXMuc2l6ZSgpOwogfQogCitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4ID49IG1NZWRpYUl0ZW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIGNvbnN0IE1lZGlhICZpdGVtID0gbU1lZGlhSXRlbXMuaXRlbUF0KGluZGV4KTsKKyAgICBjb25zdCBjaGFyICpsYW5nID0gaXRlbS5tTGFuZ3VhZ2UuZW1wdHkoKSA/ICJ1bmQiIDogaXRlbS5tTGFuZ3VhZ2UuY19zdHIoKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCBsYW5nKTsKKworICAgIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKKyAgICAgICAgLy8gVE8tRE86IHBhc3MgaW4gYSBNZWRpYUZvcm1hdCBpbnN0ZWFkCisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0FVVE9TRUxFQ1QpKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19ERUZBVUxUKSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19GT1JDRUQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCiBib29sIE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Z2V0QWN0aXZlVVJJKEFTdHJpbmcgKnVyaSkgY29uc3QgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhSXRlbXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID49IDAgJiYgaSA9PSAoc2l6ZV90KW1TZWxlY3RlZEluZGV4KSB7CkBAIC0yMzgsNiArMjQ2LDcgQEAKICAgICAgIG1Jc1ZhcmlhbnRQbGF5bGlzdChmYWxzZSksCiAgICAgICBtSXNDb21wbGV0ZShmYWxzZSksCiAgICAgICBtSXNFdmVudChmYWxzZSksCisgICAgICBtRGlzY29udGludWl0eVNlcSgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CiAgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOwogfQpAQCAtMjY1LDYgKzI3NCwxMCBAQAogICAgIHJldHVybiBtSXNFdmVudDsKIH0KIAorc2l6ZV90IE0zVVBhcnNlcjo6Z2V0RGlzY29udGludWl0eVNlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURpc2NvbnRpbnVpdHlTZXE7Cit9CisKIHNwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQpAQCAtMzE5LDE3ICszMzIsMjQgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE0zVVBhcnNlcjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3NpemVfdCBNM1VQYXJzZXI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhR3JvdXBzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHRyYWNrQ291bnQgKz0gbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmNvdW50VHJhY2tzKCk7CiAgICAgfQotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrQ291bnQpOworICAgIHJldHVybiB0cmFja0NvdW50OworfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmdldFRyYWNrSW5mbyhyZXBseSk7CitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGlpID0gaW5kZXg7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFHcm91cD4gZ3JvdXAgPSBtTWVkaWFHcm91cHMudmFsdWVBdChpKTsKKyAgICAgICAgc2l6ZV90IHRyYWNrcyA9IGdyb3VwLT5jb3VudFRyYWNrcygpOworICAgICAgICBpZiAoaWkgPCB0cmFja3MpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cC0+Z2V0VHJhY2tJbmZvKGlpKTsKKyAgICAgICAgfQorICAgICAgICBpaSAtPSB0cmFja3M7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3NpemVfdCBNM1VQYXJzZXI6OmdldFNlbGVjdGVkSW5kZXgoKSBjb25zdCB7CkBAIC0zOTgsNiArNDE4LDggQEAKICAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGNvbnN0IHNpemVfdCBzY2hlbWVFbmQgPSAoc3Ryc3RyKGJhc2VVUkwsICIvLyIpIC0gYmFzZVVSTCkgKyAyOworICAgIENIRUNLKHNjaGVtZUVuZCA9PSA3IHx8IHNjaGVtZUVuZCA9PSA4KTsKIAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmwsIDgpKSB7CiAgICAgICAgIC8vICJ1cmwiIGlzIGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLCBpZ25vcmUgYmFzZSBVUkwuCkBAIC00NDIsNyArNDY0LDcgQEAKIAogICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmb3VuZCBzbGFzaCBhY3R1YWxseSBpcyBwYXJ0IG9mIHRoZSBwYXRoCiAgICAgICAgIC8vIGFuZCBub3QgcGFydCBvZiB0aGUgImh0dHA6Ly8iLgotICAgICAgICBpZiAoZW5kID4gNikgeworICAgICAgICBpZiAoZW5kID49IHNjaGVtZUVuZCkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBlbmQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKQEAgLTU1MCw2ICs1NzIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLU1FRElBIikpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1lZGlhKGxpbmUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFIikpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2VxOworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGxpbmUsICZzZXEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC03MTMsNiArNzQxLDkgQEAKIAogICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvZGVjcyA9IHVucXVvdGVTdHJpbmcodmFsKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKm1ldGEpLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIGNvZGVjcy5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCgiYXVkaW8iLCBrZXkuY19zdHIoKSkKICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcCgidmlkZW8iLCBrZXkuY19zdHIoKSkKQEAgLTczNiw2ICs3NjcsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBrZXkudG9sb3dlcigpOworICAgICAgICAgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgICgqbWV0YSktPnNldFN0cmluZyhrZXkuY19zdHIoKSwgZ3JvdXBJRC5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc5OCw3ICs4MzIsOCBAQAogICAgICAgICAgICAgICAgIGlmIChNYWtlVVJMKGJhc2VVUkkuY19zdHIoKSwgdmFsLmNfc3RyKCksICZhYnNVUkkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFic1VSSTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciA8VVJMIHN1cHByZXNzZWQ+LiIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKGJhc2VVUkkpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTA4Niw2ICsxMTIxLDMwIEBACiB9CiAKIC8vIHN0YXRpYworc3RhdHVzX3QgTTNVUGFyc2VyOjpwYXJzZURpc2NvbnRpbnVpdHlTZXF1ZW5jZShjb25zdCBBU3RyaW5nICZsaW5lLCBzaXplX3QgKnNlcSkgeworICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKworICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHg7CisgICAgc3RhdHVzX3QgZXJyID0gUGFyc2VJbnQzMihsaW5lLmNfc3RyKCkgKyBjb2xvblBvcyArIDEsICZ4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNlcSkgeworICAgICAgICAqc2VxID0geDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKIHN0YXR1c190IE0zVVBhcnNlcjo6UGFyc2VJbnQzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp4KSB7CiAgICAgY2hhciAqZW5kOwogICAgIGxvbmcgbHZhbCA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCmluZGV4IGNjZDY1NTYuLmQ1ODhhZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCkBAIC0zNCw2ICszNCw3IEBACiAgICAgYm9vbCBpc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0OwogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFdmVudCgpIGNvbnN0OworICAgIHNpemVfdCBnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3Q7CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCkBAIC00Miw3ICs0Myw4IEBACiAKICAgICB2b2lkIHBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRJbmRleCgpIGNvbnN0OwogCiAgICAgYm9vbCBnZXRUeXBlVVJJKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp1cmkpIGNvbnN0OwpAQCAtNjUsNiArNjcsNyBAQAogICAgIGJvb2wgbUlzVmFyaWFudFBsYXlsaXN0OwogICAgIGJvb2wgbUlzQ29tcGxldGU7CiAgICAgYm9vbCBtSXNFdmVudDsKKyAgICBzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CiAKICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CiAgICAgVmVjdG9yPEl0ZW0+IG1JdGVtczsKQEAgLTkzLDYgKzk2LDggQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWVkaWEoY29uc3QgQVN0cmluZyAmbGluZSk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UoY29uc3QgQVN0cmluZyAmbGluZSwgc2l6ZV90ICpzZXEpOworCiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCk7CiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlRG91YmxlKGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqeCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDUxM2YxMTQuLjMwZmE4NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtNDksMzEgKzQ5LDM2IEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWluQnVmZmVyZWREdXJhdGlvblVzID0gMTAwMDAwMDBsbDsKIGNvbnN0IGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjprTWF4TW9uaXRvckRlbGF5VXMgPSAzMDAwMDAwbGw7Ci1jb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gMTkyOworY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDIwNDg7CiBjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a051bVNraXBGcmFtZXMgPSAxMDsKIAogUGxheWxpc3RGZXRjaGVyOjpQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxMaXZlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSkKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbikKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1TdGFydFRpbWVVc05vdGlmeShub3RpZnktPmR1cCgpKSwKICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAogICAgICAgbVVSSSh1cmkpLAogICAgICAgbVN0cmVhbVR5cGVNYXNrKDApLAogICAgICAgbVN0YXJ0VGltZVVzKC0xbGwpLAotICAgICAgbU1pblN0YXJ0VGltZVVzKDBsbCksCi0gICAgICBtU3RvcFBhcmFtcyhOVUxMKSwKKyAgICAgIG1TZWdtZW50U3RhcnRUaW1lVXMoLTFsbCksCisgICAgICBtRGlzY29udGludWl0eVNlcSgtMWxsKSwKKyAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlKGZhbHNlKSwKICAgICAgIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcygtMWxsKSwKICAgICAgIG1TZXFOdW1iZXIoLTEpLAogICAgICAgbU51bVJldHJpZXMoMCksCiAgICAgICBtU3RhcnR1cCh0cnVlKSwKKyAgICAgIG1BZGFwdGl2ZShmYWxzZSksCiAgICAgICBtUHJlcGFyZWQoZmFsc2UpLAogICAgICAgbU5leHRQVFNUaW1lVXMoLTFsbCksCiAgICAgICBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oc3VidGl0bGVHZW5lcmF0aW9uKSwKICAgICAgIG1SZWZyZXNoU3RhdGUoSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCi0gICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSB7CisgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMoMGxsKSwKKyAgICAgIG1WaWRlb0J1ZmZlcihuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKSkgewogICAgIG1lbXNldChtUGxheWxpc3RIYXNoLCAwLCBzaXplb2YobVBsYXlsaXN0SGFzaCkpOwogICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CiAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIDApOwpAQCAtMzE3LDcgKzMyMiw3IEBACiAgICAgICAgIG1heERlbGF5VXMgPSBtaW5EZWxheVVzOwogICAgIH0KICAgICBpZiAoZGVsYXlVcyA+IG1heERlbGF5VXMpIHsKLSAgICAgICAgQUxPR1YoIk5lZWQgdG8gcmVmcmVzaCBwbGF5bGlzdCBpbiAlbGxkIiwgbWF4RGVsYXlVcyk7CisgICAgICAgIEFMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJSIgUFJJZDY0ICwgbWF4RGVsYXlVcyk7CiAgICAgICAgIGRlbGF5VXMgPSBtYXhEZWxheVVzOwogICAgIH0KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TW9uaXRvclF1ZXVlLCBpZCgpKTsKQEAgLTMzNCw4ICszMzksOSBAQAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzdWJ0aXRsZVNvdXJjZSwKICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcywKLSAgICAgICAgaW50NjRfdCBtaW5TdGFydFRpbWVVcywKLSAgICAgICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQpIHsKKyAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMsCisgICAgICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxLAorICAgICAgICBib29sIGFkYXB0aXZlKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKIAogICAgIHVpbnQzMl90IHN0cmVhbVR5cGVNYXNrID0gMHVsOwpAQCAtMzU3LDggKzM2Myw5IEBACiAKICAgICBtc2ctPnNldEludDMyKCJzdHJlYW1UeXBlTWFzayIsIHN0cmVhbVR5cGVNYXNrKTsKICAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIHN0YXJ0VGltZVVzKTsKLSAgICBtc2ctPnNldEludDY0KCJtaW5TdGFydFRpbWVVcyIsIG1pblN0YXJ0VGltZVVzKTsKLSAgICBtc2ctPnNldEludDMyKCJzdGFydFNlcU51bWJlckhpbnQiLCBzdGFydFNlcU51bWJlckhpbnQpOworICAgIG1zZy0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIHNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigic3RhcnREaXNjb250aW51aXR5U2VxIiwgc3RhcnREaXNjb250aW51aXR5U2VxKTsKKyAgICBtc2ctPnNldEludDMyKCJhZGFwdGl2ZSIsIGFkYXB0aXZlKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtMzY2LDkgKzM3Myw5IEBACiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKIH0KIAotdm9pZCBQbGF5bGlzdEZldGNoZXI6OnN0b3BBc3luYyhib29sIHNlbGZUcmlnZ2VyZWQpIHsKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdG9wQXN5bmMoYm9vbCBjbGVhcikgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJzZWxmVHJpZ2dlcmVkIiwgc2VsZlRyaWdnZXJlZCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2xlYXIiLCBjbGVhcik7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQ0OCwxMCArNDU1LDEzIEBACiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbVR5cGVNYXNrIiwgKGludDMyX3QgKikmc3RyZWFtVHlwZU1hc2spKTsKIAogICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQ7CisgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXM7CisgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisgICAgaW50MzJfdCBhZGFwdGl2ZTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmc3RhcnRUaW1lVXMpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgibWluU3RhcnRUaW1lVXMiLCAoaW50NjRfdCAqKSAmbU1pblN0YXJ0VGltZVVzKSk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0U2VxTnVtYmVySGludCIsICZzdGFydFNlcU51bWJlckhpbnQpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnNlZ21lbnRTdGFydFRpbWVVcykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCAmc3RhcnREaXNjb250aW51aXR5U2VxKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFkYXB0aXZlIiwgJmFkYXB0aXZlKSk7CiAKICAgICBpZiAoc3RyZWFtVHlwZU1hc2sgJiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTykgewogICAgICAgICB2b2lkICpwdHI7CkBAIC00ODEsMTYgKzQ5MSwxNiBAQAogICAgIH0KIAogICAgIG1TdHJlYW1UeXBlTWFzayA9IHN0cmVhbVR5cGVNYXNrOwotICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOwogCi0gICAgaWYgKG1TdGFydFRpbWVVcyA+PSAwbGwpIHsKKyAgICBtU2VnbWVudFN0YXJ0VGltZVVzID0gc2VnbWVudFN0YXJ0VGltZVVzOworICAgIG1EaXNjb250aW51aXR5U2VxID0gc3RhcnREaXNjb250aW51aXR5U2VxOworCisgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CiAgICAgICAgIG1TZXFOdW1iZXIgPSAtMTsKICAgICAgICAgbVN0YXJ0dXAgPSB0cnVlOwogICAgICAgICBtUHJlcGFyZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnRTZXFOdW1iZXJIaW50ID49IDApIHsKLSAgICAgICAgbVNlcU51bWJlciA9IHN0YXJ0U2VxTnVtYmVySGludDsKKyAgICAgICAgbUFkYXB0aXZlID0gYWRhcHRpdmU7CiAgICAgfQogCiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwpAQCAtNTA1LDExICs1MTUsOSBAQAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uU3RvcChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGNhbmNlbE1vbml0b3JRdWV1ZSgpOwogCi0gICAgaW50MzJfdCBzZWxmVHJpZ2dlcmVkOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxmVHJpZ2dlcmVkIiwgJnNlbGZUcmlnZ2VyZWQpKTsKLSAgICBpZiAoIXNlbGZUcmlnZ2VyZWQpIHsKLSAgICAgICAgLy8gU2VsZiB0cmlnZ2VyZWQgc3RvcHMgb25seSBoYXBwZW4gZHVyaW5nIHN3aXRjaGluZywgaW4gd2hpY2ggY2FzZSB3ZSBkbyBub3Qgd2FudAotICAgICAgICAvLyB0byBjbGVhciB0aGUgZGlzY29udGludWl0aWVzIHF1ZXVlZCBhdCB0aGUgZW5kIG9mIHBhY2tldCBzb3VyY2VzLgorICAgIGludDMyX3QgY2xlYXI7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNsZWFyIiwgJmNsZWFyKSk7CisgICAgaWYgKGNsZWFyKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPmNsZWFyKCk7CkBAIC01NTEsMTUgKzU1OSwxNiBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGlmIHdlIHdvdWxkIHN0b3Agd2l0aGluIGEgcmVzdW1lIHRocmVzaG9sZC4KKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICBpbnQ2NF90IGxhdGVzdFRpbWVVcyA9IDAsIHN0b3BUaW1lVXMgPSAwOwotICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0TWV0YSgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbGF0ZXN0TWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAgICAgICAgIGlmIChsYXRlc3RNZXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiAobGF0ZXN0TWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGF0ZXN0VGltZVVzKQotICAgICAgICAgICAgICAgICYmIHBhcmFtcy0+ZmluZEludDY0KHN0b3BLZXksICZzdG9wVGltZVVzKSkpIHsKLSAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVczsKLSAgICAgICAgICAgIGlmIChkaWZmVXMgPCByZXN1bWVUaHJlc2hvbGQobGF0ZXN0TWV0YSkpIHsKLSAgICAgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAmJiBkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgJiYgbGF0ZXN0TWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbGF0ZXN0VGltZVVzKQorICAgICAgICAgICAgICAgICYmIHBhcmFtcy0+ZmluZEludDY0KHN0b3BLZXksICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICYmIHN0b3BUaW1lVXMgLSBsYXRlc3RUaW1lVXMgPCByZXN1bWVUaHJlc2hvbGQobGF0ZXN0TWV0YSkpIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NjcsNyArNTc2LDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RvcEFzeW5jKC8qIHNlbGZUcmlnZ2VyZWQgPSAqLyB0cnVlKTsKKyAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC01ODcsNyArNTk2LDEwIEBACiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cXVldWVEaXNjb250aW51aXR5KAogICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlRGlzY29udGludWl0eSh0eXBlLCBleHRyYSk7CisgICAgICAgIC8vIGRvIG5vdCBkaXNjYXJkIGJ1ZmZlciB1cG9uICNFWFQtWC1ESVNDT05USU5VSVRZIHRhZworICAgICAgICAvLyAoc2VlayB3aWxsIGRpc2NhcmQgYnVmZmVyIGJ5IGFiYW5kb25pbmcgb2xkIGZldGNoZXJzKQorICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgdHlwZSwgZXh0cmEsIGZhbHNlIC8qIGRpc2NhcmQgKi8pOwogICAgIH0KIH0KIApAQCAtNjI4LDcgKzY0MCw3IEBACiAKICAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgIEFMT0dWKCJidWZmZXJlZCAlbGxkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcmVkICUiIFBSSWQ2NCAiIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMsIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKTsKICAgICAgICAgICAgIGlmIChidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPiBidWZmZXJlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPSBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXM7CkBAIC02NDEsNyArNjUzLDcgQEAKICAgICBpZiAoIW1QcmVwYXJlZCAmJiBidWZmZXJlZER1cmF0aW9uVXMgPiB0YXJnZXREdXJhdGlvblVzICYmIGRvd25sb2FkTW9yZSkgewogICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOwogCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICBBTE9HVigicHJlcGFyZWQsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgdGFyZ2V0RHVyYXRpb25Vcyk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGVtcG9yYXJpbHlEb25lRmV0Y2hpbmcpOwpAQCAtNjQ5LDcgKzY2MSw3IEBACiAgICAgfQogCiAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LICYmIGRvd25sb2FkTW9yZSkgewotICAgICAgICBBTE9HVigibW9uaXRvcmluZywgYnVmZmVyZWQ9JWxsZCA8ICVsbGQiLAorICAgICAgICBBTE9HVigibW9uaXRvcmluZywgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPCAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzLCBkdXJhdGlvblRvQnVmZmVyVXMpOwogICAgICAgICAvLyBkZWxheSB0aGUgbmV4dCBkb3dubG9hZCBzbGlnaHRseTsgaG9wZWZ1bGx5IHRoaXMgZ2l2ZXMgb3RoZXIgY29uY3VycmVudCBmZXRjaGVycwogICAgICAgICAvLyBhIGJldHRlciBjaGFuY2UgdG8gcnVuLgpAQCAtNjY1LDcgKzY3Nyw3IEBACiAgICAgICAgIG1zZy0+cG9zdCgpOwogCiAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG1QcmVwYXJlZCA/IGtNYXhNb25pdG9yRGVsYXlVcyA6IHRhcmdldER1cmF0aW9uVXMgLyAyOwotICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJWxsZCwgYnVmZmVyZWQ9JWxsZCA+ICVsbGQiLAorICAgICAgICBBTE9HVigicGF1c2luZyBmb3IgJSIgUFJJZDY0ICIsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiID4gJSIgUFJJZDY0ICIiLAogICAgICAgICAgICAgICAgIGRlbGF5VXMsIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKICAgICAgICAgLy8gOlRSSUNLWTogbmVlZCB0byBlbmZvcmNlIG1pbmltdW0gZGVsYXkgYmVjYXVzZSB0aGUgZGVsYXkgdG8KICAgICAgICAgLy8gcmVmcmVzaCB0aGUgcGxheWxpc3Qgd2lsbCBiZWNvbWUgMApAQCAtNzIyLDM4ICs3MzQsNTUgQEAKICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKICAgICB9CiAKLSAgICBib29sIHNlZWtEaXNjb250aW51aXR5ID0gZmFsc2U7Ci0gICAgYm9vbCBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSBmYWxzZTsKKyAgICBib29sIGRpc2NvbnRpbnVpdHkgPSBmYWxzZTsKIAogICAgIGNvbnN0IGludDMyX3QgbGFzdFNlcU51bWJlckluUGxheWxpc3QgPQogICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDE7CiAKLSAgICBpZiAobVN0YXJ0dXAgJiYgbVNlcU51bWJlciA+PSAwCi0gICAgICAgICAgICAmJiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCB8fCBtU2VxTnVtYmVyID4gbGFzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIC8vIGluIGNhc2Ugd2UgZ3Vlc3NlZCB3cm9uZyBkdXJpbmcgcmVjb25maWd1cmF0aW9uLCB0cnkgZmV0Y2hpbmcgdGhlIGxhdGVzdCBjb250ZW50LgotICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1EaXNjb250aW51aXR5U2VxIDwgMCkgeworICAgICAgICBtRGlzY29udGludWl0eVNlcSA9IG1QbGF5bGlzdC0+Z2V0RGlzY29udGludWl0eVNlcSgpOwogICAgIH0KIAogICAgIGlmIChtU2VxTnVtYmVyIDwgMCkgewogICAgICAgICBDSEVDS19HRShtU3RhcnRUaW1lVXMsIDBsbCk7CiAKLSAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7Ci0gICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU3RhcnRUaW1lVXMpOwotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciB0aW1lICVsbGQgaXMgJWxkIGZyb20gKCVsZCAuLiAlbGQpIiwKKyAgICAgICAgaWYgKG1TZWdtZW50U3RhcnRUaW1lVXMgPCAwKSB7CisgICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpICYmICFtUGxheWxpc3QtPmlzRXZlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIHNlc3Npb24sIHN0YXJ0IDMgc2VnbWVudHMgZnJvbSB0aGUgZW5kIG9uIGNvbm5lY3QKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3QgLSAzOworICAgICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcyAtPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRUaW1lVXNSZWxhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRpbWUgJSIgUFJJZDY0ICIgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzLCBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBsaXZlIHNlc3Npb24sIHN0YXJ0IDMgc2VnbWVudHMgZnJvbSB0aGUgZW5kLgotICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMzsKKyAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TZWdtZW50U3RhcnRUaW1lVXMpOworICAgICAgICAgICAgaWYgKG1BZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIC8vIGF2b2lkIGRvdWJsZSBmZXRjaC9kZWNvZGUKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzc2l6ZV90IG1pblNlcSA9IGdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkobURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBtaW5TZXEpIHsKKyAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbWluU2VxOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewogICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIGxpdmUgZXZlbnQgJWxkIGZyb20gKCVsZCAuLiAlbGQpIiwKKworICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgbGl2ZSBldmVudCAlZCBmcm9tICglZCAuLiAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfQotCi0gICAgICAgIG1TdGFydFRpbWVVcyA9IC0xbGw7CiAgICAgfQogCiAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QKQEAgLTc3Miw3ICs4MDEsOCBAQAogICAgICAgICAgICAgICAgIGlmIChkZWxheVVzID4ga01heE1vbml0b3JEZWxheVVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWxkIGZyb20gKCVsZCAuLiAlbGQpLCBtb25pdG9yIGluICVsbGQgKHJldHJ5PSVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlZCBmcm9tICglZCAuLiAlZCksICIKKyAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciBpbiAlIiBQUklkNjQgIiAocmV0cnk9JWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCBkZWxheVVzLCBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKQEAgLTc5MCw3ICs4MjAsNyBAQAogICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwbGljaXREaXNjb250aW51aXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOwogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgfSBlbHNlIHsKQEAgLTgxNSw3ICs4NDUsOCBAQAogCiAgICAgaW50MzJfdCB2YWw7CiAgICAgaWYgKGl0ZW1NZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdmFsKSAmJiB2YWwgIT0gMCkgewotICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgICAgICBtRGlzY29udGludWl0eVNlcSsrOworICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKICAgICB9CiAKICAgICBpbnQ2NF90IHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoOwpAQCAtODQ2LDYgKzg3Nyw3IEBACiAgICAgfQogCiAgICAgLy8gYmxvY2std2lzZSBkb3dubG9hZAorICAgIGJvb2wgc3RhcnR1cCA9IG1TdGFydHVwOwogICAgIHNzaXplX3QgYnl0ZXNSZWFkOwogICAgIGRvIHsKICAgICAgICAgYnl0ZXNSZWFkID0gbVNlc3Npb24tPmZldGNoRmlsZSgKQEAgLTg3NSw3ICs5MDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TdGFydHVwIHx8IHNlZWtEaXNjb250aW51aXR5IHx8IGV4cGxpY2l0RGlzY29udGludWl0eSkgeworICAgICAgICBpZiAoc3RhcnR1cCB8fCBkaXNjb250aW51aXR5KSB7CiAgICAgICAgICAgICAvLyBTaWduYWwgZGlzY29udGludWl0eS4KIAogICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CkBAIC04ODUsMTYgKzkxNywxNyBAQAogICAgICAgICAgICAgICAgIG1OZXh0UFRTVGltZVVzID0gZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2Vla0Rpc2NvbnRpbnVpdHkgfHwgZXhwbGljaXREaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKHNlZWs9JWQsIGV4cGxpY2l0PSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBzZWVrRGlzY29udGludWl0eSwgZXhwbGljaXREaXNjb250aW51aXR5KTsKKyAgICAgICAgICAgIGlmIChkaXNjb250aW51aXR5KSB7CisgICAgICAgICAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKGV4cGxpY2l0PSVkKSIsIGRpc2NvbnRpbnVpdHkpOwogCiAgICAgICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXREaXNjb250aW51aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGV4dHJhICovKTsKKworICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHkgPSBmYWxzZTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhcnR1cCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgZXJyID0gT0s7CkBAIC05MTQsMjMgKzk0NywxOSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAvLyBiYWQgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGhpbnQKKyAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciB0b28gbG93L2hpZ2gKKyAgICAgICAgICAgIG1UU1BhcnNlci5jbGVhcigpOwogICAgICAgICAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CiAgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50Ci0gICAgICAgICAgICBzdG9wQXN5bmMoLyogc2VsZlRyaWdnZXJlZCA9ICovIHRydWUpOworICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi8gZmFsc2UpOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1TdGFydHVwID0gZmFsc2U7CiAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkICE9IDApOwogCiAgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGJ1ZmZlcikpIHsKQEAgLTk4Miw3ICsxMDExLDE2IEBACiAKICAgICAvLyBidWxrIGV4dHJhY3Qgbm9uLXRzIGZpbGVzCiAgICAgaWYgKHRzQnVmZmVyID09IE5VTEwpIHsKLSAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBlcnIgPSBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cyhidWZmZXIsIGl0ZW1NZXRhKTsKKyAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICAvLyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgdG9vIGxvdy9oaWdoCisgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgLy8gcmVhY2hlZCBzdG9wcGluZyBwb2ludAorICAgICAgICAgICAgc3RvcEFzeW5jKC8qIGNsZWFyID0gKi9mYWxzZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC05OTUsNiArMTAzMyw2NiBAQAogICAgIHBvc3RNb25pdG9yUXVldWUoKTsKIH0KIAoraW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSBjb25zdCB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMCisgICAgICAgICAgICB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgeworICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworICAgIH0KKyAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKworICAgIGludDMyX3QgaW5kZXggPSBtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMTsKKyAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiBhbmNob3JUaW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgIGludDY0X3QgaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKKworICAgICAgICBhbmNob3JUaW1lVXMgLT0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIC0taW5kZXg7CisgICAgfQorCisgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleCArIDE7CisgICAgaWYgKG5ld1NlcU51bWJlciA8PSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgICAgICByZXR1cm4gbmV3U2VxTnVtYmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICB9Cit9CisKK2ludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdCB7CisgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKKyAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IGN1ckRpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKKyAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IGN1ckRpc2NvbnRpbnVpdHlTZXEpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA8PSAwID8gMCA6IChmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxKTsKKyAgICB9CisKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5pdGVtQXQoIGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CisKKyAgICAgICAgaW50NjRfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgY3VyRGlzY29udGludWl0eVNlcSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1ckRpc2NvbnRpbnVpdHlTZXEgPT0gZGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgKytpbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCk7Cit9CisKIGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JUaW1lKGludDY0X3QgdGltZVVzKSBjb25zdCB7CiAgICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoCkBAIC0xMDI3LDYgKzExMjUsMjMgQEAKICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CiB9CiAKK2NvbnN0IHNwPEFCdWZmZXI+ICZQbGF5bGlzdEZldGNoZXI6OnNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwgYm9vbCBkaXNjYXJkKSB7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIC8vIGZvciBzaW1wbGljaXR5LCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybWF0IGluIGVhY2ggdW5pdAorICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldE9iamVjdCgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICB9CisKKyAgICBpZiAoZGlzY2FyZCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkaXNjYXJkIiwgZGlzY2FyZCk7CisgICAgfQorCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOworICAgIHJldHVybiBhY2Nlc3NVbml0OworfQorCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAobVRTUGFyc2VyID09IE5VTEwpIHsKICAgICAgICAgLy8gVXNlIFRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFIHNvIHB0cyBjYXJyeSBvdmVyIGJldHdlZW4gZmV0Y2hlcnMuCkBAIC0xMDQyLDcgKzExNTcsOSBAQAogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIGV4dHJhKTsKIAorICAgICAgICBtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPSBtTmV4dFBUU1RpbWVVczsKICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMWxsOworICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHNpemVfdCBvZmZzZXQgPSAwOwpAQCAtMTEwMiw0MyArMTIxOSwxMDggQEAKICAgICAgICAgICAgICAgICAmJiBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KCZhY2Nlc3NVbml0KSA9PSBPSykgewogCiAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgaWYgKG1NaW5TdGFydFRpbWVVcyA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbU1pblN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gdW50ZXN0ZWQgcGF0aAotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgYSBsYXRlciB0cwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluY3IgPSAobU1pblN0YXJ0VGltZVVzIC0gdGltZVVzKSAvIDEwMDAwMDAgLyB0YXJnZXREdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY3IgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IG1TZXFOdW1iZXIgYnkgYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMTsKKworICAgICAgICAgICAgaWYgKG1TdGFydHVwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVVcyAtPSBtRmlyc3RUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSAwOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgKz0gaW5jcjsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVBR0FJTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDY0KGtleSwgJnN0YXJ0VGltZVVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NChrZXksIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1NYXNrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB1cCB0byB0aGUgY2xvc2VzdCBwcmVjZWRpbmcgSURSIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJSIgUFJJZDY0ICIgdXMgPCBtU3RhcnRUaW1lVXMgJSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCAgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBib29sIGlzQXZjID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNBdmMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YyAmJiBJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU1hc2sgPT0gbVN0cmVhbVR5cGVNYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCAmJiB0aW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisgICAgICAgICAgICAgICAgLy8gbVN0YXJ0dXAKKyAgICAgICAgICAgICAgICAvLyAgIG1TdGFydHVwIGlzIHRydWUgdW50aWwgd2UgaGF2ZSBxdWV1ZWQgYSBwYWNrZXQgZm9yIGFsbCB0aGUgc3RyZWFtcworICAgICAgICAgICAgICAgIC8vICAgd2UgYXJlIGZldGNoaW5nLiBXZSBxdWV1ZSBwYWNrZXRzIHdob3NlIHRpbWVzdGFtcHMgYXJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0VGltZVVzLgorICAgICAgICAgICAgICAgIC8vIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgIC8vICAgbVNlZ21lbnRTdGFydFRpbWVVcyBpcyBub24tbmVnYXRpdmUgd2hlbiBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzCisgICAgICAgICAgICAgICAgLy8gdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VczoKKyAgICAgICAgICAgICAgICAvLyAgIFRoaXMgYW5kIHRoZSAyIGFib3ZlIGNvbmRpdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gYWRhcHRpbmcgaW4gYSBsaXZlCisgICAgICAgICAgICAgICAgLy8gICBzdHJlYW07IHRoZSBvbGQgZmV0Y2hlciBoYXMgYWxyZWFkeSBmZXRjaGVkIHRvIG1TdGFydFRpbWVVczsgdGhlIG5ldyBmZXRjaGVyCisgICAgICAgICAgICAgICAgLy8gICB3b3VsZCBzdGFydCBmZXRjaGluZyBhZnRlciB0aW1lVXMsIHdoaWNoIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gbVN0YXJ0VGltZVVzOworICAgICAgICAgICAgICAgIC8vICAgdGhlIG9sZCBmZXRjaGVyIHdvdWxkIHRoZW4gY29udGludWUgZmV0Y2hpbmcgZGF0YSB1bnRpbCB0aW1lVXMuIFdlIGRvbid0IHdhbnQKKyAgICAgICAgICAgICAgICAvLyAgIHRpbWVVcyB0byBiZSB0b28gZmFyIGFoZWFkIG9mIG1TdGFydFRpbWVVcyBiZWNhdXNlIHdlIHdhbnQgdGhlIG9sZCBmZXRjaGVyIHRvCisgICAgICAgICAgICAgICAgLy8gICBzdG9wIGFzIGVhcmx5IGFzIHBvc3NpYmxlLiBUaGUgZGVmaW5pdGlvbiBvZiBiZWluZyAidG9vIGZhciBhaGVhZCIgaXMKKyAgICAgICAgICAgICAgICAvLyAgIGFyYml0cmFyeTsgaGVyZSB3ZSB1c2UgdGFyZ2V0RHVyYXRpb25VcyBhcyB0aHJlc2hvbGQuCisgICAgICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzIC0gbVN0YXJ0VGltZVVzID4gdGFyZ2V0RHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGd1ZXNzZWQgYSBzdGFydGluZyB0aW1lc3RhbXAgdGhhdCBpcyB0b28gaGlnaCB3aGVuIGFkYXB0aW5nIGluIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW07IHJlLWFkanVzdCBiYXNlZCBvbiB0aGUgYWN0dWFsIHRpbWVzdGFtcCBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbWVkaWEgc2VnbWVudDsgaWYgd2UgZGlkbid0IG1vdmUgYmFja3dhcmQgYWZ0ZXIgdGhlIHJlLWFkanVzdG1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gKG5ld1NlcU51bWJlciksIHN0YXJ0IGF0IGxlYXN0IDEgc2VnbWVudCBwcmlvci4KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOworICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgICAgICAgICAgICAgIGlmICghbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoa2V5LCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigic3RyZWFtTWFzayIsIChpbnQzMl90ICopICZzdHJlYW1NYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayB8PSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NYXNrID09IG1TdHJlYW1UeXBlTWFzaykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gUXVldWUgZGlzY29udGludWl0eSBpbiBvcmlnaW5hbCBzdHJlYW0uCisgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoa2V5LCAmc3RvcFRpbWVVcykgfHwgdGltZVVzID49IHN0b3BUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRpc2NvbnRpbnVpdHlTZXEgPiBtRGlzY29udGludWl0eVNlcQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoa2V5LCAmc3RvcFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyA+PSBzdG9wVGltZVVzKSkgewogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgJj0gfnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMucmVtb3ZlSXRlbXNBdChpKTsKQEAgLTExNDcsMTUgKzEzMjksMTggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIE5PVCBkZXF1ZXVlIGFueSBkaXNjb250aW51aXRpZXMgZXhjZXB0IGZvciBmb3JtYXQgY2hhbmdlLgotCi0gICAgICAgICAgICAvLyBmb3Igc2ltcGxpY2l0eSwgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGZvcm1hdCBpbiBlYWNoIHVuaXQKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRPYmplY3QoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBkaXNjYXJkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1WaWRlb0J1ZmZlci0+aGFzQnVmZmVyQXZhaWxhYmxlKCZzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IHZpZGVvQnVmZmVyOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPmRlcXVldWVBY2Nlc3NVbml0KCZ2aWRlb0J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKHZpZGVvQnVmZmVyLCBzb3VyY2UsIGRpc2NhcmQpOworICAgICAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdCh2aWRlb0J1ZmZlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBTdGFzaCB0aGUgc2VxdWVuY2UgbnVtYmVyIHNvIHdlIGNhbiBoaW50IGZ1dHVyZSBwbGF5bGlzdCB3aGVyZSB0byBzdGFydCBhdC4KLSAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOworICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoYWNjZXNzVW5pdCwgc291cmNlKTsKICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICB9CiAKQEAgLTExODEsOSArMTM2NiwzNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorLyogc3RhdGljICovCitib29sIFBsYXlsaXN0RmV0Y2hlcjo6YnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzaXplX3QgcG9zID0gMDsKKworICAgIC8vIHNraXAgcG9zc2libGUgQk9NCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID49IHBvcyArIDMgJiYKKyAgICAgICAgICAgICFtZW1jbXAoIlx4ZWZceGJiXHhiZiIsIGJ1ZmZlci0+ZGF0YSgpICsgcG9zLCAzKSkgeworICAgICAgICBwb3MgKz0gMzsKKyAgICB9CisKKyAgICAvLyBhY2NlcHQgV0VCVlRUIGZvbGxvd2VkIGJ5IFNQQUNFLCBUQUIgb3IgKENSKSBMRgorICAgIGlmIChidWZmZXItPnNpemUoKSA8IHBvcyArIDYgfHwKKyAgICAgICAgICAgIG1lbWNtcCgiV0VCVlRUIiwgYnVmZmVyLT5kYXRhKCkgKyBwb3MsIDYpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9zICs9IDY7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPT0gcG9zKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3Qgc2VwID0gYnVmZmVyLT5kYXRhKClbcG9zXTsKKyAgICByZXR1cm4gc2VwID09ICcgJyB8fCBzZXAgPT0gJ1x0JyB8fCBzZXAgPT0gJ1xuJyB8fCBzZXAgPT0gJ1xyJzsKK30KKwogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpdGVtTWV0YSkgewotICAgIGlmIChidWZmZXItPnNpemUoKSA+PSA3ICYmICFtZW1jbXAoIldFQlZUVFxuIiwgYnVmZmVyLT5kYXRhKCksIDcpKSB7CisgICAgaWYgKGJ1ZmZlclN0YXJ0c1dpdGhXZWJWVFRNYWdpY1NlcXVlbmNlKGJ1ZmZlcikpIHsKICAgICAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayAhPSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKICAgICAgICAgICAgIEFMT0dFKCJUaGlzIHN0cmVhbSBvbmx5IGNvbnRhaW5zIHN1YnRpdGxlcy4iKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xMTk2LDcgKzE0MDcsOSBAQAogICAgICAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJzZXEiLCBtU2VxTnVtYmVyKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigic3VidGl0bGVHZW5lcmF0aW9uIiwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CiAKICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtMTI2MiwxNCArMTQ3NSw2IEBACiAgICAgICAgIGZpcnN0SUQzVGFnID0gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgewotICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7Ci0gICAgICAgIG1GaXJzdFBUUyA9IFBUUzsKLSAgICB9Ci0gICAgUFRTIC09IG1GaXJzdFBUUzsKLQotICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMGxsKSAvIDlsbCArIG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKLQogICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgIT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8pIHsKICAgICAgICAgQUxPR1coIlRoaXMgc3RyZWFtIG9ubHkgY29udGFpbnMgYXVkaW8gZGF0YSEiKTsKIApAQCAtMTMxMiw2ICsxNTE3LDEyIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKIAorICAgIGludDY0X3QgdGltZVVzID0gKFBUUyAqIDEwMGxsKSAvIDlsbDsKKyAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOworICAgIH0KKwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7CkBAIC0xMzM2LDE5ICsxNTQ3LDcwIEBACiAKICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgYWFjX2ZyYW1lX2xlbmd0aCwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihhYWNfZnJhbWVfbGVuZ3RoKTsKLSAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgYWR0c0hlYWRlciwgYWFjX2ZyYW1lX2xlbmd0aCk7Ci0KICAgICAgICAgaW50NjRfdCB1bml0VGltZVVzID0gdGltZVVzICsgbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7Ci0gICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHVuaXRUaW1lVXMpOworICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKIAogICAgICAgICAvLyBFYWNoIEFBQyBmcmFtZSBlbmNvZGVzIDEwMjQgc2FtcGxlcy4KICAgICAgICAgbnVtU2FtcGxlcyArPSAxMDI0OwogCi0gICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOwotICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdCh1bml0KTsKKyAgICAgICAgaWYgKG1TdGFydHVwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gdW5pdFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzIC09IG1GaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CisgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworCisgICAgICAgICAgICAgICAgLy8gRHVwbGljYXRlZCBsb2dpYyBmcm9tIGhvdyB3ZSBoYW5kbGUgLnRzIHBsYXlsaXN0cy4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbmV3U2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcU51bWJlciA+PSBtU2VxTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW1TZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbmV3U2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50NjQoInRpbWVVc0F1ZGlvIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoInN0cmVhbU1hc2siLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTyk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN0b3BQYXJhbXMgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gUXVldWUgZGlzY29udGludWl0eSBpbiBvcmlnaW5hbCBzdHJlYW0uCisgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXM7CisgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKKyAgICAgICAgICAgICAgICAgICAgfHwgZGlzY29udGludWl0eVNlcSA+IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgIHx8ICFtU3RvcFBhcmFtcy0+ZmluZEludDY0KCJ0aW1lVXNBdWRpbyIsICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICAgICB8fCAoZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcSAmJiB1bml0VGltZVVzID49IHN0b3BUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZU1hc2sgPSAwOworICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgYWR0c0hlYWRlciwgYWFjX2ZyYW1lX2xlbmd0aCk7CisKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdW5pdFRpbWVVcyk7CisgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKHVuaXQsIHBhY2tldFNvdXJjZSk7CisgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHVuaXQpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKaW5kZXggN2UyMTUyMy4uNzhjMzU4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICBQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbik7CiAKICAgICBzcDxEYXRhU291cmNlPiBnZXREYXRhU291cmNlKCk7CiAKQEAgLTU3LDE2ICs1OCwyMiBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmF1ZGlvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnZpZGVvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAotICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsCi0gICAgICAgICAgICBpbnQ2NF90IG1pblN0YXJ0VGltZVVzID0gMGxsIC8qIHN0YXJ0IGFmdGVyIHRoaXMgdGltZXN0YW1wICovLAotICAgICAgICAgICAgaW50MzJfdCBzdGFydFNlcU51bWJlckhpbnQgPSAtMSAvKiB0cnkgc3RhcnRpbmcgYXQgdGhpcyBzZXF1ZW5jZSBudW1iZXIgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsICAgICAgICAgLy8gc3RhcnRpbmcgdGltZXN0YW1wcworICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsLCAvLyBzdGFydGluZyBwb3NpdGlvbiB3aXRoaW4gcGxheWxpc3QKKyAgICAgICAgICAgIC8vIHN0YXJ0VGltZVVzIT1zZWdtZW50U3RhcnRUaW1lVXMgb25seSB3aGVuIHBsYXlsaXN0IGlzIGxpdmUKKyAgICAgICAgICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxID0gMCwKKyAgICAgICAgICAgIGJvb2wgYWRhcHRpdmUgPSBmYWxzZSk7CiAKICAgICB2b2lkIHBhdXNlQXN5bmMoKTsKIAotICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgc2VsZlRyaWdnZXJlZCA9IGZhbHNlKTsKKyAgICB2b2lkIHN0b3BBc3luYyhib29sIGNsZWFyID0gdHJ1ZSk7CiAKICAgICB2b2lkIHJlc3VtZVVudGlsQXN5bmMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCisgICAgdWludDMyX3QgZ2V0U3RyZWFtVHlwZU1hc2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZU1hc2s7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UGxheWxpc3RGZXRjaGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTkxLDYgKzk4LDcgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2tpcEZyYW1lczsKIAogICAgIHN0YXRpYyBib29sIGJ1ZmZlclN0YXJ0c1dpdGhUc1N5bmNCeXRlKGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOworICAgIHN0YXRpYyBib29sIGJ1ZmZlclN0YXJ0c1dpdGhXZWJWVFRNYWdpY1NlcXVlbmNlKGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOwogCiAgICAgLy8gbm90aWZpY2F0aW9ucyB0byBtU2Vzc2lvbgogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwpAQCAtMTAxLDcgKzEwOSwxNCBAQAogCiAgICAgdWludDMyX3QgbVN0cmVhbVR5cGVNYXNrOwogICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwotICAgIGludDY0X3QgbU1pblN0YXJ0VGltZVVzOyAvLyBzdGFydCBmZXRjaGluZyBubyBlYXJsaWVyIHRoYW4gdGhpcyB2YWx1ZQorCisgICAgLy8gU3RhcnQgdGltZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBzZWdtZW50IGluIHRoZSBpbml0aWFsCisgICAgLy8gcGxheWxpc3QuIEl0J3MgdmFsdWUgaXMgaW5pdGlhbGl6ZWQgdG8gYSBub24tbmVnYXRpdmUgdmFsdWUgb25seSB3aGVuIHdlIGFyZQorICAgIC8vIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MuCisgICAgaW50NjRfdCBtU2VnbWVudFN0YXJ0VGltZVVzOworCisgICAgc3NpemVfdCBtRGlzY29udGludWl0eVNlcTsKKyAgICBib29sIG1TdGFydFRpbWVVc1JlbGF0aXZlOwogICAgIHNwPEFNZXNzYWdlPiBtU3RvcFBhcmFtczsgLy8gbWVzc2FnZSBjb250YWluaW5nIHRoZSBsYXRlc3QgdGltZXN0YW1wcyB3ZSBzaG91bGQgZmV0Y2guCiAKICAgICBLZXllZFZlY3RvcjxMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPgpAQCAtMTE0LDEwICsxMjksMTIgQEAKICAgICBpbnQzMl90IG1TZXFOdW1iZXI7CiAgICAgaW50MzJfdCBtTnVtUmV0cmllczsKICAgICBib29sIG1TdGFydHVwOworICAgIGJvb2wgbUFkYXB0aXZlOwogICAgIGJvb2wgbVByZXBhcmVkOwogICAgIGludDY0X3QgbU5leHRQVFNUaW1lVXM7CiAKICAgICBpbnQzMl90IG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uOworICAgIGNvbnN0IGludDMyX3QgbVN1YnRpdGxlR2VuZXJhdGlvbjsKIAogICAgIGVudW0gUmVmcmVzaFN0YXRlIHsKICAgICAgICAgSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSwKQEAgLTEzMyw3ICsxNTAsOSBAQAogCiAgICAgYm9vbCBtRmlyc3RQVFNWYWxpZDsKICAgICB1aW50NjRfdCBtRmlyc3RQVFM7CisgICAgaW50NjRfdCBtRmlyc3RUaW1lVXM7CiAgICAgaW50NjRfdCBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvQnVmZmVyOwogCiAgICAgLy8gU3RvcmVzIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gZGVjcnlwdCB0aGUgbmV4dCBibG9jayBvZiBjaXBoZXIgdGV4dCwgd2hpY2ggY2FuCiAgICAgLy8gZWl0aGVyIGJlIGRlcml2ZWQgZnJvbSB0aGUgc2VxdWVuY2UgbnVtYmVyLCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBvciBjb3BpZWQgZnJvbQpAQCAtMTcyLDYgKzE5MSwxMCBAQAogICAgIC8vIFJlc3VtZSBhIGZldGNoZXIgdG8gY29udGludWUgdW50aWwgdGhlIHN0b3BwaW5nIHBvaW50IHN0b3JlZCBpbiBtc2cuCiAgICAgc3RhdHVzX3Qgb25SZXN1bWVVbnRpbChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZSk7CiAgICAgc3RhdHVzX3QgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0cygKQEAgLTE4Miw2ICsyMDUsOCBAQAogICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5KAogICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKIAorICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUoaW50NjRfdCBhbmNob3JUaW1lVXMpIGNvbnN0OworICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyRm9yRGlzY29udGludWl0eShzaXplX3QgZGlzY29udGludWl0eVNlcSkgY29uc3Q7CiAgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JUaW1lKGludDY0X3QgdGltZVVzKSBjb25zdDsKIAogICAgIHZvaWQgdXBkYXRlRHVyYXRpb24oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKaW5kZXggYmY2ZjdiYi4uMjE5NGMzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsKQEAgLTQsNiArNCw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCUlEMy5jcHAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2lkMwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC0xNSw2ICsxNyw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCXRlc3RpZDMuY3BwCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYnN0YWdlZnJpZ2h0IGxpYnV0aWxzIGxpYmxvZyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCmluZGV4IDExOTljMjIuLjdmMjIxYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwCkBAIC00NjgsNDkgKzQ2OCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0SVNPODg1OVRvU3RyaW5nOCgKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIFN0cmluZzggKnMpIHsKLSAgICBzaXplX3QgdXRmOGxlbiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1wwJykgewotICAgICAgICAgICAgc2l6ZSA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldIDwgMHg4MCkgewotICAgICAgICAgICAgKyt1dGY4bGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXRmOGxlbiArPSAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHV0ZjhsZW4gPT0gc2l6ZSkgewotICAgICAgICAvLyBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgcHJlc2VudC4KLQotICAgICAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2hhciAqdG1wID0gbmV3IGNoYXJbdXRmOGxlbl07Ci0gICAgY2hhciAqcHRyID0gdG1wOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChkYXRhW2ldID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweDgwKSB7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweGMwKSB7Ci0gICAgICAgICAgICAqcHRyKysgPSAweGMyOwotICAgICAgICAgICAgKnB0cisrID0gZGF0YVtpXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4YzM7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldIC0gNjQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzLT5zZXRUbyh0bXAsIHV0ZjhsZW4pOwotCi0gICAgZGVsZXRlW10gdG1wOwotICAgIHRtcCA9IE5VTEw7Ci19CiAKIC8vIHRoZSAybmQgYXJndW1lbnQgaXMgdXNlZCB0byBnZXQgdGhlIGRhdGEgZm9sbG93aW5nIHRoZSBcMCBpbiBhIGNvbW1lbnQgZmllbGQKIHZvaWQgSUQzOjpJdGVyYXRvcjo6Z2V0U3RyaW5nKFN0cmluZzggKmlkLCBTdHJpbmc4ICpjb21tZW50KSBjb25zdCB7CkBAIC01NDMsNyArNTAwLDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KGZyYW1lRGF0YSwgbUZyYW1lU2l6ZSwgaWQpOworICAgICAgICAvLyB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIElTTy04ODU5LTEsIGJ1dCBwYXNzIGl0IHVwIGFzLWlzIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGZpZ3VyZQorICAgICAgICAvLyBvdXQgdGhlIHJlYWwgZW5jb2RpbmcKKyAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyKilmcmFtZURhdGEsIG1GcmFtZVNpemUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01NjEsMTMgKzUyMCwxMyBAQAogICAgIH0KIAogICAgIGlmIChlbmNvZGluZyA9PSAweDAwKSB7Ci0gICAgICAgIC8vIElTTyA4ODU5LTEKLSAgICAgICAgY29udmVydElTTzg4NTlUb1N0cmluZzgoZnJhbWVEYXRhICsgMSwgbiwgaWQpOworICAgICAgICAvLyBzdXBwb3NlZGx5IElTTyA4ODU5LTEKKyAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyKilmcmFtZURhdGEgKyAxLCBuKTsKICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDMpIHsKLSAgICAgICAgLy8gVVRGLTgKKyAgICAgICAgLy8gc3VwcG9zZWRseSBVVEYtOAogICAgICAgICBpZC0+c2V0VG8oKGNvbnN0IGNoYXIgKikoZnJhbWVEYXRhICsgMSksIG4pOwogICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMikgewotICAgICAgICAvLyBVVEYtMTYgQkUsIG5vIGJ5dGUgb3JkZXIgbWFyay4KKyAgICAgICAgLy8gc3VwcG9zZWRseSBVVEYtMTYgQkUsIG5vIGJ5dGUgb3JkZXIgbWFyay4KICAgICAgICAgLy8gQVBJIHdhbnRzIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBub3QgbnVtYmVyIG9mIGJ5dGVzLi4uCiAgICAgICAgIGludCBsZW4gPSBuIC8gMjsKICAgICAgICAgY29uc3QgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IChjb25zdCBjaGFyMTZfdCAqKSAoZnJhbWVEYXRhICsgMSk7CkBAIC01ODMsNyArNTQyLDcgQEAKICAgICAgICAgaWYgKGZyYW1lZGF0YWNvcHkgIT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlW10gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAxKSB7CiAgICAgICAgIC8vIFVDUy0yCiAgICAgICAgIC8vIEFQSSB3YW50cyBudW1iZXIgb2YgY2hhcmFjdGVycywgbm90IG51bWJlciBvZiBieXRlcy4uLgogICAgICAgICBpbnQgbGVuID0gbiAvIDI7CkBAIC02MDIsNyArNTYxLDI3IEBACiAgICAgICAgICAgICBmcmFtZWRhdGErKzsKICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICB9Ci0gICAgICAgIGlkLT5zZXRUbyhmcmFtZWRhdGEsIGxlbik7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJlc3VsdGluZyBkYXRhIGNvbnNpc3RzIGVudGlyZWx5IG9mIDgtYml0IHZhbHVlcworICAgICAgICBib29sIGVpZ2h0Qml0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKGZyYW1lZGF0YVtpXSA+IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICBlaWdodEJpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlaWdodEJpdCkgeworICAgICAgICAgICAgLy8gY29sbGFwc2UgdG8gOCBiaXQsIHRoZW4gbGV0IHRoZSBtZWRpYSBzY2FubmVyIGNsaWVudCBmaWd1cmUgb3V0IHRoZSByZWFsIGVuY29kaW5nCisgICAgICAgICAgICBjaGFyICpmcmFtZTggPSBuZXcgY2hhcltsZW5dOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGZyYW1lOFtpXSA9IGZyYW1lZGF0YVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlkLT5zZXRUbyhmcmFtZTgsIGxlbik7CisgICAgICAgICAgICBkZWxldGUgW10gZnJhbWU4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZVtdIGZyYW1lZGF0YWNvcHk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggNmVlOTVhOS4uNzdkNjVlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCkBAIC0xNjAsNiArMTYxLDcgQEAKICAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwogICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBTdHJpbmc4IG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CiAKQEAgLTI0OSw2ICsyNTEsNyBAQAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTg4ZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KLQotI2RlZmluZSBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2ZEZWxlZ2F0ZTsKLQotc3RydWN0IENocm9taXVtSFRUUERhdGFTb3VyY2UgOiBwdWJsaWMgSFRUUEJhc2UgewotICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKLQotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DaHJvbWl1bUhUVFBEYXRhU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBTZkRlbGVnYXRlOwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIERJU0NPTk5FQ1RFRCwKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVELAotICAgICAgICBSRUFESU5HLAotICAgICAgICBESVNDT05ORUNUSU5HCi0gICAgfTsKLQotICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBTdGF0ZSBtU3RhdGU7Ci0KLSAgICBTZkRlbGVnYXRlICptRGVsZWdhdGU7Ci0KLSAgICBBU3RyaW5nIG1VUkk7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUhlYWRlcnM7Ci0KLSAgICBvZmY2NF90IG1DdXJyZW50T2Zmc2V0OwotCi0gICAgLy8gQW55IGNvbm5lY3Rpb24gZXJyb3Igb3IgdGhlIHJlc3VsdCBvZiBhIHJlYWQgb3BlcmF0aW9uCi0gICAgLy8gKGZvciB0aGUgbGF0dHRlciB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgaWYgc3VjY2Vzc2Z1bCkuCi0gICAgc3NpemVfdCBtSU9SZXN1bHQ7Ci0KLSAgICBpbnQ2NF90IG1Db250ZW50U2l6ZTsKLQotICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOwotCi0gICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7Ci0gICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdF9sKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWF0ZVJlYWQoCi0gICAgICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBpbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKTsKLQotICAgIHZvaWQgb25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdENvbXBsZXRlKCk7Ci0gICAgdm9pZCBvblJlZGlyZWN0KGNvbnN0IGNoYXIgKnVybCk7Ci0KLSAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmUwMmI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBBUlNFUl9IXwotCi0jZGVmaW5lIFBBUlNFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIHN0cnVjdCBTb3VyY2UgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIFNvdXJjZSgpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSA9IDA7Ci0KLSAgICAgICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZSk7Ci0gICAgfTsKLQotICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIoKTsKLQotICAgIHZvaWQgc3RhcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHZvaWQgc3RhcnQoY29uc3Qgc3A8U291cmNlPiAmc291cmNlKTsKLSAgICB2b2lkIHN0YXJ0KHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvLCBib29sIHN5bmNocm9ub3VzID0gZmFsc2UpOwotICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0LCBib29sIHN5bmNocm9ub3VzID0gZmFsc2UpOwotICAgIHN0YXR1c190IHNlZWtUbyhib29sIGF1ZGlvLCBpbnQ2NF90IHRpbWVVcyk7Ci0gICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RnJhZ21lbnRlZE1QNFBhcnNlcigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdFN0YXJ0LAotICAgICAgICBrV2hhdFByb2NlZWQsCi0gICAgICAgIGtXaGF0UmVhZE1vcmUsCi0gICAgICAgIGtXaGF0R2V0Rm9ybWF0LAotICAgICAgICBrV2hhdERlcXVldWVBY2Nlc3NVbml0LAotICAgICAgICBrV2hhdFNlZWtUbywKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnQ7Ci0gICAgc3RydWN0IER5bmFtaWNUcmFja0ZyYWdtZW50OwotICAgIHN0cnVjdCBTdGF0aWNUcmFja0ZyYWdtZW50OwotCi0gICAgc3RydWN0IERpc3BhdGNoRW50cnkgewotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgdWludDMyX3QgbVBhcmVudFR5cGU7Ci0gICAgICAgIHN0YXR1c190IChGcmFnbWVudGVkTVA0UGFyc2VyOjoqbUhhbmRsZXIpKHVpbnQzMl90LCBzaXplX3QsIHVpbnQ2NF90KTsKLSAgICB9OwotCi0gICAgc3RydWN0IENvbnRhaW5lciB7Ci0gICAgICAgIHVpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHVpbnQ2NF90IG1CeXRlc1JlbWFpbmluZzsKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIGJvb2wgbUV4dGVuZHNUb0VPRjsKLSAgICB9OwotCi0gICAgc3RydWN0IFNhbXBsZURlc2NyaXB0aW9uIHsKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIHVpbnQxNl90IG1EYXRhUmVmSW5kZXg7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTYW1wbGVJbmZvIHsKLSAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgICAgICBzaXplX3QgbVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1QcmVzZW50YXRpb25UaW1lOwotICAgICAgICBzaXplX3QgbVNhbXBsZURlc2NJbmRleDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWVkaWFEYXRhSW5mbyB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICB9OwotCi0gICAgc3RydWN0IFNpZHhFbnRyeSB7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbUR1cmF0aW9uVXM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFja0luZm8gewotICAgICAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgICAgIGtUcmFja0VuYWJsZWQgICAgID0gMHgwMSwKLSAgICAgICAgICAgIGtUcmFja0luTW92aWUgICAgID0gMHgwMiwKLSAgICAgICAgICAgIGtUcmFja0luUHJldmlldyAgID0gMHgwNCwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICB1aW50MzJfdCBtRHVyYXRpb247ICAvLyBUaGlzIGlzIHRoZSBkdXJhdGlvbiBpbiB0ZXJtcyBvZiBtb3ZpZSB0aW1lc2NhbGUhCi0gICAgICAgIHVpbnQ2NF90IG1TaWR4RHVyYXRpb247IC8vIHVzZWMsIGZyb20gc2lkeCBib3gsIHdoaWNoIGNhbiB1c2UgYSBkaWZmZXJlbnQgdGltZXNjYWxlCi0KLSAgICAgICAgdWludDMyX3QgbU1lZGlhVGltZVNjYWxlOwotCi0gICAgICAgIHVpbnQzMl90IG1NZWRpYUhhbmRsZXJUeXBlOwotICAgICAgICBWZWN0b3I8U2FtcGxlRGVzY3JpcHRpb24+IG1TYW1wbGVEZXNjczsKLQotICAgICAgICAvLyBmcm9tIHRyYWNrIGV4dGVuZHM6Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQzMl90IG1EZWNvZGluZ1RpbWU7Ci0KLSAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHg7Ci0gICAgICAgIHNwPFN0YXRpY1RyYWNrRnJhZ21lbnQ+IG1TdGF0aWNGcmFnbWVudDsKLSAgICAgICAgTGlzdDxzcDxUcmFja0ZyYWdtZW50PiA+IG1GcmFnbWVudHM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAga0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgID0gMHgwMSwKLSAgICAgICAgICAgIGtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCA9IDB4MDIsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCAgPSAweDA4LAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCAgICAgID0gMHgxMCwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICA9IDB4MjAsCi0gICAgICAgICAgICBrRHVyYXRpb25Jc0VtcHR5ICAgICAgICAgICAgICAgPSAweDEwMDAwLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1UcmFja0lEOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHVpbnQ2NF90IG1CYXNlRGF0YU9mZnNldDsKLSAgICAgICAgdWludDMyX3QgbVNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVGbGFnczsKLQotICAgICAgICB1aW50NjRfdCBtRGF0YU9mZnNldDsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IERpc3BhdGNoRW50cnkga0Rpc3BhdGNoVGFibGVbXTsKLQotICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKLSAgICBvZmZfdCBtQnVmZmVyUG9zOwotICAgIGJvb2wgbVN1c3BlbmRlZDsKLSAgICBib29sIG1Eb25lV2l0aE1vb3Y7Ci0gICAgb2ZmX3QgbUZpcnN0TW9vZk9mZnNldDsgLy8gdXNlZCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG9mZnNldHMgY2FsY3VsYXRlZCBmcm9tIHRoZSBzaWR4IGJveAotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgVmVjdG9yPENvbnRhaW5lcj4gbVN0YWNrOwotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBUcmFja0luZm8+IG1UcmFja3M7ICAvLyBUcmFja0luZm8gYnkgdHJhY2tJRAotICAgIFZlY3RvcjxNZWRpYURhdGFJbmZvPiBtTWVkaWFEYXRhOwotCi0gICAgdWludDMyX3QgbUN1cnJlbnRUcmFja0lEOwotCi0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotCi0gICAgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOwotCi0gICAgc3RhdHVzX3Qgb25Qcm9jZWVkKCk7Ci0gICAgc3RhdHVzX3Qgb25EZXF1ZXVlQWNjZXNzVW5pdChzaXplX3QgdHJhY2tJbmRleCwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotICAgIHN0YXR1c190IG9uU2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHBvc2l0aW9uKTsKLQotICAgIHZvaWQgZW50ZXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90IHR5cGUsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgdWludDE2X3QgcmVhZFUxNihzaXplX3Qgb2Zmc2V0KTsKLSAgICB1aW50MzJfdCByZWFkVTMyKHNpemVfdCBvZmZzZXQpOwotICAgIHVpbnQ2NF90IHJlYWRVNjQoc2l6ZV90IG9mZnNldCk7Ci0gICAgdm9pZCBza2lwKG9mZl90IGRpc3RhbmNlKTsKLSAgICBzdGF0dXNfdCBuZWVkKHNpemVfdCBzaXplKTsKLSAgICBib29sIGZpdHNDb250YWluZXIodWludDY0X3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrSGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhSGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhSGFuZGxlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0V4dGVuZHMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50UnVuKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VNZWRpYURhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2VnbWVudEluZGV4KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBUcmFja0luZm8gKmVkaXRUcmFjayh1aW50MzJfdCB0cmFja0lELCBib29sIGNyZWF0ZUlmTmVjZXNzYXJ5ID0gZmFsc2UpOwotCi0gICAgc3NpemVfdCBmaW5kVHJhY2soYm9vbCB3YW50QXVkaW8pIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgbWFrZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBUcmFja0luZm8gKmluZm8sCi0gICAgICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsCi0gICAgICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbywKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotICAgIHN0YXR1c190IGdldFNhbXBsZSgKLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgICAgIHNwPFRyYWNrRnJhZ21lbnQ+ICpmcmFnbWVudCwKLSAgICAgICAgICAgIFNhbXBsZUluZm8gKnNhbXBsZUluZm8pOwotCi0gICAgc3RhdGljIGludCBDb21wYXJlU2FtcGxlTG9jYXRpb24oCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8pOwotCi0gICAgdm9pZCByZXN1bWVJZk5lY2Vzc2FyeSgpOwotCi0gICAgdm9pZCBjb3B5QnVmZmVyKAotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmRzdCwKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIGNvbnN0OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRnJhZ21lbnRlZE1QNFBhcnNlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBBUlNFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKaW5kZXggZDRiN2Y5Zi4uMWMzY2Q1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApAQCAtNDgsMTQgKzQ4LDYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotICAgIGJvb2wgZ2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0OwotCi0gICAgc3RhdGljIHNwPEhUVFBCYXNlPiBDcmVhdGUodWludDMyX3QgZmxhZ3MgPSAwKTsKLQogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOwogICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOwogCkBAIC04Nyw5ICs3OSw2IEBACiAgICAgaW50MzJfdCBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CiAgICAgaW50MzJfdCBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNczsKIAotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7Ci0KICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQQmFzZSk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggN2I0YmM2ZC4uMWZlNmZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtMzksNiArMzksMTQgQEAKICAgICB1aW50MzJfdCBtRHVyYXRpb25VczsKIH07CiAKK3N0cnVjdCBUcmV4IHsKKyAgICB1aW50MzJfdCB0cmFja19JRDsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9zaXplOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOworfTsKKwogY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewogcHVibGljOgogICAgIC8vIEV4dHJhY3RvciBhc3N1bWVzIG93bmVyc2hpcCBvZiAic291cmNlIi4KQEAgLTc0LDExICs4MiwxMiBAQAogICAgIH07CiAKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7Ci0gICAgdWludDY0X3QgbVNpZHhEdXJhdGlvbjsKICAgICBvZmY2NF90IG1Nb29mT2Zmc2V0OwogCiAgICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKIAorICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKKwogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSGFzVmlkZW87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCA1ZGI0YjRiLi40MjUyNzA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogCkBAIC0xMDMsNiArMTA1LDcgQEAKICAgICBvZmY2NF90IG1MYXN0QWNjZXNzUG9zOwogICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNSZXN1bHQ7CiAgICAgYm9vbCBtRmV0Y2hpbmc7CisgICAgYm9vbCBtRGlzY29ubmVjdGluZzsKICAgICBpbnQ2NF90IG1MYXN0RmV0Y2hUaW1lVXM7CiAKICAgICBpbnQzMl90IG1OdW1SZXRyaWVzTGVmdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCmluZGV4IGNkNTFiYmYuLmU4YzQ5NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApAQCAtNzUsNiArNzUsMTAgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4X2ZyYW1lX3dpZHRoLCBPTVhfVTMyIG1heF9mcmFtZV9oZWlnaHQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCAzOTY3ZGM2Li4yNGQ0MzFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KTsKIAorICAgIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlcik7CkBAIC0xNzgsNyArMTgyLDkgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAogICAgICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIAotICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YSk7CiAKICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgdm9pZCBzZXRHcmFwaGljQnVmZmVyU291cmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKaW5kZXggY2E1OWRjMC4uMmM0ZjU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBIVFRQQmFzZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogc3RydWN0IFNEUExvYWRlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0zNCw3ICszNSwxMCBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdFNEUExvYWRlZCA9ICdzZHBsJwogICAgIH07Ci0gICAgU0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncyA9IDAsIGJvb2wgdWlkVmFsaWQgPSBmYWxzZSwgdWlkX3QgdWlkID0gMCk7CisgICAgU0RQTG9hZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCkBAIC01NSw4ICs1OSw2IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgY29uc3QgY2hhciogbVVybDsKICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKICAgICBzcDxBTG9vcGVyPiBtTmV0TG9vcGVyOwogICAgIGJvb2wgbUNhbmNlbGxlZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCmluZGV4IGI1YTA0M2MuLjYwYzllN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKQEAgLTMwLDYgKzMwLDcgQEAKICAgICBvZmY2NF90IGdldFNhbXBsZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlT2Zmc2V0OyB9CiAgICAgc2l6ZV90IGdldFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVNpemU7IH0KICAgICB1aW50MzJfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9CisgICAgdWludDMyX3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CiAKICAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplRGlyZWN0KAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHNpemVfdCAqc2l6ZSk7CkBAIC02MSwxMSArNjIsMTIgQEAKICAgICBvZmY2NF90IG1DdXJyZW50U2FtcGxlT2Zmc2V0OwogICAgIHNpemVfdCBtQ3VycmVudFNhbXBsZVNpemU7CiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVUaW1lOworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlRHVyYXRpb247CiAKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgc3RhdHVzX3QgZmluZENodW5rUmFuZ2UodWludDMyX3Qgc2FtcGxlSW5kZXgpOwogICAgIHN0YXR1c190IGdldENodW5rT2Zmc2V0KHVpbnQzMl90IGNodW5rLCBvZmY2NF90ICpvZmZzZXQpOwotICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSk7CisgICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbih1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbik7CiAKICAgICBTYW1wbGVJdGVyYXRvcihjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKICAgICBTYW1wbGVJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmluZGV4IDg0N2RmZjcuLmQwNmRmN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKQEAgLTY2LDcgKzY2LDggQEAKICAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKICAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCi0gICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMKTsKKyAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwsCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKIAogICAgIGVudW0gewogICAgICAgICBrRmxhZ0JlZm9yZSwKQEAgLTc0LDcgKzc1LDggQEAKICAgICAgICAga0ZsYWdDbG9zZXN0CiAgICAgfTsKICAgICBzdGF0dXNfdCBmaW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJlcV90aW1lLCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbiwKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIHN0YXR1c190IGZpbmRTeW5jU2FtcGxlTmVhcigKICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwKQEAgLTEzNyw2ICsxMzksMTMgQEAKIAogICAgIGZyaWVuZCBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CiAKKyAgICAvLyBub3JtYWxseSB3ZSBkb24ndCByb3VuZAorICAgIGlubGluZSB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKAorICAgICAgICAgICAgc2l6ZV90IHNhbXBsZV9pbmRleCwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlX2luZGV4XS5tQ29tcG9zaXRpb25UaW1lCisgICAgICAgICAgICAqIHNjYWxlX251bSkgLyBzY2FsZV9kZW47CisgICAgfQorCiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlU2l6ZV9sKHVpbnQzMl90IHNhbXBsZV9pbmRleCwgc2l6ZV90ICpzYW1wbGVfc2l6ZSk7CiAgICAgdWludDMyX3QgZ2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHVpbnQzMl90IHNhbXBsZUluZGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAppbmRleCBmOGM2MWViLi41OTFiMzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtNTgsNiArNTgsMTEgQEAKICAgICAgICAgfSBtVHJhbnNpdGlvbjsKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEsCisgICAgICAgIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4LAorICAgIH07CisKICAgICB2b2lkIGFkZFBvcnQoY29uc3QgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAmZGVmKTsKIAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggZDA1MGZhNi4uOWU5N2ViZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTI3LDggKzI3LDYgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgewpAQCAtNTcsMTIgKzU1LDMxIEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKKwogICAgIHZvaWQgaW5pdFBvcnRzKE9NWF9VMzIgbnVtSW5wdXRCdWZmZXJzLAogICAgICAgICAgICAgT01YX1UzMiBpbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICBPTVhfVTMyIG51bU91dHB1dEJ1ZmZlcnMsCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucyhib29sIHVwZGF0ZUNyb3AgPSB0cnVlKTsKKworICAgIHVpbnQzMl90IG91dHB1dEJ1ZmZlcldpZHRoKCk7CisgICAgdWludDMyX3Qgb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisKKyAgICBlbnVtIENyb3BTZXR0aW5nc01vZGUgeworICAgICAgICBrQ3JvcFVuU2V0ID0gMCwKKyAgICAgICAga0Nyb3BTZXQsCisgICAgICAgIGtDcm9wQ2hhbmdlZCwKKyAgICB9OworICAgIHZvaWQgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQsIGJvb2wgZmFrZVN0cmlkZSA9IGZhbHNlKTsKKworICAgIHZvaWQgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0lucHV0UG9ydEluZGV4ICA9IDAsCkBAIC03MCw2ICs4Nyw4IEBACiAgICAgICAgIGtNYXhQb3J0SW5kZXggPSAxLAogICAgIH07CiAKKyAgICBib29sIG1Jc0FkYXB0aXZlOworICAgIHVpbnQzMl90IG1BZGFwdGl2ZU1heFdpZHRoLCBtQWRhcHRpdmVNYXhIZWlnaHQ7CiAgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OwogICAgIHVpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjgxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfVklERU9fRU5DT0RFUl9PTVhfQ09NUE9ORU5UX0hfCisKKyNkZWZpbmUgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKK3N0cnVjdCBod19tb2R1bGVfdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKKyAgICBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgKnljYmNyLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5ZVlUsIHVpbnQ4X3QqIG91dFlVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgc3RhdGljIHZvaWQgQ29udmVydFJHQjMyVG9QbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKKyAgICAgICAgYm9vbCBiZ3IpOworCisgICAgY29uc3QgdWludDhfdCAqZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICB1aW50OF90ICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBzcmNTaXplLAorICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSBjb25zdDsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleChjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0lucHV0UG9ydEluZGV4ID0gMCwKKyAgICAgICAga091dHB1dFBvcnRJbmRleCA9IDEsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIGNvbnN0IGh3X21vZHVsZV90ICptR3JhbGxvY01vZHVsZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCA3YWIwMDQyLi5mYTNlYTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtMjQsMTcgKzI0LDE3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1ldGFEYXRhOworc3RydWN0IEFNZXNzYWdlOwogCiBjbGFzcyBTb2Z0d2FyZVJlbmRlcmVyIHsKIHB1YmxpYzoKLSAgICBTb2Z0d2FyZVJlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKyAgICBleHBsaWNpdCBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOwogCiAgICAgflNvZnR3YXJlUmVuZGVyZXIoKTsKIAogICAgIHZvaWQgcmVuZGVyKAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiBwcml2YXRlOgogICAgIGVudW0gWVVWTW9kZSB7CkBAIC01MSw2ICs1MSw4IEBACiAKICAgICBTb2Z0d2FyZVJlbmRlcmVyKGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CiAgICAgU29mdHdhcmVSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUmVuZGVyZXIgJik7CisKKyAgICB2b2lkIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IGIwMmVkMGUuLjY2MzJjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMyw2ICszMyw3IEBACiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKaW5kZXggOGU2Mjk0Ni4uYWI3ZThiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgZGF0YSBjYWNoZWQgZnJvbSB0aGUgY3VycmVudAogICAgIC8vIHBsYXliYWNrIHBvc2l0aWlvbiAoaW4gdXMpLgpAQCAtNzQsOCArNzUsNiBAQAogICAgIC8vIGNvZGVjLgogICAgIHZvaWQgc2V0Q3J5cHRvUGx1Z2luTW9kZShib29sIGNyeXB0b1BsdWdpbk1vZGUpOwogCi0gICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKLQogICAgIHN0YXRpYyBib29sIGdldFZlbmRvckxpYkhhbmRsZSgpOwogCiAgICAgc3RhdHVzX3QgZ2V0RXJyb3IoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY1MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvY2hyb21pdW1faHR0cF9zdHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDSFJPTUlVTV9IVFRQX1NUVUJfSF8KLSNkZWZpbmUgQ0hST01JVU1fSFRUUF9TVFVCX0hfCi0KLSNpbmNsdWRlIDxpbmNsdWRlL0hUVFBCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1leHRlcm4gIkMiIHsKLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKTsKLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCi1EYXRhU291cmNlICpjcmVhdGVEYXRhVXJpU291cmNlKGNvbnN0IGNoYXIgKnVyaSk7Ci19Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IDBlNGRkMmIuLjI1ODdlYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIk1hdHJvc2thRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlICJta3ZwYXJzZXIuaHBwIgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CkBAIC04OSw3ICs4Nyw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdHJ1Y3QgQmxvY2tJdGVyYXRvciB7Ci0gICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtKTsKKyAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOwogCiAgICAgYm9vbCBlb3MoKSBjb25zdDsKIApAQCAtMTA2LDYgKzEwNCw3IEBACiBwcml2YXRlOgogICAgIE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwogICAgIGxvbmcgbG9uZyBtVHJhY2tOdW07CisgICAgdW5zaWduZWQgbG9uZyBtSW5kZXg7CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkNsdXN0ZXIgKm1DbHVzdGVyOwogICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2tFbnRyeSAqbUJsb2NrRW50cnk7CkBAIC0xNTcsNiArMTU2LDUzIEBACiAgICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKIH07CiAKK2NvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmdldFRyYWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0VHJhY2tzKCktPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgbWt2cGFyc2VyOjpDdWVzOjpGaW5kLCBleGNlcHQgdGhhdCBpdAorLy8gc2VhcmNoZXMgaW4gb3VyIG93biB0cmFjayBiYXNlZCB2ZWN0b3JzLiBXZSBzaG91bGQgbm90IG5lZWQgdGhpcyBvbmNlIG1rdnBhcnNlcgorLy8gYWRkcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6ZmluZCgKKyAgICAgICAgbG9uZyBsb25nIHRpbWVOcykgY29uc3QgeworICAgIEFMT0dWKCJtQ3VlUG9pbnRzLnNpemUgJXp1IiwgbUN1ZVBvaW50cy5zaXplKCkpOworICAgIGlmIChtQ3VlUG9pbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdCgwKTsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiB0cmFjayA9IGdldFRyYWNrKCk7CisgICAgaWYgKHRpbWVOcyA8PSBjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkpIHsKKyAgICAgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKKyAgICB9CisKKyAgICAvLyBCaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCByZWxldmFudCBjdWVzOyBhc3N1bWVzIGN1ZXMgYXJlIG9yZGVyZWQgYnkgdGltZWNvZGUuCisgICAgLy8gSWYgd2UgZG8gZGV0ZWN0IG91dC1vZi1vcmRlciBjdWVzLCByZXR1cm4gTlVMTC4KKyAgICBzaXplX3QgbG8gPSAwOworICAgIHNpemVfdCBoaSA9IG1DdWVQb2ludHMuc2l6ZSgpOworICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNvbnN0IG1pZENwID0gbUN1ZVBvaW50cy5pdGVtQXQobWlkKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGN1ZVRpbWVOcyA9IG1pZENwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KTsKKyAgICAgICAgaWYgKGN1ZVRpbWVOcyA8PSB0aW1lTnMpIHsKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChsbyAtIDEpOworICAgIGlmIChjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkgPiB0aW1lTnMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKK30KKwogTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAogICAgICAgICBjb25zdCBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLApAQCAtMTY0LDcgKzIxMCw4IEBACiAgICAgICBtVHlwZShPVEhFUiksCiAgICAgICBtSXNBdWRpbyhmYWxzZSksCiAgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0pLAorICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAorICAgICAgICAgICAgICAgICBpbmRleCksCiAgICAgICBtTkFMU2l6ZUxlbigwKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CiAKQEAgLTIxNCw5ICsyNjEsMTAgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEJsb2NrSXRlcmF0b3I6OkJsb2NrSXRlcmF0b3IoCi0gICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtVHJhY2tOdW0odHJhY2tOdW0pLAorICAgICAgbUluZGV4KGluZGV4KSwKICAgICAgIG1DbHVzdGVyKE5VTEwpLAogICAgICAgbUJsb2NrRW50cnkoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKQEAgLTMxNSw3ICszNjMsNyBAQAogCiAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gLTFsbDsKIAotICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGw7CisgICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbCAtIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zOwogCiAgICAgbWt2cGFyc2VyOjpTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IG1FeHRyYWN0b3ItPm1TZWdtZW50OwogCkBAIC0zNjQsOSArNDEyLDIwIEBACiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogcENQOworICAgIG1rdnBhcnNlcjo6VHJhY2tzIGNvbnN0ICpwVHJhY2tzID0gcFNlZ21lbnQtPkdldFRyYWNrcygpOworICAgIHVuc2lnbmVkIGxvbmcgaW50IHRyYWNrQ291bnQgPSBwVHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOwogICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKICAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwogICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOworICAgICAgICBDSEVDSyhwQ1ApOworCisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOworICAgICAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxICYmIHBDUC0+RmluZChwVHJhY2spKSB7IC8vIFZJREVPX1RSQUNLCisgICAgICAgICAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHRyYWNrLm1DdWVQb2ludHMucHVzaF9iYWNrKHBDUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBpZiAocENQLT5HZXRUaW1lKHBTZWdtZW50KSA+PSBzZWVrVGltZU5zKSB7CiAgICAgICAgICAgICBBTE9HVigiUGFyc2VkIHBhc3QgcmVsZXZhbnQgQ3VlIik7CkBAIC0zNzQsMjIgKzQzMywyNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIEN1ZSBpbmRleCBpcyBidWlsdCBhcm91bmQgdmlkZW8ga2V5ZnJhbWVzCi0gICAgbWt2cGFyc2VyOjpUcmFja3MgY29uc3QgKnBUcmFja3MgPSBwU2VnbWVudC0+R2V0VHJhY2tzKCk7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcFRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgewotICAgICAgICBwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOwotICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gVklERU9fVFJBQ0sKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlbyB0cmFjayBsb2NhdGVkIGF0ICV6dSIsIGluZGV4KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKnBUUCA9IE5VTEw7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdGhpc1RyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KG1JbmRleCk7CisgICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEpIHsgLy8gdmlkZW8KKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyYgdHJhY2sgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQobUluZGV4KTsKKyAgICAgICAgcFRQID0gdHJhY2suZmluZChzZWVrVGltZU5zKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgQ3VlIGluZGV4IGlzIGJ1aWx0IGFyb3VuZCB2aWRlbyBrZXlmcmFtZXMKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CisgICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcEN1ZXMtPkZpbmQoc2Vla1RpbWVOcywgcFRyYWNrLCBwQ1AsIHBUUCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlenUiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIC8vIEFsd2F5cyAqc2VhcmNoKiBiYXNlZCBvbiB0aGUgdmlkZW8gdHJhY2ssIGJ1dCBmaW5hbGl6ZSBiYXNlZCBvbiBtVHJhY2tOdW0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uKiBwVFA7Ci0gICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7Ci0gICAgICAgIHBDdWVzLT5GaW5kKHNlZWtUaW1lTnMsIHBUcmFjaywgcENQLCBwVFApOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFwVFApIHsKICAgICAgICAgQUxPR0UoIkRpZCBub3QgbG9jYXRlIHRoZSB2aWRlbyB0cmFjayBmb3Igc2Vla2luZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDEwLDEwICs0NzIsMTMgQEAKIAogICAgICAgICBpZiAoaXNBdWRpbyB8fCBibG9jaygpLT5Jc0tleSgpKSB7CiAgICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGZpcnN0IGtleSBmcmFtZQotICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gKGJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwTEwpIC8gMTAwMExMOwotICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsICphY3R1YWxGcmFtZVRpbWVVcyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7CisgICAgICAgICAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSB8fCBmcmFtZVRpbWVVcyA+PSBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gZnJhbWVUaW1lVXM7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAqYWN0dWFsRnJhbWVUaW1lVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjMwLDcgKzY5NSw4IEBACiAgICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKLSAgICAgIG1Jc1dlYm0oZmFsc2UpIHsKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgewogICAgIG9mZjY0X3Qgc2l6ZTsKICAgICBtSXNMaXZlU3RyZWFtaW5nID0KICAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCkBAIC02NTYsMTQgKzcyMiwyMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgogICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBDSEVDS19FUShyZXQsIDApOwotCi0gICAgbG9uZyBsZW47Ci0gICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICBDSEVDS19FUShyZXQsIDApOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgaWYgKHJldCA+PSAxKSB7CisgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1EYXRhU291cmNlLT5nZXRVcmkoKSkuY19zdHIoKSk7CiAgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOwogICAgICAgICByZXR1cm47CkBAIC05MjEsNiArOTk1LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwsIHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTQ5LDYgKzEwMjksNyBAQAogICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKTsKICAgICAgICAgdHJhY2tJbmZvLT5tVHJhY2tOdW0gPSB0cmFjay0+R2V0TnVtYmVyKCk7CiAgICAgICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOworICAgICAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOwogICAgIH0KIH0KIApAQCAtOTYzLDcgKzEwNDQsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgaW5mby0+bVRyYWNrTnVtKTsKKyAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSwgaSk7CiAgICAgICAgIGludDMyX3QgaiA9IDA7CiAgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0gMDsKICAgICAgICAgc2l6ZV90IG1heEJsb2NrU2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaAppbmRleCAxMjk0YjRmLi5kYjM2YmY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKQEAgLTE4LDE0ICsxOCwxMiBAQAogCiAjZGVmaW5lIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwogCisjaW5jbHVkZSAibWt2cGFyc2VyLmhwcCIKKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCi1uYW1lc3BhY2UgbWt2cGFyc2VyIHsKLXN0cnVjdCBTZWdtZW50OwotfTsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC01OCw2ICs1NiwxMSBAQAogICAgIHN0cnVjdCBUcmFja0luZm8gewogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOworCisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIGdldFRyYWNrKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKmZpbmQobG9uZyBsb25nIHRpbWVOcykgY29uc3Q7CiAgICAgfTsKIAogICAgIE11dGV4IG1Mb2NrOwpAQCAtNjksNiArNzIsNyBAQAogICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7CiAgICAgYm9vbCBtSXNMaXZlU3RyZWFtaW5nOwogICAgIGJvb2wgbUlzV2VibTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbE5zOwogCiAgICAgdm9pZCBhZGRUcmFja3MoKTsKICAgICB2b2lkIGZpbmRUaHVtYm5haWxzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDI2NTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L0ZyYWdtZW50ZWRNUDRQYXJzZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJGcmFnbWVudGVkTVA0UGFyc2VyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLSNpbmNsdWRlICJUcmFja0ZyYWdtZW50LmgiCi0KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpGb3VyY2MyU3RyaW5nKHVpbnQzMl90IGZvdXJjYykgewotICAgIHN0YXRpYyBjaGFyIGJ1ZmZlcls1XTsKLSAgICBidWZmZXJbNF0gPSAnXDAnOwotICAgIGJ1ZmZlclswXSA9IGZvdXJjYyA+PiAyNDsKLSAgICBidWZmZXJbMV0gPSAoZm91cmNjID4+IDE2KSAmIDB4ZmY7Ci0gICAgYnVmZmVyWzJdID0gKGZvdXJjYyA+PiA4KSAmIDB4ZmY7Ci0gICAgYnVmZmVyWzNdID0gZm91cmNjICYgMHhmZjsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpJbmRlbnRTdHJpbmcoc2l6ZV90IG4pIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBrU3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwotICAgIHJldHVybiBrU3BhY2UgKyBzaXplb2Yoa1NwYWNlKSAtIDIgKiBuIC0gMTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEaXNwYXRjaEVudHJ5IEZyYWdtZW50ZWRNUDRQYXJzZXI6OmtEaXNwYXRjaFRhYmxlW10gPSB7Ci0gICAgeyBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgMCwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyksIEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKSwgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0hlYWRlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICd2JywgJ2UnLCAneCcpLCBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKSwgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4JyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRXh0ZW5kcwotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdkJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIZWFkZXIKLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKSwgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGFuZGxlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdkJywgJ2knLCAnbicsICdmJyksIEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ3onKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVNpemVzIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3onLCAnMicpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlVG9DaHVuayB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0cyB9LAotCi0gICAgeyBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKSwgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0czY0IH0sCi0KLSAgICB7IEZPVVJDQygnYScsICd2JywgJ2MnLCAnQycpLCBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyksIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyksIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JyksIDAsICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSwgMCwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcgotICAgIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICd1JywgJ24nKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4KLSAgICB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZicsICdyJywgJ2EnKSwgMCwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSwgMCwgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2VnbWVudEluZGV4IH0sCi19OwotCi1zdHJ1Y3QgRmlsZVNvdXJjZSA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpTb3VyY2UgewotICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJyYiIpKSB7Ci0gICAgICAgICAgICBDSEVDSyhtRmlsZSAhPSBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCB+RmlsZVNvdXJjZSgpIHsKLSAgICAgICAgZmNsb3NlKG1GaWxlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBmc2VlayhtRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHJldHVybiBmcmVhZChkYXRhLCAxLCBzaXplLCBtRmlsZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgRklMRSAqbUZpbGU7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlU291cmNlKTsKLX07Ci0KLXN0cnVjdCBSZWFkVHJhY2tlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBSZWFkVHJhY2tlcihvZmY2NF90IHNpemUpIHsKLSAgICAgICAgYWxsb2NTaXplID0gMSArIHNpemUgLyA4MTkyOyAvLyAxIGJpdCBwZXIga2lsb2J5dGUKLSAgICAgICAgYml0bWFwID0gKGNoYXIqKSBjYWxsb2MoMSwgYWxsb2NTaXplKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+UmVhZFRyYWNrZXIoKSB7Ci0gICAgICAgIGR1bXBUb0xvZygpOwotICAgICAgICBmcmVlKGJpdG1hcCk7Ci0gICAgfQotICAgIHZvaWQgbWFyayhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0Yml0ID0gb2Zmc2V0IC8gMTAyNDsKLSAgICAgICAgaW50IGxhc3RiaXQgPSAob2Zmc2V0ICsgc2l6ZSAtIDEpIC8gMTAyNDsKLSAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0Yml0OyBpIDw9IGxhc3RiaXQ7IGkrKykgewotICAgICAgICAgICAgYml0bWFwW2kvOF0gfD0gKDB4ODAgPj4gKGkgJiA3KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSBwcml2YXRlOgotICAgIHZvaWQgZHVtcFRvTG9nKCkgewotICAgICAgICAvLyA5NiBjaGFycyBwZXIgbGluZSwgZWFjaCBjaGFyIHJlcHJlc2VudHMgb25lIGtpbG9ieXRlLCAxIGtiIHBlciBiaXQKLSAgICAgICAgaW50IG51bWxpbmVzID0gYWxsb2NTaXplIC8gMTI7Ci0gICAgICAgIGNoYXIgYnVmWzk3XTsKLSAgICAgICAgY2hhciAqY3VyID0gYml0bWFwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWxpbmVzOyBpKysgJiYgY3VyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBidWZbKGogKiA4KSArIGtdID0gKCpjdXIgJiAoMHg4MCA+PiBrKSkgPyAnWCcgOiAnLic7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmWzk2XSA9ICdcMCc7Ci0gICAgICAgICAgICBBTE9HSSgiJTVkazogJXMiLCBpICogOTYsIGJ1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgYWxsb2NTaXplOwotICAgIGNoYXIgKmJpdG1hcDsKLX07Ci0KLXN0cnVjdCBEYXRhU291cmNlU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgRGF0YVNvdXJjZVNvdXJjZShzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSkgewotICAgICAgICAgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7Ci0jaWYgMAotICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwotICAgICAgICAgICAgaWYgKHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBtUmVhZFRyYWNrZXIgPSBuZXcgUmVhZFRyYWNrZXIoc2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgZGF0YSBzb3VyY2Ugc2l6ZSIpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGlmIChtUmVhZFRyYWNrZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlYWRUcmFja2VyLT5tYXJrKG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxSZWFkVHJhY2tlcj4gbVJlYWRUcmFja2VyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGF0YVNvdXJjZVNvdXJjZSk7Ci19OwotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpGcmFnbWVudGVkTVA0UGFyc2VyKCkKLSAgICA6IG1CdWZmZXJQb3MoMCksCi0gICAgICBtU3VzcGVuZGVkKGZhbHNlKSwKLSAgICAgIG1Eb25lV2l0aE1vb3YoZmFsc2UpLAotICAgICAgbUZpcnN0TW9vZk9mZnNldCgwKSwKLSAgICAgIG1GaW5hbFJlc3VsdChPSykgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjp+RnJhZ21lbnRlZE1QNFBhcnNlcigpIHsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpzdGFydChjb25zdCBjaGFyICpmaWxlbmFtZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBGaWxlU291cmNlKGZpbGVuYW1lKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoJXMpIiwgZmlsZW5hbWUpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0gICAgQUxPR1YoIlBhcnNlcjo6c3RhcnQoU291cmNlKSIpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgRGF0YVNvdXJjZVNvdXJjZShzb3VyY2UpKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydChEYXRhU291cmNlKSIpOwotfQotCi1zcDxBTWVzc2FnZT4gRnJhZ21lbnRlZE1QNFBhcnNlcjo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8sIGJvb2wgc3luY2hyb25vdXMpIHsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGJvb2wgbW9vdkRvbmUgPSBtRG9uZVdpdGhNb292OwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBhdWRpbyk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoImdldEZvcm1hdCBwb3N0IGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoc3luY2hyb25vdXMgJiYgZXJyID09IC1FV09VTERCTE9DSyAmJiAhbW9vdkRvbmUpIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJAZ2V0Rm9ybWF0IHBhcnNlciBub3QgcmVhZHkgeWV0LCByZXRyeWluZyIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZ2V0Rm9ybWF0IGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKLQotICAgICAgICBBTE9HVigicmV0dXJuaW5nIGZvcm1hdCAlcyIsIGZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnNlZWtUbyhib29sIHdhbnRBdWRpbywgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vla1RvLCBpZCgpKTsKLSAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHdhbnRBdWRpbyk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgicG9zaXRpb24iLCB0aW1lVXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmlzU2Vla2FibGUoKSBjb25zdCB7Ci0gICAgd2hpbGUgKG1GaXJzdE1vb2ZPZmZzZXQgPT0gMCAmJiBtRmluYWxSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICB9Ci0gICAgYm9vbCBzZWVrYWJsZSA9IG1Tb3VyY2UtPmlzU2Vla2FibGUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgc2Vla2FibGUgJiYgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgc2Vla2FibGUgJj0gIWluZm8tPm1TaWR4LmVtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBzZWVrYWJsZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25TZWVrVG8oYm9vbCB3YW50QXVkaW8sIGludDY0X3QgcG9zaXRpb24pIHsKLSAgICBzdGF0dXNfdCBlcnIgPSAtRUlOVkFMOwotICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgICAgIGludCBudW1TaWR4RW50cmllcyA9IGluZm8tPm1TaWR4LnNpemUoKTsKLSAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwotICAgICAgICBvZmZfdCB0b3RhbE9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2lkeEVudHJpZXM7IGkrKykgewotICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZpbmZvLT5tU2lkeFtpXTsKLSAgICAgICAgICAgIGlmICh0b3RhbFRpbWUgKyBzZS0+bUR1cmF0aW9uVXMgPiBwb3NpdGlvbikgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsMCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlclBvcyA9IHRvdGFsT2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmIChtRmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgbVN1c3BlbmRlZCA9IHRydWU7IC8vIGZvcmNlIHJlc3VtZQotICAgICAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmZvLT5tRnJhZ21lbnRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaW5mby0+bURlY29kaW5nVGltZSA9IHRvdGFsVGltZSAqIGluZm8tPm1NZWRpYVRpbWVTY2FsZSAvIDEwMDAwMDBsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOwotICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJzZWVrVG8gb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5bmNocm9ub3VzKSB7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGVxdWV1ZUFjY2Vzc1VuaXQsIGlkKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVxdWV1ZSBmYWlsIDE6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoc3luY2hyb25vdXMgJiYgZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBhcnNlciBub3QgcmVhZHkgeWV0LCByZXRyeWluZyIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVxdWV1ZSBmYWlsIDI6ICVkLCAlZCIsIGVyciwgc3luY2hyb25vdXMpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCkpOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci19Ci0KLXNzaXplX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZmluZFRyYWNrKGJvb2wgd2FudEF1ZGlvKSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgYm9vbCBpc0F1ZGlvID0KLSAgICAgICAgICAgIGluZm8tPm1NZWRpYUhhbmRsZXJUeXBlID09IEZPVVJDQygncycsICdvJywgJ3UnLCAnbicpOwotCi0gICAgICAgIGJvb2wgaXNWaWRlbyA9Ci0gICAgICAgICAgICBpbmZvLT5tTWVkaWFIYW5kbGVyVHlwZSA9PSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKTsKLQotICAgICAgICBpZiAoKHdhbnRBdWRpbyAmJiBpc0F1ZGlvKSB8fCAoIXdhbnRBdWRpbyAmJiAhaXNBdWRpbykpIHsKLSAgICAgICAgICAgIGlmIChpbmZvLT5tU2FtcGxlRGVzY3MuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7Ci0KLSAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLQotICAgICAgICAgICAgbUJ1ZmZlciA9IG5ldyBBQnVmZmVyKDUxMiAqIDEwMjQpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7Ci0KLSAgICAgICAgICAgIGVudGVyKDBsbCwgMCwgMCk7Ci0KLSAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFByb2NlZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKCFtU3VzcGVuZGVkKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25Qcm9jZWVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gLUVBR0FJTikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvblByb2NlZWQgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZWFkTW9yZToKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90IG5lZWRlZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoIm5lZWRlZCIsICZuZWVkZWQpKTsKLQotICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5iYXNlKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG1CdWZmZXJQb3MgKz0gbUJ1ZmZlci0+b2Zmc2V0KCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPSBtQnVmZmVyLT5jYXBhY2l0eSgpIC0gbUJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgICAgICAgICBpZiAobWF4Qnl0ZXNUb1JlYWQgPCBuZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVzaXppbmcgYnVmZmVyLiIpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFCdWZmZXIoKG1CdWZmZXItPnNpemUoKSArIG5lZWRlZCArIDEwMjMpICYgfjEwMjMpOwotICAgICAgICAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIG5ld0J1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtQnVmZmVyLT5jYXBhY2l0eSgpIC0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDS19HRShtYXhCeXRlc1RvUmVhZCwgbmVlZGVkKTsKLQotICAgICAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUG9zICsgbUJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksIG5lZWRlZCk7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpbmVlZGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlYWNoZWQgRU9GIHdoZW4gcmVhZGluZyAlZCBAICVkICsgJWQiLCBuZWVkZWQsIG1CdWZmZXJQb3MsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IG47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSArIG4pOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0R2V0Rm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gaW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdCgwKS5tRm9ybWF0OwotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tU2lkeER1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBpbmZvLT5tU2lkeER1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlIHplcm8uIE9oIHdlbGwuLi4KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsICogaW5mby0+bUR1cmF0aW9uIC8gaW5mby0+bU1lZGlhVGltZVNjYWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IiwgZm9ybWF0KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXREZXF1ZXVlQWNjZXNzVW5pdDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3YW50QXVkaW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmd2FudEF1ZGlvKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLQotICAgICAgICAgICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gb25EZXF1ZXVlQWNjZXNzVW5pdCh0cmFja0luZGV4LCAmYWNjZXNzVW5pdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRCdWZmZXIoImFjY2Vzc1VuaXQiLCBhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNlZWtUbzoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2Vla1RvIik7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLSAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb24iLCAmcG9zaXRpb24pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gb25TZWVrVG8od2FudEF1ZGlvLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6b25Qcm9jZWVkKCkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIGlmICgoZXJyID0gbmVlZCg4KSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBzaXplID0gcmVhZFUzMigwKTsKLSAgICB1aW50MzJfdCB0eXBlID0gcmVhZFUzMig0KTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSA4OwotCi0gICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICBpZiAoKGVyciA9IG5lZWQoMTYpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemUgPSByZWFkVTY0KG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0KLQotICAgIHVpbnQ4X3QgdXNlclR5cGVbMTZdOwotCi0gICAgaWYgKHR5cGUgPT0gRk9VUkNDKCd1JywgJ3UnLCAnaScsICdkJykpIHsKLSAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDE2KSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkodXNlclR5cGUsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgMTYpOwotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotCi0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIHVpbnQzMl90IHB0eXBlID0gbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMSkubVR5cGU7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1EaXNwYXRjaGVycyA9Ci0gICAgICAgIHNpemVvZihrRGlzcGF0Y2hUYWJsZSkgLyBzaXplb2Yoa0Rpc3BhdGNoVGFibGVbMF0pOwotCi0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGtOdW1EaXNwYXRjaGVyczsgKytpKSB7Ci0gICAgICAgIGlmIChrRGlzcGF0Y2hUYWJsZVtpXS5tVHlwZSA9PSB0eXBlCi0gICAgICAgICAgICAgICAgJiYga0Rpc3BhdGNoVGFibGVbaV0ubVBhcmVudFR5cGUgPT0gcHR5cGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2FtcGxlRW50cnkgYm94ZXMgYXJlIGNvbnRhaW5lciBib3hlcyB0aGF0IHN0YXJ0IHdpdGggYSB2YXJpYWJsZQotICAgIC8vIGFtb3VudCBvZiBkYXRhIGRlcGVuZGluZyBvbiB0aGUgbWVkaWEgaGFuZGxlciB0eXBlLgotICAgIC8vIFdlIGRvbid0IGxvb2sgaW5zaWRlICdoaW50JyB0eXBlIFNhbXBsZUVudHJ5IGJveGVzLgotCi0gICAgYm9vbCBpc1NhbXBsZUVudHJ5Qm94ID0KLSAgICAgICAgKHB0eXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKQotICAgICAgICAmJiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUKLSAgICAgICAgIT0gRk9VUkNDKCdoJywgJ2knLCAnbicsICd0Jyk7Ci0KLSAgICBpZiAoKGkgPCBrTnVtRGlzcGF0Y2hlcnMgJiYga0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIgPT0gMCkKLSAgICAgICAgICAgIHx8IGlzU2FtcGxlRW50cnlCb3ggfHwgcHR5cGUgPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JykpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnRhaW5lciBib3guCi0gICAgICAgIGlmICh0eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpcnN0IG1vb2YgQCAlMDh4IiwgbUJ1ZmZlclBvcyArIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0TW9vZk9mZnNldCA9IG1CdWZmZXJQb3MgKyBvZmZzZXQgLSA4OyAvLyBwb2ludCBhdCB0aGUgc2l6ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpKSB7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgNCkpIDwgT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgewotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIDgpKSA8IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCArIDQpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGF0IGxlYXN0IHNvbWUgZW50cmllcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNTYW1wbGVFbnRyeUJveCkgewotICAgICAgICAgICAgc2l6ZV90IGhlYWRlclNpemU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkgKyA3MCBieXRlcyBWaXN1YWxTYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gNzg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyA4IGJ5dGVzIFNhbXBsZUVudHJ5ICsgMjAgYnl0ZXMgQXVkaW9TYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gMjg7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTaXplID0gODsgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9mZnNldCArIGhlYWRlclNpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyBoZWFkZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgb2Zmc2V0ICsgaGVhZGVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBvZmZzZXQgKyBoZWFkZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGhlYWRlclNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBza2lwKG9mZnNldCk7Ci0KLSAgICAgICAgQUxPR1YoIiVzZW50ZXJpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLCBGb3VyY2MyU3RyaW5nKHR5cGUpKTsKLQotICAgICAgICBlbnRlcihtQnVmZmVyUG9zIC0gb2Zmc2V0LCB0eXBlLCBzaXplIC0gb2Zmc2V0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWZpdHNDb250YWluZXIoc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPCBrTnVtRGlzcGF0Y2hlcnMgJiYga0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIgIT0gMCkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIGhhbmRsZXIgZm9yIHRoaXMgYm94IHR5cGUuCi0KLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChzaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiJXNwYXJzaW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksIEZvdXJjYzJTdHJpbmcodHlwZSkpOwotCi0gICAgICAgICAgICBpZiAoKGVyciA9ICh0aGlzLT4qa0Rpc3BhdGNoVGFibGVbaV0ubUhhbmRsZXIpKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG9mZnNldCwgc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVua25vd24gYm94IHR5cGUKLQotICAgICAgICAgICAgQUxPR1YoIiVzc2tpcHBpbmcgYm94IG9mIHR5cGUgJyVzJywgc2l6ZSAlbGx1IiwKLSAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkpLAotICAgICAgICAgICAgICAgICAgICBGb3VyY2MyU3RyaW5nKHR5cGUpLCBzaXplKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcChzaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotaW50IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkNvbXBhcmVTYW1wbGVMb2NhdGlvbigKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLCBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbykgewotICAgIGlmIChzYW1wbGUubU9mZnNldCArIHNhbXBsZS5tU2l6ZSA8IG1kYXRJbmZvLm1PZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChzYW1wbGUubU9mZnNldCA+PSBtZGF0SW5mby5tT2Zmc2V0ICsgbWRhdEluZm8ubUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSBtYWtlIHN1cmUgdGhlIHNhbXBsZSBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gdGhpcwotICAgIC8vIG1lZGlhIGRhdGEgYmxvY2suCi0KLSAgICBDSEVDS19HRShzYW1wbGUubU9mZnNldCwgbWRhdEluZm8ubU9mZnNldCk7Ci0KLSAgICBDSEVDS19MRShzYW1wbGUubU9mZnNldCArIHNhbXBsZS5tU2l6ZSwKLSAgICAgICAgICAgICBtZGF0SW5mby5tT2Zmc2V0ICsgbWRhdEluZm8ubUJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlc3VtZUlmTmVjZXNzYXJ5KCkgewotICAgIGlmICghbVN1c3BlbmRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoInJlc3VtaW5nLiIpOwotCi0gICAgbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcm9jZWVkLCBpZCgpKSktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Z2V0U2FtcGxlKAotICAgICAgICBUcmFja0luZm8gKmluZm8sIHNwPFRyYWNrRnJhZ21lbnQ+ICpmcmFnbWVudCwgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbykgewotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGluZm8tPm1GcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1GaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRmluYWxSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgICAgICB9Ci0KLSAgICAgICAgKmZyYWdtZW50ID0gKmluZm8tPm1GcmFnbWVudHMuYmVnaW4oKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKmZyYWdtZW50KS0+Z2V0U2FtcGxlKHNhbXBsZUluZm8pOwotCi0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWxseSwgZW5kIG9mIHRoaXMgZnJhZ21lbnQuLi4KLQotICAgICAgICBpbmZvLT5tRnJhZ21lbnRzLmVyYXNlKGluZm8tPm1GcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvbkRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgIHNwPFRyYWNrRnJhZ21lbnQ+IGZyYWdtZW50OwotICAgIFNhbXBsZUluZm8gc2FtcGxlSW5mbzsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGUoaW5mbywgJmZyYWdtZW50LCAmc2FtcGxlSW5mbyk7Ci0KLSAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gLUVXT1VMREJMT0NLOwotCi0gICAgYm9vbCBjaGVja0Ryb3BwYWJsZSA9IGZhbHNlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFEYXRhLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvID0gbU1lZGlhRGF0YS5pdGVtQXQoaSk7Ci0KLSAgICAgICAgaW50IGNtcCA9IENvbXBhcmVTYW1wbGVMb2NhdGlvbihzYW1wbGVJbmZvLCBtZGF0SW5mbyk7Ci0KLSAgICAgICAgaWYgKGNtcCA8IDAgJiYgIW1Tb3VyY2UtPmlzU2Vla2FibGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tEcm9wcGFibGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBtYWtlQWNjZXNzVW5pdChpbmZvLCBzYW1wbGVJbmZvLCBtZGF0SW5mbywgYWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmcmFnbWVudC0+YWR2YW5jZSgpOwotCi0gICAgaWYgKCFtTWVkaWFEYXRhLmVtcHR5KCkgJiYgY2hlY2tEcm9wcGFibGUpIHsKLSAgICAgICAgc2l6ZV90IG51bURyb3BwYWJsZSA9IDA7Ci0gICAgICAgIGJvb2wgZG9uZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIFhYWCBGSVhNRTogaWYgb25lIG9mIHRoZSB0cmFja3MgaXMgbm90IGFkdmFuY2VkIChlLmcuIGlmIHlvdSBwbGF5IGFuIGF1ZGlvK3ZpZGVvCi0gICAgICAgIC8vIGZpbGUgd2l0aCBzZjIpLCB0aGVuIG1NZWRpYURhdGEgd2lsbCBub3QgYmUgcHJ1bmVkIGFuZCBrZWVwcyBncm93aW5nCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyAhZG9uZSAmJiBpIDwgbU1lZGlhRGF0YS5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8gPSBtTWVkaWFEYXRhLml0ZW1BdChpKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtVHJhY2tzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQoaik7Ci0KLSAgICAgICAgICAgICAgICBzcDxUcmFja0ZyYWdtZW50PiBmcmFnbWVudDsKLSAgICAgICAgICAgICAgICBTYW1wbGVJbmZvIHNhbXBsZUluZm87Ci0gICAgICAgICAgICAgICAgZXJyID0gZ2V0U2FtcGxlKGluZm8sICZmcmFnbWVudCwgJnNhbXBsZUluZm8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGNtcCA9IENvbXBhcmVTYW1wbGVMb2NhdGlvbihzYW1wbGVJbmZvLCBtZGF0SW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY21wIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgKytudW1Ecm9wcGFibGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtRHJvcHBhYmxlID4gMCkgewotICAgICAgICAgICAgbU1lZGlhRGF0YS5yZW1vdmVJdGVtc0F0KDAsIG51bURyb3BwYWJsZSk7Ci0KLSAgICAgICAgICAgIGlmIChtTWVkaWFEYXRhLnNpemUoKSA8IDUpIHsKLSAgICAgICAgICAgICAgICByZXN1bWVJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHNpemVfdCBwYXJzZU5BTFNpemUoc2l6ZV90IG5hbExlbmd0aFNpemUsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKLSAgICBzd2l0Y2ggKG5hbExlbmd0aFNpemUpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuICpkYXRhOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZXR1cm4gVTE2X0FUKGRhdGEpOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByZXR1cm4gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZXR1cm4gVTMyX0FUKGRhdGEpOwotICAgIH0KLQotICAgIC8vIFRoaXMgY2Fubm90IGhhcHBlbiwgbU5BTExlbmd0aFNpemUgc3ByaW5ncyB0byBsaWZlIGJ5IGFkZGluZyAxIHRvCi0gICAgLy8gYSAyLWJpdCBpbnRlZ2VyLgotICAgIFRSRVNQQVNTKCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6bWFrZUFjY2Vzc1VuaXQoCi0gICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmc2FtcGxlLAotICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbywKLSAgICAgICAgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAoc2FtcGxlLm1TYW1wbGVEZXNjSW5kZXggPCAxCi0gICAgICAgICAgICB8fCBzYW1wbGUubVNhbXBsZURlc2NJbmRleCA+IGluZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVcyA9Ci0gICAgICAgIDEwMDAwMDBsbCAqIHNhbXBsZS5tUHJlc2VudGF0aW9uVGltZSAvIGluZm8tPm1NZWRpYVRpbWVTY2FsZTsKLQotICAgIGNvbnN0IFNhbXBsZURlc2NyaXB0aW9uICZzYW1wbGVEZXNjID0KLSAgICAgICAgaW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdChzYW1wbGUubVNhbXBsZURlc2NJbmRleCAtIDEpOwotCi0gICAgc2l6ZV90IG5hbExlbmd0aFNpemU7Ci0gICAgaWYgKCFzYW1wbGVEZXNjLm1Gb3JtYXQtPmZpbmRTaXplKCJuYWwtbGVuZ3RoLXNpemUiLCAmbmFsTGVuZ3RoU2l6ZSkpIHsKLSAgICAgICAgKmFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihzYW1wbGUubVNpemUpOwotCi0gICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCksCi0gICAgICAgICAgICAgICBtZGF0SW5mby5tQnVmZmVyLT5kYXRhKCkgKyAoc2FtcGxlLm1PZmZzZXQgLSBtZGF0SW5mby5tT2Zmc2V0KSwKLSAgICAgICAgICAgICAgIHNhbXBsZS5tU2l6ZSk7Ci0KLSAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKLSAgICAgICAgaWYgKElzSURSKCphY2Nlc3NVbml0KSkgewotICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigiaXMtc3luYy1mcmFtZSIsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1B0ciA9Ci0gICAgICAgIG1kYXRJbmZvLm1CdWZmZXItPmRhdGEoKSArIChzYW1wbGUubU9mZnNldCAtIG1kYXRJbmZvLm1PZmZzZXQpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyIDsgKytpKSB7Ci0gICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoU2l6ZSA+IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBuYWxTaXplID0gcGFyc2VOQUxTaXplKG5hbExlbmd0aFNpemUsICZzcmNQdHJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoU2l6ZTsKLQotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbFNpemUgPiBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSArIGRzdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDEiLAotICAgICAgICAgICAgICAgICAgICAgICA0KTsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgoKmFjY2Vzc1VuaXQpLT5kYXRhKCkgKyBkc3RPZmZzZXQgKyA0LAotICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgKyBzcmNPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsU2l6ZTsKLSAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxTaXplICsgNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICgqYWNjZXNzVW5pdCkgPSBuZXcgQUJ1ZmZlcihkc3RPZmZzZXQpOwotICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgInRpbWVVcyIsIHByZXNlbnRhdGlvblRpbWVVcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKElzSURSKCphY2Nlc3NVbml0KSkgewotICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpuZWVkKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKCFmaXRzQ29udGFpbmVyKHNpemUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChzaXplIDw9IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWRNb3JlLCBpZCgpKTsKLSAgICBtc2ctPnNldFNpemUoIm5lZWRlZCIsIHNpemUgLSBtQnVmZmVyLT5zaXplKCkpOwotICAgIG1zZy0+cG9zdCgpOwotCi0gICAgLy8gQUxPR1YoIm5lZWQoJWQpIHJldHVybmluZyAtRUFHQUlOLCBvbmx5IGhhdmUgJWQiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIC1FQUdBSU47Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZW50ZXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90IHR5cGUsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBDb250YWluZXIgY29udGFpbmVyOwotICAgIGNvbnRhaW5lci5tT2Zmc2V0ID0gb2Zmc2V0OwotICAgIGNvbnRhaW5lci5tVHlwZSA9IHR5cGU7Ci0gICAgY29udGFpbmVyLm1FeHRlbmRzVG9FT0YgPSAoc2l6ZSA9PSAwKTsKLSAgICBjb250YWluZXIubUJ5dGVzUmVtYWluaW5nID0gc2l6ZTsKLQotICAgIG1TdGFjay5wdXNoKGNvbnRhaW5lcik7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Zml0c0NvbnRhaW5lcih1aW50NjRfdCBzaXplKSBjb25zdCB7Ci0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIGNvbnN0IENvbnRhaW5lciAmY29udGFpbmVyID0gbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMSk7Ci0KLSAgICByZXR1cm4gY29udGFpbmVyLm1FeHRlbmRzVG9FT0YgfHwgc2l6ZSA8PSBjb250YWluZXIubUJ5dGVzUmVtYWluaW5nOwotfQotCi11aW50MTZfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTE2KHNpemVfdCBvZmZzZXQpIHsKLSAgICBDSEVDS19MRShvZmZzZXQgKyAyLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgIHJldHVybiAocHRyWzBdIDw8IDgpIHwgcHRyWzFdOwotfQotCi11aW50MzJfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTMyKHNpemVfdCBvZmZzZXQpIHsKLSAgICBDSEVDS19MRShvZmZzZXQgKyA0LCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgIHJldHVybiAocHRyWzBdIDw8IDI0KSB8IChwdHJbMV0gPDwgMTYpIHwgKHB0clsyXSA8PCA4KSB8IHB0clszXTsKLX0KLQotdWludDY0X3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVhZFU2NChzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuICgoKHVpbnQ2NF90KXJlYWRVMzIob2Zmc2V0KSkgPDwgMzIpIHwgcmVhZFUzMihvZmZzZXQgKyA0KTsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpza2lwKG9mZl90IGRpc3RhbmNlKSB7Ci0gICAgQ0hFQ0soIW1TdGFjay5pc0VtcHR5KCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSBtU3RhY2suc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBDb250YWluZXIgKmNvbnRhaW5lciA9ICZtU3RhY2suZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgaWYgKCFjb250YWluZXItPm1FeHRlbmRzVG9FT0YpIHsKLSAgICAgICAgICAgIENIRUNLX0xFKGRpc3RhbmNlLCAob2ZmX3QpY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcpOwotCi0gICAgICAgICAgICBjb250YWluZXItPm1CeXRlc1JlbWFpbmluZyAtPSBkaXN0YW5jZTsKLQotICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXNsZWF2aW5nIGJveCBvZiB0eXBlICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50U3RyaW5nKG1TdGFjay5zaXplKCkgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdXJjYzJTdHJpbmcoY29udGFpbmVyLT5tVHlwZSkpOwotCi0jaWYgMAotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvcm1hdCAjJWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5pdGVtQXQoaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1Gb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQtPnNpZ25hbENvbXBsZXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja0luZm8tPm1GcmFnbWVudHMuZW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bUZyYWdtZW50cy5wdXNoX2JhY2sodHJhY2tJbmZvLT5tU3RhdGljRnJhZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudC5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0ZyYWdtZW50PiAmZnJhZ21lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKi0tdHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVuZCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PER5bmFtaWNUcmFja0ZyYWdtZW50ICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmdldCgpKS0+c2lnbmFsQ29tcGxldGlvbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLT5tVHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSkgewotICAgICAgICAgICAgICAgICAgICBtRG9uZVdpdGhNb292ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb250YWluZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1TdGFjay5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRpc3RhbmNlIDwgKG9mZl90KW1CdWZmZXItPnNpemUoKSkgewotICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZShtQnVmZmVyLT5vZmZzZXQoKSArIGRpc3RhbmNlLCBtQnVmZmVyLT5zaXplKCkgLSBkaXN0YW5jZSk7Ci0gICAgICAgIG1CdWZmZXJQb3MgKz0gZGlzdGFuY2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICBtQnVmZmVyUG9zICs9IGRpc3RhbmNlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrSGVhZGVyKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgdWludDMyX3QgdHJhY2tJRDsKLSAgICB1aW50NjRfdCBkdXJhdGlvbjsKLQotICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDM2ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0gICAgICAgIGR1cmF0aW9uID0gcmVhZFU2NChvZmZzZXQgKyAyOCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDM2OwotICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAyNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgMTIpOwotICAgICAgICBkdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0ICsgMjApOwotCi0gICAgICAgIG9mZnNldCArPSAyNDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sodHJhY2tJRCwgdHJ1ZSAvKiBjcmVhdGVJZk5lY2Vzc2FyeSAqLyk7Ci0gICAgaW5mby0+bUZsYWdzID0gZmxhZ3M7Ci0gICAgaW5mby0+bUR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgaWYgKGluZm8tPm1EdXJhdGlvbiA9PSAweGZmZmZmZmZmKSB7Ci0gICAgICAgIC8vIGZmbXBlZyBzZXRzIHRoaXMgdG8gLTEsIHdoaWNoIGlzIGluY29ycmVjdC4KLSAgICAgICAgaW5mby0+bUR1cmF0aW9uID0gMDsKLSAgICB9Ci0KLSAgICBpbmZvLT5tU3RhdGljRnJhZ21lbnQgPSBuZXcgU3RhdGljVHJhY2tGcmFnbWVudDsKLQotICAgIG1DdXJyZW50VHJhY2tJRCA9IHRyYWNrSUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdmVyc2lvbkFuZEZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKHZlcnNpb25BbmRGbGFncyAmIDB4ZmZmZmZmKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IHZlcnNpb25BbmRGbGFncyA+PiAyNDsKLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCArIDMyID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1lZGlhVGltZVNjYWxlID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCArIDIwKTsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCArIDIwID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1lZGlhVGltZVNjYWxlID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCArIDEyKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhhbmRsZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBoYW5kbGVyVHlwZSA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBzd2l0Y2ggKGhhbmRsZXJUeXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd2JywgJ2knLCAnZCcsICdlJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2knLCAnbicsICd0Jyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlID0gaGFuZGxlclR5cGU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNzggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5wdXNoKCk7Ci0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZURlc2MtPm1UeXBlID0gdHlwZTsKLSAgICBzYW1wbGVEZXNjLT5tRGF0YVJlZkluZGV4ID0gcmVhZFUxNihvZmZzZXQgKyA2KTsKLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCByZWFkVTE2KG9mZnNldCArIDggKyAxNikpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDE4KSk7Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMjggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5wdXNoKCk7Ci0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZURlc2MtPm1UeXBlID0gdHlwZTsKLSAgICBzYW1wbGVEZXNjLT5tRGF0YVJlZkluZGV4ID0gcmVhZFUxNihvZmZzZXQgKyA2KTsKLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgOCkpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1zaXplIiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTApKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHJlYWRVMzIob2Zmc2V0ICsgOCArIDE2KSAvIDY1NTM2LjBmKTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdtJywgJ3InKToKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAxKTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgODAwMCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIDEpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCAxNjAwMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHZvaWQgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBpbnQzMl90IGluZGV4LAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgYm9vbCBpbnNlcnRTdGFydENvZGUgPSBmYWxzZSkgewotICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGluc2VydFN0YXJ0Q29kZSA/IHNpemUgKyA0IDogc2l6ZSk7Ci0KLSAgICBtZW1jcHkoY3NkLT5kYXRhKCkgKyAoaW5zZXJ0U3RhcnRDb2RlID8gNCA6IDApLCBkYXRhLCBzaXplKTsKLQotICAgIGlmIChpbnNlcnRTdGFydENvZGUpIHsKLSAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwotICAgIH0KLQotICAgIGNzZC0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7Ci0gICAgY3NkLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwbGwpOwotCi0gICAgZm9ybWF0LT5zZXRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpbmRleCkuY19zdHIoKSwgY3NkKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZVNhbXBsZVNpemVzKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICAgICAgdGhpcywgdHlwZSwgb2Zmc2V0LCBzaXplKTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIFNhbXBsZURlc2NyaXB0aW9uICpzYW1wbGVEZXNjID0KLSAgICAgICAgJnRyYWNrSW5mby0+bVNhbXBsZURlc2NzLmVkaXRJdGVtQXQoCi0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJykpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotCi0gICAgc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgb2Zmc2V0ID0gMDsKLQotICAgIGlmIChzaXplIDwgNyB8fCBwdHJbMF0gIT0gMHgwMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQtPnNldFNpemUoIm5hbC1sZW5ndGgtc2l6ZSIsIDEgKyAocHRyWzRdICYgMykpOwotCi0gICAgc2l6ZV90IG51bVNQUyA9IHB0cls1XSAmIDMxOwotCi0gICAgcHRyICs9IDY7Ci0gICAgc2l6ZSAtPSA2OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TUFM7ICsraSkgewotICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7Ci0KLSAgICAgICAgcHRyICs9IDI7Ci0gICAgICAgIHNpemUgLT0gMjsKLQotICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQsIGksIHB0ciwgbGVuZ3RoLAotICAgICAgICAgICAgICAgIHRydWUgLyogaW5zZXJ0U3RhcnRDb2RlICovKTsKLQotICAgICAgICBwdHIgKz0gbGVuZ3RoOwotICAgICAgICBzaXplIC09IGxlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtUFBTID0gKnB0cjsKLSAgICArK3B0cjsKLSAgICAtLXNpemU7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBQUzsgKytpKSB7Ci0gICAgICAgIGlmIChzaXplIDwgMikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKLQotICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgc2l6ZSAtPSAyOwotCi0gICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzYy0+bUZvcm1hdCwgbnVtU1BTICsgaSwgcHRyLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbnNlcnRTdGFydENvZGUgKi8pOwotCi0gICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gbGVuZ3RoOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VFU0RTQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKQotICAgICAgICAgICAgJiYgc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotCi0gICAgc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgb2Zmc2V0ID0gMDsKLQotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoVTMyX0FUKHB0cikgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBwdHIgKz0gNDsKLSAgICBzaXplIC09NDsKLQotICAgIEVTRFMgZXNkcyhwdHIsIHNpemUpOwotCi0gICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKLSAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqY3NkOwotICAgIHNpemVfdCBjc2Rfc2l6ZTsKLSAgICBpZiAoZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKLSAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKikmY3NkLCAmY3NkX3NpemUpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoc2FtcGxlRGVzYy0+bUZvcm1hdCwgMCwgY3NkLCBjc2Rfc2l6ZSk7Ci0KLSAgICBpZiAoc2FtcGxlRGVzYy0+bVR5cGUgIT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChjc2Rfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8vIFRoZXJlJ3Mgbm8gZnVydGhlciBpbmZvcm1hdGlvbiwgaS5lLiBubyBjb2RlYyBzcGVjaWZpYyBkYXRhCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgbXBlZzQgaGVhZGVycwotICAgICAgICAvLyBpcyBhY2N1cmF0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCi0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChjc2Rfc2l6ZSA8IDIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBvYmplY3RUeXBlID0gY3NkWzBdID4+IDM7Ci0KLSAgICBpZiAob2JqZWN0VHlwZSA9PSAzMSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZnJlcUluZGV4ID0gKGNzZFswXSAmIDcpIDw8IDEgfCAoY3NkWzFdID4+IDcpOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBudW1DaGFubmVscyA9IDA7Ci0gICAgaWYgKGZyZXFJbmRleCA9PSAxNSkgewotICAgICAgICBpZiAoY3NkX3NpemUgPCA1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2FtcGxlUmF0ZSA9IChjc2RbMV0gJiAweDdmKSA8PCAxNwotICAgICAgICAgICAgICAgICAgICAgICAgfCBjc2RbMl0gPDwgOQotICAgICAgICAgICAgICAgICAgICAgICAgfCBjc2RbM10gPDwgMQotICAgICAgICAgICAgICAgICAgICAgICAgfCAoY3NkWzRdID4+IDcpOwotCi0gICAgICAgIG51bUNoYW5uZWxzID0gKGNzZFs0XSA+PiAzKSAmIDE1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7Ci0gICAgICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCi0gICAgICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCi0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwotICAgICAgICBudW1DaGFubmVscyA9IChjc2RbMV0gPj4gMykgJiAxNTsKLSAgICB9Ci0KLSAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgc2FtcGxlUmF0ZSk7Ci0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBudW1DaGFubmVscyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFEYXRhKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQUxPR1YoInNraXBwaW5nICdtZGF0JyBjaHVuayBhdCBvZmZzZXRzIDB4JTA4bHgtMHglMDhsbHguIiwKLSAgICAgICAgICBtQnVmZmVyUG9zICsgb2Zmc2V0LCBtQnVmZmVyUG9zICsgc2l6ZSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplIC0gb2Zmc2V0KTsKLSAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7Ci0KLSAgICBtTWVkaWFEYXRhLnB1c2goKTsKLSAgICBNZWRpYURhdGFJbmZvICppbmZvID0gJm1NZWRpYURhdGEuZWRpdEl0ZW1BdChtTWVkaWFEYXRhLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1CdWZmZXIgPSBidWZmZXI7Ci0gICAgaW5mby0+bU9mZnNldCA9IG1CdWZmZXJQb3MgKyBvZmZzZXQ7Ci0KLSAgICBpZiAobU1lZGlhRGF0YS5zaXplKCkgPiAxMCkgewotICAgICAgICBBTE9HVigic3VzcGVuZGluZyBmb3Igbm93LiIpOwotICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2VnbWVudEluZGV4KAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgQUxPR1YoInNpZHggYm94IHR5cGUgJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCIsIHR5cGUsIGludChvZmZzZXQpLCBpbnQoc2l6ZSkpOwotLy8gICAgQVN0cmluZyBzaWR4c3RyOwotLy8gICAgaGV4ZHVtcChtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIHNpemUsIDAgLyogaW5kZW50ICovLCAmc2lkeHN0cik7Ci0vLyAgICBBTE9HVigicmF3IHNpZHg6Iik7Ci0vLyAgICBBTE9HVigiJXMiLCBzaWR4c3RyLmNfc3RyKCkpOwotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gZmxhZ3MgPj4gMjQ7Ci0gICAgZmxhZ3MgJj0gMHhmZmZmZmY7Ci0KLSAgICBBTE9HVigic2lkeCB2ZXJzaW9uICVkIiwgdmVyc2lvbik7Ci0KLSAgICB1aW50MzJfdCByZWZlcmVuY2VJZCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgdWludDMyX3QgdGltZVNjYWxlID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLSAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7Ci0KLSAgICB1aW50NjRfdCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU7Ci0gICAgdWludDY0X3QgZmlyc3RPZmZzZXQ7Ci0KLSAgICBvZmZzZXQgKz0gMTI7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWFybGllc3RQcmVzZW50YXRpb25UaW1lID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBmaXJzdE9mZnNldCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyAxNiA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgZmlyc3RPZmZzZXQgPSByZWFkVTY0KG9mZnNldCArIDgpOwotICAgICAgICBvZmZzZXQgKz0gMTY7Ci0gICAgfQotICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlTGQvJUxkIiwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotICAgIGlmIChyZWFkVTE2KG9mZnNldCkgIT0gMCkgeyAvLyByZXNlcnZlZAotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaW50MzJfdCByZWZlcmVuY2VDb3VudCA9IHJlYWRVMTYob2Zmc2V0ICsgMik7Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgQUxPR1YoInJlZmNvdW50OiAlZCIsIHJlZmVyZW5jZUNvdW50KTsKLQotICAgIGlmIChvZmZzZXQgKyByZWZlcmVuY2VDb3VudCAqIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLSAgICB1aW50NjRfdCB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VDb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQzMl90IGQxID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICB1aW50MzJfdCBkMiA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgICAgIHVpbnQzMl90IGQzID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgICAgICBpZiAoZDEgJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICAgICBBTE9HVygic3ViLXNpZHggYm94ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKLSAgICAgICAgfQotICAgICAgICBib29sIHNhcCA9IGQzICYgMHg4MDAwMDAwMDsKLSAgICAgICAgYm9vbCBzYXB0eXBlID0gZDMgPj4gMjg7Ci0gICAgICAgIGlmICghc2FwIHx8IHNhcHR5cGUgPiAyKSB7Ci0gICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGQyOwotICAgICAgICBvZmZzZXQgKz0gMTI7Ci0gICAgICAgIEFMT0dWKCIgaXRlbSAlZCwgJTA4eCAlMDh4ICUwOHgiLCBpLCBkMSwgZDIsIGQzKTsKLSAgICAgICAgU2lkeEVudHJ5IHNlOwotICAgICAgICBzZS5tU2l6ZSA9IGQxICYgMHg3ZmZmZmZmZjsKLSAgICAgICAgc2UubUR1cmF0aW9uVXMgPSAxMDAwMDAwTEwgKiBkMiAvIHRpbWVTY2FsZTsKLSAgICAgICAgaW5mby0+bVNpZHguYWRkKHNlKTsKLSAgICB9Ci0KLSAgICBpbmZvLT5tU2lkeER1cmF0aW9uID0gdG90YWxfZHVyYXRpb24gKiAxMDAwMDAwIC8gdGltZVNjYWxlOwotICAgIEFMT0dWKCJkdXJhdGlvbjogJWxsZCIsIGluZm8tPm1TaWR4RHVyYXRpb24pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0V4dGVuZHMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMjQgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayh0cmFja0lELCB0cnVlIC8qIGNyZWF0ZUlmTmVjZXNzYXJ5ICovKTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSByZWFkVTMyKG9mZnNldCArIDgpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCArIDEyKTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCArIDE2KTsKLSAgICBpbmZvLT5tRGVmYXVsdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrSW5mbyAqRnJhZ21lbnRlZE1QNFBhcnNlcjo6ZWRpdFRyYWNrKAotICAgICAgICB1aW50MzJfdCB0cmFja0lELCBib29sIGNyZWF0ZUlmTmVjZXNzYXJ5KSB7Ci0gICAgc3NpemVfdCBpID0gbVRyYWNrcy5pbmRleE9mS2V5KHRyYWNrSUQpOwotCi0gICAgaWYgKGkgPj0gMCkgewotICAgICAgICByZXR1cm4gJm1UcmFja3MuZWRpdFZhbHVlQXQoaSk7Ci0gICAgfQotCi0gICAgaWYgKCFjcmVhdGVJZk5lY2Vzc2FyeSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gaW5mbzsKLSAgICBpbmZvLm1UcmFja0lEID0gdHJhY2tJRDsKLSAgICBpbmZvLm1GbGFncyA9IDA7Ci0gICAgaW5mby5tRHVyYXRpb24gPSAweGZmZmZmZmZmOwotICAgIGluZm8ubVNpZHhEdXJhdGlvbiA9IDA7Ci0gICAgaW5mby5tTWVkaWFUaW1lU2NhbGUgPSAwOwotICAgIGluZm8ubU1lZGlhSGFuZGxlclR5cGUgPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVTaXplID0gMDsKLSAgICBpbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSAwOwotCi0gICAgaW5mby5tRGVjb2RpbmdUaW1lID0gMDsKLQotICAgIG1UcmFja3MuYWRkKHRyYWNrSUQsIGluZm8pOwotICAgIHJldHVybiAmbVRyYWNrcy5lZGl0VmFsdWVBdChtVHJhY2tzLmluZGV4T2ZLZXkodHJhY2tJRCkpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MgPSBmbGFnczsKLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCA9IHJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0gICAgb2Zmc2V0ICs9IDg7Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1TYW1wbGVEZXNjcmlwdGlvbkluZGV4ID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKCEoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkpIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgcG9pbnQgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZQotICAgICAgICAvLyBlbmNsb3NpbmcgJ21vb2YnIGNvbnRhaW5lciBmb3IgdGhlIGZpcnN0IHRyYWNrIGFuZAotICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBkYXRhIG9mIHRoZSBwcmVjZWRpbmcgZnJhZ21lbnQgZm9yIHN1YnNlcXVlbnQKLSAgICAgICAgLy8gdHJhY2tzLgotCi0gICAgICAgIENIRUNLX0dFKG1TdGFjay5zaXplKCksIDJ1KTsKLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ID0KLSAgICAgICAgICAgIG1TdGFjay5pdGVtQXQobVN0YWNrLnNpemUoKSAtIDIpLm1PZmZzZXQ7Ci0KLSAgICAgICAgLy8gWFhYIFRPRE86IFRoaXMgZG9lcyBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciB0aGUgMm5kIGFuZAotICAgICAgICAvLyBzdWJzZXF1ZW50IHRyYWNrcyB5ZXQuCi0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldDsKLQotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICBpZiAodHJhY2tJbmZvLT5tRnJhZ21lbnRzLmVtcHR5KCkKLSAgICAgICAgICAgIHx8ICgqdHJhY2tJbmZvLT5tRnJhZ21lbnRzLmJlZ2luKCkpLT5jb21wbGV0ZSgpKSB7Ci0gICAgICAgIHRyYWNrSW5mby0+bUZyYWdtZW50cy5wdXNoX2JhY2sobmV3IER5bmFtaWNUcmFja0ZyYWdtZW50KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga0RhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDAxLAotICAgICAgICBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICA9IDB4MDQsCi0gICAgICAgIGtTYW1wbGVEdXJhdGlvblByZXNlbnQgICAgICAgICAgICAgID0gMHgxMDAsCi0gICAgICAgIGtTYW1wbGVTaXplUHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgICAgIGtTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICAgICAgID0gMHg0MDAsCi0gICAgICAgIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50ID0gMHg4MDAsCi0gICAgfTsKLQotICAgIHVpbnQzMl90IGZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotCi0gICAgaWYgKGZsYWdzICYgMHhmZjAwMDAwMCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSkgewotICAgICAgICAvLyBUaGVzZSB0d28gc2hhbGwgbm90IGJlIHVzZWQgdG9nZXRoZXIuCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICBvZmZzZXQgKz0gODsKLQotICAgIHVpbnQ2NF90IGRhdGFPZmZzZXQgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQ7Ci0KLSAgICB1aW50MzJfdCBmaXJzdFNhbXBsZUZsYWdzID0gMDsKLQotICAgIGlmIChmbGFncyAmIGtEYXRhT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBkYXRhT2Zmc2V0RGVsdGEgPSAoaW50MzJfdClyZWFkVTMyKG9mZnNldCk7Ci0KLSAgICAgICAgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgKyBkYXRhT2Zmc2V0RGVsdGE7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaXJzdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBUcmFja0luZm8gKmluZm8gPSBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgIGlmIChpbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb24gPSAwLCBzYW1wbGVTaXplID0gMCwgc2FtcGxlRmxhZ3MgPSAwLAotICAgICAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7Ci0KLSAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSAwOwotICAgIGlmIChmbGFncyAmIGtTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBpbmZvLT5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBzYW1wbGVTaXplID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVTaXplID0gaW5mby0+bURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRmxhZ3MgPSBpbmZvLT5tRGVmYXVsdFNhbXBsZUZsYWdzOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ICsgc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlRGVzY0luZGV4ID0KLSAgICAgICAgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkKLSAgICAgICAgICAgID8gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1TYW1wbGVEZXNjcmlwdGlvbkluZGV4Ci0gICAgICAgICAgICA6IGluZm8tPm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZVNpemUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgICAgIHNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSBhdCBvZmZzZXQgMHglMDhsbHgsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICJzYW1wbGVEZXNjSW5kZXg9JXUsIGZsYWdzIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKLQotICAgICAgICBjb25zdCBzcDxUcmFja0ZyYWdtZW50PiAmZnJhZ21lbnQgPSAqLS1pbmZvLT5tRnJhZ21lbnRzLmVuZCgpOwotCi0gICAgICAgIHVpbnQzMl90IGRlY29kaW5nVGltZSA9IGluZm8tPm1EZWNvZGluZ1RpbWU7Ci0gICAgICAgIGluZm8tPm1EZWNvZGluZ1RpbWUgKz0gc2FtcGxlRHVyYXRpb247Ci0gICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUgPSBkZWNvZGluZ1RpbWUgKyBzYW1wbGVDdHNPZmZzZXQ7Ci0KLSAgICAgICAgc3RhdGljX2Nhc3Q8RHluYW1pY1RyYWNrRnJhZ21lbnQgKj4oCi0gICAgICAgICAgICAgICAgZnJhZ21lbnQuZ2V0KCkpLT5hZGRTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOwotCi0gICAgICAgIGRhdGFPZmZzZXQgKz0gc2FtcGxlU2l6ZTsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OmNvcHlCdWZmZXIoCi0gICAgICAgIHNwPEFCdWZmZXI+ICpkc3QsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIGNvbnN0IHsKLSAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICBtZW1jcHkoYnVmLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICAqZHN0ID0gYnVmOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk5MDM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJUcmFja0ZyYWdtZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVHJhY2tGcmFnbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OkR5bmFtaWNUcmFja0ZyYWdtZW50KCkKLSAgICA6IG1Db21wbGV0ZShmYWxzZSksCi0gICAgICBtU2FtcGxlSW5kZXgoMCkgewotfQotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6fkR5bmFtaWNUcmFja0ZyYWdtZW50KCkgewotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6Z2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gbUNvbXBsZXRlID8gRVJST1JfRU5EX09GX1NUUkVBTSA6IC1FV09VTERCTE9DSzsKLSAgICB9Ci0KLSAgICAqaW5mbyA9IG1TYW1wbGVzLml0ZW1BdChtU2FtcGxlSW5kZXgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjphZHZhbmNlKCkgewotICAgICsrbVNhbXBsZUluZGV4OwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjphZGRTYW1wbGUoCi0gICAgICAgIG9mZjY0X3QgZGF0YU9mZnNldCwgc2l6ZV90IHNhbXBsZVNpemUsCi0gICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgIHNpemVfdCBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgbVNhbXBsZXMucHVzaCgpOwotICAgIFNhbXBsZUluZm8gKnNhbXBsZUluZm8gPSAmbVNhbXBsZXMuZWRpdEl0ZW1BdChtU2FtcGxlcy5zaXplKCkgLSAxKTsKLQotICAgIHNhbXBsZUluZm8tPm1PZmZzZXQgPSBkYXRhT2Zmc2V0OwotICAgIHNhbXBsZUluZm8tPm1TaXplID0gc2FtcGxlU2l6ZTsKLSAgICBzYW1wbGVJbmZvLT5tUHJlc2VudGF0aW9uVGltZSA9IHByZXNlbnRhdGlvblRpbWU7Ci0gICAgc2FtcGxlSW5mby0+bVNhbXBsZURlc2NJbmRleCA9IHNhbXBsZURlc2NJbmRleDsKLSAgICBzYW1wbGVJbmZvLT5tRmxhZ3MgPSBmbGFnczsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OnNpZ25hbENvbXBsZXRpb24oKSB7Ci0gICAgbUNvbXBsZXRlID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6Y29tcGxldGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db21wbGV0ZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6U3RhdGljVHJhY2tGcmFnbWVudCgpCi0gICAgOiBtU2FtcGxlSW5kZXgoMCksCi0gICAgICBtU2FtcGxlQ291bnQoMCksCi0gICAgICBtQ2h1bmtJbmRleCgwKSwKLSAgICAgIG1TYW1wbGVUb0NodW5rSW5kZXgoLTEpLAotICAgICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcoMCksCi0gICAgICBtUHJldkNodW5rSW5kZXgoMHhmZmZmZmZmZiksCi0gICAgICBtTmV4dFNhbXBsZU9mZnNldCgwKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6On5TdGF0aWNUcmFja0ZyYWdtZW50KCkgewotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgICppbmZvID0gbVNhbXBsZUluZm87Ci0KLSAgICBBTE9HVigicmV0dXJuaW5nIHNhbXBsZSAlZCBhdCBbMHglMDhsbHgsIDB4JTA4bGx4KSIsCi0gICAgICAgICAgbVNhbXBsZUluZGV4LAotICAgICAgICAgIGluZm8tPm1PZmZzZXQsIGluZm8tPm1PZmZzZXQgKyBpbmZvLT5tU2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6dXBkYXRlU2FtcGxlSW5mbygpIHsKLSAgICBpZiAobVNhbXBsZUluZGV4ID49IG1TYW1wbGVDb3VudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVTaXplcyAhPSBOVUxMKSB7Ci0gICAgICAgIHVpbnQzMl90IGRlZmF1bHRTYW1wbGVTaXplID0gVTMyX0FUKG1TYW1wbGVTaXplcy0+ZGF0YSgpICsgNCk7Ci0gICAgICAgIGlmIChkZWZhdWx0U2FtcGxlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gZGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZT0gVTMyX0FUKG1TYW1wbGVTaXplcy0+ZGF0YSgpICsgMTIgKyA0ICogbVNhbXBsZUluZGV4KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1Db21wYWN0U2FtcGxlU2l6ZXMgIT0gTlVMTCk7Ci0KLSAgICAgICAgdWludDMyX3QgZmllbGRTaXplID0gVTMyX0FUKG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKSArIDQpOwotCi0gICAgICAgIHN3aXRjaCAoZmllbGRTaXplKSB7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgYnl0ZSA9IG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKVsxMiArIG1TYW1wbGVJbmRleCAvIDJdOwotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gKG1TYW1wbGVJbmRleCAmIDEpID8gYnl0ZSAmIDB4MGYgOiBieXRlID4+IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9IG1Db21wYWN0U2FtcGxlU2l6ZXMtPmRhdGEoKVsxMiArIG1TYW1wbGVJbmRleF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZmllbGRTaXplLCAxNik7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPQotICAgICAgICAgICAgICAgICAgICBVMTZfQVQobUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpICsgMTIgKyBtU2FtcGxlSW5kZXggKiAyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIENIRUNLX0dUKG1TYW1wbGVUb0NodW5rUmVtYWluaW5nLCAwKTsKLQotICAgIC8vIFRoZSBzYW1wbGUgZGVzYyBpbmRleCBpcyAxLWJhc2VkLi4uIFhYWAotICAgIG1TYW1wbGVJbmZvLm1TYW1wbGVEZXNjSW5kZXggPQotICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA4KTsKLQotICAgIGlmIChtQ2h1bmtJbmRleCAhPSBtUHJldkNodW5rSW5kZXgpIHsKLSAgICAgICAgbVByZXZDaHVua0luZGV4ID0gbUNodW5rSW5kZXg7Ci0KLSAgICAgICAgaWYgKG1DaHVua09mZnNldHMgIT0gTlVMTCkgewotICAgICAgICAgICAgdWludDMyX3QgZW50cnlDb3VudCA9IFUzMl9BVChtQ2h1bmtPZmZzZXRzLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5kZXggPSBtU2FtcGxlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTmV4dFNhbXBsZU9mZnNldCA9Ci0gICAgICAgICAgICAgICAgVTMyX0FUKG1DaHVua09mZnNldHMtPmRhdGEoKSArIDggKyA0ICogbUNodW5rSW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0hFQ0sobUNodW5rT2Zmc2V0czY0ICE9IE5VTEwpOwotCi0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1DaHVua09mZnNldHM2NC0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZGV4ID0gbVNhbXBsZUNvdW50OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU5leHRTYW1wbGVPZmZzZXQgPQotICAgICAgICAgICAgICAgIFU2NF9BVChtQ2h1bmtPZmZzZXRzNjQtPmRhdGEoKSArIDggKyA4ICogbUNodW5rSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVNhbXBsZUluZm8ubU9mZnNldCA9IG1OZXh0U2FtcGxlT2Zmc2V0OwotCi0gICAgbVNhbXBsZUluZm8ubVByZXNlbnRhdGlvblRpbWUgPSAwOwotICAgIG1TYW1wbGVJbmZvLm1GbGFncyA9IDA7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6YWR2YW5jZSgpIHsKLSAgICBtTmV4dFNhbXBsZU9mZnNldCArPSBtU2FtcGxlSW5mby5tU2l6ZTsKLQotICAgICsrbVNhbXBsZUluZGV4OwotICAgIGlmICgtLW1TYW1wbGVUb0NodW5rUmVtYWluaW5nID09IDApIHsKLSAgICAgICAgKyttQ2h1bmtJbmRleDsKLQotICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBzYW1wbGUgdG8gY2h1bmsgdGFibGUsIHdlIHdpbGwKLSAgICAgICAgLy8gc3RheSBvbiB0aGlzIGVudHJ5LgotICAgICAgICBpZiAoKHVpbnQzMl90KShtU2FtcGxlVG9DaHVua0luZGV4ICsgMSkgPCBlbnRyeUNvdW50KSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBuZXh0Q2h1bmtJbmRleCA9Ci0gICAgICAgICAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiAobVNhbXBsZVRvQ2h1bmtJbmRleCArIDEpKTsKLQotICAgICAgICAgICAgQ0hFQ0tfR0UobmV4dENodW5rSW5kZXgsIDF1KTsKLSAgICAgICAgICAgIC0tbmV4dENodW5rSW5kZXg7Ci0KLSAgICAgICAgICAgIGlmIChtQ2h1bmtJbmRleCA+PSBuZXh0Q2h1bmtJbmRleCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1DaHVua0luZGV4LCBuZXh0Q2h1bmtJbmRleCk7Ci0gICAgICAgICAgICAgICAgKyttU2FtcGxlVG9DaHVua0luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPQotICAgICAgICAgICAgVTMyX0FUKG1TYW1wbGVUb0NodW5rLT5kYXRhKCkgKyA4ICsgMTIgKiBtU2FtcGxlVG9DaHVua0luZGV4ICsgNCk7Ci0gICAgfQotCi0gICAgdXBkYXRlU2FtcGxlSW5mbygpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRVMzJBdCh1aW50OF90ICpwdHIsIHVpbnQzMl90IHgpIHsKLSAgICBwdHJbMF0gPSB4ID4+IDI0OwotICAgIHB0clsxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgcHRyWzJdID0gKHggPj4gOCkgJiAweGZmOwotICAgIHB0clszXSA9IHggJiAweGZmOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpzaWduYWxDb21wbGV0aW9uKCkgewotICAgIG1TYW1wbGVUb0NodW5rSW5kZXggPSAwOwotCi0gICAgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPQotICAgICAgICAobVNhbXBsZVRvQ2h1bmsgPT0gTlVMTCkKLSAgICAgICAgICAgID8gMAotICAgICAgICAgICAgOiBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA0KTsKLQotICAgIHVwZGF0ZVNhbXBsZUluZm8oKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojpjb21wbGV0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlU2l6ZSA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIGlmIChzYW1wbGVTaXplID09IDAgJiYgb2Zmc2V0ICsgMTIgKyBzYW1wbGVDb3VudCAqIDQgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbVNhbXBsZVNpemVzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgbVNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmaWVsZFNpemUgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAoZmllbGRTaXplICE9IDQgJiYgZmllbGRTaXplICE9IDggJiYgZmllbGRTaXplICE9IDE2KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgMTIgKyAoc2FtcGxlQ291bnQgKiBmaWVsZFNpemUgKyA0KSAvIDggIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNvbXBhY3RTYW1wbGVTaXplcywgb2Zmc2V0LCBzaXplKTsKLQotICAgIG1TYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChlbnRyeUNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDEyICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1TYW1wbGVUb0NodW5rLCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogNCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ2h1bmtPZmZzZXRzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiA4ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1DaHVua09mZnNldHM2NCwgb2Zmc2V0LCBzaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9UcmFja0ZyYWdtZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWQ0NmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUUkFDS19GUkFHTUVOVF9IXwotCi0jZGVmaW5lIFRSQUNLX0ZSQUdNRU5UX0hfCi0KLSNpbmNsdWRlICJpbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBUcmFja0ZyYWdtZW50KCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5UcmFja0ZyYWdtZW50KCkge30KLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFja0ZyYWdtZW50KTsKLX07Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudCA6IHB1YmxpYyBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IHsKLSAgICBEeW5hbWljVHJhY2tGcmFnbWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbyk7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKTsKLQotICAgIHZvaWQgYWRkU2FtcGxlKAotICAgICAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0LCBzaXplX3Qgc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvblRpbWUsCi0gICAgICAgICAgICBzaXplX3Qgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gTm8gbW9yZSBzYW1wbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBmcmFnbWVudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKTsKLQotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RHluYW1pY1RyYWNrRnJhZ21lbnQoKTsKLQotcHJpdmF0ZToKLSAgICBib29sIG1Db21wbGV0ZTsKLSAgICBzaXplX3QgbVNhbXBsZUluZGV4OwotICAgIFZlY3RvcjxTYW1wbGVJbmZvPiBtU2FtcGxlczsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKER5bmFtaWNUcmFja0ZyYWdtZW50KTsKLX07Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50IDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgewotICAgIFN0YXRpY1RyYWNrRnJhZ21lbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlKFNhbXBsZUluZm8gKmluZm8pOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbENvbXBsZXRpb24oKTsKLSAgICB2aXJ0dWFsIGJvb2wgY29tcGxldGUoKSBjb25zdDsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVUb0NodW5rKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U3RhdGljVHJhY2tGcmFnbWVudCgpOwotCi1wcml2YXRlOgotICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7Ci0gICAgc2l6ZV90IG1TYW1wbGVDb3VudDsKLSAgICB1aW50MzJfdCBtQ2h1bmtJbmRleDsKLQotICAgIFNhbXBsZUluZm8gbVNhbXBsZUluZm87Ci0KLSAgICBzcDxBQnVmZmVyPiBtU2FtcGxlU2l6ZXM7Ci0gICAgc3A8QUJ1ZmZlcj4gbUNvbXBhY3RTYW1wbGVTaXplczsKLQotICAgIHNwPEFCdWZmZXI+IG1TYW1wbGVUb0NodW5rOwotICAgIHNzaXplX3QgbVNhbXBsZVRvQ2h1bmtJbmRleDsKLSAgICBzaXplX3QgbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmc7Ci0KLSAgICBzcDxBQnVmZmVyPiBtQ2h1bmtPZmZzZXRzOwotICAgIHNwPEFCdWZmZXI+IG1DaHVua09mZnNldHM2NDsKLSAgICB1aW50MzJfdCBtUHJldkNodW5rSW5kZXg7Ci0gICAgdWludDY0X3QgbU5leHRTYW1wbGVPZmZzZXQ7Ci0KLSAgICB2b2lkIHVwZGF0ZVNhbXBsZUluZm8oKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0YXRpY1RyYWNrRnJhZ21lbnQpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBUUkFDS19GUkFHTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCmluZGV4IGQxYWZkOGIuLjZkODg2NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKQEAgLTUwMywxMSArNTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHNF9WSURFTyk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUENNX0FVRElPOgotICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpQQ01fQVVESU8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgogICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzMpOwpAQCAtNTU1LDcgKzU1MSw5IEBACiAgICAgICAgIH0KICNlbmRpZgogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgaWYgKCFwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlciA9IChjb250aW51aXR5X2NvdW50ZXIgKyAxKSAmIDB4MGY7CkBAIC02MjAsNyArNjE4LDcgQEAKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcxX0FVRElPOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU86CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfUENNX0FVRElPOgorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtNjY3LDcgKzY2NSw3IEBACiAgICAgfQogCiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgZXh0cmEpOworICAgICAgICBtU291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgZXh0cmEsIHRydWUpOwogICAgIH0KIH0KIApAQCAtODk2LDYgKzg5NCwxMiBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJTdHJlYW0gUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCBub3cgaGFzIGRhdGEuIiwKICAgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBtU3RyZWFtVHlwZSk7CiAKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIUlzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggODZiMDI1Zi4uODk4NmEyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC05Myw3ICs5Myw5IEBACiAgICAgICAgIC8vIEZyb20gQVRTQyBBLzUzIFBhcnQgMzoyMDA5LCA2LjcuMQogICAgICAgICBTVFJFQU1UWVBFX0FDMyAgICAgICAgICAgICAgICAgID0gMHg4MSwKIAotICAgICAgICBTVFJFQU1UWVBFX1BDTV9BVURJTyAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCisgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMworICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKICAgICB9OwogCiBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKaW5kZXggYzFhN2E5ZC4uYzE3YTBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMTMsNiArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21wZWcydHMKIAogaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKaW5kZXggNmRmYWE5NC4uYTAzZjZmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFub3RoZXJQYWNrZXRTb3VyY2UiCisKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTI2LDE2ICsyOSwyMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNvbnN0IGludDY0X3Qga05lYXJFT1NNYXJrVXMgPSAyMDAwMDAwbGw7IC8vIDIgc2VjcwogCiBBbm90aGVyUGFja2V0U291cmNlOjpBbm90aGVyUGFja2V0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKICAgICA6IG1Jc0F1ZGlvKGZhbHNlKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1Gb3JtYXQoTlVMTCksCiAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcygwKSwKICAgICAgIG1FT1NSZXN1bHQoT0spLAotICAgICAgbUxhdGVzdEVucXVldWVkTWV0YShOVUxMKSB7CisgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhKE5VTEwpLAorICAgICAgbUxhdGVzdERlcXVldWVkTWV0YShOVUxMKSwKKyAgICAgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQoMCkgewogICAgIHNldEZvcm1hdChtZXRhKTsKIH0KIApAQCAtNDMsNiArNTEsNyBAQAogICAgIENIRUNLKG1Gb3JtYXQgPT0gTlVMTCk7CiAKICAgICBtSXNBdWRpbyA9IGZhbHNlOworICAgIG1Jc1ZpZGVvID0gZmFsc2U7CiAKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTU0LDggKzYzLDEwIEBACiAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBtSXNBdWRpbyA9IHRydWU7CisgICAgfSBlbHNlICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSk7CisgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidGV4dC8iLCBtaW1lLCA1KSk7CiAgICAgfQogfQogCkBAIC04Niw3ICs5Nyw3IEBACiAKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICArK2l0OwpAQCAtMTEyLDkgKzEyMywxMiBAQAogICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLS1tUXVldWVkRGlzY29udGludWl0eUNvdW50OwogICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKICAgICAgICAgfQogCisgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSAoKmJ1ZmZlciktPm1ldGEoKS0+ZHVwKCk7CisKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoKCpidWZmZXIpLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOwpAQCAtMTM2LDggKzE1MCwxMCBAQAogICAgIH0KIAogICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgeworCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOwogICAgICAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpKTsKKyAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpLT5kdXAoKTsKIAogICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CkBAIC0xNzMsNyArMTg5LDExIEBACiAgICAgICAgIHJldHVybiAoZGlzY29udGludWl0eVR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUKSAhPSAwOwogICAgIH0KIAotICAgIHJldHVybiAoZGlzY29udGludWl0eVR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUKSAhPSAwOworICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICByZXR1cm4gKGRpc2NvbnRpbnVpdHlUeXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCkgIT0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKQEAgLTE4NiwxMyArMjA2LDE4IEBACiAgICAgaW50NjRfdCBsYXN0UXVldWVkVGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0UXVldWVkVGltZVVzKSk7CiAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOwotICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLCBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOworICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSUiIFBSSWk2NCAiIHVzICglLjJmIHNlY3MpIiwgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKIAotICAgIGlmICghbUxhdGVzdEVucXVldWVkTWV0YS5nZXQoKSkgeworICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICArK21RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CisgICAgfQorCisgICAgaWYgKG1MYXRlc3RFbnF1ZXVlZE1ldGEgPT0gTlVMTCkgewogICAgICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBsYXRlc3RUaW1lVXMgPSAwOwpAQCAtMjA4LDYgKzIzMyw3IEBACiAKICAgICBtQnVmZmVycy5jbGVhcigpOwogICAgIG1FT1NSZXN1bHQgPSBPSzsKKyAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50ID0gMDsKIAogICAgIG1Gb3JtYXQgPSBOVUxMOwogICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBOVUxMOwpAQCAtMjE1LDI3ICsyNDEsMzEgQEAKIAogdm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgeworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhLAorICAgICAgICBib29sIGRpc2NhcmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgLy8gTGVhdmUgb25seSBkaXNjb250aW51aXRpZXMgaW4gdGhlIHF1ZXVlLgotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWZmZXIgPSAqaXQ7CisgICAgaWYgKGRpc2NhcmQpIHsKKyAgICAgICAgLy8gTGVhdmUgb25seSBkaXNjb250aW51aXRpZXMgaW4gdGhlIHF1ZXVlLgorICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBvbGRCdWZmZXIgPSAqaXQ7CiAKLSAgICAgICAgaW50MzJfdCBvbGREaXNjb250aW51aXR5VHlwZTsKLSAgICAgICAgaWYgKCFvbGRCdWZmZXItPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAiZGlzY29udGludWl0eSIsICZvbGREaXNjb250aW51aXR5VHlwZSkpIHsKLSAgICAgICAgICAgIGl0ID0gbUJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpbnQzMl90IG9sZERpc2NvbnRpbnVpdHlUeXBlOworICAgICAgICAgICAgaWYgKCFvbGRCdWZmZXItPm1ldGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgImRpc2NvbnRpbnVpdHkiLCAmb2xkRGlzY29udGludWl0eVR5cGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsraXQ7CiAgICAgICAgIH0KLQotICAgICAgICArK2l0OwogICAgIH0KIAogICAgIG1FT1NSZXN1bHQgPSBPSzsKICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IDA7CiAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CisgICAgKyttUXVldWVkRGlzY29udGludWl0eUNvdW50OwogCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoMCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5Iiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odHlwZSkpOwpAQCAtMjY1LDcgKzI5NSwxMCBAQAogCiBpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25VcyhzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChmaW5hbFJlc3VsdCk7Cit9CiAKK2ludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKIAogICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CkBAIC0yNzQsNiArMzA3LDcgQEAKIAogICAgIGludDY0X3QgdGltZTEgPSAtMTsKICAgICBpbnQ2NF90IHRpbWUyID0gLTE7CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwogICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewpAQCAtMjgxLDIwICszMTUsNjQgQEAKIAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICBpZiAodGltZTEgPCAwKSB7CisgICAgICAgICAgICBpZiAodGltZTEgPCAwIHx8IHRpbWVVcyA8IHRpbWUxKSB7CiAgICAgICAgICAgICAgICAgdGltZTEgPSB0aW1lVXM7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHRpbWUyID0gdGltZVVzOworICAgICAgICAgICAgaWYgKHRpbWUyIDwgMCB8fCB0aW1lVXMgPiB0aW1lMikgeworICAgICAgICAgICAgICAgIHRpbWUyID0gdGltZVVzOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpc2NvbnRpbnVpdHksIHJlc2V0IGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICBkdXJhdGlvblVzICs9IHRpbWUyIC0gdGltZTE7CiAgICAgICAgICAgICB0aW1lMSA9IHRpbWUyID0gLTE7CiAgICAgICAgIH0KIAogICAgICAgICArK2l0OwogICAgIH0KIAotICAgIHJldHVybiB0aW1lMiAtIHRpbWUxOworICAgIHJldHVybiBkdXJhdGlvblVzICsgKHRpbWUyIC0gdGltZTEpOworfQorCisvLyBBIGNoZWFwZXIgYnV0IGxlc3MgcHJlY2lzZSB2ZXJzaW9uIG9mIGdldEJ1ZmZlcmVkRHVyYXRpb25VcyB0aGF0IHdlIHdvdWxkIGxpa2UgdG8gdXNlIGluCisvLyBMaXZlU2Vzc2lvbjo6ZGVxdWV1ZUFjY2Vzc1VuaXQgdG8gdHJpZ2dlciBkb3dud2FyZHMgYWRhcHRhdGlvbi4KK2ludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChtUXVldWVkRGlzY29udGludWl0eUNvdW50ID4gMCkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKCZmaW5hbFJlc3VsdCk7CisgICAgfQorCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKml0OworCisgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc3RhcnRUaW1lVXMpOworICAgIGlmIChzdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaXQgPSBtQnVmZmVycy5lbmQoKTsKKyAgICAtLWl0OworICAgIGJ1ZmZlciA9ICppdDsKKworICAgIGludDY0X3QgZW5kVGltZVVzOworICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZlbmRUaW1lVXMpOworICAgIGlmIChlbmRUaW1lVXMgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludDY0X3QgZGlmZlVzOworICAgIGlmIChlbmRUaW1lVXMgPiBzdGFydFRpbWVVcykgeworICAgICAgICBkaWZmVXMgPSBlbmRUaW1lVXMgLSBzdGFydFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWZmVXMgPSBzdGFydFRpbWVVcyAtIGVuZFRpbWVVczsKKyAgICB9CisgICAgcmV0dXJuIGRpZmZVczsKIH0KIAogc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6bmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKSB7CkBAIC0zMjMsOSArNDAxLDE0IEBACiAgICAgcmV0dXJuIChtRU9TUmVzdWx0ICE9IE9LKTsKIH0KIAotc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldExhdGVzdE1ldGEoKSB7CitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1MYXRlc3RFbnF1ZXVlZE1ldGE7CiB9CiAKK3NwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRMYXRlc3REZXF1ZXVlZE1ldGEoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUxhdGVzdERlcXVldWVkTWV0YTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKaW5kZXggOWIxOTNhMi4uODA5YTg1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgKQEAgLTQ5LDEyICs0OSwxNiBAQAogICAgIC8vIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIHNpbmNlIHRoZSBsYXN0IGRpc2NvbnRpbnVpdHkgKGlmIGFueSkuCiAgICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAorICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkRHVyYXRpb25VcygpOworCiAgICAgc3RhdHVzX3QgbmV4dEJ1ZmZlclRpbWUoaW50NjRfdCAqdGltZVVzKTsKIAogICAgIHZvaWQgcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOworICAgICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSwKKyAgICAgICAgICAgIGJvb2wgZGlzY2FyZCk7CiAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCByZXN1bHQpOwogCkBAIC02Miw3ICs2Niw4IEBACiAKICAgICBib29sIGlzRmluaXNoZWQoaW50NjRfdCBkdXJhdGlvbikgY29uc3Q7CiAKLSAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0TWV0YSgpOworICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Bbm90aGVyUGFja2V0U291cmNlKCk7CkBAIC03MiwxMyArNzcsMTggQEAKICAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKIAogICAgIGJvb2wgbUlzQXVkaW87CisgICAgYm9vbCBtSXNWaWRlbzsKICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKICAgICBpbnQ2NF90IG1MYXN0UXVldWVkVGltZVVzOwogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtQnVmZmVyczsKICAgICBzdGF0dXNfdCBtRU9TUmVzdWx0OwogICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RW5xdWV1ZWRNZXRhOworICAgIHNwPEFNZXNzYWdlPiBtTGF0ZXN0RGVxdWV1ZWRNZXRhOworCisgICAgc2l6ZV90ICBtUXVldWVkRGlzY29udGludWl0eUNvdW50OwogCiAgICAgYm9vbCB3YXNGb3JtYXRDaGFuZ2UoaW50MzJfdCBkaXNjb250aW51aXR5VHlwZSkgY29uc3Q7CisgICAgaW50NjRfdCBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQW5vdGhlclBhY2tldFNvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggZTkyNTJjYy4uZWYxY2QzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0yNjUsNyArMjY1LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEguMjY0L01QRUcgc3luY3dvcmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgb2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zNTksNyArMzU5LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTYwNCw2ICs2MDQsOCBAQAogICAgIC8vIGhhdmluZyB0byBpbnRlcnBvbGF0ZS4KICAgICAvLyBUaGUgZmluYWwgQUFDIGZyYW1lIG1heSB3ZWxsIGV4dGVuZCBpbnRvIHRoZSBuZXh0IFJhbmdlSW5mbyBidXQKICAgICAvLyB0aGF0J3Mgb2suCisgICAgLy8gVE9ETzogdGhlIGxvZ2ljIGNvbW1lbnRlZCBhYm92ZSBpcyBza2lwcGVkIGJlY2F1c2UgY29kZWMgY2Fubm90IHRha2UKKyAgICAvLyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVyczsKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgaW5mby5tTGVuZ3RoKSB7CiAgICAgICAgIGlmIChvZmZzZXQgKyA3ID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CkBAIC02NjgsOSArNjcwLDEyIEBACiAgICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gcHJvdGVjdGlvbl9hYnNlbnQgPyA3IDogOTsKIAogICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgLy8gVE9ETzogbW92ZSBiYWNrIHRvIGNvbmNhdGVuYXRpb24gd2hlbiBjb2RlYyBjYW4gc3VwcG9ydCBhcmJpdHJhcnkgaW5wdXQgYnVmZmVycy4KKyAgICAgICAgLy8gRm9yIG5vdyBvbmx5IHF1ZXVlIGEgc2luZ2xlIGJ1ZmZlcgorICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcEFBQyhvZmZzZXQpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG9mZnNldCk7CiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBvZmZzZXQpOwpAQCAtNzE3LDYgKzcyMiw0NSBAQAogICAgIHJldHVybiB0aW1lVXM7CiB9CiAKKy8vIFRPRE86IGF2b2lkIGludGVycG9sYXRpbmcgdGltZXN0YW1wcyBvbmNlIGNvZGVjIHN1cHBvcnRzIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzCitpbnQ2NF90IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZmV0Y2hUaW1lc3RhbXBBQUMoc2l6ZV90IHNpemUpIHsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgc2l6ZV90IHNhbXBsZXNpemUgPSBzaXplOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7CisKKyAgICAgICAgUmFuZ2VJbmZvICppbmZvID0gJiptUmFuZ2VJbmZvcy5iZWdpbigpOworCisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgdGltZVVzID0gaW5mby0+bVRpbWVzdGFtcFVzOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmZvLT5tTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgaW5mby0+bUxlbmd0aCAtPSBzaXplOworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSAxMDI0ICogc2l6ZSAvIHNhbXBsZXNpemU7CisgICAgICAgICAgICBpbmZvLT5tVGltZXN0YW1wVXMgKz0gbnVtU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgLT0gaW5mby0+bUxlbmd0aDsKKworICAgICAgICAgICAgbVJhbmdlSW5mb3MuZXJhc2UobVJhbmdlSW5mb3MuYmVnaW4oKSk7CisgICAgICAgICAgICBpbmZvID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKHRpbWVVcyA9PSAwbGwpIHsKKyAgICAgICAgQUxPR1YoIlJldHVybmluZyAwIHRpbWVzdGFtcCIpOworICAgIH0KKworICAgIHJldHVybiB0aW1lVXM7Cit9CisKIHN0cnVjdCBOQUxQb3NpdGlvbiB7CiAgICAgc2l6ZV90IG5hbE9mZnNldDsKICAgICBzaXplX3QgbmFsU2l6ZTsKQEAgLTc3Nyw2ICs4MjEsMTIgQEAKIAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBtQnVmZmVyLT5kYXRhKClbcG9zLm5hbE9mZnNldF0gJiAweDFmOwogCisgICAgICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNikgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBuZXcgQUJ1ZmZlcihwb3MubmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzZWktPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgcG9zLm5hbE9mZnNldCwgcG9zLm5hbFNpemUpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICAgICAgICAgICAgICB9CisKICNpZiAhTE9HX05ERUJVRwogICAgICAgICAgICAgICAgIGNoYXIgdG1wWzEyOF07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIweCUwMngiLCBuYWxUeXBlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKaW5kZXggYTJjY2E3Ny4uN2M4MWZmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKQEAgLTc3LDYgKzc3LDcgQEAKICAgICAvLyBjb25zdW1lIGEgbG9naWNhbCAoY29tcHJlc3NlZCkgYWNjZXNzIHVuaXQgb2Ygc2l6ZSAic2l6ZSIsCiAgICAgLy8gcmV0dXJucyBpdHMgdGltZXN0YW1wIGluIHVzIChvciAtMSBpZiBubyB0aW1lIGluZm9ybWF0aW9uKS4KICAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wKHNpemVfdCBzaXplKTsKKyAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wQUFDKHNpemVfdCBzaXplKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawppbmRleCBjZDkxMmU3Li5hYWE4MzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawpAQCAtMSw2ICsxLDEwIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitpZmVxICgkKFRBUkdFVF9ERVZJQ0UpLCBtYW50YSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURTVVJGQUNFX0lTX0JHUjMyCitlbmRpZgorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgICAgICAgXAogICAgICAgICBPTVguY3BwICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMCw2ICsxNCw3IEBACiAgICAgICAgIFNvZnRPTVhDb21wb25lbnQuY3BwICAgICAgICAgIFwKICAgICAgICAgU29mdE9NWFBsdWdpbi5jcHAgICAgICAgICAgICAgXAogICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBcCisgICAgICAgIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIFwKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTE4LDYgKzIzLDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICAgICAgICAgIFwKICAgICAgICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYmhhcmR3YXJlICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDNmZTljMjMuLjNlNzA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTI5LDEzICsyOSwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGJvb2wgRVhUUkFfQ0hFQ0sgPSB0cnVlOwogCiAKIEdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50KSA6CisgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIDoKICAgICBtSW5pdENoZWNrKFVOS05PV05fRVJST1IpLAogICAgIG1Ob2RlSW5zdGFuY2Uobm9kZUluc3RhbmNlKSwKICAgICBtRXhlY3V0aW5nKGZhbHNlKSwKQEAgLTQzLDE2ICs0NiwyMiBAQAogICAgIG1OdW1GcmFtZXNBdmFpbGFibGUoMCksCiAgICAgbUVuZE9mU3RyZWFtKGZhbHNlKSwKICAgICBtRW5kT2ZTdHJlYW1TZW50KGZhbHNlKSwKLSAgICBtUmVwZWF0QWZ0ZXJVcygtMWxsKSwKICAgICBtTWF4VGltZXN0YW1wR2FwVXMoLTFsbCksCiAgICAgbVByZXZPcmlnaW5hbFRpbWVVcygtMWxsKSwKICAgICBtUHJldk1vZGlmaWVkVGltZVVzKC0xbGwpLAorICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMoLTFsbCksCisgICAgbVJlcGVhdEFmdGVyVXMoLTFsbCksCiAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCiAgICAgbVJlcGVhdExhc3RGcmFtZVRpbWVzdGFtcCgtMWxsKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQoLTEpLAogICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSgwKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQoMCksCi0gICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSB7CisgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkKGZhbHNlKSwKKyAgICBtVGltZVBlckNhcHR1cmVVcygtMWxsKSwKKyAgICBtVGltZVBlckZyYW1lVXMoLTFsbCksCisgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCisgICAgbVByZXZGcmFtZVVzKC0xbGwpLAorICAgIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKIAogICAgIEFMT0dWKCJHcmFwaGljQnVmZmVyU291cmNlIHc9JXUgaD0ldSBjPSV1IiwKICAgICAgICAgICAgIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQsIGJ1ZmZlckNvdW50KTsKQEAgLTY1LDEzICs3NCwxMiBAQAogCiAgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyTmFtZShuYW1lKTsKLSAgICBtQnVmZmVyUXVldWUtPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAldTogJWQiLAogICAgICAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtSW5pdENoZWNrKTsKQEAgLTg1LDcgKzkzLDcgQEAKICAgICB3cDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOwogICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0gbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOwogCi0gICAgbUluaXRDaGVjayA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1tSW5pdENoZWNrKSwgbUluaXRDaGVjayk7CkBAIC05Nyw4ICsxMDUsOCBAQAogCiBHcmFwaGljQnVmZmVyU291cmNlOjp+R3JhcGhpY0J1ZmZlclNvdXJjZSgpIHsKICAgICBBTE9HVigifkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKLSAgICBpZiAobUJ1ZmZlclF1ZXVlICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKICAgICAgICAgfQpAQCAtMTA3LDcgKzExNSw3IEBACiAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b214RXhlY3V0aW5nKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCItLT4gZXhlY3V0aW5nOyBhdmFpbD0lZCwgY29kZWMgdmVjIHNpemU9JXpkIiwKKyAgICBBTE9HVigiLS0+IGV4ZWN1dGluZzsgYXZhaWw9JXp1LCBjb2RlYyB2ZWMgc2l6ZT0lemQiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUNvZGVjQnVmZmVycy5zaXplKCkpOwogICAgIENIRUNLKCFtRXhlY3V0aW5nKTsKICAgICBtRXhlY3V0aW5nID0gdHJ1ZTsKQEAgLTEyOSw3ICsxMzcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImRvbmUgbG9hZGluZyBpbml0aWFsIGZyYW1lcywgYXZhaWw9JWQiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKKyAgICBBTE9HVigiZG9uZSBsb2FkaW5nIGluaXRpYWwgZnJhbWVzLCBhdmFpbD0lenUiLCBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKIAogICAgIC8vIElmIEVPUyBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkLCBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzIHRvCiAgICAgLy8gc3VibWl0LCB0cnkgdG8gc2VuZCBFT1Mgbm93IGFzIHdlbGwuCkBAIC0xODEsNyArMTg5LDcgQEAKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwogICAgIH0KIAotICAgIEFMT0dWKCItLT4gbG9hZGVkOyBhdmFpbD0lZCBlb3M9JWQgZW9zU2VudD0lZCIsCisgICAgQUxPR1YoIi0tPiBsb2FkZWQ7IGF2YWlsPSV6dSBlb3M9JWQgZW9zU2VudD0lZCIsCiAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLCBtRW5kT2ZTdHJlYW0sIG1FbmRPZlN0cmVhbVNlbnQpOwogCiAgICAgLy8gQ29kZWMgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZy4gIERpc2NhcmQgYWxsIGNvZGVjLXJlbGF0ZWQgc3RhdGUuCkBAIC0yNDgsMTMgKzI1NiwyNSBAQAogICAgICAgICAvLyBQdWxsIHRoZSBncmFwaGljIGJ1ZmZlciBoYW5kbGUgYmFjayBvdXQgb2YgdGhlIGJ1ZmZlciwgYW5kIGNvbmZpcm0KICAgICAgICAgLy8gdGhhdCBpdCBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KICAgICAgICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlOwotICAgICAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgZGF0YSArIDQsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLSAgICAgICAgaWYgKGJ1ZmZlckhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7Ci0gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIncyBoYW5kbGUgaXMgJXAsIGV4cGVjdGVkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVySGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLSAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOworICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9ICooTWV0YWRhdGFCdWZmZXJUeXBlICopZGF0YTsKKyAgICAgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGU7CisgICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgZGF0YSArIDQsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJIYW5kbGUgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIncyBoYW5kbGUgaXMgJXAsIGV4cGVjdGVkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcikgeworICAgICAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgbWVtY3B5KCZidWZmZXIsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlciBpcyAlcCwgZXhwZWN0ZWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3MCw3ICsyOTAsNyBAQAogICAgICAgICBpZiAoaWQgPT0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkKSB7CiAgICAgICAgICAgICBDSEVDS19HVChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQtLSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTI4NCw3ICszMDQsNyBAQAogICAgIGlmIChtTnVtRnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgIC8vIEZpbGwgdGhpcyBjb2RlYyBidWZmZXIuCiAgICAgICAgIENIRUNLKCFtRW5kT2ZTdHJlYW1TZW50KTsKLSAgICAgICAgQUxPR1YoImJ1ZmZlciBmcmVlZCwgJWQgZnJhbWVzIGF2YWlsIChlb3M9JWQpIiwKKyAgICAgICAgQUxPR1YoImJ1ZmZlciBmcmVlZCwgJXp1IGZyYW1lcyBhdmFpbCAoZW9zPSVkKSIsCiAgICAgICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUVuZE9mU3RyZWFtKTsKICAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKICAgICB9IGVsc2UgaWYgKG1FbmRPZlN0cmVhbSkgewpAQCAtMzEzLDcgKzMzMyw4IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtT3JpZ2luYWxUaW1lVXMuaW5kZXhPZktleShoZWFkZXItPm5UaW1lU3RhbXApOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgQUxPR1YoIk9VVCB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCwgbU9yaWdpbmFsVGltZVVzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaGVhZGVyLT5uVGltZVN0YW1wKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtT3JpZ2luYWxUaW1lVXNbaW5kZXhdKSk7CiAgICAgICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSBtT3JpZ2luYWxUaW1lVXNbaW5kZXhdOwogICAgICAgICAgICAgbU9yaWdpbmFsVGltZVVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzI0LDcgKzM0NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1PcmlnaW5hbFRpbWVVcy5zaXplKCkgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykgewogICAgICAgICAgICAgLy8gc29tZXRoaW5nIHRlcnJpYmx5IHdyb25nIG11c3QgaGF2ZSBoYXBwZW5lZCwgZ2l2aW5nIHVwLi4uCi0gICAgICAgICAgICBBTE9HRSgibU9yaWdpbmFsVGltZVVzIGhhcyB0b28gbWFueSBlbnRyaWVzICglZCkiLAorICAgICAgICAgICAgQUxPR0UoIm1PcmlnaW5hbFRpbWVVcyBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5zaXplKCkpOwogICAgICAgICAgICAgbU1heFRpbWVzdGFtcEdhcFVzID0gLTFsbDsKICAgICAgICAgfQpAQCAtMzM5LDcgKzM2MCw3IEBACiAKICAgICAgICAgd2hpbGUgKG1OdW1GcmFtZXNBdmFpbGFibGUgPiAwKSB7CiAgICAgICAgICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLgpAQCAtMzUyLDcgKzM3Myw3IEBACiAKICAgICAgICAgICAgIC0tbU51bUZyYW1lc0F2YWlsYWJsZTsKIAotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgaXRlbS5tRmVuY2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKQEAgLTM4MSwxNSArNDAyLDE1IEBACiAgICAgaW50IGNiaSA9IGZpbmRBdmFpbGFibGVDb2RlY0J1ZmZlcl9sKCk7CiAgICAgaWYgKGNiaSA8IDApIHsKICAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCi0gICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWwgbm93ICVkIiwKKyAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLCBhdmFpbCBub3cgJXp1IiwKICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogYWNxdWlyaW5nIGJ1ZmZlciwgYXZhaWw9JWQiLAorICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogYWNxdWlyaW5nIGJ1ZmZlciwgYXZhaWw9JXp1IiwKICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbgogICAgICAgICBBTE9HVygiZmlsbENvZGVjQnVmZmVyX2w6IGZyYW1lIHdhcyBub3QgYXZhaWxhYmxlIik7CkBAIC00MTYsMTAgKzQzNywyMSBAQAogICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKICAgICB9CiAKLSAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworICAgIGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCisgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQorICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcCA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7CisgICAgICAgIC8vIGlmIHN0YXJ0IHRpbWUgaXMgc2V0LCBvZmZzZXQgdGltZSBzdGFtcCBieSBzdGFydCB0aW1lCisgICAgICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zID4gMCkgeworICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wIC09IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKyAgICB9CisKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dWKCJzdWJtaXRCdWZmZXJfbCBmYWlsZWQsIHJlbGVhc2luZyBicSBidWYgJWQiLCBpdGVtLm1CdWYpOwotICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiYnVmZmVyIHN1Ym1pdHRlZCAoYnEgJWQsIGNiaSAlZCkiLCBpdGVtLm1CdWYsIGNiaSk7CkBAIC00NDIsNyArNDc0LDcgQEAKICAgICAgICAgLy8KICAgICAgICAgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSB0cnkgdG8gcmVsZWFzZSB0aGUgYnVmZmVyLgogICAgICAgICBBTE9HRCgicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2w6IHNsb3Qgd2FzIE5VTEwiKTsKLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAogICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKQEAgLTQ5Niw3ICs1MjgsNyBAQAogCiAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA+PSAwKSB7CiAgICAgICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCiAgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCkBAIC01MjIsNyArNTU0LDcgQEAKIAogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBBTE9HVigic2lnbmFsRW5kT2ZJbnB1dFN0cmVhbTogZXhlYz0lZCBhdmFpbD0lZCBlb3M9JWQiLAorICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjPSVkIGF2YWlsPSV6dSBlb3M9JWQiLAogICAgICAgICAgICAgbUV4ZWN1dGluZywgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUVuZE9mU3RyZWFtKTsKIAogICAgIGlmIChtRW5kT2ZTdHJlYW0pIHsKQEAgLTU1MCw3ICs1ODIsMzIgQEAKIGludDY0X3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtKSB7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXAgLyAxMDAwOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCkgeworICAgIGlmIChtVGltZVBlckNhcHR1cmVVcyA+IDBsbCkgeworICAgICAgICAvLyBUaW1lIGxhcHNlIG9yIHNsb3cgbW90aW9uIG1vZGUKKyAgICAgICAgaWYgKG1QcmV2Q2FwdHVyZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjYXB0dXJlCisgICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIG1QcmV2RnJhbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNuYXAgdG8gbmVhcmVzdCBjYXB0dXJlIHBvaW50CisgICAgICAgICAgICBpbnQ2NF90IG5GcmFtZXMgPSAodGltZVVzICsgbVRpbWVQZXJDYXB0dXJlVXMgLyAyIC0gbVByZXZDYXB0dXJlVXMpCisgICAgICAgICAgICAgICAgICAgIC8gbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IG1QcmV2Q2FwdHVyZVVzICsgbkZyYW1lcyAqIG1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICAgICAgbVByZXZGcmFtZVVzICs9IG1UaW1lUGVyRnJhbWVVcyAqIG5GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigidGltZVVzICVsbGQsIGNhcHR1cmVVcyAlbGxkLCBmcmFtZVVzICVsbGQiLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2Q2FwdHVyZVVzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2RnJhbWVVcykpOworCisgICAgICAgIHJldHVybiBtUHJldkZyYW1lVXM7CisgICAgfSBlbHNlIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPiAwbGwpIHsKICAgICAgICAgLyogQ2FwIHRpbWVzdGFtcCBnYXAgYmV0d2VlbiBhZGphY2VudCBmcmFtZXMgdG8gc3BlY2lmaWVkIG1heAogICAgICAgICAgKgogICAgICAgICAgKiBJbiB0aGUgc2NlbmFyaW8gb2YgY2FzdCBtaXJyb3JpbmcsIGVuY29kaW5nIGNvdWxkIGJlIHN1c3BlbmRlZCBmb3IKQEAgLTU3NCw3ICs2MzEsOSBAQAogICAgICAgICBtUHJldk9yaWdpbmFsVGltZVVzID0gb3JpZ2luYWxUaW1lVXM7CiAgICAgICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5hZGQodGltZVVzLCBvcmlnaW5hbFRpbWVVcyk7Ci0gICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLCBvcmlnaW5hbFRpbWVVcywgdGltZVVzKTsKKyAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG9yaWdpbmFsVGltZVVzKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRpbWVVczsKQEAgLTU5NywxMCArNjU2LDIyIEBACiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciA9IGNvZGVjQnVmZmVyLm1IZWFkZXI7CiAgICAgQ0hFQ0soaGVhZGVyLT5uQWxsb2NMZW4gPj0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7Ci0gICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKLSAgICBtZW1jcHkoZGF0YSArIDQsICZoYW5kbGUsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlOworICAgIGlmICghbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKKyAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgIGhhbmRsZSA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7CisgICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CisgICAgICAgIG1lbWNweShkYXRhICsgNCwgJmhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNvZGVjQnVmZmVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBHcmFwaGljQnVmZmVyLCBzbworICAgICAgICAvLyBpdCBpcyB2YWxpZCB3aGlsZSBpdCBpcyB3aXRoIHRoZSBPTVggY29tcG9uZW50CisgICAgICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOworICAgICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOworICAgICAgICAvLyBwYXNzaW5nIGEgbm9uLXJlZmVyZW5jZS1jb3VudGVkIGdyYXBoaWNCdWZmZXIKKyAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCk7CisgICAgICAgIGhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOworICAgICAgICBtZW1jcHkoZGF0YSArIDQsICZidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eURpcmVjdEJ1ZmZlcihoZWFkZXIsIDAsCiAgICAgICAgICAgICA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCksIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUsCkBAIC02ODIsNyArNzUzLDcgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25GcmFtZUF2YWlsYWJsZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIAotICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIGV4ZWM9JWQgYXZhaWw9JWQiLAorICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIGV4ZWM9JWQgYXZhaWw9JXp1IiwKICAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogCiAgICAgaWYgKG1FbmRPZlN0cmVhbSB8fCBtU3VzcGVuZGVkKSB7CkBAIC02OTYsMTUgKzc2NywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKICAgICAgICAgICAgIC8vIHNsb3QgdGFibGUuCiAgICAgICAgICAgICBpZiAoaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtNzI0LDEzICs3OTUsMTMgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAotICAgIHVpbnQzMl90IHNsb3RNYXNrOwotICAgIGlmIChtQnVmZmVyUXVldWUtPmdldFJlbGVhc2VkQnVmZmVycygmc2xvdE1hc2spICE9IE5PX0VSUk9SKSB7CisgICAgdWludDY0X3Qgc2xvdE1hc2s7CisgICAgaWYgKG1Db25zdW1lci0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZzbG90TWFzaykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIm9uQnVmZmVyc1JlbGVhc2VkOiB1bmFibGUgdG8gZ2V0IHJlbGVhc2VkIGJ1ZmZlciBzZXQiKTsKLSAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmOworICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKICAgICB9CiAKLSAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTA4eCIsIHNsb3RNYXNrKTsKKyAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKICAgICAgICAgaWYgKChzbG90TWFzayAmIDB4MDEpICE9IDApIHsKQEAgLTc0MCw2ICs4MTEsMTEgQEAKICAgICB9CiB9CiAKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKwogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCiAgICAgICAgIGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwpAQCAtNzY0LDYgKzg0MCwyNyBAQAogCiAgICAgcmV0dXJuIE9LOwogfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9CisgICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgPyAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VVcyhpbnQ2NF90KiBkYXRhKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUV4ZWN1dGluZyB8fCBkYXRhWzBdIDw9IDBsbCB8fCBkYXRhWzFdIDw9IDBsbCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVRpbWVQZXJGcmFtZVVzID0gZGF0YVswXTsKKyAgICBtVGltZVBlckNhcHR1cmVVcyA9IGRhdGFbMV07CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRSZXBlYXRMYXN0RnJhbWU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCAzYjBlNDU0Li5jMDg2MGFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTQ5LDcgKzQ5LDggQEAKIGNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgewogcHVibGljOgogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGJvb2wgdXNlR3JhcGhpY0J1ZmZlckluTWV0YSA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyU291cmNlKCk7CiAKICAgICAvLyBXZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxzLCBzbyB3ZSBqdXN0IHNldApAQCAtNjEsNyArNjIsNyBAQAogICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCiAgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVyUXVldWU7CisgICAgICAgIHJldHVybiBtUHJvZHVjZXI7CiAgICAgfQogCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlRXhlY3V0aW5nLCB3aGljaCBtZWFucwpAQCAtMTE4LDYgKzExOSwxNyBAQAogICAgIC8vIG9mIHN1c3BlbnNpb24gb24gaW5wdXQuCiAgICAgc3RhdHVzX3Qgc2V0TWF4VGltZXN0YW1wR2FwVXMoaW50NjRfdCBtYXhHYXBVcyk7CiAKKyAgICAvLyBTZXRzIHRoZSB0aW1lIGxhcHNlIChvciBzbG93IG1vdGlvbikgcGFyYW1ldGVycy4KKyAgICAvLyBkYXRhWzBdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBwbGF5YmFjaworICAgIC8vIGRhdGFbMV0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIGNhcHR1cmUKKyAgICAvLyBXaGVuIHNldCwgdGhlIHNhbXBsZSdzIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIHBsYXliYWNrIGZyYW1lcmF0ZSwKKyAgICAvLyBhbmQgY2FwdHVyZSB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBjYXB0dXJlIHJhdGUuCisgICAgc3RhdHVzX3Qgc2V0VGltZUxhcHNlVXMoaW50NjRfdCogZGF0YSk7CisKKyAgICAvLyBTZXRzIHRoZSBzdGFydCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYmVmb3JlIHdoaWNoIHNob3VsZAorICAgIC8vIGJlIGRyb3BwZWQgYW5kIG5vdCBzdWJtaXR0ZWQgdG8gZW5jb2RlcgorICAgIHZvaWQgc2V0U2tpcEZyYW1lc0JlZm9yZVVzKGludDY0X3Qgc3RhcnRUaW1lVXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiBhIG5ldyBmcmFtZSBvZgogICAgIC8vIGRhdGEgaXMgYXZhaWxhYmxlLiAgSWYgd2UncmUgZXhlY3V0aW5nIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcwpAQCAtMTMyLDYgKzE0NCwxMSBAQAogICAgIC8vIHNldCBvZiBtQnVmZmVyU2xvdCBlbnRyaWVzLgogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpOwogCisgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcworICAgIC8vIGNoYW5nZWQgdGhlIHNpZGViYW5kIHN0cmVhbS4gR3JhcGhpY0J1ZmZlclNvdXJjZSBkb2Vzbid0IGhhbmRsZSBzaWRlYmFuZAorICAgIC8vIHN0cmVhbXMgc28gdGhpcyBpcyBhIG5vLW9wIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCkuCisgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CisKIHByaXZhdGU6CiAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2RlYyBpbnB1dCBidWZmZXJzLiAgVGhleSBtYXkgZWl0aGVyIGJlIGF2YWlsYWJsZQogICAgIC8vIChtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKSBvciBpbiB1c2UgYnkgdGhlIGNvZGVjLgpAQCAtMTk0LDggKzIxMSwxMSBAQAogCiAgICAgYm9vbCBtU3VzcGVuZGVkOwogCi0gICAgLy8gV2UgY29uc3VtZSBncmFwaGljIGJ1ZmZlcnMgZnJvbSB0aGlzLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gT3VyIEJ1ZmZlclF1ZXVlIGludGVyZmFjZXMuIG1Qcm9kdWNlciBpcyBwYXNzZWQgdG8gdGhlIHByb2R1Y2VyIHRocm91Z2gKKyAgICAvLyBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBhbmQgbUNvbnN1bWVyIGlzIHVzZWQgaW50ZXJuYWxseSB0byByZXRyaWV2ZQorICAgIC8vIHRoZSBidWZmZXJzIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIC8vIE51bWJlciBvZiBmcmFtZXMgcGVuZGluZyBpbiBCdWZmZXJRdWV1ZSB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4KICAgICAvLyBmb3J3YXJkZWQgdG8gdGhlIGNvZGVjLgpAQCAtMjIzLDE2ICsyNDMsMTcgQEAKICAgICBlbnVtIHsKICAgICAgICAga1JlcGVhdExhc3RGcmFtZUNvdW50ID0gMTAsCiAgICAgfTsKLSAgICBpbnQ2NF90IG1SZXBlYXRBZnRlclVzOwotICAgIGludDY0X3QgbU1heFRpbWVzdGFtcEdhcFVzOwogCiAgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgaW50NjRfdD4gbU9yaWdpbmFsVGltZVVzOworICAgIGludDY0X3QgbU1heFRpbWVzdGFtcEdhcFVzOwogICAgIGludDY0X3QgbVByZXZPcmlnaW5hbFRpbWVVczsKICAgICBpbnQ2NF90IG1QcmV2TW9kaWZpZWRUaW1lVXM7CisgICAgaW50NjRfdCBtU2tpcEZyYW1lc0JlZm9yZU5zOwogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPiA+IG1SZWZsZWN0b3I7CiAKKyAgICBpbnQ2NF90IG1SZXBlYXRBZnRlclVzOwogICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wOwogICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUNvdW50OwpAQCAtMjQ1LDYgKzI2NiwxNCBAQAogICAgIC8vIG5vIGNvZGVjIGJ1ZmZlciB3YXMgYXZhaWxhYmxlIGF0IHRoZSB0aW1lLgogICAgIGJvb2wgbVJlcGVhdEJ1ZmZlckRlZmVycmVkOwogCisgICAgLy8gVGltZSBsYXBzZSAvIHNsb3cgbW90aW9uIGNvbmZpZ3VyYXRpb24KKyAgICBpbnQ2NF90IG1UaW1lUGVyQ2FwdHVyZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVByZXZDYXB0dXJlVXM7CisgICAgaW50NjRfdCBtUHJldkZyYW1lVXM7CisKKyAgICBib29sIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhOworCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHcmFwaGljQnVmZmVyU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggNzgxOWZjMy4uNDE0MDdlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICAgICAgaW5zdGFuY2UsICZoYW5kbGUpOwogCiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIiwgbmFtZSk7CisgICAgICAgIEFMT0dFKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIiwgbmFtZSk7CiAKICAgICAgICAgaW5zdGFuY2UtPm9uR2V0SGFuZGxlRmFpbGVkKCk7CiAKQEAgLTM0Miw2ICszNDIsMTMgQEAKICAgICAgICAgICAgIHBvcnRJbmRleCwgZW5hYmxlLCBtYXhGcmFtZVdpZHRoLCBtYXhGcmFtZUhlaWdodCk7CiB9CiAKK3N0YXR1c190IE9NWDo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBwb3J0SW5kZXgsIHR1bm5lbGVkLCBhdWRpb0h3U3luYywgc2lkZWJhbmRIYW5kbGUpOworfQorCiBzdGF0dXNfdCBPTVg6OnVzZUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC00NzIsOCArNDc5LDYgQEAKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9sZW5ndGggPSBwQnVmZmVyLT5uRmlsbGVkTGVuOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzID0gcEJ1ZmZlci0+bkZsYWdzOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA9IHBCdWZmZXItPm5UaW1lU3RhbXA7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSA9IHBCdWZmZXItPnBQbGF0Zm9ybVByaXZhdGU7Ci0gICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZGF0YV9wdHIgPSBwQnVmZmVyLT5wQnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCA2YjZkMGFiLi5hZTNjYjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9Nb3JlKSB7Ci0gICAgICAgIEFMT0dFKCJPTVggcGx1Z2luIGZhaWxlZCB3LyBlcnJvciAweCUwOHggYWZ0ZXIgcmVnaXN0ZXJpbmcgJWQgIgorICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICV6dSAiCiAgICAgICAgICAgICAgImNvbXBvbmVudHMiLCBlcnIsIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGM2NGRjZjAuLmY5Yzg0ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0xNDksNiArMTQ5LDExIEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZyZWVOb2RlKE9NWE1hc3RlciAqbWFzdGVyKSB7CiAgICAgc3RhdGljIGludDMyX3Qga01heE51bUl0ZXJhdGlvbnMgPSAxMDsKIAorICAgIC8vIGV4aXQgaWYgd2UgaGF2ZSBhbHJlYWR5IGZyZWVkIHRoZSBub2RlCisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gVHJhbnNpdGlvbiB0aGUgbm9kZSBmcm9tIGl0cyBjdXJyZW50IHN0YXRlIGFsbCB0aGUgd2F5IGRvd24KICAgICAvLyB0byAiTG9hZGVkIi4KICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgYWN0aXZlIGJ1ZmZlcnMgYXJlIHByb3Blcmx5IGZyZWVkIGV2ZW4KQEAgLTM5MywyMCArMzk4LDM5IEBACiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICBPTVhfQk9PTCBlbmFibGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBlbmFibGUpOworICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCisgICAgICAgICAgICBwb3J0SW5kZXgsIGVuYWJsZSwKKyAgICAgICAgICAgIE9NWF9GQUxTRSAvKiB1c2VHcmFwaGljQnVmZmVyICovLCBOVUxMIC8qIHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgKi8pOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9CT09MIGVuYWJsZSkgeworICAgICAgICBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgIE9NWF9CT09MIHVzZUdyYXBoaWNCdWZmZXIsCisgICAgICAgIE9NWF9CT09MICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhKSB7CiAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKICAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIik7CiAKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIE9NWF9TVFJJTkcgZ3JhcGhpY0J1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIik7CisgICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gJnVzZUdyYXBoaWNCdWZmZXI7CisgICAgfQorCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPQorICAgICAgICAodXNlR3JhcGhpY0J1ZmZlciAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KQorICAgICAgICAgICAgICAgID8gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIGdyYXBoaWNCdWZmZXJOYW1lLCAmaW5kZXgpCisgICAgICAgICAgICAgICAgOiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgIH0KKwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBBTE9HRSgiT01YX0dldEV4dGVuc2lvbkluZGV4ICVzIGZhaWxlZCIsIG5hbWUpOwotCiAgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAKQEAgLTQyMSw2ICs0NDUsNyBAQAogICAgIHBhcmFtcy5iU3RvcmVNZXRhRGF0YSA9IGVuYWJsZTsKICAgICBpZiAoKGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpKSAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIEFMT0dFKCJPTVhfU2V0UGFyYW1ldGVyKCkgZmFpbGVkIGZvciBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzOiAweCUwOHgiLCBlcnIpOworICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogICAgIHJldHVybiBlcnI7CkBAIC00NjAsNiArNDg1LDQ5IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwgT01YX1UzMiBhdWRpb0h3U3luYywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgT01YX0lOREVYVFlQRSBpbmRleDsKKyAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAorICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUiKTsKKworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZXh0ZW5zaW9uIGlzIG1pc3NpbmchIik7CisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICBDb25maWd1cmVWaWRlb1R1bm5lbE1vZGVQYXJhbXMgdHVubmVsUGFyYW1zOworICAgIHR1bm5lbFBhcmFtcy5uU2l6ZSA9IHNpemVvZih0dW5uZWxQYXJhbXMpOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHR1bm5lbFBhcmFtcy5uVmVyc2lvbi5zLm5SZXZpc2lvbiA9IDA7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublN0ZXAgPSAwOworCisgICAgdHVubmVsUGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgdHVubmVsUGFyYW1zLmJUdW5uZWxlZCA9IHR1bm5lbGVkOworICAgIHR1bm5lbFBhcmFtcy5uQXVkaW9Id1N5bmMgPSBhdWRpb0h3U3luYzsKKyAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmdHVubmVsUGFyYW1zKTsKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGVyciA9IE9NWF9HZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZ0dW5uZWxQYXJhbXMpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBBTE9HRSgiR2V0VmlkZW9UdW5uZWxXaW5kb3cgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKHNpZGViYW5kSGFuZGxlKSB7CisgICAgICAgICpzaWRlYmFuZEhhbmRsZSA9IChuYXRpdmVfaGFuZGxlX3QqKXR1bm5lbFBhcmFtcy5wU2lkZWJhbmRXaW5kb3c7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAogICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyKSB7CkBAIC02NDAsNyArNzA4LDEwIEBACiAgICAgfQogCiAgICAgLy8gSW5wdXQgYnVmZmVycyB3aWxsIGhvbGQgbWV0YS1kYXRhIChncmFsbG9jIHJlZmVyZW5jZXMpLgotICAgIGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIE9NWF9UUlVFKTsKKyAgICBPTVhfQk9PTCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgcG9ydEluZGV4LCBPTVhfVFJVRSwKKyAgICAgICAgICAgIE9NWF9UUlVFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sICZ1c2luZ0dyYXBoaWNCdWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC02NjYsNyArNzM3LDcgQEAKIAogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UqIGJ1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKAogICAgICAgICAgICAgdGhpcywgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIHVzaW5nR3JhcGhpY0J1ZmZlcik7CiAgICAgaWYgKChlcnIgPSBidWZmZXJTb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgewogICAgICAgICBkZWxldGUgYnVmZmVyU291cmNlOwogICAgICAgICByZXR1cm4gZXJyOwpAQCAtODU1LDYgKzkyNiw4IEBACiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NVU1BFTkQ6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWToKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVA6CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1NUQVJUX1RJTUU6CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0U6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UgPQogICAgICAgICAgICAgICAgIGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKQEAgLTg3OSw3ICs5NTIsOCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyhkZWxheVVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQKXsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KQEAgLTg4Nyw2ICs5NjEsMjAgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heEdhcFVzID0gKihpbnQ2NF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJTb3VyY2UtPnNldE1heFRpbWVzdGFtcEdhcFVzKG1heEdhcFVzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSkgeworICAgICAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMgPSAqKGludDY0X3QgKilkYXRhOworCisgICAgICAgICAgICAgICAgYnVmZmVyU291cmNlLT5zZXRTa2lwRnJhbWVzQmVmb3JlVXMoc2tpcEZyYW1lc0JlZm9yZVVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFCisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpICogMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyU291cmNlLT5zZXRUaW1lTGFwc2VVcygoaW50NjRfdCAqKWRhdGEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggZDQ5ZTUwYi4uOWI2OTU4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtNDIsNiArNDIsNyBAQAogICAgIHsgIk9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIsICJhbXJ3YmVuYyIsICJhdWRpb19lbmNvZGVyLmFtcndiIiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiwgImgyNjRkZWMiLCAidmlkZW9fZGVjb2Rlci5hdmMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjY0LmVuY29kZXIiLCAiaDI2NGVuYyIsICJ2aWRlb19lbmNvZGVyLmF2YyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIsICJoZXZjZGVjIiwgInZpZGVvX2RlY29kZXIuaGV2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIsICJtcGVnNGRlYyIsICJ2aWRlb19kZWNvZGVyLmgyNjMiIH0sCkBAIC01MCw2ICs1MSw3IEBACiAgICAgeyAiT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiwgIm1wZWc0ZW5jIiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5tcDMuZGVjb2RlciIsICJtcDNkZWMiLCAiYXVkaW9fZGVjb2Rlci5tcDMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIsICJ2b3JiaXNkZWMiLCAiYXVkaW9fZGVjb2Rlci52b3JiaXMiIH0sCisgICAgeyAiT01YLmdvb2dsZS5vcHVzLmRlY29kZXIiLCAib3B1c2RlYyIsICJhdWRpb19kZWNvZGVyLm9wdXMiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDguZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cDgiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDkuZGVjb2RlciIsICJ2cHhkZWMiLCAidmlkZW9fZGVjb2Rlci52cDkiIH0sCiAgICAgeyAiT01YLmdvb2dsZS52cDguZW5jb2RlciIsICJ2cHhlbmMiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggZWI5ZmNmNy4uMmY4MzYxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtNTAsNiArNTEsOSBAQAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQogICAgICAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgICBtSXNBZGFwdGl2ZShmYWxzZSksCisgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoKDApLAorICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQoMCksCiAgICAgICAgIG1XaWR0aCh3aWR0aCksCiAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKICAgICAgICAgbUNyb3BMZWZ0KDApLApAQCAtMTE5LDE2ICsxMjMsMTggQEAKICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKIH0KIAotdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Ojp1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKSB7Cit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucyhib29sIHVwZGF0ZUNyb3ApIHsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMyAvIDI7CisKICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOwotICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwotICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKQEAgLTEzNiwxMCArMTQyLDEwNSBAQAogICAgICAgICAgICAgKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICoKICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7CiAKLSAgICBtQ3JvcExlZnQgPSAwOwotICAgIG1Dcm9wVG9wID0gMDsKLSAgICBtQ3JvcFdpZHRoID0gbVdpZHRoOwotICAgIG1Dcm9wSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBpZiAodXBkYXRlQ3JvcCkgeworICAgICAgICBtQ3JvcExlZnQgPSAwOworICAgICAgICBtQ3JvcFRvcCA9IDA7CisgICAgICAgIG1Dcm9wV2lkdGggPSBtV2lkdGg7CisgICAgICAgIG1Dcm9wSGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9Cit9CisKKwordWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVyV2lkdGgoKSB7CisgICAgcmV0dXJuIG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4V2lkdGggOiBtV2lkdGg7Cit9CisKK3VpbnQzMl90IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om91dHB1dEJ1ZmZlckhlaWdodCgpIHsKKyAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBtSGVpZ2h0OworfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgQ3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlLCBib29sIGZha2VTdHJpZGUpIHsKKyAgICAqcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGJvb2wgc2l6ZUNoYW5nZWQgPSAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KTsKKyAgICBib29sIHVwZGF0ZUNyb3AgPSAoY3JvcFNldHRpbmdzTW9kZSA9PSBrQ3JvcFVuU2V0KTsKKyAgICBib29sIGNyb3BDaGFuZ2VkID0gKGNyb3BTZXR0aW5nc01vZGUgPT0ga0Nyb3BDaGFuZ2VkKTsKKyAgICBib29sIHN0cmlkZUNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZmFrZVN0cmlkZSkgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICBpZiAoZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAhPSB3aWR0aCB8fCBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgIT0gaGVpZ2h0KSB7CisgICAgICAgICAgICBzdHJpZGVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplQ2hhbmdlZCB8fCBjcm9wQ2hhbmdlZCB8fCBzdHJpZGVDaGFuZ2VkKSB7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIGlmICgoc2l6ZUNoYW5nZWQgJiYgIW1Jc0FkYXB0aXZlKQorICAgICAgICAgICAgfHwgd2lkdGggPiBtQWRhcHRpdmVNYXhXaWR0aAorICAgICAgICAgICAgfHwgaGVpZ2h0ID4gbUFkYXB0aXZlTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAobUlzQWRhcHRpdmUpIHsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBtQWRhcHRpdmVNYXhXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID4gbUFkYXB0aXZlTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnModXBkYXRlQ3JvcCk7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwga091dHB1dFBvcnRJbmRleCwgMCwgTlVMTCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAqcG9ydFdpbGxSZXNldCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnModXBkYXRlQ3JvcCk7CisKKyAgICAgICAgICAgIGlmIChmYWtlU3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gTUFKT1IgSEFDSyB0aGF0IGlzIG5vdCBwcmV0dHksIGl0J3MganVzdCB0byBmb29sIHRoZSByZW5kZXJlciB0byByZWFkIHRoZSBjb3JyZWN0CisgICAgICAgICAgICAgICAgLy8gZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBTb21lIHNvZnR3YXJlIGRlY29kZXJzIChlLmcuIFNvZnRNUEVHNCkgZmlsbCBkZWNvZGVkIGZyYW1lIGRpcmVjdGx5IHRvIG91dHB1dAorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdXRwdXQgYnVmZmVyIHN0cmlkZSBhbmQgc2xpY2UgaGVpZ2h0LiBTbyB0aGlzIGlzCisgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzaWduYWwgaG93IHRoZSBidWZmZXIgaXMgYXJyYW5nZWQuICBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gcmUtYXJyYW5nZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIGluIFNvZnRNUEVHNCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBtZW1jb3BpZXMuCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gbVdpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsIE5VTEwpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlKSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGRzdFlTdHJpZGUgLyAyOworICAgIHNpemVfdCBkc3RIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCBtV2lkdGgpOworICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogZHN0SGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgbVdpZHRoIC8gMik7CisgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoNSAqIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQpIC8gNDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIG1XaWR0aCAvIDIpOworICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKQEAgLTE4MywxMiArMjg0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1tpbmRleF0ubVByb2ZpbGU7Ci0gICAgICAgICAgICBwcm9maWxlTGV2ZWwtPmVMZXZlbCAgID0gbVByb2ZpbGVMZXZlbHNbaW5kZXhdLm1MZXZlbDsKKyAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1twcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXhdLm1Qcm9maWxlOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lTGV2ZWwgICA9IG1Qcm9maWxlTGV2ZWxzW3Byb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleF0ubUxldmVsOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMTk5LDcgKzMwMCwxMCBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAvLyBJbmNsdWRlIGV4dGVuc2lvbiBpbmRleCBPTVhfSU5ERVhFWFRUWVBFLgorICAgIGNvbnN0IGludDMyX3QgaW5kZXhGdWxsID0gaW5kZXg7CisKKyAgICBzd2l0Y2ggKGluZGV4RnVsbCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpAQCAtMjMwLDYgKzMzNCw1OCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyogYWRhcHRpdmVQbGF5YmFja1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyAqKXBhcmFtczsKKyAgICAgICAgICAgIG1Jc0FkYXB0aXZlID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+YkVuYWJsZTsKKyAgICAgICAgICAgIGlmIChtSXNBZGFwdGl2ZSkgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lV2lkdGg7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gYWRhcHRpdmVQbGF5YmFja1BhcmFtcy0+bk1heEZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgIG1XaWR0aCA9IG1BZGFwdGl2ZU1heFdpZHRoOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBtQWRhcHRpdmVNYXhIZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoID0gMDsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICAgICAgeworICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqbmV3UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKyAgICAgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgKnZpZGVvX2RlZiA9ICZuZXdQYXJhbXMtPmZvcm1hdC52aWRlbzsKKyAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8obmV3UGFyYW1zLT5uUG9ydEluZGV4KS0+bURlZjsKKworICAgICAgICAgICAgdWludDMyX3Qgb2xkV2lkdGggPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG9sZEhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1dpZHRoID0gdmlkZW9fZGVmLT5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld0hlaWdodCA9IHZpZGVvX2RlZi0+bkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgaWYgKG5ld1dpZHRoICE9IG9sZFdpZHRoIHx8IG5ld0hlaWdodCAhPSBvbGRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBib29sIG91dHB1dFBvcnQgPSAobmV3UGFyYW1zLT5uUG9ydEluZGV4ID09IGtPdXRwdXRQb3J0SW5kZXgpOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgKG1Jc0FkYXB0aXZlICYmIG91dHB1dFBvcnQpID8gbUFkYXB0aXZlTWF4V2lkdGggOiBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAobUlzQWRhcHRpdmUgJiYgb3V0cHV0UG9ydCkgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBkZWYtPm5CdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0UG9ydCkgeworICAgICAgICAgICAgICAgICAgICBtV2lkdGggPSBuZXdXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbUhlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BUb3AgPSAwOworICAgICAgICAgICAgICAgICAgICBtQ3JvcFdpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wSGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdQYXJhbXMtPm5CdWZmZXJTaXplID0gZGVmLT5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgfQpAQCAtMjU5LDYgKzQxNSwxNiBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIikpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKKyAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZjE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgorCisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUdyYWxsb2NNb2R1bGUoTlVMTCkgeworfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Q29udmVydEZsZXhZVVZUb1BsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgKnljYmNyLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IChjb25zdCB1aW50OF90ICopeWNiY3ItPnk7CisgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopeWNiY3ItPmNiOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKXljYmNyLT5jcjsKKyAgICB1aW50OF90ICpkc3RVID0gZHN0ICsgZHN0VlN0cmlkZSAqIGRzdFN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RWU3RyaWRlID4+IDEpICogKGRzdFN0cmlkZSA+PiAxKTsKKworICAgIGZvciAoc2l6ZV90IHkgPSBoZWlnaHQ7IHkgPiAwOyAtLXkpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CisgICAgICAgIHNyYyArPSB5Y2Jjci0+eXN0cmlkZTsKKyAgICB9CisgICAgaWYgKHljYmNyLT5jc3RyaWRlID09IHljYmNyLT55c3RyaWRlID4+IDEgJiYgeWNiY3ItPmNocm9tYV9zdGVwID09IDEpIHsKKyAgICAgICAgLy8gcGxhbmFyCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSBoZWlnaHQgPj4gMTsgeSA+IDA7IC0teSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoID4+IDEpOworICAgICAgICAgICAgZHN0VSArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHNyY1UgKz0geWNiY3ItPmNzdHJpZGU7CisgICAgICAgICAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggPj4gMSk7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgc3JjViArPSB5Y2Jjci0+Y3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGFyYml0cmFyeQorICAgICAgICBmb3IgKHNpemVfdCB5ID0gaGVpZ2h0ID4+IDE7IHkgPiAwOyAtLXkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSB3aWR0aCA+PiAxOyB4ID4gMDsgLS14KSB7CisgICAgICAgICAgICAgICAgKmRzdFUrKyA9ICpzcmNVOworICAgICAgICAgICAgICAgICpkc3RWKysgPSAqc3JjVjsKKyAgICAgICAgICAgICAgICBzcmNVICs9IHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgICAgICAgICBzcmNWICs9IHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFUgKz0gKGRzdFN0cmlkZSA+PiAxKSAtICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGRzdFYgKz0gKGRzdFN0cmlkZSA+PiAxKSAtICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIHNyY1UgKz0geWNiY3ItPmNzdHJpZGUgLSAod2lkdGggPj4gMSkgKiB5Y2Jjci0+Y2hyb21hX3N0ZXA7CisgICAgICAgICAgICBzcmNWICs9IHljYmNyLT5jc3RyaWRlIC0gKHdpZHRoID4+IDEpICogeWNiY3ItPmNocm9tYV9zdGVwOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Q29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5ZVlUsIHVpbnQ4X3QqIG91dFlVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igc3RyaWRlCisgICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHVpbnQzMl90ICpvdXRZICA9ICh1aW50MzJfdCAqKSBvdXRZVVY7CisgICAgdWludDE2X3QgKm91dENiID0gKHVpbnQxNl90ICopIChvdXRZVVYgKyBvdXRZc2l6ZSk7CisgICAgdWludDE2X3QgKm91dENyID0gKHVpbnQxNl90ICopIChvdXRZVVYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7CisKKyAgICAvKiBZIGNvcHlpbmcgKi8KKyAgICBtZW1jcHkob3V0WSwgaW5ZVlUsIG91dFlzaXplKTsKKworICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KKyAgICAvLyBGSVhNRSB0aGlzIG9ubHkgd29ya3MgaWYgd2lkdGggaXMgbXVsdGlwbGUgb2YgNAorICAgIHVpbnQzMl90ICppbllWVV80ID0gKHVpbnQzMl90ICopIChpbllWVSArIG91dFlzaXplKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbllWVV80Kys7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOworICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOworCisgICAgICAgICAgICAqb3V0Q2IrKyA9IHRlbXBVOworICAgICAgICAgICAgKm91dENyKysgPSB0ZW1wVjsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OkNvbnZlcnRSR0IzMlRvUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCisgICAgICAgIGJvb2wgYmdyKSB7CisgICAgQ0hFQ0soKHdpZHRoICYgMSkgPT0gMCk7CisgICAgQ0hFQ0soKGhlaWdodCAmIDEpID09IDApOworCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+PiAxKSAqIChkc3RWU3RyaWRlID4+IDEpOworCisjaWZkZWYgU1VSRkFDRV9JU19CR1IzMgorICAgIGJnciA9ICFiZ3I7CisjZW5kaWYKKworICAgIGNvbnN0IHNpemVfdCByZWRPZmZzZXQgICA9IGJnciA/IDIgOiAwOworICAgIGNvbnN0IHNpemVfdCBncmVlbk9mZnNldCA9IDE7CisgICAgY29uc3Qgc2l6ZV90IGJsdWVPZmZzZXQgID0gYmdyID8gMCA6IDI7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgdW5zaWduZWQgcmVkICAgPSBzcmNbcmVkT2Zmc2V0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuID0gc3JjW2dyZWVuT2Zmc2V0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGJsdWUgID0gc3JjW2JsdWVPZmZzZXRdOworCisgICAgICAgICAgICAvLyB1c2luZyBJVFUtUiBCVC42MDEgY29udmVyc2lvbiBtYXRyaXgKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQorICAgICAgICAgICAgICAgICgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNjsKKworICAgICAgICAgICAgZHN0WVt4XSA9IGx1bWE7CisKKyAgICAgICAgICAgIGlmICgoeCAmIDEpID09IDAgJiYgKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgVSA9CisgICAgICAgICAgICAgICAgICAgICgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4OworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9CisgICAgICAgICAgICAgICAgICAgICgocmVkICogMTEyIC0gZ3JlZW4gKiA5NCAtIGJsdWUgKiAxOCkgPj4gOCkgKyAxMjg7CisKKyAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOworICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgc3JjICs9IHNyY1N0cmlkZSAtIDQgKiB3aWR0aDsKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorfQorCitjb25zdCB1aW50OF90ICpTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgc2l6ZV90IGRzdFN0cmlkZSA9IHdpZHRoOworICAgIHNpemVfdCBkc3RWU3RyaWRlID0gaGVpZ2h0OworCisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSAqKE1ldGFkYXRhQnVmZmVyVHlwZSAqKXNyYzsKKyAgICBib29sIHVzaW5nR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlclR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7CisgICAgaWYgKCF1c2luZ0dyYXBoaWNCdWZmZXIgJiYgYnVmZmVyVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWV0YWRhdGEgdHlwZSAoJWQpIiwgYnVmZmVyVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtR3JhbGxvY01vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIENIRUNLX0VRKDAsIGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtR3JhbGxvY01vZHVsZSkpOworICAgIH0KKworICAgIGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKmdybW9kdWxlID0KKyAgICAgICAgKGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKiltR3JhbGxvY01vZHVsZTsKKworICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGU7CisgICAgaW50IGZvcm1hdDsKKyAgICBzaXplX3Qgc3JjU3RyaWRlOworICAgIHNpemVfdCBzcmNWU3RyaWRlOworICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXIpIHsKKyAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gKihHcmFwaGljQnVmZmVyICoqKShzcmMgKyA0KTsKKyAgICAgICAgaGFuZGxlID0gYnVmZmVyLT5oYW5kbGU7CisgICAgICAgIGZvcm1hdCA9IGJ1ZmZlci0+Zm9ybWF0OworICAgICAgICBzcmNTdHJpZGUgPSBidWZmZXItPnN0cmlkZTsKKyAgICAgICAgc3JjVlN0cmlkZSA9IGJ1ZmZlci0+aGVpZ2h0OworICAgICAgICAvLyBjb252ZXJ0IHN0cmlkZSBmcm9tIHBpeGVscyB0byBieXRlcworICAgICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMiAmJgorICAgICAgICAgICAgZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICAgICAgLy8gVE9ETyBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgb3RoZXIgZm9ybWF0cz8KKyAgICAgICAgICAgIHNyY1N0cmlkZSAqPSA0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgcGFydC4gIENoZWNrIGlmIGFueW9uZSB1c2VzIHRoaXMuCisKKyAgICAgICAgaWYgKHNyY1NpemUgPCA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QgKikoc3JjICsgNCk7CisgICAgICAgIC8vIGFzc3VtZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OAorICAgICAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBzcmMgc3RyaWRlIHdpdGhvdXQgdGhlIGdyYXBoaWMgYnVmZmVyCisgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OworICAgICAgICBzcmNTdHJpZGUgPSB3aWR0aCAqIDQ7CisgICAgICAgIHNyY1ZTdHJpZGUgPSBoZWlnaHQ7CisgICAgfQorCisgICAgc2l6ZV90IG5lZWRlZFNpemUgPQorICAgICAgICBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICsgKHdpZHRoID4+IDEpCisgICAgICAgICAgICAgICAgKyAoZHN0U3RyaWRlID4+IDEpICogKChkc3RWU3RyaWRlID4+IDEpICsgKGhlaWdodCA+PiAxKSAtIDEpOworICAgIGlmIChkc3RTaXplIDwgbmVlZGVkU2l6ZSkgeworICAgICAgICBBTE9HRSgiZGVzdGluYXRpb24gYnVmZmVyIGlzIHRvbyBzbWFsbCAoJXp1IHZzICV6dSkiLCBkc3RTaXplLCBuZWVkZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdm9pZCAqYml0cyA9IE5VTEw7CisgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgeWNiY3I7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CisgICAgICAgIHJlcyA9IGdybW9kdWxlLT5sb2NrX3ljYmNyKAorICAgICAgICAgICAgICAgICBncm1vZHVsZSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAorICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmeWNiY3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IGdybW9kdWxlLT5sb2NrKAorICAgICAgICAgICAgICAgICBncm1vZHVsZSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAorICAgICAgICAgICAgICAgICAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0cyk7CisgICAgfQorICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6ICAvLyBZQ3JDYiAvIFlWVSBwbGFuYXIKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZmxleCBZVVYKKyAgICAgICAgICAgIHljYmNyLnkgPSBiaXRzOworICAgICAgICAgICAgeWNiY3IuY3IgPSAodWludDhfdCAqKWJpdHMgKyBzcmNTdHJpZGUgKiBzcmNWU3RyaWRlOworICAgICAgICAgICAgeWNiY3IuY2IgPSAodWludDhfdCAqKXljYmNyLmNyICsgKHNyY1N0cmlkZSA+PiAxKSAqIChzcmNWU3RyaWRlID4+IDEpOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAxOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHljYmNyLnlzdHJpZGUgPSBzcmNWU3RyaWRlOworICAgICAgICAgICAgQ29udmVydEZsZXhZVVZUb1BsYW5hcihkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwgJnljYmNyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOiAgLy8gWUNyQ2IgLyBZVlUgc2VtaXBsYW5hciwgTlYyMQorICAgICAgICAgICAgLy8gY29udmVydCB0byBmbGV4IFlVVgorICAgICAgICAgICAgeWNiY3IueSA9IGJpdHM7CisgICAgICAgICAgICB5Y2Jjci5jciA9ICh1aW50OF90ICopYml0cyArIHNyY1N0cmlkZSAqIHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci5jYiA9ICh1aW50OF90ICopeWNiY3IuY3IgKyAxOworICAgICAgICAgICAgeWNiY3IuY2hyb21hX3N0ZXAgPSAyOworICAgICAgICAgICAgeWNiY3IuY3N0cmlkZSA9IHNyY1ZTdHJpZGU7CisgICAgICAgICAgICB5Y2Jjci55c3RyaWRlID0gc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsICZ5Y2Jjciwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6CisgICAgICAgICAgICBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLCAmeWNiY3IsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgICAgICBDb252ZXJ0UkdCMzJUb1BsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYml0cywgd2lkdGgsIGhlaWdodCwgc3JjU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICBkc3QgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGdybW9kdWxlLT51bmxvY2soZ3Jtb2R1bGUsIGhhbmRsZSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB1bmxvY2sgaW1hZ2UgYnVmZmVyICVwIGZvciBhY2Nlc3MiLCBoYW5kbGUpOworICAgIH0KKworICAgIHJldHVybiBkc3Q7Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikgfHwKKyAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlR3JhcGhpY0J1ZmZlckluTWV0YURhdGEiKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGUzNjgxMzQuLjQ0N2IyOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xMSw2ICsxMSw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IG9teF90ZXN0cwogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDQ0ZTRmOWQuLmY0ZGZkNmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtMjQyLDcgKzI0Myw4IEBACiB9OwogCiBzdGF0aWMgc3A8TWVkaWFFeHRyYWN0b3I+IENyZWF0ZUV4dHJhY3RvckZyb21VUkkoY29uc3QgY2hhciAqdXJpKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgdXJpKTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ2MSw2ICs0NjMsNyBAQAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpby9tcDRhLWxhdG0iIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIubXAzIiwgImF1ZGlvL21wZWciIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvL3ZvcmJpcyIgfSwKKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvL29wdXMiIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyB9LAogICAgIH07CkBAIC00OTMsNiArNDk2LDcgQEAKICAgICAgICAgeyAiYXVkaW8vbXBlZyIsCiAgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfQ0JSLm1wMyIgfSwKICAgICAgICAgeyAiYXVkaW8vdm9yYmlzIiwgTlVMTCB9LAorICAgICAgICB7ICJhdWRpby9vcHVzIiwgTlVMTCB9LAogICAgICAgICB7ICJ2aWRlby94LXZuZC5vbjIudnA4IiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJmaWxlOi8vL3NkY2FyZC9NMUYxLUFsYXctQUZzcC53YXYiIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAppbmRleCA5OGI1MGRkLi43ZWI2NTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKQEAgLTI0OSwxMSArMjQ5LDE1IEBACiAgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhidWZmZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KIAotICAgICAgICBDSEVDS19HRShidWZmZXItPnNpemUoKSwgMnUpOwogICAgICAgICB1bnNpZ25lZCBBVV9oZWFkZXJzX2xlbmd0aCA9IFUxNl9BVChidWZmZXItPmRhdGEoKSk7ICAvLyBpbiBiaXRzCiAKLSAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDgpOworICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyICsgKEFVX2hlYWRlcnNfbGVuZ3RoICsgNykgLyA4KSB7CisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQogCiAgICAgICAgIExpc3Q8QVVIZWFkZXI+IGhlYWRlcnM7CiAKQEAgLTM0Miw3ICszNDYsOSBAQAogICAgICAgICAgICAgIGl0ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgIGNvbnN0IEFVSGVhZGVyICZoZWFkZXIgPSAqaXQ7CiAKLSAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIGhlYWRlci5tU2l6ZSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgb2Zmc2V0ICsgaGVhZGVyLm1TaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihoZWFkZXIubVNpemUpOwogICAgICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGhlYWRlci5tU2l6ZSk7CkBAIC0zNTMsNyArMzU5LDEwIEBACiAgICAgICAgICAgICBtUGFja2V0cy5wdXNoX2JhY2soYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIAotICAgICAgICBDSEVDS19FUShvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG9mZnNldCAhPSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coInBvdGVudGlhbGx5IG1hbGZvcm1lZCBwYWNrZXQgKG9mZnNldCAlZCwgc2l6ZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CkBAIC00MDAsNiArNDA5LDcgQEAKICAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgewogICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOwogICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBBTE9HSSgiYWNjZXNzIHVuaXQgaXMgZGFtYWdlZCIpOwogICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggNDYyYzM4NC4uMDlmNTJiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiQVJhd0F1ZGlvQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCA0OTJiZDRhLi5mMjU1MzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yMzksNyArMjM5LDcgQEAKICAgICAgICAgLy8gcmlnaHQgaGVyZSwgc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGFza2luZyB0aGUgdXNlcgogICAgICAgICAvLyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KIAotICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIHJ0c3AgdXJsIDxVUkwgc3VwcHJlc3NlZD4iKTsKKyAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBydHNwIHVybCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBFUlJPUl9NQUxGT1JNRUQpOwogICAgICAgICByZXBseS0+cG9zdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggYTliMzMzMC4uOTg0OThlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0zMTksNiArMzE5LDExIEBACiAKICAgICBzID0gZW5kICsgMTsgIC8vIHNraXAgdGhlIGRhc2guCiAKKyAgICBpZiAoKnMgPT0gJ1wwJykgeworICAgICAgICAqbnB0MiA9IEZMVF9NQVg7ICAvLyBvcGVuIGVuZGVkLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAoIXN0cm5jbXAoIm5vdyIsIHMsIDMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIGFic29sdXRlIGVuZCB0aW1lIGF2YWlsYWJsZQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawppbmRleCAzNmU4ZDgyLi5kNjBkYzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIFNEUExvYWRlci5jcHAgICAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIApAQCAtMzAsNiArMzAsOCBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKIAogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggZTc1ODBjMi4uNDIzYTQyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0xOSw3ICsxOSwxMSBAQAogI2RlZmluZSBNWV9IQU5ETEVSX0hfCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2lmbmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIk15SGFuZGxlciIKKyNlbmRpZgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCkBAIC00Miw2ICs0NiwxMiBAQAogCiAjaW5jbHVkZSAiSFRUUEJhc2UuaCIKIAorI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCisjZW5kaWYKKwogLy8gSWYgbm8gYWNjZXNzIHVuaXRzIGFyZSByZWNlaXZlZCB3aXRoaW4gNSBzZWNzLCBhc3N1bWUgdGhhdCB0aGUgcnRwCiAvLyBzdHJlYW0gaGFzIGVuZGVkIGFuZCBzaWduYWwgZW5kIG9mIHN0cmVhbS4KIHN0YXRpYyBpbnQ2NF90IGtBY2Nlc3NVbml0VGltZW91dFVzID0gMTAwMDAwMDBsbDsKQEAgLTE3OCw3ICsxODgsNyBAQAogICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICB9CiAKLSAgICBBU3RyaW5nIGdldENvbnRyb2xVUkwoc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gZGVzYykgeworICAgIEFTdHJpbmcgZ2V0Q29udHJvbFVSTCgpIHsKICAgICAgICAgQVN0cmluZyBzZXNzaW9uTGV2ZWxDb250cm9sVVJMOwogICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5maW5kQXR0cmlidXRlKAogICAgICAgICAgICAgICAgIDAsCkBAIC0yNDQsNyArMjU0LDkgQEAKICAgICBzdGF0aWMgdm9pZCBhZGRTREVTKGludCBzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogICAgICAgICBzb2NrbGVuX3QgYWRkclNpemUgPSBzaXplb2YoYWRkcik7Ci0gICAgICAgIENIRUNLX0VRKDAsIGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKHMsIChzb2NrYWRkciAqKSZhZGRyLCAmYWRkclNpemUpICE9IDApIHsKKyAgICAgICAgICAgIGluZXRfYXRvbigiMC4wLjAuMCIsICYoYWRkci5zaW5fYWRkcikpOworICAgICAgICB9CiAKICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKQEAgLTU1Niw3ICs1NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFzZVVSTCA9IHRtcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkRlc2MtPmNvdW50VHJhY2tzKCkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC02MDIsNyArNjE0LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWthYmxlID0gIWlzTGl2ZVN0cmVhbShtU2Vzc2lvbkRlc2MpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwobVNlc3Npb25EZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sVVJMID0gZ2V0Q29udHJvbFVSTCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gYWN0dWFsIHRyYWNrcyBpbiB0aGlzIHNlc3Npb24uCkBAIC0xODE2LDYgKzE4MjgsOCBAQAogICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoCiAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXgsIGNvbnN0IFRyYWNrSW5mbyAqdHJhY2ssCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgICAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UodHJhY2tJbmRleCk7CisKICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCA4OWZmMTdkLi40MjRiYWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0xOCwzNCArMTgsMzAgQEAKICNkZWZpbmUgTE9HX1RBRyAiU0RQTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiU0RQTG9hZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9TRFBMb2FkZXIuaCIKIAogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogI2RlZmluZSBERUZBVUxUX1NEUF9TSVpFIDEwMDAwMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVNEUExvYWRlcjo6U0RQTG9hZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKQorU0RQTG9hZGVyOjpTRFBMb2FkZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKICAgICAgIG1GbGFncyhmbGFncyksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSkgewotICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgbUhUVFBEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7Ci0gICAgfQotCisgICAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKQEAgLTk0LDExICs5MCw3IEBACiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOwogICAgIG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlcnMiLCAodm9pZCAqKikmaGVhZGVycyk7CiAKLSAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykpIHsKLSAgICAgICAgQUxPR1YoIm9uTG9hZCAnJXMnIiwgdXJsLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJvbkxvYWQgPFVSTCBzdXBwcmVzc2VkPiIpOwotICAgIH0KKyAgICBBTE9HVigib25Mb2FkICVzIiwgdXJpRGVidWdTdHJpbmcodXJsLCBtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykuY19zdHIoKSk7CiAKICAgICBpZiAoIW1DYW5jZWxsZWQpIHsKICAgICAgICAgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybC5jX3N0cigpLCBoZWFkZXJzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDkwM2FmNDkuLjk5YjQ4MGFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTksNyArOSw3IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBcCisJU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIFwKIAlEdW1teVJlY29yZGVyLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApAQCAtMzMsMTAgKzMzLDEwIEBACiAJbGliZ3Rlc3RfbWFpbiBcCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAorCWJpb25pYyBcCisJYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwlleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKKwlleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCkBAIC00Nyw2ICs0Nyw0MSBAQAogCiBlbmRpZgogCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gVXRpbHNfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVV0aWxzX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKwlsaWJsb2cgXAorCWxpYm1lZGlhIFwKKwlsaWJzdGFnZWZyaWdodCBcCisJbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisJbGlic3RhZ2VmcmlnaHRfb214IFwKKwlsaWJzdGxwb3J0IFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisJbGliZ3Rlc3QgXAorCWxpYmd0ZXN0X21haW4gXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwliaW9uaWMgXAorCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCisJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwlmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCiAjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCmluZGV4IDQ5ZmZjZDYuLmZkODg5ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgpAQCAtMTEwLDcgKzEwOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTm8gYWN0dWFsIGRpc3BsYXkuIENob29zaW5nIEVHTFN1cmZhY2UgYmFzZWQgb24gU3VyZmFjZU1lZGlhU291cmNlIik7CiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBzbXMgPSAobmV3IFN1cmZhY2VNZWRpYVNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSkpLT5nZXRCdWZmZXJRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldFByb2R1Y2VyKCk7CiAgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShzbXMpOwogICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gc3RjOwogCkBAIC0zNjEsOSArMzYwLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CiAgICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLQotICAgICAgICAvLyBNYW51YWwgY2FzdCBpcyByZXF1aXJlZCB0byBhdm9pZCBjb25zdHJ1Y3RvciBhbWJpZ3VpdHkKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKHN0YXRpY19jYXN0PHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4oIG1TTVMtPmdldEJ1ZmZlclF1ZXVlKCkpKTsKKyAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgICAgICBtQU5XID0gbVNUQzsKICAgICB9CiAKQEAgLTM5OCw3ICszOTUsNyBAQAogICAgICAgICBBTE9HVigiU01TLUdMVGVzdDo6U2V0VXAoKSIpOwogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAKICAgICAgICAgLy8gRG9pbmcgdGhlIHNldHVwIHJlbGF0ZWQgdG8gdGhlIEdMIFNpZGUKQEAgLTUyNyw3ICs1MjQsOCBAQAogfQogCiAvLyBEZXF1ZXVpbmcgYW5kIHF1ZXVpbmcgdGhlIGJ1ZmZlciB3aXRob3V0IHJlYWxseSBmaWxsaW5nIGl0IGluLgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzTm9GaWxsKGludCB3aWR0aCwgaW50IGhlaWdodCApIHsKK3ZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzc05vRmlsbCgKKyAgICAgICAgaW50IC8qIHdpZHRoICovLCBpbnQgLyogaGVpZ2h0ICAqLykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobUFOVy5nZXQoKSwgJmFuYikpOwogICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKQEAgLTc0Niw5ICs3NDQsOCBAQAogICAgIENIRUNLKGZkID49IDApOwogCiAgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihmZCwKLSAgICAgICAgICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKLSAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwKLSAgICAgICAgICAgIG1ZdXZUZXhIZWlnaHQsIDMwKTsKKyAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFLCBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LAorICAgICAgICAgICAgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KICAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlTVCA9IG1yLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwpAQCAtNzgzLDcgKzc4MCw3IEBACiAgICAgQUxPR1YoIlZlcmlmeSBjcmVhdGluZyBhIHN1cmZhY2Ugdy8gcmlnaHQgY29uZmlnICsgZHVtbXkgd3JpdGVyKioqKioqKioqIik7CiAKICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwogICAgIG1BTlcgPSBtU1RDOwogCiAgICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7CkBAIC04ODAsNyArODc3LDcgQEAKICAgICB9CiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAorICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKICAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogCiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KQEAgLTkyMyw3ICs5MjAsNyBAQAogICAgIH0KICAgICBDSEVDSyhmZCA+PSAwKTsKIAotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCisgICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAogICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7CiAKICAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjgyNWRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVXRpbHNfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihVdGlsc1Rlc3QsIFRlc3RGb3VyQ0MpIHsKKyAgICBBU1NFUlRfRVEoRk9VUkNDKCdzJywgJ3QnLCAnbScgLCAndScpLCAnc3RtdScpOworfQorCitURVNUX0YoVXRpbHNUZXN0LCBUZXN0TWF0aFRlbXBsYXRlcykgeworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTAsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMSwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEyLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTMsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xNCwgLTQpLCA0KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMCwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDExLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTIsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMywgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDE0LCAtNCksIC00KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTAsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMSwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEyLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTMsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xNCwgNCksIC00KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMCwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMSwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMiwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMywgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxNCwgNCksIDQpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMSwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEyLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTMsIC00KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTEsIC00KSwgLTIpOworICAgIEFTU0VSVF9FUShkaXZVcCgxMiwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEzLCAtNCksIC0zKTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgtMTEsIDQpLCAtMik7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMiwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEzLCA0KSwgLTMpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKDExLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEyLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEzLCA0KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoYWJzKDVMKSwgNUwpOworICAgIEFTU0VSVF9FUShhYnMoLTI1KSwgMjUpOworCisgICAgQVNTRVJUX0VRKG1pbig1LjZmLCA2LjBmKSwgNS42Zik7CisgICAgQVNTRVJUX0VRKG1pbig2LjBmLCA1LjZmKSwgNS42Zik7CisgICAgQVNTRVJUX0VRKG1pbigtNC4zLCA4LjYpLCAtNC4zKTsKKyAgICBBU1NFUlRfRVEobWluKDguNiwgLTQuMyksIC00LjMpOworCisgICAgQVNTRVJUX0VRKG1heCg1LjZmLCA2LjBmKSwgNi4wZik7CisgICAgQVNTRVJUX0VRKG1heCg2LjBmLCA1LjZmKSwgNi4wZik7CisgICAgQVNTRVJUX0VRKG1heCgtNC4zLCA4LjYpLCA4LjYpOworICAgIEFTU0VSVF9FUShtYXgoOC42LCAtNC4zKSwgOC42KTsKKworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKDEyNCwgMTAwKSwgMjQpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKDI4OCwgMTAwKSwgMTIpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC0zNDUsIDEwMCksIDQ1KTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNDkzLCAxMDApLCA3KTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNTUwLCAxMDApLCA1MCk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTYwMCwgMTAwKSwgMCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKaW5kZXggMTJmZDdmNC4uNzFhYTIxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgpAQCAtNDAsOSArNDEsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogVGltZWRUZXh0RHJpdmVyOjpUaW1lZFRleHREcml2ZXIoCi0gICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKQorICAgICAgICBjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKICAgICA6IG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUxpc3RlbmVyKGxpc3RlbmVyKSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtQ3VycmVudFRyYWNrSW5kZXgoVUlOVF9NQVgpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJUaW1lZFRleHREcml2ZXIiKTsKQEAgLTIwNyw3ICsyMTAsNyBAQAogICAgIH0KIAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtSFRUUFNlcnZpY2UsIHVyaSk7CiAgICAgcmV0dXJuIGNyZWF0ZU91dE9mQmFuZFRleHRTb3VyY2UodHJhY2tJbmRleCwgbWltZVR5cGUsIGRhdGFTb3VyY2UpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawppbmRleCBhNWU3YmEyLi45YTlmZGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBVbml0IHRlc3RzIGZvciBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQKLSMgU2VlIGFsc28gL2RldmVsb3BtZW50L3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTgsMTAgKzE3LDEzIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QKS9leHRlcm5hbC9leHBhdC9saWIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmJpbmRlciBcCiAgICAgbGliZXhwYXQgXAotICAgIGxpYnN0YWdlZnJpZ2h0CisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYnV0aWxzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgxNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NQUEZMQUdTICs9IC1EX19TVERJTlRfTElNSVRTIFwKKyAgICAgICAgICAgICAgICAgIC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gRWJtbFV0aWwuY3BwICAgICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRWxlbWVudC5jcHAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1GcmFtZS5jcHAgICAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUZyYW1lVGhyZWFkLmNwcCBcCisgICAgICAgICAgICAgICAgICBXZWJtV3JpdGVyLmNwcAorCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnV0aWxzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlibG9nCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3dlYm0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlmZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB7CisKKy8vIFRhYmxlIGZvciBTZWFsJ3MgYWxnb3JpdGhtIGZvciBOdW1iZXIgb2YgVHJhaWxpbmcgWmVyb3MuIEhhY2tlcidzIERlbGlnaHQKKy8vIG9ubGluZSwgRmlndXJlIDUtMTggKGh0dHA6Ly93d3cuaGFja2Vyc2RlbGlnaHQub3JnL3JldmlzaW9ucy5wZGYpCisvLyBUaGUgZW50cmllcyB3aG9zZSB2YWx1ZSBpcyAtMSBhcmUgbmV2ZXIgcmVmZXJlbmNlZC4KK2ludCBOVFpfVEFCTEVbXSA9IHsKKyAgICAzMiwgIDAsICAxLCAxMiwgIDIsICA2LCAtMSwgMTMsICAgMywgLTEsICA3LCAtMSwgLTEsIC0xLCAtMSwgMTQsCisgICAgMTAsICA0LCAtMSwgLTEsICA4LCAtMSwgLTEsIDI1LCAgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMSwgMjcsIDE1LAorICAgIDMxLCAxMSwgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgICA5LCAtMSwgLTEsIDI0LCAtMSwgLTEsIDIwLCAyNiwKKyAgICAzMCwgLTEsIC0xLCAtMSwgLTEsIDIzLCAtMSwgMTksICAyOSwgLTEsIDIyLCAxOCwgMjgsIDE3LCAxNiwgLTEKK307CisKK2ludCBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMihpbnQzMl90IGkpIHsKKyAgICB1aW50MzJfdCB1ID0gKGkgJiAtaSkgKiAweDA0NTBGQkFGOworICAgIHJldHVybiBOVFpfVEFCTEVbKHUpID4+IDI2XTsKK30KKwordWludDY0X3QgaGlnaGVzdE9uZUJpdCh1aW50NjRfdCBuKSB7CisgICAgbiB8PSAobiA+PiAxKTsKKyAgICBuIHw9IChuID4+IDIpOworICAgIG4gfD0gKG4gPj4gNCk7CisgICAgbiB8PSAobiA+PiA4KTsKKyAgICBuIHw9IChuID4+IDE2KTsKKyAgICBuIHw9IChuID4+IDMyKTsKKyAgICByZXR1cm4gbiAtIChuID4+IDEpOworfQorCit1aW50NjRfdCBfcG93ZXJPZjIodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gaGlnaGVzdE9uZUJpdCh1KTsKKyAgICByZXR1cm4gcG93ZXJPZjIgPyBwb3dlck9mMiA6IDE7Cit9CisKKy8vIEJhc2VkIG9uIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zIGluIExvbmcuamF2YQoraW50IG51bWJlck9mVHJhaWxpbmdaZXJvcyh1aW50NjRfdCB1KSB7CisgICAgaW50MzJfdCBsb3cgPSB1OworICAgIHJldHVybiBsb3cgIT0wID8gbnVtYmVyT2ZUcmFpbGluZ1plcm9zMzIobG93KQorICAgICAgICAgICAgICAgICAgIDogMzIgKyBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMigoaW50MzJfdCkgKHUgPj4gMzIpKTsKK30KK30KKworbmFtZXNwYWNlIHdlYm0geworCisvLyBFbmNvZGUgdGhlIGlkIGFuZC9vciBzaXplIG9mIGFuIEVCTUwgZWxlbWVudCBieXRlcyBieSBzZXR0aW5nIGEgbGVhZGluZyBsZW5ndGggZGVzY3JpcHRvciBiaXQ6CisvLworLy8gICAxeHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtYnl0ZSB2YWx1ZXMKKy8vICAgMDF4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDF4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDF4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gLi4uCisvLyAgIDAwMDAxeHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAxeHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDAxeCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAtCisvLyAgIDAwMDAwMDAxIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IC0gOC1ieXRlIHZhbHVlcworLy8KKy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyBwb3NzaWJsZS4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpZiAodSArIDEgPT0gcG93ZXJPZjIgPDwgMSkKKyAgICAgICAgcG93ZXJPZjIgPDw9IDE7CisgICAgaW50IHNoaWZ0V2lkdGggPSAoNyArIG51bWJlck9mVHJhaWxpbmdaZXJvcyhwb3dlck9mMikpIC8gNyAqIDc7CisgICAgbG9uZyBsZW5ndGhEZXNjcmlwdG9yID0gMSA8PCBzaGlmdFdpZHRoOworICAgIHJldHVybiBsZW5ndGhEZXNjcmlwdG9yIHwgdTsKK30KKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCkgeworICAgIGludCBzaGlmdFdpZHRoID0gNyAqIHdpZHRoOworICAgIHVpbnQ2NF90IGxlbmd0aERlc2NyaXB0b3IgPSAxOworICAgIGxlbmd0aERlc2NyaXB0b3IgPDw9IHNoaWZ0V2lkdGg7CisgICAgcmV0dXJuIGxlbmd0aERlc2NyaXB0b3IgfCB1OworfQorCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpbnQgdW5zaWduZWRMZW5ndGggPSBudW1iZXJPZlRyYWlsaW5nWmVyb3MocG93ZXJPZjIpIC8gOCArIDE7CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCisvLyBTZXJpYWxpemUgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGluIGJpZy1lbmRpYW4gb3JkZXIuCitpbnQgc2VyaWFsaXplQ29kZWRVbnNpZ25lZCh1aW50NjRfdCB1LCB1aW50OF90KiBiYXJ5KSB7CisgICAgaW50IHVuc2lnbmVkTGVuZ3RoID0gc2l6ZU9mKHUpOworICAgIGZvciAoaW50IGkgPSB1bnNpZ25lZExlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGJhcnlbaV0gPSB1ICYgMHhmZjsKKyAgICAgICAgdSA+Pj0gODsKKyAgICB9CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YzM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBFQk1MVVRJTF9IXworI2RlZmluZSBFQk1MVVRJTF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB3ZWJtIHsKKworLy8gRW5jb2RlIHRoZSBpZCBhbmQvb3Igc2l6ZSBvZiBhbiBFQk1MIGVsZW1lbnQgYnl0ZXMgYnkgc2V0dGluZyBhIGxlYWRpbmcgbGVuZ3RoIGRlc2NyaXB0b3IgYml0OgorLy8KKy8vICAgMXh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLWJ5dGUgdmFsdWVzCisvLyAgIDAxeHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAxeHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAxeHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC4uLgorLy8gICAwMDAwMXh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMXh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAwMXggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgLQorLy8gICAwMDAwMDAwMSB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAtIDgtYnl0ZSB2YWx1ZXMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxlYXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcG9zc2libGUuCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1KTsKKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCk7CisKKy8vIFNlcmlhbGl6ZSBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgaW4gYmlnLWVuZGlhbiBvcmRlci4KK2ludCBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHVpbnQ2NF90IHUsIHVpbnQ4X3QqIGJhcnkpOworCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpOworCit9CisKKyNlbmRpZiAvKiBFQk1MVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZhOWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTElOS0VEQkxPQ0tJTkdRVUVVRV9IXworI2RlZmluZSBMSU5LRURCTE9DS0lOR1FVRVVFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgTGlua2VkQmxvY2tpbmdRdWV1ZSB7CisgICAgTGlzdDxUPiBtTGlzdDsKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb247CisKKyAgICBUIGZyb250KGJvb2wgcmVtb3ZlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIHdoaWxlIChtTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgfQorICAgICAgICBUIGUgPSAqKG1MaXN0LmJlZ2luKCkpOworICAgICAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgICAgICBtTGlzdC5lcmFzZShtTGlzdC5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5rZWRCbG9ja2luZ1F1ZXVlKTsKKworcHVibGljOgorICAgIExpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgfkxpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmVtcHR5KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgbUxpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICBUIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBmcm9udChmYWxzZSk7CisgICAgfQorCisgICAgVCB0YWtlKCkgeworICAgICAgICByZXR1cm4gZnJvbnQodHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoKFQgZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICBtTGlzdC5wdXNoX2JhY2soZSk7CisgICAgICAgIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBMSU5LRURCTE9DS0lOR1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2Y0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUNPTlNUQU5UU19IXworI2RlZmluZSBXRUJNQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHdlYm0geworCitjb25zdCBpbnQga01pbkVibWxWb2lkU2l6ZSA9IDI7Citjb25zdCBpbnQ2NF90IGtNYXhNZXRhU2Vla1NpemUgPSA2NDsKK2NvbnN0IGludDY0X3Qga01rdlVua25vd25MZW5ndGggPSAweDAxZmZmZmZmZmZmZmZmZmZsOworCisvLyBFQk1MIGVsZW1lbnQgaWQncyBmcm9tIGh0dHA6Ly9tYXRyb3NrYS5vcmcvdGVjaG5pY2FsL3NwZWNzL2luZGV4Lmh0bWwKK2VudW0gTWt2IHsKKyAgICBrTWt2RWJtbCA9IDB4MUE0NURGQTMsCisgICAga01rdkVibWxWZXJzaW9uID0gMHg0Mjg2LAorICAgIGtNa3ZFYm1sUmVhZFZlcnNpb24gPSAweDQyRjcsCisgICAga01rdkVibWxNYXhJZGxlbmd0aCA9IDB4NDJGMiwKKyAgICBrTWt2RWJtbE1heFNpemVMZW5ndGggPSAweDQyRjMsCisgICAga01rdkRvY1R5cGUgPSAweDQyODIsCisgICAga01rdkRvY1R5cGVWZXJzaW9uID0gMHg0Mjg3LAorICAgIGtNa3ZEb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODUsCisgICAga01rdlZvaWQgPSAweEVDLAorICAgIGtNa3ZTaWduYXR1cmVTbG90ID0gMHgxQjUzODY2NywKKyAgICBrTWt2U2lnbmF0dXJlQWxnbyA9IDB4N0U4QSwKKyAgICBrTWt2U2lnbmF0dXJlSGFzaCA9IDB4N0U5QSwKKyAgICBrTWt2U2lnbmF0dXJlUHVibGljS2V5ID0gMHg3RUE1LAorICAgIGtNa3ZTaWduYXR1cmUgPSAweDdFQjUsCisgICAga01rdlNpZ25hdHVyZUVsZW1lbnRzID0gMHg3RTVCLAorICAgIGtNa3ZTaWduYXR1cmVFbGVtZW50TGlzdCA9IDB4N0U3QiwKKyAgICBrTWt2U2lnbmVkRWxlbWVudCA9IDB4NjUzMiwKKyAgICBrTWt2U2VnbWVudCA9IDB4MTg1MzgwNjcsCisgICAga01rdlNlZWtIZWFkID0gMHgxMTREOUI3NCwKKyAgICBrTWt2U2VlayA9IDB4NERCQiwKKyAgICBrTWt2U2Vla0lkID0gMHg1M0FCLAorICAgIGtNa3ZTZWVrUG9zaXRpb24gPSAweDUzQUMsCisgICAga01rdkluZm8gPSAweDE1NDlBOTY2LAorICAgIGtNa3ZUaW1lY29kZVNjYWxlID0gMHgyQUQ3QjEsCisgICAga01rdlNlZ21lbnREdXJhdGlvbiA9IDB4NDQ4OSwKKyAgICBrTWt2RGF0ZVV0YyA9IDB4NDQ2MSwKKyAgICBrTWt2TXV4aW5nQXBwID0gMHg0RDgwLAorICAgIGtNa3ZXcml0aW5nQXBwID0gMHg1NzQxLAorICAgIGtNa3ZDbHVzdGVyID0gMHgxRjQzQjY3NSwKKyAgICBrTWt2VGltZWNvZGUgPSAweEU3LAorICAgIGtNa3ZQcmV2U2l6ZSA9IDB4QUIsCisgICAga01rdkJsb2NrR3JvdXAgPSAweEEwLAorICAgIGtNa3ZCbG9jayA9IDB4QTEsCisgICAga01rdkJsb2NrQWRkaXRpb25zID0gMHg3NUExLAorICAgIGtNa3ZCbG9ja01vcmUgPSAweEE2LAorICAgIGtNa3ZCbG9ja0FkZElkID0gMHhFRSwKKyAgICBrTWt2QmxvY2tBZGRpdGlvbmFsID0gMHhBNSwKKyAgICBrTWt2QmxvY2tEdXJhdGlvbiA9IDB4OUIsCisgICAga01rdlJlZmVyZW5jZUJsb2NrID0gMHhGQiwKKyAgICBrTWt2TGFjZU51bWJlciA9IDB4Q0MsCisgICAga01rdlNpbXBsZUJsb2NrID0gMHhBMywKKyAgICBrTWt2VHJhY2tzID0gMHgxNjU0QUU2QiwKKyAgICBrTWt2VHJhY2tFbnRyeSA9IDB4QUUsCisgICAga01rdlRyYWNrTnVtYmVyID0gMHhENywKKyAgICBrTWt2VHJhY2tVaWQgPSAweDczQzUsCisgICAga01rdlRyYWNrVHlwZSA9IDB4ODMsCisgICAga01rdkZsYWdFbmFibGVkID0gMHhCOSwKKyAgICBrTWt2RmxhZ0RlZmF1bHQgPSAweDg4LAorICAgIGtNa3ZGbGFnRm9yY2VkID0gMHg1NUFBLAorICAgIGtNa3ZGbGFnTGFjaW5nID0gMHg5QywKKyAgICBrTWt2RGVmYXVsdER1cmF0aW9uID0gMHgyM0UzODMsCisgICAga01rdk1heEJsb2NrQWRkaXRpb25JZCA9IDB4NTVFRSwKKyAgICBrTWt2TmFtZSA9IDB4NTM2RSwKKyAgICBrTWt2TGFuZ3VhZ2UgPSAweDIyQjU5QywKKyAgICBrTWt2Q29kZWNJZCA9IDB4ODYsCisgICAga01rdkNvZGVjUHJpdmF0ZSA9IDB4NjNBMiwKKyAgICBrTWt2Q29kZWNOYW1lID0gMHgyNTg2ODgsCisgICAga01rdlZpZGVvID0gMHhFMCwKKyAgICBrTWt2RmxhZ0ludGVybGFjZWQgPSAweDlBLAorICAgIGtNa3ZTdGVyZW9Nb2RlID0gMHg1M0I4LAorICAgIGtNa3ZBbHBoYU1vZGUgPSAweDUzQzAsCisgICAga01rdlBpeGVsV2lkdGggPSAweEIwLAorICAgIGtNa3ZQaXhlbEhlaWdodCA9IDB4QkEsCisgICAga01rdlBpeGVsQ3JvcEJvdHRvbSA9IDB4NTRBQSwKKyAgICBrTWt2UGl4ZWxDcm9wVG9wID0gMHg1NEJCLAorICAgIGtNa3ZQaXhlbENyb3BMZWZ0ID0gMHg1NENDLAorICAgIGtNa3ZQaXhlbENyb3BSaWdodCA9IDB4NTRERCwKKyAgICBrTWt2RGlzcGxheVdpZHRoID0gMHg1NEIwLAorICAgIGtNa3ZEaXNwbGF5SGVpZ2h0ID0gMHg1NEJBLAorICAgIGtNa3ZEaXNwbGF5VW5pdCA9IDB4NTRCMiwKKyAgICBrTWt2QXNwZWN0UmF0aW9UeXBlID0gMHg1NEIzLAorICAgIGtNa3ZGcmFtZVJhdGUgPSAweDIzODNFMywKKyAgICBrTWt2QXVkaW8gPSAweEUxLAorICAgIGtNa3ZTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4QjUsCisgICAga01rdk91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMHg3OEI1LAorICAgIGtNa3ZDaGFubmVscyA9IDB4OUYsCisgICAga01rdkJpdERlcHRoID0gMHg2MjY0LAorICAgIGtNa3ZDdWVzID0gMHgxQzUzQkI2QiwKKyAgICBrTWt2Q3VlUG9pbnQgPSAweEJCLAorICAgIGtNa3ZDdWVUaW1lID0gMHhCMywKKyAgICBrTWt2Q3VlVHJhY2tQb3NpdGlvbnMgPSAweEI3LAorICAgIGtNa3ZDdWVUcmFjayA9IDB4RjcsCisgICAga01rdkN1ZUNsdXN0ZXJQb3NpdGlvbiA9IDB4RjEsCisgICAga01rdkN1ZUJsb2NrTnVtYmVyID0gMHg1Mzc4Cit9OworCitlbnVtIFRyYWNrVHlwZXMgeworICAgIGtJbnZhbGlkVHlwZSA9IC0xLAorICAgIGtWaWRlb1R5cGUgPSAweDEsCisgICAga0F1ZGlvVHlwZSA9IDB4MiwKKyAgICBrQ29tcGxleFR5cGUgPSAweDMsCisgICAga0xvZ29UeXBlID0gMHgxMCwKKyAgICBrU3VidGl0bGVUeXBlID0gMHgxMSwKKyAgICBrQnV0dG9uc1R5cGUgPSAweDEyLAorICAgIGtDb250cm9sVHlwZSA9IDB4MjAKK307CisKK2VudW0gVHJhY2tOdW0geworICAgIGtWaWRlb1RyYWNrTnVtID0gMHgxLAorICAgIGtBdWRpb1RyYWNrTnVtID0gMHgyCit9OworfQorCisjZW5kaWYgLyogV0VCTUNPTlNUQU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA4Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtRWxlbWVudCIKKworI2luY2x1ZGUgIkVibWxVdGlsLmgiCisjaW5jbHVkZSAiV2VibUVsZW1lbnQuaCIKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CisKK2ludDY0X3Qgdm9pZFNpemUoaW50NjRfdCB0b3RhbFNpemUpIHsKKyAgICBpZiAodG90YWxTaXplIDwgMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh0b3RhbFNpemUgPCA5KSB7CisgICAgICAgIHJldHVybiB0b3RhbFNpemUgLSAyOworICAgIH0KKyAgICByZXR1cm4gdG90YWxTaXplIC0gOTsKK30KKwordWludDY0X3QgY2hpbGRyZW5TdW0oY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICB1aW50NjRfdCB0b3RhbCA9IDA7CisgICAgZm9yIChMaXN0PHNwPFdlYm1FbGVtZW50PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgICAgICB0b3RhbCArPSAoKml0KS0+dG90YWxTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordm9pZCBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgaW50IG51bSwKKyAgICAgICAgdWludDY0X3QgdWlkLAorICAgICAgICBib29sIGxhY2luZywKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCisgICAgICAgIFRyYWNrVHlwZXMgdHlwZSwKKyAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiAmbHMpIHsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tOdW1iZXIsIG51bSkpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja1VpZCwgdWlkKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkZsYWdMYWNpbmcsIGxhY2luZykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2TGFuZ3VhZ2UsIGxhbmcpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkNvZGVjSWQsIGNvZGVjKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrVHlwZSwgdHlwZSkpOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dlYm1FbGVtZW50OjpXZWJtRWxlbWVudCh1aW50NjRfdCBpZCwgdWludDY0X3Qgc2l6ZSkKKyAgICA6IG1JZChpZCksIG1TaXplKHNpemUpIHsKK30KKworV2VibUVsZW1lbnQ6On5XZWJtRWxlbWVudCgpIHsKK30KKworaW50IFdlYm1FbGVtZW50OjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtU2l6ZSksIGJ1Zik7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50OjpzZXJpYWxpemVJbnRvKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ4X3QgKmN1ciA9IGJ1ZjsKKyAgICBpbnQgaGVhZCA9IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQobUlkLCBjdXIpOworICAgIGN1ciArPSBoZWFkOworICAgIGludCBuZWNrID0gc2VyaWFsaXplUGF5bG9hZFNpemUoY3VyKTsKKyAgICBjdXIgKz0gbmVjazsKKyAgICBzZXJpYWxpemVQYXlsb2FkKGN1cik7CisgICAgY3VyICs9IG1TaXplOworICAgIHJldHVybiBjdXIgLSBidWY7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50Ojp0b3RhbFNpemUoKSB7CisgICAgdWludDhfdCBidWZbOF07CisgICAgLy8uLi4uLi4uLi4uLi4uLi4gKyBzaXplT2YoZW5jb2RlVW5zaWduZWQoc2l6ZSkpCisgICAgcmV0dXJuIHNpemVPZihtSWQpICsgc2VyaWFsaXplUGF5bG9hZFNpemUoYnVmKSArIG1TaXplOworfQorCit1aW50OF90ICpXZWJtRWxlbWVudDo6c2VyaWFsaXplKHVpbnQ2NF90JiBzaXplKSB7CisgICAgc2l6ZSA9IHRvdGFsU2l6ZSgpOworICAgIHVpbnQ4X3QgKmJ1ZiA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHNlcmlhbGl6ZUludG8oYnVmKTsKKyAgICByZXR1cm4gYnVmOworfQorCitpbnQgV2VibUVsZW1lbnQ6OndyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpIHsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICBzaXplID0gdG90YWxTaXplKCk7CisgICAgb2ZmNjRfdCBvZmYgPSA6OmxzZWVrNjQoZmQsIChzaXplIC0gMSksIFNFRUtfQ1VSKSAtIChzaXplIC0gMSk7CisgICAgOjp3cml0ZShmZCwgYnVmLCAxKTsgLy8gZXh0ZW5kIGZpbGUKKworICAgIG9mZjY0X3QgY3VyT2ZmID0gb2ZmICsgc2l6ZTsKKyAgICBvZmY2NF90IGFsaWduZWRPZmYgPSBvZmYgJiB+KDo6c3lzY29uZihfU0NfUEFHRV9TSVpFKSAtIDEpOworICAgIG9mZjY0X3QgbWFwU2l6ZSA9IGN1ck9mZiAtIGFsaWduZWRPZmY7CisgICAgb2ZmNjRfdCBwYWdlT2ZmID0gb2ZmIC0gYWxpZ25lZE9mZjsKKyAgICB2b2lkICpkc3QgPSA6Om1tYXA2NChOVUxMLCBtYXBTaXplLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgYWxpZ25lZE9mZik7CisgICAgaWYgKGRzdCA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwNjQgZmFpbGVkOyBlcnJubyA9ICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiZmQgJWQ7IGZsYWdzOiAlbyIsIGZkLCA6OmZjbnRsKGZkLCBGX0dFVEZMLCAwKSk7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXJpYWxpemVJbnRvKCh1aW50OF90KikgZHN0ICsgcGFnZU9mZik7CisgICAgICAgIDo6bXN5bmMoZHN0LCBtYXBTaXplLCBNU19TWU5DKTsKKyAgICAgICAgcmV0dXJuIDo6bXVubWFwKGRzdCwgbWFwU2l6ZSk7CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVVuc2lnbmVkOjpXZWJtVW5zaWduZWQodWludDY0X3QgaWQsIHVpbnQ2NF90IHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVPZih2YWx1ZSkpLCBtVmFsdWUodmFsdWUpIHsKK30KKwordm9pZCBXZWJtVW5zaWduZWQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChtVmFsdWUsIGJ1Zik7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRmxvYXQ6OldlYm1GbG9hdCh1aW50NjRfdCBpZCwgZG91YmxlIHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVvZihkb3VibGUpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK1dlYm1GbG9hdDo6V2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzaXplb2YoZmxvYXQpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK3ZvaWQgV2VibUZsb2F0OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ2NF90IGRhdGE7CisgICAgaWYgKG1TaXplID09IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgZmxvYXQgZiA9IG1WYWx1ZTsKKyAgICAgICAgZGF0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oJmYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KCZtVmFsdWUpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gbVNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBidWZbaV0gPSBkYXRhICYgMHhmZjsKKyAgICAgICAgZGF0YSA+Pj0gODsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtQmluYXJ5OjpXZWJtQmluYXJ5KHVpbnQ2NF90IGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmcmVmKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHJlZi0+c2l6ZSgpKSwgbVJlZihyZWYpIHsKK30KKwordm9pZCBXZWJtQmluYXJ5OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIG1lbWNweShidWYsIG1SZWYtPmRhdGEoKSwgbVJlZi0+c2l6ZSgpKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1TdHJpbmc6OldlYm1TdHJpbmcodWludDY0X3QgaWQsIGNvbnN0IGNoYXIgKnN0cikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzdHJsZW4oc3RyKSksIG1TdHIoc3RyKSB7Cit9CisKK3ZvaWQgV2VibVN0cmluZzo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBtZW1jcHkoYnVmLCBtU3RyLCBzdHJsZW4obVN0cikpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVNpbXBsZUJsb2NrOjpXZWJtU2ltcGxlQmxvY2soCisgICAgICAgIGludCB0cmFja051bSwKKyAgICAgICAgaW50MTZfdCByZWxUaW1lY29kZSwKKyAgICAgICAgYm9vbCBrZXksCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+JiBvcmlnKQorICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gdHJhY2tOdW0qMSArIHRpbWVjb2RlKjIgKyBmbGFncyoxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXgorICAgIC8vIE9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdHJhY2tOdW0gaXMgZW5jb2RlZAorICAgIDogV2VibUVsZW1lbnQoa01rdlNpbXBsZUJsb2NrLCBvcmlnLT5zaXplKCkgKyA0KSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtUmVsVGltZWNvZGUocmVsVGltZWNvZGUpLAorICAgICAgbUtleShrZXkpLAorICAgICAgbVJlZihvcmlnKSB7Cit9CisKK3ZvaWQgV2VibVNpbXBsZUJsb2NrOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVRyYWNrTnVtKSwgYnVmKTsKKyAgICBidWZbMV0gPSAobVJlbFRpbWVjb2RlICYgMHhmZjAwKSA+PiA4OworICAgIGJ1ZlsyXSA9IG1SZWxUaW1lY29kZSAmIDB4ZmY7CisgICAgYnVmWzNdID0gbUtleSA/IDB4ODAgOiAwOworICAgIG1lbWNweShidWYgKyA0LCBtUmVmLT5kYXRhKCksIG1TaXplIC0gNCk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFYm1sVm9pZDo6RWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKQorICAgIDogV2VibUVsZW1lbnQoa01rdlZvaWQsIHZvaWRTaXplKHRvdGFsU2l6ZSkpLAorICAgICAgbVNpemVXaWR0aCh0b3RhbFNpemUgLSBzaXplT2Yoa01rdlZvaWQpIC0gdm9pZFNpemUodG90YWxTaXplKSkgeworICAgIENIRUNLX0dFKHZvaWRTaXplKHRvdGFsU2l6ZSksIDApOworfQorCitpbnQgRWJtbFZvaWQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1TaXplLCBtU2l6ZVdpZHRoKSwgYnVmKTsKK30KKwordm9pZCBFYm1sVm9pZDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICA6Om1lbXNldChidWYsIDAsIG1TaXplKTsKKyAgICByZXR1cm47Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtTWFzdGVyOjpXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBjaGlsZHJlblN1bShjaGlsZHJlbikpLCBtQ2hpbGRyZW4oY2hpbGRyZW4pIHsKK30KKworV2VibU1hc3Rlcjo6V2VibU1hc3Rlcih1aW50NjRfdCBpZCkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCAwKSB7Cit9CisKK2ludCBXZWJtTWFzdGVyOjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICBpZiAobVNpemUgPT0gMCl7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGtNa3ZVbmtub3duTGVuZ3RoLCBidWYpOworICAgIH0KKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKGJ1Zik7Cit9CisKK3ZvaWQgV2VibU1hc3Rlcjo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICB1aW50NjRfdCBvZmYgPSAwOworICAgIGZvciAoTGlzdDxzcDxXZWJtRWxlbWVudD4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtQ2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gbUNoaWxkcmVuLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBzcDxXZWJtRWxlbWVudD4gY2hpbGQgPSAoKml0KTsKKyAgICAgICAgY2hpbGQtPnNlcmlhbGl6ZUludG8oYnVmICsgb2ZmKTsKKyAgICAgICAgb2ZmICs9IGNoaWxkLT50b3RhbFNpemUoKTsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkN1ZVBvaW50RW50cnkodWludDY0X3QgdGltZSwgaW50IHRyYWNrLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGN1ZVBvaW50RW50cnlGaWVsZHM7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlVHJhY2ssIHRyYWNrKSk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlQ2x1c3RlclBvc2l0aW9uLCBvZmYpKTsKKyAgICBXZWJtRWxlbWVudCAqY3VlVHJhY2tQb3NpdGlvbnMgPSBuZXcgV2VibU1hc3RlcihrTWt2Q3VlVHJhY2tQb3NpdGlvbnMsIGN1ZVBvaW50RW50cnlGaWVsZHMpOworCisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5jbGVhcigpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkN1ZVRpbWUsIHRpbWUpKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhjdWVUcmFja1Bvc2l0aW9ucyk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVQb2ludCwgY3VlUG9pbnRFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6U2Vla0VudHJ5KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZWtFbnRyeUZpZWxkczsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtJZCwgaWQpKTsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtQb3NpdGlvbiwgb2ZmKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZTZWVrLCBzZWVrRW50cnlGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoCisgICAgICAgIGludCB2ZXIsCisgICAgICAgIGludCByZWFkVmVyLAorICAgICAgICBpbnQgbWF4SWRMZW4sCisgICAgICAgIGludCBtYXhTaXplTGVuLAorICAgICAgICBpbnQgZG9jVmVyLAorICAgICAgICBpbnQgZG9jUmVhZFZlcikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gaGVhZGVyRmllbGRzOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFZlcnNpb24sIHZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFJlYWRWZXJzaW9uLCByZWFkVmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4SWRsZW5ndGgsIG1heElkTGVuKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4U2l6ZUxlbmd0aCwgbWF4U2l6ZUxlbikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkRvY1R5cGUsICJ3ZWJtIikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVZlcnNpb24sIGRvY1ZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVJlYWRWZXJzaW9uLCBkb2NSZWFkVmVyKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZFYm1sLCBoZWFkZXJGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OlNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlLCBkb3VibGUgZHVyKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWdtZW50SW5mbzsKKyAgICAvLyBwbGFjZSBkdXJhdGlvbiBmaXJzdDsgZWFzaWVyIHRvIHBhdGNoCisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtRmxvYXQoa01rdlNlZ21lbnREdXJhdGlvbiwgZHVyKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRpbWVjb2RlU2NhbGUsIHNjYWxlKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZNdXhpbmdBcHAsICJhbmRyb2lkIikpOworICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2V3JpdGluZ0FwcCwgImFuZHJvaWQiKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZJbmZvLCBzZWdtZW50SW5mbyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICBpbnQgY2hhbnMsCisgICAgICAgIGRvdWJsZSByYXRlLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICBpbnQgYnBzLAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtBdWRpb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJBX1ZPUkJJUyIsCisgICAgICAgICAgICBrQXVkaW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGF1ZGlvSW5mbzsKKyAgICBhdWRpb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkNoYW5uZWxzLCBjaGFucykpOworICAgIGF1ZGlvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1GbG9hdChrTWt2U2FtcGxpbmdGcmVxdWVuY3ksIHJhdGUpKTsKKyAgICBpZiAoYnBzKSB7CisgICAgICAgIFdlYm1FbGVtZW50ICpiaXREZXB0aCA9IG5ldyBXZWJtVW5zaWduZWQoa01rdkJpdERlcHRoLCBicHMpOworICAgICAgICBhdWRpb0luZm8ucHVzaF9iYWNrKGJpdERlcHRoKTsKKyAgICB9CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2QXVkaW8sIGF1ZGlvSW5mbykpOworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtQmluYXJ5KGtNa3ZDb2RlY1ByaXZhdGUsIGJ1ZikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6VmlkZW9UcmFja0VudHJ5KAorICAgICAgICB1aW50NjRfdCB3aWR0aCwKKyAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtWaWRlb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtWaWRlb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJWX1ZQOCIsCisgICAgICAgICAgICBrVmlkZW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHZpZGVvSW5mbzsKKyAgICB2aWRlb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlBpeGVsV2lkdGgsIHdpZHRoKSk7CisgICAgdmlkZW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZQaXhlbEhlaWdodCwgaGVpZ2h0KSk7CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2VmlkZW8sIHZpZGVvSW5mbykpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUVMRU1FTlRfSF8KKyNkZWZpbmUgV0VCTUVMRU1FTlRfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgV2VibUVsZW1lbnQgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFdlYm1FbGVtZW50PiB7CisgICAgY29uc3QgdWludDY0X3QgbUlkLCBtU2l6ZTsKKworICAgIFdlYm1FbGVtZW50KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5XZWJtRWxlbWVudCgpOworCisgICAgdmlydHVhbCBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpPTA7CisgICAgdWludDY0X3QgdG90YWxTaXplKCk7CisgICAgdWludDY0X3Qgc2VyaWFsaXplSW50byh1aW50OF90ICpidWYpOworICAgIHVpbnQ4X3QgKnNlcmlhbGl6ZSh1aW50NjRfdCYgc2l6ZSk7CisgICAgaW50IHdyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBFYm1sSGVhZGVyKAorICAgICAgICAgICAgaW50IHZlciA9IDEsCisgICAgICAgICAgICBpbnQgcmVhZFZlciA9IDEsCisgICAgICAgICAgICBpbnQgbWF4SWRMZW4gPSA0LAorICAgICAgICAgICAgaW50IG1heFNpemVMZW4gPSA4LAorICAgICAgICAgICAgaW50IGRvY1ZlciA9IDIsCisgICAgICAgICAgICBpbnQgZG9jUmVhZFZlciA9IDIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSA9IDEwMDAwMDAsIGRvdWJsZSBkdXIgPSAwKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgaW50IGNoYW5zLAorICAgICAgICAgICAgZG91YmxlIHJhdGUsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICAgICAgaW50IGJwcyA9IDAsCisgICAgICAgICAgICB1aW50NjRfdCB1aWQgPSAwLAorICAgICAgICAgICAgYm9vbCBsYWNpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSAidW5kIik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFZpZGVvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIHVpbnQ2NF90IHdpZHRoLAorICAgICAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDY0X3QgdWlkID0gMCwKKyAgICAgICAgICAgIGJvb2wgbGFjaW5nID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gInVuZCIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWVrRW50cnkodWludDY0X3QgaWQsIHVpbnQ2NF90IG9mZik7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBDdWVQb2ludEVudHJ5KHVpbnQ2NF90IHRpbWUsIGludCB0cmFjaywgdWludDY0X3Qgb2ZmKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNpbXBsZUJsb2NrKAorICAgICAgICAgICAgaW50IHRyYWNrTnVtLAorICAgICAgICAgICAgaW50MTZfdCB0aW1lY29kZSwKKyAgICAgICAgICAgIGJvb2wga2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGRhdGFTaXplKTsKK307CisKK3N0cnVjdCBXZWJtVW5zaWduZWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIFdlYm1VbnNpZ25lZCh1aW50NjRfdCBpZCwgdWludDY0X3QgdmFsdWUpOworICAgIGNvbnN0IHVpbnQ2NF90IG1WYWx1ZTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtRmxvYXQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IGRvdWJsZSBtVmFsdWU7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSk7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1CaW5hcnkgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1SZWY7CisgICAgV2VibUJpbmFyeSh1aW50NjRfdCBpZCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJnJlZik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibVN0cmluZyA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgY2hhciAqY29uc3QgbVN0cjsKKyAgICBXZWJtU3RyaW5nKHVpbnQ2NF90IGlkLCBjb25zdCBjaGFyICpzdHIpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1TaW1wbGVCbG9jayA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgaW50IG1UcmFja051bTsKKyAgICBjb25zdCBpbnQxNl90IG1SZWxUaW1lY29kZTsKKyAgICBjb25zdCBib29sIG1LZXk7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbVJlZjsKKworICAgIFdlYm1TaW1wbGVCbG9jayhpbnQgdHJhY2tOdW0sIGludDE2X3QgdGltZWNvZGUsIGJvb2wga2V5LCBjb25zdCBzcDxBQnVmZmVyPiYgb3JpZyk7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgRWJtbFZvaWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHVpbnQ2NF90IG1TaXplV2lkdGg7CisgICAgRWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKTsKKyAgICBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtTWFzdGVyIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IG1DaGlsZHJlbjsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkKTsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+ICZjaGlsZHJlbik7CisgICAgaW50IHNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1Zik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTUVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEzNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZSIKKworI2luY2x1ZGUgIldlYm1GcmFtZS5oIgorI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CitzcDxBQnVmZmVyPiB0b0FCdWZmZXIoTWVkaWFCdWZmZXIgKm1idWYpIHsKKyAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIG1lbWNweShhYnVmLT5kYXRhKCksICh1aW50OF90KikgbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICByZXR1cm4gYWJ1ZjsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBzcDxXZWJtRnJhbWU+IFdlYm1GcmFtZTo6RU9TID0gbmV3IFdlYm1GcmFtZSgpOworCitXZWJtRnJhbWU6OldlYm1GcmFtZSgpCisgICAgOiBtVHlwZShrSW52YWxpZFR5cGUpLAorICAgICAgbUtleShmYWxzZSksCisgICAgICBtQWJzVGltZWNvZGUoVUlOVDY0X01BWCksCisgICAgICBtRGF0YShuZXcgQUJ1ZmZlcigwKSksCisgICAgICBtRW9zKHRydWUpIHsKK30KKworV2VibUZyYW1lOjpXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKm1idWYpCisgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgIG1LZXkoa2V5KSwKKyAgICAgIG1BYnNUaW1lY29kZShhYnNUaW1lY29kZSksCisgICAgICBtRGF0YSh0b0FCdWZmZXIobWJ1ZikpLAorICAgICAgbUVvcyhmYWxzZSkgeworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUZyYW1lOjpTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IFdlYm1TaW1wbGVCbG9jaygKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyBrVmlkZW9UcmFja051bSA6IGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgbUFic1RpbWVjb2RlIC0gYmFzZVRpbWVjb2RlLAorICAgICAgICAgICAgbUtleSwKKyAgICAgICAgICAgIG1EYXRhKTsKK30KKworYm9vbCBXZWJtRnJhbWU6Om9wZXJhdG9yPChjb25zdCBXZWJtRnJhbWUgJm90aGVyKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm1Fb3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAob3RoZXIubUVvcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHRoaXMtPm1BYnNUaW1lY29kZSA9PSBvdGhlci5tQWJzVGltZWNvZGUpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtBdWRpb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga1ZpZGVvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga0F1ZGlvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMtPm1BYnNUaW1lY29kZSA8IG90aGVyLm1BYnNUaW1lY29kZTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMGIwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1GUkFNRV9IXworI2RlZmluZSBXRUJNRlJBTUVfSF8KKworI2luY2x1ZGUgIldlYm1FbGVtZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFdlYm1GcmFtZSA6IExpZ2h0UmVmQmFzZTxXZWJtRnJhbWU+IHsKK3B1YmxpYzoKKyAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgY29uc3QgYm9vbCBtS2V5OworICAgIGNvbnN0IHVpbnQ2NF90IG1BYnNUaW1lY29kZTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtRGF0YTsKKyAgICBjb25zdCBib29sIG1Fb3M7CisKKyAgICBXZWJtRnJhbWUoKTsKKyAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKmJ1Zik7CisgICAgfldlYm1GcmFtZSgpIHt9CisKKyAgICBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IHNwPFdlYm1GcmFtZT4gRU9TOworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtRnJhbWUpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1GUkFNRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjhhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZVRocmVhZCIKKworI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKyNpbmNsdWRlICJXZWJtRnJhbWVUaHJlYWQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgKldlYm1GcmFtZVRocmVhZDo6d3JhcCh2b2lkICphcmcpIHsKKyAgICBXZWJtRnJhbWVUaHJlYWQgKndvcmtlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2VibUZyYW1lVGhyZWFkKj4oYXJnKTsKKyAgICB3b3JrZXItPnJ1bigpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgV2VibUZyYW1lVGhyZWFkOjp3cmFwLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKSB7CisgICAgdm9pZCAqc3RhdHVzOworICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmc3RhdHVzKTsKKyAgICByZXR1cm4gKHN0YXR1c190KShpbnRwdHJfdClzdGF0dXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTb3VyY2VUaHJlYWQ6OldlYm1GcmFtZVNvdXJjZVRocmVhZCgKKyAgICBpbnQgdHlwZSwKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaykKKyAgICA6IG1UeXBlKHR5cGUpLCBtU2luayhzaW5rKSB7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTaW5rVGhyZWFkOjpXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IHZpZGVvVGhyZWFkLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9UaHJlYWQtPm1TaW5rKSwKKyAgICAgIG1BdWRpb0ZyYW1lcyhhdWRpb1RocmVhZC0+bVNpbmspLAorICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtRG9uZSh0cnVlKSB7Cit9CisKK1dlYm1GcmFtZVNpbmtUaHJlYWQ6OldlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiB2aWRlb1NvdXJjZSwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGF1ZGlvU291cmNlLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9Tb3VyY2UpLAorICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvU291cmNlKSwKKyAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbURvbmUodHJ1ZSkgeworfQorCisvLyBJbml0aWFsaXplcyBhIHdlYm0gY2x1c3RlciB3aXRoIGl0cyBzdGFydGluZyB0aW1lY29kZS4KKy8vCisvLyBmcmFtZXM6CisvLyAgIHNlcXVlbmNlIG9mIGlucHV0IGF1ZGlvL3ZpZGVvIGZyYW1lcyByZWNlaXZlZCBmcm9tIHRoZSBzb3VyY2UuCisvLworLy8gY2x1c3RlclRpbWVjb2RlTDoKKy8vICAgdGhlIHN0YXJ0aW5nIHRpbWVjb2RlIG9mIHRoZSBjbHVzdGVyOyB0aGlzIGlzIHRoZSB0aW1lY29kZSBvZiB0aGUgZmlyc3QKKy8vICAgZnJhbWUgc2luY2UgZnJhbWVzIGFyZSBvcmRlcmVkIGJ5IHRpbWVzdGFtcC4KKy8vCisvLyBjaGlsZHJlbjoKKy8vICAgbGlzdCB0byBob2xkIGNoaWxkIGVsZW1lbnRzIGluIGEgd2VibSBjbHVzdGVyIChzdGFydCB0aW1lY29kZSBhbmQKKy8vICAgc2ltcGxlIGJsb2NrcykuCisvLworLy8gc3RhdGljCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OmluaXRDbHVzdGVyKAorICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsCisgICAgdWludDY0X3QmIGNsdXN0ZXJUaW1lY29kZUwsCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICBDSEVDSyghZnJhbWVzLmVtcHR5KCkgJiYgY2hpbGRyZW4uZW1wdHkoKSk7CisKKyAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICBjbHVzdGVyVGltZWNvZGVMID0gZi0+bUFic1RpbWVjb2RlOworICAgIFdlYm1VbnNpZ25lZCAqY2x1c3RlclRpbWVjb2RlID0gbmV3IFdlYm1VbnNpZ25lZChrTWt2VGltZWNvZGUsIGNsdXN0ZXJUaW1lY29kZUwpOworICAgIGNoaWxkcmVuLmNsZWFyKCk7CisgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGNsdXN0ZXJUaW1lY29kZSk7Cit9CisKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6d3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKSB7CisgICAgLy8gY2hpbGRyZW4gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBzaW1wbGVibG9jayBhbmQgaXRzIHRpbWVjb2RlCisgICAgQ0hFQ0tfR0UoY2hpbGRyZW4uc2l6ZSgpLCAyKTsKKworICAgIHVpbnQ2NF90IHNpemU7CisgICAgc3A8V2VibUVsZW1lbnQ+IGNsdXN0ZXIgPSBuZXcgV2VibU1hc3RlcihrTWt2Q2x1c3RlciwgY2hpbGRyZW4pOworICAgIGNsdXN0ZXItPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKK30KKworLy8gV3JpdGUgb3V0IChwb3NzaWJseSBtdWx0aXBsZSkgd2VibSBjbHVzdGVyKHMpIGZyb20gZnJhbWVzIHNwbGl0IG9uIHZpZGVvIGtleSBmcmFtZXMuCisvLworLy8gbGFzdDoKKy8vICAgY3VycmVudCBmbHVzaCBpcyB0cmlnZ2VyZWQgYnkgRU9TIGluc3RlYWQgb2YgYSBzZWNvbmQgb3V0c3RhbmRpbmcgdmlkZW8ga2V5IGZyYW1lLgordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpmbHVzaEZyYW1lcyhMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLCBib29sIGxhc3QpIHsKKyAgICBpZiAoZnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGNsdXN0ZXJUaW1lY29kZUw7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBpbml0Q2x1c3RlcihmcmFtZXMsIGNsdXN0ZXJUaW1lY29kZUwsIGNoaWxkcmVuKTsKKworICAgIHVpbnQ2NF90IGN1ZVRpbWUgPSBjbHVzdGVyVGltZWNvZGVMOworICAgIG9mZl90IGZwb3MgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19DVVIpOworICAgIHNpemVfdCBuID0gZnJhbWVzLnNpemUoKTsKKyAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBmbHVzaGluZyB0aGUgbGFzdCBzZXF1ZW5jZSBvZiBvdXRzdGFuZGluZyBmcmFtZXMsIGZsdXNoRnJhbWVzCisgICAgICAgIC8vIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCByaWdodCBhZnRlciB3ZSBoYXZlIHB1c2hlZCBhIHNlY29uZCBvdXRzdGFuZGluZyB2aWRlbyBrZXkKKyAgICAgICAgLy8gZnJhbWUgKHRoZSBsYXN0IGZyYW1lKSwgd2hpY2ggYmVsb25ncyB0byB0aGUgbmV4dCBjbHVzdGVyOyBhbHNvIGhvbGQgYmFjayBvbgorICAgICAgICAvLyBmbHVzaGluZyB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUgYmVmb3JlIHdlIGNoZWNrIGl0cyB0eXBlLiBBIGF1ZGlvIGZyYW1lCisgICAgICAgIC8vIHNob3VsZCBwcmVjZWRlIHRoZSBhZm9yZW1lbnRpb25lZCB2aWRlbyBrZXkgZnJhbWUgaW4gdGhlIG5leHQgc2VxdWVuY2UsIGEgdmlkZW8KKyAgICAgICAgLy8gZnJhbWUgc2hvdWxkIGJlIHRoZSBsYXN0IGZyYW1lIGluIHRoZSBjdXJyZW50ICh0by1iZS1mbHVzaGVkKSBzZXF1ZW5jZS4KKyAgICAgICAgQ0hFQ0tfR0UobiwgMik7CisgICAgICAgIG4gLT0gMjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgaWYgKGYtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgZi0+bUtleSkgeworICAgICAgICAgICAgY3VlVGltZSA9IGYtPm1BYnNUaW1lY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmLT5tQWJzVGltZWNvZGUgLSBjbHVzdGVyVGltZWNvZGVMID4gSU5UMTZfTUFYKSB7CisgICAgICAgICAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgICAgICAgICAgaW5pdENsdXN0ZXIoZnJhbWVzLCBjbHVzdGVyVGltZWNvZGVMLCBjaGlsZHJlbik7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZXMuZXJhc2UoZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soZi0+U2ltcGxlQmxvY2soY2x1c3RlclRpbWVjb2RlTCkpOworICAgIH0KKworICAgIC8vIGVxdWl2YWxlbnQgdG8gbGFzdD09ZmFsc2UKKyAgICBpZiAoIWZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIG91dCB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUuCisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gc2Vjb25kTGFzdEZyYW1lID0gKihmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGlmIChzZWNvbmRMYXN0RnJhbWUtPm1UeXBlID09IGtWaWRlb1R5cGUpIHsKKyAgICAgICAgICAgIGZyYW1lcy5lcmFzZShmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soc2Vjb25kTGFzdEZyYW1lLT5TaW1wbGVCbG9jayhjbHVzdGVyVGltZWNvZGVMKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVQb2ludCA9IFdlYm1FbGVtZW50OjpDdWVQb2ludEVudHJ5KGN1ZVRpbWUsIDEsIGZwb3MgLSBtU2VnbWVudERhdGFTdGFydCk7CisgICAgbUN1ZXMucHVzaF9iYWNrKGN1ZVBvaW50KTsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lU2lua1RocmVhZDo6c3RhcnQoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpzdG9wKCkgeworICAgIG1Eb25lID0gdHJ1ZTsKKyAgICBtVmlkZW9GcmFtZXMucHVzaChXZWJtRnJhbWU6OkVPUyk7CisgICAgbUF1ZGlvRnJhbWVzLnB1c2goV2VibUZyYW1lOjpFT1MpOworICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKK30KKwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpydW4oKSB7CisgICAgaW50IG51bVZpZGVvS2V5RnJhbWVzID0gMDsKKyAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiBvdXRzdGFuZGluZ0ZyYW1lczsKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIEFMT0dWKCJ3YWl0IHYgZnJhbWUiKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiB2aWRlb0ZyYW1lID0gbVZpZGVvRnJhbWVzLnBlZWsoKTsKKyAgICAgICAgQUxPR1YoInYgZnJhbWU6ICVwIiwgdmlkZW9GcmFtZS5nZXQoKSk7CisKKyAgICAgICAgQUxPR1YoIndhaXQgYSBmcmFtZSIpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGF1ZGlvRnJhbWUgPSBtQXVkaW9GcmFtZXMucGVlaygpOworICAgICAgICBBTE9HVigiYSBmcmFtZTogJXAiLCBhdWRpb0ZyYW1lLmdldCgpKTsKKworICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUVvcyAmJiBhdWRpb0ZyYW1lLT5tRW9zKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqYXVkaW9GcmFtZSA8ICp2aWRlb0ZyYW1lKSB7CisgICAgICAgICAgICBBTE9HVigidGFrZSBhIGZyYW1lIik7CisgICAgICAgICAgICBtQXVkaW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKGF1ZGlvRnJhbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInRha2UgdiBmcmFtZSIpOworICAgICAgICAgICAgbVZpZGVvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIG91dHN0YW5kaW5nRnJhbWVzLnB1c2hfYmFjayh2aWRlb0ZyYW1lKTsKKyAgICAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tS2V5KQorICAgICAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtVmlkZW9LZXlGcmFtZXMgPT0gMikgeworICAgICAgICAgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyBmYWxzZSk7CisgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmbHVzaGluZyBsYXN0IGNsdXN0ZXIgKHNpemUgJXp1KSIsIG91dHN0YW5kaW5nRnJhbWVzLnNpemUoKSk7CisgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyB0cnVlKTsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgaW50NjRfdCBrSW5pdGlhbERlbGF5VGltZVVzID0gNzAwMDAwTEw7CisKK3ZvaWQgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OmNsZWFyRmxhZ3MoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK1dlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKKyAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgIGludCBudW1UcmFja3MsCisgICAgICAgIGJvb2wgcmVhbFRpbWVSZWNvcmRpbmcpCisgICAgOiBXZWJtRnJhbWVTb3VyY2VUaHJlYWQodHlwZSwgc2luayksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVGltZUNvZGVTY2FsZSh0aW1lQ29kZVNjYWxlKSwKKyAgICAgIG1UcmFja0R1cmF0aW9uVXMoMCkgeworICAgIGNsZWFyRmxhZ3MoKTsKKyAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVSZWFsVXM7CisgICAgaWYgKHJlYWxUaW1lUmVjb3JkaW5nICYmIG51bVRyYWNrcyA+IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29waWVkIGZyb20gTVBFRzRXcml0ZXIKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBleHRyYSBkZWxheSBvZiBhY2NlcHRpbmcgaW5jb21pbmcgYXVkaW8vdmlkZW8gc2lnbmFscworICAgICAgICAgKiBoZWxwcyB0byBhbGlnbiBhL3Ygc3RhcnQgdGltZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVjb3JkaW5nCisgICAgICAgICAqIHNlc3Npb24sIGFuZCBpdCBhbHNvIGhlbHBzIGVsaW1pbmF0ZSB0aGUgInJlY29yZGluZyIgc291bmQgZm9yCisgICAgICAgICAqIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGNsaWVudCBkb2VzIG5vdCBzZXQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0LCB3ZSBmYWxsIGJhY2sgdG8KKyAgICAgICAgICogdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgZGVsYXkgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gc3RhcnRUaW1lT2Zmc2V0TXMgKiAxMDAwTEw7CisgICAgICAgIGlmIChzdGFydFRpbWVPZmZzZXRVcyA8IDApIHsgIC8vIFN0YXJ0IHRpbWUgb2Zmc2V0IHdhcyBub3Qgc2V0CisgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOworICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICUiIFBSSWQ2NCAiIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KG1ldGEuZ2V0KCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnJlc3VtZSgpIHsKKyAgICBpZiAoIW1Eb25lICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnBhdXNlKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6c3RvcCgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpydW4oKSB7CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IDB4ZGVhZGJlZWY7CisgICAgaW50NjRfdCBsYXN0VGltZXN0YW1wVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcAorICAgIGludDY0X3QgbGFzdER1cmF0aW9uVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgZHVyYXRpb24KKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisKKyAgICBjb25zdCB1aW50NjRfdCBrVW5pbml0aWFsaXplZCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkw7CisgICAgbVN0YXJ0VGltZVVzID0ga1VuaW5pdGlhbGl6ZWQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciwgTlVMTCkpID09IE9LKSB7CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1kID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQ0hFQ0sobWQtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcFVzIC09IG1TdGFydFRpbWVVczsKKworICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsrY291bnQ7CisKKyAgICAgICAgLy8gYWRqdXN0IHRpbWUtc3RhbXBzIGFmdGVyIHBhdXNlL3Jlc3VtZQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDS19HRShkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMsIDBsbCk7CisgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKworICAgICAgICBpbnQzMl90IGlzU3luYyA9IGZhbHNlOworICAgICAgICBtZC0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYyk7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9IG5ldyBXZWJtRnJhbWUoCisgICAgICAgICAgICBtVHlwZSwKKyAgICAgICAgICAgIGlzU3luYywKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyKTsKKyAgICAgICAgbVNpbmsucHVzaChmKTsKKworICAgICAgICBBTE9HVigKKyAgICAgICAgICAgICIlcyAlcyBmcmFtZSBhdCAlIiBQUklkNjQgIiBzaXplICV6dVxuIiwKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyAidmlkZW8iIDogImF1ZGlvIiwKKyAgICAgICAgICAgIGlzU3luYyA/ICJJIiA6ICJQIiwKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgeworICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIH0KKworICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CisgICAgbVNpbmsucHVzaChXZWJtRnJhbWU6OkVPUyk7Cit9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUZSQU1FVEhSRUFEX0hfCisjZGVmaW5lIFdFQk1GUkFNRVRIUkVBRF9IXworCisjaW5jbHVkZSAiV2VibUZyYW1lLmgiCisjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgV2VibUZyYW1lVGhyZWFkIDogcHVibGljIExpZ2h0UmVmQmFzZTxXZWJtRnJhbWVUaHJlYWQ+IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBydW5uaW5nKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKSB7IHJldHVybiBPSzsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgfldlYm1GcmFtZVRocmVhZCgpIHsgc3RvcCgpOyB9CisgICAgc3RhdGljIHZvaWQgKndyYXAodm9pZCAqYXJnKTsKKworcHJvdGVjdGVkOgorICAgIFdlYm1GcmFtZVRocmVhZCgpCisgICAgICAgIDogbVRocmVhZCgwKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1GcmFtZVRocmVhZCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkOworY2xhc3MgV2VibUZyYW1lU2lua1RocmVhZCA6IHB1YmxpYyBXZWJtRnJhbWVUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gdmlkZW9UaHJlYWQsCisgICAgICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3Vlcyk7CisKKyAgICBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgdmlkZW9Tb3VyY2UsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKTsKKworICAgIHZvaWQgcnVuKCk7CisgICAgYm9vbCBydW5uaW5nKCkgeworICAgICAgICByZXR1cm4gIW1Eb25lOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQmIG1GZDsKKyAgICBjb25zdCB1aW50NjRfdCYgbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1WaWRlb0ZyYW1lczsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbUF1ZGlvRnJhbWVzOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIG1DdWVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKworICAgIHN0YXRpYyB2b2lkIGluaXRDbHVzdGVyKAorICAgICAgICAgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywKKyAgICAgICAgICAgIHVpbnQ2NF90JiBjbHVzdGVyVGltZWNvZGVMLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pOworICAgIHZvaWQgd3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKTsKKyAgICB2b2lkIGZsdXNoRnJhbWVzKExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsIGJvb2wgbGFzdCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lU291cmNlVGhyZWFkKGludCB0eXBlLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luayk7CisgICAgdmlydHVhbCBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSA9IDA7Citwcm90ZWN0ZWQ6CisgICAgY29uc3QgaW50IG1UeXBlOworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtU2luazsKKworICAgIGZyaWVuZCBjbGFzcyBXZWJtRnJhbWVTaW5rVGhyZWFkOworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQoaW50IHR5cGUsIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKQorICAgICAgICA6IFdlYm1GcmFtZVNvdXJjZVRocmVhZCh0eXBlLCBzaW5rKSB7CisgICAgfQorICAgIHZvaWQgcnVuKCkgeyBtU2luay5wdXNoKFdlYm1GcmFtZTo6RU9TKTsgfQorICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIHsgcmV0dXJuIDA7IH0KK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmssCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICAgICAgaW50IG51bVBlZXJzLAorICAgICAgICAgICAgYm9vbCByZWFsVGltZVJlY29yZGluZyk7CisKKyAgICB2b2lkIHJ1bigpOworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3QgcmVzdW1lKCk7CisgICAgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICBzdGF0dXNfdCBzdG9wKCk7CisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgeworICAgICAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgY29uc3QgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CisgICAgdWludDY0X3QgbVN0YXJ0VGltZVVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZDsKKyAgICB2b2xhdGlsZSBib29sIG1TdGFydGVkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgaW50NjRfdCBtVHJhY2tEdXJhdGlvblVzOworCisgICAgdm9pZCBjbGVhckZsYWdzKCk7Cit9OworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZW5kaWYgLyogV0VCTUZSQU1FVEhSRUFEX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NmOTJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1Xcml0ZXIiCisKKyNpbmNsdWRlICJFYm1sVXRpbC5oIgorI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2Ugeworc2l6ZV90IFhpcGhMYWNlQ29kZUxlbihzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBzaXplIC8gMHhmZiArIDE7Cit9CisKK3NpemVfdCBYaXBoTGFjZUVuYyh1aW50OF90ICpidWYsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgc2l6ZSA+PSAweGZmOyArK2ksIHNpemUgLT0gMHhmZikgeworICAgICAgICBidWZbaV0gPSAweGZmOworICAgIH0KKyAgICBidWZbaSsrXSA9IHNpemU7CisgICAgcmV0dXJuIGk7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMgPSA1ICogMTAyNCAqIDEwMjQ7CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoaW50IGZkKQorICAgIDogbUZkKGR1cChmZCkpLAorICAgICAgbUluaXRDaGVjayhtRmQgPCAwID8gTk9fSU5JVCA6IE9LKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAorICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCisgICAgICBtU2VnbWVudE9mZnNldCgwKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAorICAgICAgbUluZm9PZmZzZXQoMCksCisgICAgICBtSW5mb1NpemUoMCksCisgICAgICBtVHJhY2tzT2Zmc2V0KDApLAorICAgICAgbUN1ZXNPZmZzZXQoMCksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKKyAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7CisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7CisgICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIG1GZCwKKyAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAorICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbUN1ZVBvaW50cyk7Cit9CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKKyAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCisgICAgICBtSW5mb09mZnNldCgwKSwKKyAgICAgIG1JbmZvU2l6ZSgwKSwKKyAgICAgIG1UcmFja3NPZmZzZXQoMCksCisgICAgICBtQ3Vlc09mZnNldCgwKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAorICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAorICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIEFMT0dWKCJmZCAlZDsgZmxhZ3M6ICVvIiwgbUZkLCBmY250bChtRmQsIEZfR0VURkwsIDApKTsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgIH0KKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKKyAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgbUZkLAorICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtQ3VlUG9pbnRzKTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6dmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OlZpZGVvVHJhY2tFbnRyeSh3aWR0aCwgaGVpZ2h0KTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpOworICAgIENIRUNLKG1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKSk7CisgICAgQ0hFQ0sobWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSk7CisKKyAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgIG9mZl90IG9mZiA9IDA7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKworICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOworICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7CisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgcmV0dXJuIGVudHJ5OworfQorCitzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG51bVRyYWNrcysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bVRyYWNrczsKK30KKwordWludDY0X3QgV2VibVdyaXRlcjo6ZXN0aW1hdGVDdWVzU2l6ZShpbnQzMl90IGJpdFJhdGUpIHsKKyAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGVzdGltYXRlTW9vdkJveFNpemUgaW4gTVBFRzRXcml0ZXIuCisgICAgLy8KKyAgICAvLyBTdGF0aXN0aWNhbCBhbmFseXNpcyBzaG93cyB0aGF0IG1ldGFkYXRhIHVzdWFsbHkgYWNjb3VudHMKKyAgICAvLyBmb3IgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSB0b3RhbCBmaWxlIHNpemUsIHVzdWFsbHkgPCAwLjYlLgorCisgICAgLy8gVGhlIGRlZmF1bHQgTUlOX01PT1ZfQk9YX1NJWkUgaXMgc2V0IHRvIDAuNiUgeCAxTUIgLyAyLAorICAgIC8vIHdoZXJlIDFNQiBpcyB0aGUgY29tbW9uIGZpbGUgc2l6ZSBsaW1pdCBmb3IgTU1TIGFwcGxpY2F0aW9uLgorICAgIC8vIFRoZSBkZWZhdWx0IE1BWCBfTU9PVl9CT1hfU0laRSB2YWx1ZSBpcyBiYXNlZCBvbiBhYm91dCAzCisgICAgLy8gbWludXRlIHZpZGVvIHJlY29yZGluZyB3aXRoIGEgYml0IHJhdGUgYWJvdXQgMyBNYnBzLCBiZWNhdXNlCisgICAgLy8gc3RhdGlzdGljcyBhbHNvIHNob3cgdGhhdCBtb3N0IG9mIHRoZSB2aWRlbyBjYXB0dXJlZCBhcmUgZ29pbmcKKyAgICAvLyB0byBiZSBsZXNzIHRoYW4gMyBtaW51dGVzLgorCisgICAgLy8gSWYgdGhlIGVzdGltYXRpb24gaXMgd3JvbmcsIHdlIHdpbGwgcGF5IHRoZSBwcmljZSBvZiB3YXN0aW5nCisgICAgLy8gc29tZSByZXNlcnZlZCBzcGFjZS4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzbyBvZnRlbiBzdGF0aXN0aWNhbGx5LgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGZhY3RvciA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUlOX0NVRVNfU0laRSA9IDMgKiAxMDI0OyAgLy8gMyBLQgorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1BWF9DVUVTX1NJWkUgPSAoMTgwICogMzAwMDAwMCAqIDZMTCAvIDgwMDApOworICAgIGludDY0X3Qgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisKKyAgICAvLyBNYXggZmlsZSBzaXplIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDAgJiYgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSA9IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgKiA2IC8gMTAwMDsKKyAgICB9CisKKyAgICAvLyBNYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgIT0gMCkgeworICAgICAgICBpZiAoYml0UmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2l6ZTIgPSAoKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzICogYml0UmF0ZSAqIDYpIC8gMTAwMCAvIDgwMDAwMDApOworICAgICAgICAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCAmJiBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBmaWxlIHNpemUgYW5kIGR1cmF0aW9uIGxpbWl0cyBhcmUgc2V0LAorICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgc21hbGxlciBsaW1pdCBvZiB0aGUgdHdvLgorICAgICAgICAgICAgICAgIGlmIChzaXplID4gc2l6ZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBtYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IE1JTl9DVUVTX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisgICAgfQorCisgICAgLy8gQW55IGxvbmcgZHVyYXRpb24gcmVjb3JkaW5nIHdpbGwgYmUgcHJvYmFibHkgZW5kIHVwIHdpdGgKKyAgICAvLyBub24tc3RyZWFtYWJsZSB3ZWJtIGZpbGUuCisgICAgaWYgKHNpemUgPiBNQVhfQ1VFU19TSVpFKSB7CisgICAgICAgIHNpemUgPSBNQVhfQ1VFU19TSVpFOworICAgIH0KKworICAgIEFMT0dWKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCIKKyAgICAgICAgICAgICIgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCBjdWVzIHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAorICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOworICAgIHJldHVybiBmYWN0b3IgKiBzaXplOworfQorCit2b2lkIFdlYm1Xcml0ZXI6OmluaXRTdHJlYW0oc2l6ZV90IGlkeCkgeworICAgIGlmIChtU3RyZWFtc1tpZHhdLm1UaHJlYWQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtU3RyZWFtc1tpZHhdLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkaW5nIGR1bW15IHNvdXJjZSAuLi4gIik7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1UeXBlLCBtU3RyZWFtc1tpZHhdLm1TaW5rKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiYWRkaW5nIHNvdXJjZSAlcCIsIG1TdHJlYW1zW2lkeF0ubVNvdXJjZS5nZXQoKSk7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1Tb3VyY2UsCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVHlwZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1TaW5rLAorICAgICAgICAgICAgICAgIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgICAgICAgICBudW1UcmFja3MoKSwKKyAgICAgICAgICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyk7CisgICAgfQorfQorCit2b2lkIFdlYm1Xcml0ZXI6OnJlbGVhc2UoKSB7CisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1pbkR1cmF0aW9uVXMgPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5nZXREdXJhdGlvblVzKCk7CisgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgeworICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPCBtaW5EdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtaW5EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1UcmFja3MoKSA+IDEpIHsKKyAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslIiBQUklkNjQgIiwgJSIgUFJJZDY0ICJdIHVzIiwgbWluRHVyYXRpb25VcywgbWF4RHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgbVNpbmtUaHJlYWQtPnN0b3AoKTsKKworICAgIC8vIERvIG5vdCB3cml0ZSBvdXQgbW92aWUgaGVhZGVyIG9uIGVycm9yLgorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVzID0gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZXMsIG1DdWVQb2ludHMpOworICAgIHVpbnQ2NF90IGN1ZXNTaXplID0gY3Vlcy0+dG90YWxTaXplKCk7CisgICAgLy8gVFJJQ0tZIEV2ZW4gd2hlbiB0aGUgY3VlcyBkbyBmaXQgaW4gdGhlIHNwYWNlIHdlIHJlc2VydmVkLCBpZiB0aGV5IGRvIG5vdCBmaXQKKyAgICAvLyBwZXJmZWN0bHksIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoICJleHRyYSBzcGFjZSIgdG8gd3JpdGUgYW4KKyAgICAvLyBFQk1MIHZvaWQgZWxlbWVudC4KKyAgICBpZiAoY3Vlc1NpemUgIT0gbUVzdGltYXRlZEN1ZXNTaXplICYmIGN1ZXNTaXplID4gbUVzdGltYXRlZEN1ZXNTaXplIC0ga01pbkVibWxWb2lkU2l6ZSkgeworICAgICAgICBtQ3Vlc09mZnNldCA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICAgICAgOjpsc2VlayhtRmQsIG1DdWVzT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQobUVzdGltYXRlZEN1ZXNTaXplIC0gY3Vlc1NpemUpOworICAgICAgICBzcGFjZS0+d3JpdGUobUZkLCBzcGFjZVNpemUpOworICAgIH0KKworICAgIG1DdWVQb2ludHMuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKworICAgIHVpbnQ4X3QgYmFyeVtzaXplb2YodWludDY0X3QpXTsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19FTkQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplID0gdG90YWxTaXplIC0gbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50T2Zmc2V0ICsgc2l6ZU9mKGtNa3ZTZWdtZW50KSwgU0VFS19TRVQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplQ29kZWQgPSBlbmNvZGVVbnNpZ25lZChzZWdtZW50U2l6ZSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChzZWdtZW50U2l6ZUNvZGVkLCBiYXJ5KTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisKKyAgICB1aW50NjRfdCBzaXplOworICAgIHVpbnQ2NF90IGR1cmF0aW9uT2Zmc2V0ID0gbUluZm9PZmZzZXQgKyBzaXplT2Yoa01rdkluZm8pICsgc2l6ZU9mKG1JbmZvU2l6ZSkKKyAgICAgICAgKyBzaXplT2Yoa01rdlNlZ21lbnREdXJhdGlvbikgKyBzaXplT2Yoc2l6ZW9mKGRvdWJsZSkpOworICAgIHNwPFdlYm1FbGVtZW50PiBkdXJhdGlvbiA9IG5ldyBXZWJtRmxvYXQoCisgICAgICAgICAgICBrTWt2U2VnbWVudER1cmF0aW9uLAorICAgICAgICAgICAgKGRvdWJsZSkgKG1heER1cmF0aW9uVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUpKTsKKyAgICBkdXJhdGlvbi0+c2VyaWFsaXplUGF5bG9hZChiYXJ5KTsKKyAgICA6OmxzZWVrKG1GZCwgZHVyYXRpb25PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZW9mKGRvdWJsZSkpOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWVrRW50cmllczsKKyAgICBzZWVrRW50cmllcy5wdXNoX2JhY2soV2VibUVsZW1lbnQ6OlNlZWtFbnRyeShrTWt2SW5mbywgbUluZm9PZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZUcmFja3MsIG1UcmFja3NPZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZDdWVzLCBtQ3Vlc09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc3A8V2VibUVsZW1lbnQ+IHNlZWtIZWFkID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZWtIZWFkLCBzZWVrRW50cmllcyk7CisKKyAgICB1aW50NjRfdCBtZXRhU2Vla1NpemU7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50RGF0YVN0YXJ0LCBTRUVLX1NFVCk7CisgICAgc2Vla0hlYWQtPndyaXRlKG1GZCwgbWV0YVNlZWtTaXplKTsKKworICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQoa01heE1ldGFTZWVrU2l6ZSAtIG1ldGFTZWVrU2l6ZSk7CisgICAgc3BhY2UtPndyaXRlKG1GZCwgc3BhY2VTaXplKTsKKworICAgIHJlbGVhc2UoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGFkZCBzb3VyY2UgQUZURVIgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQXQgbW9zdCAyIHRyYWNrcyBjYW4gYmUgc3VwcG9ydGVkLgorICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoMikgdG8gYWRkIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CisKKyAgICAvLyBBIHRyYWNrIG9mIHR5cGUgb3RoZXIgdGhhbiB2aWRlbyBvciBhdWRpbyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKworICAgIHNpemVfdCBzdHJlYW1JbmRleDsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpKSB7CisgICAgICAgIHN0cmVhbUluZGV4ID0ga1ZpZGVvSW5kZXg7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkpIHsKKyAgICAgICAgc3RyZWFtSW5kZXggPSBrQXVkaW9JbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCB2cDgsIHZvcmJpcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBObyBtb3JlIHRoYW4gb25lIHZpZGVvIG9yIG9uZSBhdWRpbyB0cmFjayBpcyBzdXBwb3J0ZWQuCisgICAgaWYgKG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlcyB0cmFjayBhbHJlYWR5IGV4aXN0cyIsIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tTmFtZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmFjayBvZiBlaXRoZXIgYXVkaW8gb3IgdmlkZW8uCisgICAgLy8gR28gYWhlYWQgdG8gYWRkIHRoZSB0cmFjay4KKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVRyYWNrRW50cnkgPSBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubU1ha2VUcmFjayhzb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgPT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIHNvdXJjZSBhZGRlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCkgeworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBpbnQzMl90IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgJmlzUmVhbFRpbWVSZWNvcmRpbmcpOworICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaW50MzJfdCB0Y3NsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJnRjc2wpKSB7CisgICAgICAgICAgICBtVGltZUNvZGVTY2FsZSA9IHRjc2w7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfR1QobVRpbWVDb2RlU2NhbGUsIDApOworICAgIEFMT0dWKCJtb3ZpZSB0aW1lIHNjYWxlOiAlIiBQUkl1NjQsIG1UaW1lQ29kZVNjYWxlKTsKKworICAgIC8qCisgICAgICogV2hlbiB0aGUgcmVxdWVzdGVkIGZpbGUgc2l6ZSBsaW1pdCBpcyBzbWFsbCwgdGhlIHByaW9yaXR5CisgICAgICogaXMgdG8gbWVldCB0aGUgZmlsZSBzaXplIGxpbWl0IHJlcXVpcmVtZW50LCByYXRoZXIgdGhhbgorICAgICAqIHRvIG1ha2UgdGhlIGZpbGUgc3RyZWFtYWJsZS4gbVN0cmVhbWFibGVGaWxlIGRvZXMgbm90IHRlbGwKKyAgICAgKiB3aGV0aGVyIHRoZSBhY3R1YWwgcmVjb3JkZWQgZmlsZSBpcyBzdHJlYW1hYmxlIG9yIG5vdC4KKyAgICAgKi8KKyAgICBtU3RyZWFtYWJsZUZpbGUgPSAoIW1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpCisgICAgICAgIHx8IChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID49IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzKTsKKworICAgIC8qCisgICAgICogV3JpdGUgdmFyaW91cyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBzcDxXZWJtRWxlbWVudD4gZWJtbCwgc2VnbWVudCwgaW5mbywgc2Vla0hlYWQsIHRyYWNrcywgY3VlczsKKyAgICBlYm1sID0gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoKTsKKyAgICBzZWdtZW50ID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZ21lbnQpOworICAgIHNlZWtIZWFkID0gbmV3IEVibWxWb2lkKGtNYXhNZXRhU2Vla1NpemUpOworICAgIGluZm8gPSBXZWJtRWxlbWVudDo6U2VnbWVudEluZm8obVRpbWVDb2RlU2NhbGUsIDApOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhtU3RyZWFtc1tpXS5tVHJhY2tFbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhY2tzID0gbmV3IFdlYm1NYXN0ZXIoa01rdlRyYWNrcywgY2hpbGRyZW4pOworCisgICAgaWYgKCFtU3RyZWFtYWJsZUZpbGUpIHsKKyAgICAgICAgY3VlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlID0gLTE7CisgICAgICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUVzdGltYXRlZEN1ZXNTaXplID0gZXN0aW1hdGVDdWVzU2l6ZShiaXRSYXRlKTsKKyAgICAgICAgQ0hFQ0tfR0UobUVzdGltYXRlZEN1ZXNTaXplLCA4KTsKKyAgICAgICAgY3VlcyA9IG5ldyBFYm1sVm9pZChtRXN0aW1hdGVkQ3Vlc1NpemUpOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBlbGVtc1tdID0geyBlYm1sLCBzZWdtZW50LCBzZWVrSGVhZCwgaW5mbywgdHJhY2tzLCBjdWVzIH07CisgICAgc2l6ZV90IG5FbGVtcyA9IHNpemVvZihlbGVtcykgLyBzaXplb2YoZWxlbXNbMF0pOworICAgIHVpbnQ2NF90IG9mZnNldHNbbkVsZW1zXTsKKyAgICB1aW50NjRfdCBzaXplc1tuRWxlbXNdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuRWxlbXM7IGkrKykgeworICAgICAgICBXZWJtRWxlbWVudCAqZSA9IGVsZW1zW2ldLmdldCgpOworICAgICAgICBpZiAoIWUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3Qgc2l6ZTsKKyAgICAgICAgb2Zmc2V0c1tpXSA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIHNpemVzW2ldID0gZS0+bVNpemU7CisgICAgICAgIGUtPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgfQorCisgICAgbVNlZ21lbnRPZmZzZXQgPSBvZmZzZXRzWzFdOworICAgIG1TZWdtZW50RGF0YVN0YXJ0ID0gb2Zmc2V0c1syXTsKKyAgICBtSW5mb09mZnNldCA9IG9mZnNldHNbM107CisgICAgbUluZm9TaXplID0gc2l6ZXNbM107CisgICAgbVRyYWNrc09mZnNldCA9IG9mZnNldHNbNF07CisgICAgbUN1ZXNPZmZzZXQgPSBvZmZzZXRzWzVdOworCisgICAgLy8gc3RhcnQgdGhyZWFkcworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgfQorCisgICAgaW5pdFN0cmVhbShrQXVkaW9JbmRleCk7CisgICAgaW5pdFN0cmVhbShrVmlkZW9JbmRleCk7CisKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU2lua1RocmVhZC0+c3RhcnQoKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnBhdXNlKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPnBhdXNlKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpzdG9wKCkgeworICAgIHJldHVybiByZXNldCgpOworfQorCitib29sIFdlYm1Xcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuICFtU2lua1RocmVhZC0+cnVubmluZygpOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI2OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1XUklURVJfSF8KKyNkZWZpbmUgV0VCTVdSSVRFUl9IXworCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgorI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFdlYm1Xcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgeworcHVibGljOgorICAgIFdlYm1Xcml0ZXIoaW50IGZkKTsKKyAgICBXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICB+V2VibVdyaXRlcigpIHsgcmVzZXQoKTsgfQorCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICB1aW50NjRfdCBtVGltZUNvZGVTY2FsZTsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOworCisgICAgdWludDY0X3QgbVNlZ21lbnRPZmZzZXQ7CisgICAgdWludDY0X3QgbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgdWludDY0X3QgbUluZm9PZmZzZXQ7CisgICAgdWludDY0X3QgbUluZm9TaXplOworICAgIHVpbnQ2NF90IG1UcmFja3NPZmZzZXQ7CisgICAgdWludDY0X3QgbUN1ZXNPZmZzZXQ7CisKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkOworICAgIGJvb2wgbUlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgYm9vbCBtU3RyZWFtYWJsZUZpbGU7CisgICAgdWludDY0X3QgbUVzdGltYXRlZEN1ZXNTaXplOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBtQ3VlUG9pbnRzOworCisgICAgZW51bSB7CisgICAgICAgIGtBdWRpb0luZGV4ICAgICA9ICAwLAorICAgICAgICBrVmlkZW9JbmRleCAgICAgPSAgMSwKKyAgICAgICAga01heFN0cmVhbXMgICAgID0gIDIsCisgICAgfTsKKworICAgIHN0cnVjdCBXZWJtU3RyZWFtIHsKKyAgICAgICAgaW50IG1UeXBlOworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+ICgqbU1ha2VUcmFjaykoY29uc3Qgc3A8TWV0YURhdGE+Jik7CisKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBtVHJhY2tFbnRyeTsKKyAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBtVGhyZWFkOworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiBtU2luazsKKworICAgICAgICBXZWJtU3RyZWFtKCkKKyAgICAgICAgICAgIDogbVR5cGUoa0ludmFsaWRUeXBlKSwKKyAgICAgICAgICAgICAgbU5hbWUoIkludmFsaWQiKSwKKyAgICAgICAgICAgICAgbU1ha2VUcmFjayhOVUxMKSB7CisgICAgICAgIH0KKworICAgICAgICBXZWJtU3RyZWFtKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCBzcDxXZWJtRWxlbWVudD4gKCptYWtlVHJhY2spKGNvbnN0IHNwPE1ldGFEYXRhPiYpKQorICAgICAgICAgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgICAgICAgICAgbU5hbWUobmFtZSksCisgICAgICAgICAgICAgIG1NYWtlVHJhY2sobWFrZVRyYWNrKSB7CisgICAgICAgIH0KKworICAgICAgICBXZWJtU3RyZWFtICZvcGVyYXRvcj0oY29uc3QgV2VibVN0cmVhbSAmb3RoZXIpIHsKKyAgICAgICAgICAgIG1UeXBlID0gb3RoZXIubVR5cGU7CisgICAgICAgICAgICBtTmFtZSA9IG90aGVyLm1OYW1lOworICAgICAgICAgICAgbU1ha2VUcmFjayA9IG90aGVyLm1NYWtlVHJhY2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB9OworICAgIFdlYm1TdHJlYW0gbVN0cmVhbXNba01heFN0cmVhbXNdOworCisgICAgc3A8V2VibUZyYW1lU2lua1RocmVhZD4gbVNpbmtUaHJlYWQ7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzKCk7CisgICAgdWludDY0X3QgZXN0aW1hdGVDdWVzU2l6ZShpbnQzMl90IGJpdFJhdGUpOworICAgIHZvaWQgaW5pdFN0cmVhbShzaXplX3QgaWR4KTsKKyAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICBzdGF0dXNfdCByZXNldCgpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiB2aWRlb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpOworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gYXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1Xcml0ZXIpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1XUklURVJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcAppbmRleCA3NTNiM2VjLi4yODM0YTY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCkBAIC03NCwxOSArNzQsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgdm9pZCAqbWJ1ZjsKLSAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWJ1ZikKLSAgICAgICAgICAgICYmIG1idWYgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigicmVsZWFzaW5nIG1idWYgJXAiLCBtYnVmKTsKLQotICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgTlVMTCk7Ci0KLSAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXIgKj4obWJ1ZiktPnJlbGVhc2UoKTsKLSAgICAgICAgbWJ1ZiA9IE5VTEw7Ci0gICAgfQotfQotCiB2b2lkIENvbnZlcnRlcjo6cmVsZWFzZUVuY29kZXIoKSB7CiAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtOTUsMTggKzgyLDcgQEAKICAgICBtRW5jb2Rlci0+cmVsZWFzZSgpOwogICAgIG1FbmNvZGVyLmNsZWFyKCk7CiAKLSAgICB3aGlsZSAoIW1JbnB1dEJ1ZmZlclF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOwotICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5jb2RlcklucHV0QnVmZmVycy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGkpOwotICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7Ci0gICAgfQotCisgICAgbUlucHV0QnVmZmVyUXVldWUuY2xlYXIoKTsKICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5jbGVhcigpOwogICAgIG1FbmNvZGVyT3V0cHV0QnVmZmVycy5jbGVhcigpOwogfQpAQCAtMzI4LDcgKzMwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7CiAKLSAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMzUxLDE1ICszMjcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJkcm9wcGluZyBmcmFtZS4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICNpZiAwCi0gICAgICAgICAgICAgICAgdm9pZCAqbWJ1ZjsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWJ1ZikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0KKyAgICAgICAgICAgICAgICAgICAgKE1lZGlhQnVmZmVyICopKGFjY2Vzc1VuaXQtPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJxdWV1ZWluZyBtYnVmICVwIiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAjZW5kaWYKIApAQCAtNjQ3LDEzICs2MjQsMTMgQEAKICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgICAgIHZvaWQgKm1lZGlhQnVmZmVyOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kUG9pbnRlcigibWVkaWFCdWZmZXIiLCAmbWVkaWFCdWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5tZXRhKCkKLSAgICAgICAgICAgICAgICAgICAgLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIG1lZGlhQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKE1lZGlhQnVmZmVyICopKGJ1ZmZlci0+Z2V0TWVkaWFCdWZmZXJCYXNlKCkpOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5zZXRNZWRpYUJ1ZmZlckJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlcik7CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZsYWdzID0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAppbmRleCA3ZTg4OTFkLi44NmI5MThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcApAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZW5jb2RlciB3aWxsIHJlbGVhc2UgTWVkaWFCdWZmZXIgd2hlbiBkb25lCiAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdW5kZXJseWluZyBkYXRhLgotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgbWJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKaW5kZXggMjg2ZWExMy4uMmNiNDc4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNzQ5LDcgKzc1MCw4IEBACiAKICAgICBtRXh0cmFjdG9yID0gbmV3IE51TWVkaWFFeHRyYWN0b3I7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKG1NZWRpYVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1NZWRpYVBhdGguY19zdHIoKSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xMDUzLDcgKzEwNTUsNyBAQAogICAgIGVyciA9IHNvdXJjZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChudW1JbnB1dEJ1ZmZlcnMpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1CdWZmZXJRdWV1ZSA9IHNvdXJjZS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICBtUHJvZHVjZXIgPSBzb3VyY2UtPmdldFByb2R1Y2VyKCk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDc3LDcgKzEwNzksNyBAQAogfQogCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpnZXRTdXJmYWNlVGV4dHVyZSgpIHsKLSAgICByZXR1cm4gbUJ1ZmZlclF1ZXVlOworICAgIHJldHVybiBtUHJvZHVjZXI7CiB9CiAKIHZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cmVxdWVzdElEUkZyYW1lKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKaW5kZXggNWM4ZWU5NC4uMjgyNDE0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCkBAIC0yNSw3ICsyNSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEJ1ZmZlclF1ZXVlOwogc3RydWN0IElIRENQOwogc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBzdHJ1Y3QgTWVkaWFQdWxsZXI7CkBAIC0xMTEsNyArMTEwLDcgQEAKIAogICAgIGludDY0X3QgbUxhc3RMaWZlc2lnblVzOwogCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIHNwPFRyYWNrPiA+IG1UcmFja3M7CiAgICAgc3NpemVfdCBtVmlkZW9UcmFja0luZGV4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAppbmRleCBjYzhkZWUzLi41OWQ3ZTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmNwcApAQCAtNzksNiArNzksOCBAQAogCiAgICAgQUxPR1YoInN0b3BwaW5nIik7CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CisKICAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICAgICAgbUxvb3Blci5jbGVhcigpOwpAQCAtOTIsNyArOTQsNiBAQAogICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7CiAKICAgICBBTE9HVigic3RvcHBlZCIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCmluZGV4IGIzZjdiMWIuLmJiODZkZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0xMiw1ICsxMiw3IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKIAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IDdiOTAwMGIuLmJiM2UyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMjI2LDggKzIyNiw4IEBACiAgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CiAgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zOTMsOSArMzkzLDkgQEAKICAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOwotICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7Ci0gICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlID0gMHU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZSA9IDB1OworICAgICAgICAgICAgdWludDhfdCB2VmFsdWUgPSAwdTsKICAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOwogCiAgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGQwN2JjOTkuLjNhMjgwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsOCBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAorCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCisJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGliY3V0aWxzIFwKQEAgLTIzLDcgKzI1LDggQEAKIAlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAotCWxpYmJpbmRlcgorCWxpYmJpbmRlciBcCisJbGlic291bmR0cmlnZ2Vyc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKIAlsaWJyZWdpc3Rlcm1zZXh0CkBAIC0zMiw3ICszNSwxMCBAQAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvc291bmR0cmlnZ2VyCiAKIExPQ0FMX01PRFVMRTo9IG1lZGlhc2VydmVyCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IGQ1MjA3ZDUuLmFmMWM5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0zNCwxMCArMzQsMTEgQEAKICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKICNpbmNsdWRlICJNZWRpYVBsYXllclNlcnZpY2UuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKIHsKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtMTI4LDYgKzEyOSw3IEBACiAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQ2FtZXJhU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9ucygpOwogICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCmluZGV4IGFjNjA4YTEuLjNhZjA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL210cC9BbmRyb2lkLm1rCkBAIC0zOSw5ICszOSw2IEBACiAKIExPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UgLURNVFBfSE9TVAogCi0jIE5lZWRlZCBmb3IgPGJpb25pY190aW1lLmg+Ci1MT0NBTF9DX0lOQ0xVREVTIDo9IGJpb25pYy9saWJjL3ByaXZhdGUKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ1dGlscyBsaWJjdXRpbHMgbGlibG9nIGxpYnVzYmhvc3QgbGliYmluZGVyCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCmluZGV4IDM3NWVkOWEuLmM1MDA5MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJNdHBQcm9wZXJ0eSIKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKQEAgLTE5MCw5ICsxOTEsOSBAQAogICAgICAgICAgICAgaWYgKGRldmljZVByb3ApCiAgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZShwYWNrZXQsIG1DdXJyZW50VmFsdWUpOwogICAgIH0KLSAgICBwYWNrZXQucHV0VUludDMyKG1Hcm91cENvZGUpOwogICAgIGlmICghZGV2aWNlUHJvcCkKLSAgICAgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CisgICAgICAgIHBhY2tldC5wdXRVSW50MzIobUdyb3VwQ29kZSk7CisgICAgcGFja2V0LnB1dFVJbnQ4KG1Gb3JtRmxhZyk7CiAgICAgaWYgKG1Gb3JtRmxhZyA9PSBrRm9ybVJhbmdlKSB7CiAgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1pbmltdW1WYWx1ZSk7CiAgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbU1heGltdW1WYWx1ZSk7CkBAIC01MTgsOCArNTE5LDE0IEBACiAKIE10cFByb3BlcnR5VmFsdWUqIE10cFByb3BlcnR5OjpyZWFkQXJyYXlWYWx1ZXMoTXRwRGF0YVBhY2tldCYgcGFja2V0LCBpbnQmIGxlbmd0aCkgewogICAgIGxlbmd0aCA9IHBhY2tldC5nZXRVSW50MzIoKTsKLSAgICBpZiAobGVuZ3RoID09IDApCisgICAgLy8gRmFpbCBpZiByZXN1bHRpbmcgYXJyYXkgaXMgb3ZlciAyR0IuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG1heGltdW0gYXJyYXkKKyAgICAvLyBzaXplIG1heSBiZSBsZXNzIHRoYW4gU0laRV9NQVggb24gc29tZSBwbGF0Zm9ybXMuCisgICAgaWYgKCBDQ19VTkxJS0VMWSgKKyAgICAgICAgICAgIGxlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICBsZW5ndGggPj0gSU5UMzJfTUFYIC8gc2l6ZW9mKE10cFByb3BlcnR5VmFsdWUpKSApIHsKKyAgICAgICAgbGVuZ3RoID0gMDsKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIE10cFByb3BlcnR5VmFsdWUqIHJlc3VsdCA9IG5ldyBNdHBQcm9wZXJ0eVZhbHVlW2xlbmd0aF07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgcmVhZFZhbHVlKHBhY2tldCwgcmVzdWx0W2ldKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggMTU1ZjY0NS4uYWE0Mzk2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTk0LDYgKzk0LDcgQEAKICAgICBNVFBfRVZFTlRfT0JKRUNUX1JFTU9WRUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX0FEREVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELAorICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAogfTsKIAogTXRwU2VydmVyOjpNdHBTZXJ2ZXIoaW50IGZkLCBNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgcHRwLApAQCAtMjYyLDYgKzI2MywxMSBAQAogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfU1RPUkVfUkVNT1ZFRCwgaWQpOwogfQogCit2b2lkIE10cFNlcnZlcjo6c2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIEFMT0dWKCJzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkICVkXG4iLCBwcm9wZXJ0eSk7CisgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELCBwcm9wZXJ0eSk7Cit9CisKIHZvaWQgTXRwU2VydmVyOjpzZW5kRXZlbnQoTXRwRXZlbnRDb2RlIGNvZGUsIHVpbnQzMl90IHBhcmFtMSkgewogICAgIGlmIChtU2Vzc2lvbk9wZW4pIHsKICAgICAgICAgbUV2ZW50LnNldEV2ZW50Q29kZShjb2RlKTsKQEAgLTMxOSw2ICszMjUsMTQgQEAKICAgICAgICAgbVNlbmRPYmplY3RIYW5kbGUgPSBrSW52YWxpZE9iamVjdEhhbmRsZTsKICAgICB9CiAKKyAgICBpbnQgY29udGFpbmVydHlwZSA9IG1SZXF1ZXN0LmdldENvbnRhaW5lclR5cGUoKTsKKyAgICBpZiAoY29udGFpbmVydHlwZSAhPSBNVFBfQ09OVEFJTkVSX1RZUEVfQ09NTUFORCkgeworICAgICAgICBBTE9HRSgid3JvbmcgY29udGFpbmVyIHR5cGUgJWQiLCBjb250YWluZXJ0eXBlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgY29tbWFuZCAlcyAoJXgpIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CisKICAgICBzd2l0Y2ggKG9wZXJhdGlvbikgewogICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fR0VUX0RFVklDRV9JTkZPOgogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0dldERldmljZUluZm8oKTsKQEAgLTQwOSw3ICs0MjMsOCBAQAogICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0VuZEVkaXRPYmplY3QoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImdvdCB1bnN1cHBvcnRlZCBjb21tYW5kICVzIiwgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbikpOworICAgICAgICAgICAgQUxPR0UoImdvdCB1bnN1cHBvcnRlZCBjb21tYW5kICVzICgleCkiLAorICAgICAgICAgICAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKICAgICAgICAgICAgIHJlc3BvbnNlID0gTVRQX1JFU1BPTlNFX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNzg3LDcgKzgwMiw3IEBACiAgICAgaW50IHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgoaGFuZGxlLCBwYXRoQnVmLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOwogICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQogICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBmaWxlTGVuZ3RoKQorICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiAodWludDY0X3QpZmlsZUxlbmd0aCkKICAgICAgICAgbGVuZ3RoID0gZmlsZUxlbmd0aCAtIG9mZnNldDsKIAogICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKilwYXRoQnVmOwpAQCAtOTQ0LDIyICs5NTksMjggQEAKICAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOwogICAgIHVtYXNrKG1hc2spOwogCi0gICAgaWYgKGluaXRpYWxEYXRhID4gMCkKKyAgICBpZiAoaW5pdGlhbERhdGEgPiAwKSB7CiAgICAgICAgIHJldCA9IHdyaXRlKG1mci5mZCwgbURhdGEuZ2V0RGF0YSgpLCBpbml0aWFsRGF0YSk7CisgICAgfQogCi0gICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YSA+IDApIHsKLSAgICAgICAgbWZyLm9mZnNldCA9IGluaXRpYWxEYXRhOwotICAgICAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSA9PSAweEZGRkZGRkZGKSB7Ci0gICAgICAgICAgICAvLyB0ZWxsIGRyaXZlciB0byByZWFkIHVudGlsIGl0IHJlY2VpdmVzIGEgc2hvcnQgcGFja2V0Ci0gICAgICAgICAgICBtZnIubGVuZ3RoID0gMHhGRkZGRkZGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGE7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byB3cml0ZSBpbml0aWFsIGRhdGEiKTsKKyAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1mci5vZmZzZXQgPSBpbml0aWFsRGF0YTsKKyAgICAgICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgICAgICAvLyB0ZWxsIGRyaXZlciB0byByZWFkIHVudGlsIGl0IHJlY2VpdmVzIGEgc2hvcnQgcGFja2V0CisgICAgICAgICAgICAgICAgbWZyLmxlbmd0aCA9IDB4RkZGRkZGRkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1mci5sZW5ndGggPSBtU2VuZE9iamVjdEZpbGVTaXplIC0gaW5pdGlhbERhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWNlaXZpbmcgJXNcbiIsIChjb25zdCBjaGFyICopbVNlbmRPYmplY3RGaWxlUGF0aCk7CisgICAgICAgICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgICAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICAgICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkXG4iLCByZXQpOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoInJlY2VpdmluZyAlc1xuIiwgKGNvbnN0IGNoYXIgKiltU2VuZE9iamVjdEZpbGVQYXRoKTsKLSAgICAgICAgLy8gdHJhbnNmZXIgdGhlIGZpbGUKLSAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKLSAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAgICAgfQogICAgIGNsb3NlKG1mci5mZCk7CiAKQEAgLTk4NCw3ICsxMDA1LDcgQEAKIAogc3RhdGljIHZvaWQgZGVsZXRlUmVjdXJzaXZlKGNvbnN0IGNoYXIqIHBhdGgpIHsKICAgICBjaGFyIHBhdGhidWZbUEFUSF9NQVhdOwotICAgIGludCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOworICAgIHNpemVfdCBwYXRoTGVuZ3RoID0gc3RybGVuKHBhdGgpOwogICAgIGlmIChwYXRoTGVuZ3RoID49IHNpemVvZihwYXRoYnVmKSAtIDEpIHsKICAgICAgICAgQUxPR0UoInBhdGggdG9vIGxvbmc6ICVzXG4iLCBwYXRoKTsKICAgICB9CkBAIC0xMTA2LDEyICsxMTI3LDEzIEBACiAKICAgICAvLyBjYW4ndCBzdGFydCB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZQogICAgIGlmIChvZmZzZXQgPiBlZGl0LT5tU2l6ZSkgewotICAgICAgICBBTE9HRCgid3JpdGluZyBwYXN0IGVuZCBvZiBvYmplY3QsIG9mZnNldDogJWxsZCwgZWRpdC0+bVNpemU6ICVsbGQiLCBvZmZzZXQsIGVkaXQtPm1TaXplKTsKKyAgICAgICAgQUxPR0QoIndyaXRpbmcgcGFzdCBlbmQgb2Ygb2JqZWN0LCBvZmZzZXQ6ICUiIFBSSXU2NCAiLCBlZGl0LT5tU2l6ZTogJSIgUFJJdTY0LAorICAgICAgICAgICAgb2Zmc2V0LCBlZGl0LT5tU2l6ZSk7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopZWRpdC0+bVBhdGg7Ci0gICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICVsbGQgJSIgUFJJdTMyICJcbiIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoInJlY2VpdmluZyBwYXJ0aWFsICVzICUiIFBSSXU2NCAiICUiIFBSSXUzMiwgZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQogICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1GRCk7CkBAIC0xMTI1LDE1ICsxMTQ3LDE5IEBACiAgICAgICAgIGxlbmd0aCAtPSBpbml0aWFsRGF0YTsKICAgICB9CiAKLSAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwotICAgICAgICBtZnIuZmQgPSBlZGl0LT5tRkQ7Ci0gICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byB3cml0ZSBpbml0aWFsIGRhdGEiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKKyAgICAgICAgICAgIG1mci5mZCA9IGVkaXQtPm1GRDsKKyAgICAgICAgICAgIG1mci5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOwogCi0gICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IGlvY3RsKG1GRCwgTVRQX1JFQ0VJVkVfRklMRSwgKHVuc2lnbmVkIGxvbmcpJm1mcik7Ci0gICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgICAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmggYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKaW5kZXggZGZhODI1OC4uYjNhMTFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5oCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RBZGRlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RSZW1vdmVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOworICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZERldmljZVByb3BlcnR5Q2hhbmdlZChNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSk7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKaW5kZXggZGNkMzdjZC4uMmIxYTlhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RvcmFnZUluZm8iCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSAiTXRwRGVidWcuaCIKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwU3RvcmFnZUluZm8uaCIKQEAgLTYzLDcgKzY1LDcgQEAKIHZvaWQgTXRwU3RvcmFnZUluZm86OnByaW50KCkgewogICAgIEFMT0dEKCJTdG9yYWdlIEluZm8gJTA4WDpcblx0bVN0b3JhZ2VUeXBlOiAlZFxuXHRtRmlsZVN5c3RlbVR5cGU6ICVkXG5cdG1BY2Nlc3NDYXBhYmlsaXR5OiAlZFxuIiwKICAgICAgICAgICAgIG1TdG9yYWdlSUQsIG1TdG9yYWdlVHlwZSwgbUZpbGVTeXN0ZW1UeXBlLCBtQWNjZXNzQ2FwYWJpbGl0eSk7Ci0gICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlbGxkXG5cdG1GcmVlU3BhY2VCeXRlczogJWxsZFxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCisgICAgQUxPR0QoIlx0bU1heENhcGFjaXR5OiAlIiBQUkl1NjQgIlxuXHRtRnJlZVNwYWNlQnl0ZXM6ICUiIFBSSXU2NCAiXG5cdG1GcmVlU3BhY2VPYmplY3RzOiAlZFxuIiwKICAgICAgICAgICAgIG1NYXhDYXBhY2l0eSwgbUZyZWVTcGFjZUJ5dGVzLCBtRnJlZVNwYWNlT2JqZWN0cyk7CiAgICAgQUxPR0QoIlx0bVN0b3JhZ2VEZXNjcmlwdGlvbjogJXNcblx0bVZvbHVtZUlkZW50aWZpZXI6ICVzXG4iLAogICAgICAgICAgICAgbVN0b3JhZ2VEZXNjcmlwdGlvbiwgbVZvbHVtZUlkZW50aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKaW5kZXggNmVjODg3Ni4uMDY2N2JkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0xOSw3ICsxOSw4IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLSNpbmNsdWRlIDxjdXRpbHMvdHp0aW1lLmg+CisjaW5jbHVkZSA8Li4vcHJpdmF0ZS9iaW9uaWNfdGltZS5oPiAvKiBUT0RPOiBzd2l0Y2ggdGhpcyBjb2RlIHRvIGljdTRjISAqLworCiAjaW5jbHVkZSAiTXRwVXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL0FuZHJvaWQubWsgYi9tZWRpYS9uZGsvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc5NWNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhQ3J5cHRvLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUZvcm1hdC5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhTXV4ZXIuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFEcm0uY3BwICAgICAgICAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX01PRFVMRTo9IGxpYm1lZGlhbmRrCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGJpb25pYy9saWJjL3ByaXZhdGUgXAorICAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kaworCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtRCBFWFBPUlQ9J19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSknCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmJpbmRlciBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYnN0YWdlZnJpZ2h0IFwKKyAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgIGxpYmJpbmRlciBcCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAwYjcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFDb2RlYyIKKworI2luY2x1ZGUgIk5ka01lZGlhQ29kZWMuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG9Qcml2LmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKSB7CisgICAgICAgIHJldHVybiAobWVkaWFfc3RhdHVzX3QpIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworZW51bSB7CisgICAga1doYXRBY3Rpdml0eU5vdGlmeSwKKyAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsCisgICAga1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLAorfTsKKworCitjbGFzcyBDb2RlY0hhbmRsZXI6IHB1YmxpYyBBSGFuZGxlciB7Citwcml2YXRlOgorICAgIEFNZWRpYUNvZGVjKiBtQ29kZWM7CitwdWJsaWM6CisgICAgQ29kZWNIYW5kbGVyKEFNZWRpYUNvZGVjICpjb2RlYyk7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKK307CisKK3R5cGVkZWYgdm9pZCAoKk9uQ29kZWNFdmVudCkoQU1lZGlhQ29kZWMgKmNvZGVjLCB2b2lkICp1c2VyZGF0YSk7CisKK3N0cnVjdCBBTWVkaWFDb2RlYyB7CisgICAgc3A8YW5kcm9pZDo6TWVkaWFDb2RlYz4gbUNvZGVjOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8Q29kZWNIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gbUFjdGl2aXR5Tm90aWZpY2F0aW9uOworICAgIGludDMyX3QgbUdlbmVyYXRpb247CisgICAgYm9vbCBtUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb247CisgICAgT25Db2RlY0V2ZW50IG1DYWxsYmFjazsKKyAgICB2b2lkICptQ2FsbGJhY2tVc2VyRGF0YTsKK307CisKK0NvZGVjSGFuZGxlcjo6Q29kZWNIYW5kbGVyKEFNZWRpYUNvZGVjICpjb2RlYykgeworICAgIG1Db2RlYyA9IGNvZGVjOworfQorCit2b2lkIENvZGVjSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ29kZWMtPm1Db2RlYy0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG1Db2RlYy0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIG1Db2RlYy0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEFjdGl2aXR5Tm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUNvZGVjLT5tR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1DYWxsYmFjayhtQ29kZWMsIG1Db2RlYy0+bUNhbGxiYWNrVXNlckRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpOworCisgICAgICAgICAgICBtQ29kZWMtPm1HZW5lcmF0aW9uKys7CisgICAgICAgICAgICBtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IGZhbHNlOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNob3VsZG4ndCBiZSBoZXJlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworCitzdGF0aWMgdm9pZCByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24oQU1lZGlhQ29kZWMgKmNvZGVjKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbnMsIGNvZGVjLT5tSGFuZGxlci0+aWQoKSkpLT5wb3N0KCk7Cit9CisKK2V4dGVybiAiQyIgeworCitzdGF0aWMgQU1lZGlhQ29kZWMgKiBjcmVhdGVBTWVkaWFDb2RlYyhjb25zdCBjaGFyICpuYW1lLCBib29sIG5hbWVfaXNfdHlwZSwgYm9vbCBlbmNvZGVyKSB7CisgICAgQU1lZGlhQ29kZWMgKm1EYXRhID0gbmV3IEFNZWRpYUNvZGVjKCk7CisgICAgbURhdGEtPm1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtRGF0YS0+bUxvb3Blci0+c2V0TmFtZSgiTkRLIE1lZGlhQ29kZWNfbG9vcGVyIik7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Mb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgZmFsc2UsICAgICAgLy8gcnVuT25DYWxsaW5nVGhyZWFkCisgICAgICAgICAgICB0cnVlLCAgICAgICAvLyBjYW5DYWxsSmF2YSBYWFgKKyAgICAgICAgICAgIFBSSU9SSVRZX0ZPUkVHUk9VTkQpOworICAgIGlmIChuYW1lX2lzX3R5cGUpIHsKKyAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtRGF0YS0+bUxvb3BlciwgbmFtZSwgZW5jb2Rlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtRGF0YS0+bUxvb3BlciwgbmFtZSk7CisgICAgfQorICAgIG1EYXRhLT5tSGFuZGxlciA9IG5ldyBDb2RlY0hhbmRsZXIobURhdGEpOworICAgIG1EYXRhLT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyKTsKKyAgICBtRGF0YS0+bUdlbmVyYXRpb24gPSAxOworICAgIG1EYXRhLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICBtRGF0YS0+bUNhbGxiYWNrID0gTlVMTDsKKworICAgIHJldHVybiBtRGF0YTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhuYW1lLCBmYWxzZSwgZmFsc2UpOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhtaW1lX3R5cGUsIHRydWUsIGZhbHNlKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIHRydWUsIHRydWUpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBpZiAobURhdGEtPm1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbURhdGEtPm1Db2RlYy5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtRGF0YS0+bUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgICAgICBtRGF0YS0+bUxvb3Blci0+c3RvcCgpOworICAgICAgICBtRGF0YS0+bUxvb3Blci5jbGVhcigpOworICAgIH0KKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19jb25maWd1cmUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgQU1lZGlhQ3J5cHRvICpjcnlwdG8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5hdGl2ZUZvcm1hdDsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZvcm1hdCwgJm5hdGl2ZUZvcm1hdCk7CisgICAgQUxPR1YoImNvbmZpZ3VyZSB3aXRoIGZvcm1hdDogJXMiLCBuYXRpdmVGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOworICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBOVUxMOworICAgIGlmICh3aW5kb3cgIT0gTlVMTCkgeworICAgICAgICBzdXJmYWNlID0gKFN1cmZhY2UqKSB3aW5kb3c7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgICAgICAgICAgY3J5cHRvID8gY3J5cHRvLT5tQ3J5cHRvIDogTlVMTCwgZmxhZ3MpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdGFydChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBzdGF0dXNfdCByZXQgPSAgbURhdGEtPm1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKKyAgICB9CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbiA9IG5ldyBBTWVzc2FnZShrV2hhdEFjdGl2aXR5Tm90aWZ5LCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24tPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbURhdGEtPm1HZW5lcmF0aW9uKTsKKyAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+c3RvcCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi5jbGVhcigpOworCisgICAgcmV0dXJuIHJldDsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19mbHVzaChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPmZsdXNoKCkpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgaW50NjRfdCB0aW1lb3V0VXMpIHsKKyAgICBzaXplX3QgaWR4OworICAgIHN0YXR1c190IHJldCA9IG1EYXRhLT5tQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaWR4LCB0aW1lb3V0VXMpOworICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CisgICAgaWYgKHJldCA9PSBPSykgeworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK0VYUE9SVAordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+ID4gYWJ1ZnM7CisgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldElucHV0QnVmZmVycygmYWJ1ZnMpID09IDApIHsKKyAgICAgICAgc2l6ZV90IG4gPSBhYnVmcy5zaXplKCk7CisgICAgICAgIGlmIChpZHggPj0gbikgeworICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBpbmRleCAlenUgb3V0IG9mIHJhbmdlIiwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmc1tpZHhdLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmc1tpZHhdLT5kYXRhKCk7CisgICAgfQorICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgaW5wdXQgYnVmZmVycyIpOworICAgIHJldHVybiBOVUxMOworfQorCitFWFBPUlQKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3A8YW5kcm9pZDo6QUJ1ZmZlcj4gPiBhYnVmczsKKyAgICBpZiAobURhdGEtPm1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmYWJ1ZnMpID09IDApIHsKKyAgICAgICAgc2l6ZV90IG4gPSBhYnVmcy5zaXplKCk7CisgICAgICAgIGlmIChpZHggPj0gbikgeworICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBpbmRleCAlenUgb3V0IG9mIHJhbmdlIiwgaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmc1tpZHhdLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmc1tpZHhdLT5kYXRhKCk7CisgICAgfQorICAgIEFMT0dFKCJjb3VsZG4ndCBnZXQgb3V0cHV0IGJ1ZmZlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIEFTdHJpbmcgZXJyb3JNc2c7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcihpZHgsIG9mZnNldCwgc2l6ZSwgdGltZSwgZmxhZ3MsICZlcnJvck1zZyk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitFWFBPUlQKK3NzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywgaW50NjRfdCB0aW1lb3V0VXMpIHsKKyAgICBzaXplX3QgaWR4OworICAgIHNpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgc3RhdHVzX3QgcmV0ID0gbURhdGEtPm1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaWR4LCAmb2Zmc2V0LCAmc2l6ZSwgJnByZXNlbnRhdGlvblRpbWVVcywKKyAgICAgICAgICAgICZmbGFncywgdGltZW91dFVzKTsKKyAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICBpbmZvLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBpbmZvLT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGluZm8tPmZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgICAgICAgICByZXR1cm4gaWR4OworICAgICAgICBjYXNlIC1FQUdBSU46CisgICAgICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVI7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6SU5GT19GT1JNQVRfQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDsKKyAgICAgICAgY2FzZSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworRVhQT1JUCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyAqbURhdGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKSB7CisgICAgaWYgKHJlbmRlcikgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2UoaWR4KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGlkeCkpOworICAgIH0KK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKAorICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBBTE9HVigicmVuZGVyIEAgJSIgUFJJZDY0LCB0aW1lc3RhbXBOcyk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGlkeCwgdGltZXN0YW1wTnMpKTsKK30KKworLy9FWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldE5vdGlmaWNhdGlvbkNhbGxiYWNrKEFNZWRpYUNvZGVjICptRGF0YSwgT25Db2RlY0V2ZW50IGNhbGxiYWNrLCB2b2lkICp1c2VyZGF0YSkgeworICAgIG1EYXRhLT5tQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBtRGF0YS0+bUNhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm8geworICAgICAgICBpbnQgbnVtc3Vic2FtcGxlczsKKyAgICAgICAgdWludDhfdCBrZXlbMTZdOworICAgICAgICB1aW50OF90IGl2WzE2XTsKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZTsKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzOworICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzOworfSBBTWVkaWFDb2RlY0NyeXB0b0luZm87CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgQU1lZGlhQ29kZWMqIGNvZGVjLAorICAgICAgICBzaXplX3QgaWR4LAorICAgICAgICBvZmZfdCBvZmZzZXQsCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY3J5cHRvLAorICAgICAgICB1aW50NjRfdCB0aW1lLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworCisgICAgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMgPSBuZXcgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGVbY3J5cHRvLT5udW1zdWJzYW1wbGVzXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyeXB0by0+bnVtc3Vic2FtcGxlczsgaSsrKSB7CisgICAgICAgIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGEgPSBjcnlwdG8tPmNsZWFyYnl0ZXNbaV07CisgICAgICAgIHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID0gY3J5cHRvLT5lbmNyeXB0ZWRieXRlc1tpXTsKKyAgICB9CisKKyAgICBBU3RyaW5nIGVycm9ybXNnOworICAgIHN0YXR1c190IGVyciAgPSBjb2RlYy0+bUNvZGVjLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKGlkeCwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjcnlwdG8tPm51bXN1YnNhbXBsZXMsCisgICAgICAgICAgICBjcnlwdG8tPmtleSwKKyAgICAgICAgICAgIGNyeXB0by0+aXYsCisgICAgICAgICAgICAoQ3J5cHRvUGx1Z2luOjpNb2RlKSBjcnlwdG8tPm1vZGUsCisgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAmZXJyb3Jtc2cpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBBTE9HRSgicXVlU2VjdXJlSW5wdXRCdWZmZXI6ICVzIiwgZXJyb3Jtc2cuY19zdHIoKSk7CisgICAgfQorICAgIGRlbGV0ZSBbXSBzdWJTYW1wbGVzOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKworCisKK0VYUE9SVAorQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKSB7CisKKyAgICAvLyBzaXplIG5lZWRlZCB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBkYXRhCisgICAgc2l6ZV90IGNyeXB0b3NpemUgPSBzaXplb2YoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKSArIHNpemVvZihzaXplX3QpICogbnVtc3Vic2FtcGxlcyAqIDI7CisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpyZXQgPSAoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKikgbWFsbG9jKGNyeXB0b3NpemUpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldC0+bnVtc3Vic2FtcGxlcyA9IG51bXN1YnNhbXBsZXM7CisgICAgbWVtY3B5KHJldC0+a2V5LCBrZXksIDE2KTsKKyAgICBtZW1jcHkocmV0LT5pdiwgaXYsIDE2KTsKKyAgICByZXQtPm1vZGUgPSBtb2RlOworCisgICAgLy8gY2xlYXJieXRlcyBhbmQgZW5jcnlwdGVkYnl0ZXMgcG9pbnQgYXQgdGhlIGFjdHVhbCBkYXRhLCB3aGljaCBmb2xsb3dzCisgICAgcmV0LT5jbGVhcmJ5dGVzID0gKHNpemVfdCopIChyZXQgKyAxKTsgLy8gcG9pbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHN0cnVjdAorICAgIHJldC0+ZW5jcnlwdGVkYnl0ZXMgPSByZXQtPmNsZWFyYnl0ZXMgKyBudW1zdWJzYW1wbGVzOyAvLyBwb2ludCBhZnRlciB0aGUgY2xlYXIgc2l6ZXMKKworICAgIG1lbWNweShyZXQtPmNsZWFyYnl0ZXMsIGNsZWFyYnl0ZXMsIG51bXN1YnNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgbWVtY3B5KHJldC0+ZW5jcnlwdGVkYnl0ZXMsIGVuY3J5cHRlZGJ5dGVzLCBudW1zdWJzYW1wbGVzICogc2l6ZW9mKHNpemVfdCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBpbmZvKSB7CisgICAgZnJlZShpbmZvKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK3NpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpKSB7CisgICAgcmV0dXJuIGNpLT5udW1zdWJzYW1wbGVzOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgdWludDhfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+a2V5LCAxNik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgdWludDhfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+aXYsIDE2KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2kpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiAoY3J5cHRvaW5mb19tb2RlX3QpIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIGNpLT5tb2RlOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2ksIHNpemVfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+Y2xlYXJieXRlcywgc2l6ZW9mKHNpemVfdCkgKiBjaS0+bnVtc3Vic2FtcGxlcyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSwgc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAoIWNpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghZHN0KSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIG1lbWNweShkc3QsIGNpLT5lbmNyeXB0ZWRieXRlcywgc2l6ZW9mKHNpemVfdCkgKiBjaS0+bnVtc3Vic2FtcGxlcyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYzJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUNyeXB0byIKKworCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworCitzdGF0aWMgc3A8SUNyeXB0bz4gbWFrZUNyeXB0bygpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOworCisgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CisKKyAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IHNlcnZpY2UtPm1ha2VDcnlwdG8oKTsKKworICAgIGlmIChjcnlwdG8gPT0gTlVMTCB8fCAoY3J5cHRvLT5pbml0Q2hlY2soKSAhPSBPSyAmJiBjcnlwdG8tPmluaXRDaGVjaygpICE9IE5PX0lOSVQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcnlwdG87Cit9CisKK3N0cnVjdCBBTWVkaWFDcnlwdG8geworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87Cit9OworCisKK2V4dGVybiAiQyIgeworCisKK0VYUE9SVAorYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CisgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gbWFrZUNyeXB0bygpOworICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjcnlwdG8tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKSB7CisgICAgc3A8SUNyeXB0bz4gY3J5cHRvID0gbWFrZUNyeXB0bygpOworICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjcnlwdG8tPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKK30KKworRVhQT1JUCitBTWVkaWFDcnlwdG8qIEFNZWRpYUNyeXB0b19uZXcoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YXNpemUpIHsKKworICAgIHNwPElDcnlwdG8+IHRtcCA9IG1ha2VDcnlwdG8oKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHRtcC0+Y3JlYXRlUGx1Z2luKHV1aWQsIGRhdGEsIGRhdGFzaXplKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvID0gbmV3IEFNZWRpYUNyeXB0bygpOworICAgIGNyeXB0by0+bUNyeXB0byA9IHRtcDsKKworICAgIHJldHVybiBjcnlwdG87Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSB7CisgICAgZGVsZXRlIGNyeXB0bzsKK30KKworCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlYTkyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0b1ByaXYuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DUllQVE9fUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfQ1JZUFRPX1BSSVZfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBBTWVkaWFDcnlwdG8geworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87Cit9OworCisjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fUFJJVl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEwNDhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMCwwICsxLDcyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEcm0iCisKKyNpbmNsdWRlICJOZGtNZWRpYURybS5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWEvSURybUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxuZGsvTmRrTWVkaWFDcnlwdG8uaD4KKworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordHlwZWRlZiBWZWN0b3I8dWludDhfdD4gaWR2ZWNfdDsKKworc3RydWN0IERybUxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBCbkRybUNsaWVudAoreworcHJpdmF0ZToKKyAgICBBTWVkaWFEcm0gKm1PYmo7CisgICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXI7CisKK3B1YmxpYzoKKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKyAgICB2b2lkIG5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopOworfTsKKworc3RydWN0IEFNZWRpYURybSB7CisgICAgc3A8SURybT4gbURybTsKKyAgICBzcDxJRHJtQ2xpZW50PiBtRHJtQ2xpZW50OworICAgIExpc3Q8aWR2ZWNfdD4gbUlkczsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtUXVlcnlSZXN1bHRzOworICAgIFZlY3Rvcjx1aW50OF90PiBtS2V5UmVxdWVzdDsKKyAgICBWZWN0b3I8dWludDhfdD4gbVByb3Zpc2lvblJlcXVlc3Q7CisgICAgU3RyaW5nOCBtUHJvdmlzaW9uVXJsOworICAgIFN0cmluZzggbVByb3BlcnR5U3RyaW5nOworICAgIFZlY3Rvcjx1aW50OF90PiBtUHJvcGVydHlCeXRlQXJyYXk7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPiBtU2VjdXJlU3RvcHM7CisgICAgc3A8RHJtTGlzdGVuZXI+IG1MaXN0ZW5lcjsKK307CisKK3ZvaWQgRHJtTGlzdGVuZXI6Om5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopIHsKKyAgICBpZiAoIW1MaXN0ZW5lcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQU1lZGlhRHJtU2Vzc2lvbklkIHNlc3Npb25JZCA9IHtOVUxMLCAwfTsKKyAgICBpbnQzMl90IHNlc3Npb25JZFNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgIGlmIChzZXNzaW9uSWRTaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKnNlc3Npb25JZERhdGEgPSBuZXcgdWludDhfdFtzZXNzaW9uSWRTaXplXTsKKyAgICAgICAgc2Vzc2lvbklkLnB0ciA9IHNlc3Npb25JZERhdGE7CisgICAgICAgIHNlc3Npb25JZC5sZW5ndGggPSBzZXNzaW9uSWRTaXplOworICAgICAgICBvYmotPnJlYWQoc2Vzc2lvbklkRGF0YSwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgfQorCisgICAgaW50MzJfdCBkYXRhU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgaWYgKGRhdGFTaXplKSB7CisgICAgICAgIGRhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07CisgICAgICAgIG9iai0+cmVhZChkYXRhLCBkYXRhU2l6ZSk7CisgICAgfQorCisgICAgLy8gdHJhbnNsYXRlIERybVBsdWdpbiBldmVudCB0eXBlcyBpbnRvIHRoZWlyIE5ESyBlcXVpdmFsZW50cworICAgIEFNZWRpYURybUV2ZW50VHlwZSBuZGtFdmVudFR5cGU7CisgICAgc3dpdGNoKGV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50UHJvdmlzaW9uUmVxdWlyZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9QUk9WSVNJT05fUkVRVUlSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleU5lZWRlZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX0tFWV9SRVFVSVJFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5RXhwaXJlZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX0tFWV9FWFBJUkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfVkVORE9SX0RFRklORUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGV2ZW50IERybVBsdWdpbjo6RXZlbnRUeXBlICVkLCBpZ25vcmVkIiwgKGludClldmVudFR5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICgqbUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBuZGtFdmVudFR5cGUsIGV4dHJhLCBkYXRhLCBkYXRhU2l6ZSk7CisKKyAgICBkZWxldGUgW10gc2Vzc2lvbklkLnB0cjsKKyAgICBkZWxldGUgW10gZGF0YTsKK30KKworCitleHRlcm4gIkMiIHsKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXN1bHQgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX1JFU09VUkNFX0JVU1k6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX1JFU09VUkNFX0JVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX0RFVklDRV9SRVZPS0VEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fVEFNUEVSX0RFVEVDVEVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9UQU1QRVJfREVURUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fTk9fTElDRU5TRToKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fTkVFRF9LRVk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9MSUNFTlNFX0VYUElSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3A8SURybT4gQ3JlYXRlRHJtKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgIHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CisKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKKworICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SURybT4gZHJtID0gc2VydmljZS0+bWFrZURybSgpOworCisgICAgaWYgKGRybSA9PSBOVUxMIHx8IChkcm0tPmluaXRDaGVjaygpICE9IE9LICYmIGRybS0+aW5pdENoZWNrKCkgIT0gTk9fSU5JVCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGRybTsKK30KKworCitzdGF0aWMgc3A8SURybT4gQ3JlYXRlRHJtRnJvbVVVSUQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKSB7CisgICAgc3A8SURybT4gZHJtID0gQ3JlYXRlRHJtKCk7CisKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gZHJtLT5jcmVhdGVQbHVnaW4odXVpZCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBkcm07Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkLCBjb25zdCBjaGFyICptaW1lVHlwZSkgeworICAgIHNwPElEcm0+IGRybSA9IENyZWF0ZURybSgpOworCisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7CisgICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7Cit9CisKK0VYUE9SVAorQU1lZGlhRHJtKiBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgeworICAgIEFNZWRpYURybSAqbU9iaiA9IG5ldyBBTWVkaWFEcm0oKTsKKyAgICBtT2JqLT5tRHJtID0gQ3JlYXRlRHJtRnJvbVVVSUQodXVpZCk7CisgICAgcmV0dXJuIG1PYmo7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKm1PYmopIHsKKyAgICBpZiAobU9iai0+bURybSAhPSBOVUxMKSB7CisgICAgICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKE5VTEwpOworICAgICAgICBtT2JqLT5tRHJtLT5kZXN0cm95UGx1Z2luKCk7CisgICAgICAgIG1PYmotPm1Ecm0uY2xlYXIoKTsKKyAgICB9CisgICAgZGVsZXRlIG1PYmo7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXZlbnRMaXN0ZW5lcihBTWVkaWFEcm0gKm1PYmosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCisKK3N0YXRpYyBib29sIGZpbmRJZChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybUJ5dGVBcnJheSAmaWQsIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yICZpdGVyKSB7CisgICAgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXRlciAhPSBtT2JqLT5tSWRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5hcnJheSgpID09IGlkLnB0ciAmJiBpdGVyLT5zaXplKCkgPT0gaWQubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX29wZW5TZXNzaW9uKEFNZWRpYURybSAqbU9iaiwgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPm9wZW5TZXNzaW9uKHNlc3Npb24pOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbU9iai0+bUlkcy5wdXNoX2Zyb250KHNlc3Npb24pOworICAgICAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgICAgICBzZXNzaW9uSWQtPnB0ciA9IGl0ZXItPmFycmF5KCk7CisgICAgICAgIHNlc3Npb25JZC0+bGVuZ3RoID0gaXRlci0+c2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisgICAgbU9iai0+bURybS0+Y2xvc2VTZXNzaW9uKCppdGVyKTsKKyAgICBtT2JqLT5tSWRzLmVyYXNlKGl0ZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFtaW1lVHlwZSB8fCAhc2NvcGUgfHwgIWtleVJlcXVlc3QgfHwgIWtleVJlcXVlc3RTaXplKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2NvcGUsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWRJbml0OworICAgIG1kSW5pdC5hcHBlbmRBcnJheShpbml0LCBpbml0U2l6ZSk7CisgICAgRHJtUGx1Z2luOjpLZXlUeXBlIG1kS2V5VHlwZTsKKyAgICBzd2l0Y2ggKGtleVR5cGUpIHsKKyAgICAgICAgY2FzZSBLRVlfVFlQRV9TVFJFQU1JTkc6CisgICAgICAgICAgICBtZEtleVR5cGUgPSBEcm1QbHVnaW46OmtLZXlUeXBlX1N0cmVhbWluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtFWV9UWVBFX09GRkxJTkU6CisgICAgICAgICAgICBtZEtleVR5cGUgPSBEcm1QbHVnaW46OmtLZXlUeXBlX09mZmxpbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlfVFlQRV9SRUxFQVNFOgorICAgICAgICAgICAgbWRLZXlUeXBlID0gRHJtUGx1Z2luOjprS2V5VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtZE9wdGlvbmFsUGFyYW1ldGVyczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU9wdGlvbmFsUGFyYW1ldGVyczsgaSsrKSB7CisgICAgICAgIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLmFkZChTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tS2V5KSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVyc1tpXS5tVmFsdWUpKTsKKyAgICB9CisgICAgU3RyaW5nOCBkZWZhdWx0VXJsOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCisgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmtleVJlcXVlc3QgPSBtT2JqLT5tS2V5UmVxdWVzdC5hcnJheSgpOworICAgICAgICAqa2V5UmVxdWVzdFNpemUgPSBtT2JqLT5tS2V5UmVxdWVzdC5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZShBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNjb3BlICpzY29wZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUsIEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNjb3BlIHx8ICFyZXNwb25zZSB8fCAhcmVzcG9uc2VTaXplIHx8ICFrZXlTZXRJZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNjb3BlLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBtZFJlc3BvbnNlOworICAgIG1kUmVzcG9uc2UuYXBwZW5kQXJyYXkocmVzcG9uc2UsIHJlc3BvbnNlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWRLZXlTZXRJZDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5wcm92aWRlS2V5UmVzcG9uc2UoKml0ZXIsIG1kUmVzcG9uc2UsIG1kS2V5U2V0SWQpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbU9iai0+bUlkcy5wdXNoX2Zyb250KG1kS2V5U2V0SWQpOworICAgICAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgICAgICBrZXlTZXRJZC0+cHRyID0gaXRlci0+YXJyYXkoKTsKKyAgICAgICAga2V5U2V0SWQtPmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBrZXlTZXRJZC0+cHRyID0gTlVMTDsKKyAgICAgICAga2V5U2V0SWQtPmxlbmd0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Jlc3RvcmVLZXlzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVNldElkICprZXlTZXRJZCkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCB8fCAha2V5U2V0SWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXQ7CisgICAga2V5U2V0LmFwcGVuZEFycmF5KGtleVNldElkLT5wdHIsIGtleVNldElkLT5sZW5ndGgpOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cmVzdG9yZUtleXMoKml0ZXIsIGtleVNldCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICprZXlTZXRJZCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqa2V5U2V0SWQsIGl0ZXIpKSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXQ7CisgICAgICAgIGtleVNldC5hcHBlbmRBcnJheShrZXlTZXRJZC0+cHRyLCBrZXlTZXRJZC0+bGVuZ3RoKTsKKyAgICAgICAgc3RhdHVzID0gbU9iai0+bURybS0+cmVtb3ZlS2V5cyhrZXlTZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1PYmotPm1Ecm0tPnJlbW92ZUtleXMoKml0ZXIpOworICAgICAgICBtT2JqLT5tSWRzLmVyYXNlKGl0ZXIpOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIEFNZWRpYURybUtleVZhbHVlICprZXlWYWx1ZVBhaXJzLCBzaXplX3QgKm51bVBhaXJzKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkIHx8ICFudW1QYWlycykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5xdWVyeUtleVN0YXR1cygqaXRlciwgbU9iai0+bVF1ZXJ5UmVzdWx0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAqbnVtUGFpcnMgPSAwOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpID4gKm51bVBhaXJzKSB7CisgICAgICAgICpudW1QYWlycyA9IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubUtleSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7CisgICAgICAgIGtleVZhbHVlUGFpcnNbaV0ubVZhbHVlID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5rZXlBdChpKS5zdHJpbmcoKTsKKyAgICB9CisgICAgKm51bVBhaXJzID0gbU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IHVpbnQ4X3QgKipwcm92aXNpb25SZXF1ZXN0LAorICAgICAgICBzaXplX3QgKnByb3Zpc2lvblJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqc2VydmVyVXJsKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXByb3Zpc2lvblJlcXVlc3QgfHwgIXByb3Zpc2lvblJlcXVlc3RTaXplIHx8ICEqcHJvdmlzaW9uUmVxdWVzdFNpemUgfHwgIXNlcnZlclVybCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCgiIiksIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgbU9iai0+bVByb3Zpc2lvblJlcXVlc3QsIG1PYmotPm1Qcm92aXNpb25VcmwpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgICpwcm92aXNpb25SZXF1ZXN0ID0gbU9iai0+bVByb3Zpc2lvblJlcXVlc3QuYXJyYXkoKTsKKyAgICAgICAgKnByb3Zpc2lvblJlcXVlc3RTaXplID0gbU9iai0+bVByb3Zpc2lvblJlcXVlc3Quc2l6ZSgpOworICAgICAgICAqc2VydmVyVXJsID0gbU9iai0+bVByb3Zpc2lvblVybC5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZVNpemUpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlU2l6ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBtZFJlc3BvbnNlOworICAgIG1kUmVzcG9uc2UuYXBwZW5kQXJyYXkocmVzcG9uc2UsIHJlc3BvbnNlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gdW51c2VkOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKG1kUmVzcG9uc2UsIHVudXNlZCwgdW51c2VkKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc2VjdXJlU3RvcHMsIHNpemVfdCAqbnVtU2VjdXJlU3RvcHMpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFudW1TZWN1cmVTdG9wcykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRTZWN1cmVTdG9wcyhtT2JqLT5tU2VjdXJlU3RvcHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKm51bVNlY3VyZVN0b3BzID0gMDsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKyAgICBpZiAoKm51bVNlY3VyZVN0b3BzIDwgbU9iai0+bVNlY3VyZVN0b3BzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0ZXIgPSBtT2JqLT5tU2VjdXJlU3RvcHMuYmVnaW4oKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGl0ZXIgIT0gbU9iai0+bVNlY3VyZVN0b3BzLmVuZCgpKSB7CisgICAgICAgIHNlY3VyZVN0b3BzW2ldLnB0ciA9IGl0ZXItPmFycmF5KCk7CisgICAgICAgIHNlY3VyZVN0b3BzW2ldLmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgKytpdGVyOworICAgICAgICArK2k7CisgICAgfQorICAgICpudW1TZWN1cmVTdG9wcyA9IG1PYmotPm1TZWN1cmVTdG9wcy5zaXplKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc3NSZWxlYXNlKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc3NSZWxlYXNlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlbGVhc2U7CisgICAgcmVsZWFzZS5hcHBlbmRBcnJheShzc1JlbGVhc2UtPnB0ciwgc3NSZWxlYXNlLT5sZW5ndGgpOworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+cmVsZWFzZVNlY3VyZVN0b3BzKHJlbGVhc2UpKTsKK30KKworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKm1PYmosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgY2hhciAqKnByb3BlcnR5VmFsdWUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFwcm9wZXJ0eU5hbWUgfHwgIXByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICBtT2JqLT5tUHJvcGVydHlTdHJpbmcpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAqcHJvcGVydHlWYWx1ZSA9IG1PYmotPm1Qcm9wZXJ0eVN0cmluZy5zdHJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcHJvcGVydHlWYWx1ZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFwcm9wZXJ0eU5hbWUgfHwgIXByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICBtT2JqLT5tUHJvcGVydHlCeXRlQXJyYXkpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5wdHIgPSBtT2JqLT5tUHJvcGVydHlCeXRlQXJyYXkuYXJyYXkoKTsKKyAgICAgICAgcHJvcGVydHlWYWx1ZS0+bGVuZ3RoID0gbU9iai0+bVByb3BlcnR5Qnl0ZUFycmF5LnNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5wdHIgPSBOVUxMOworICAgICAgICBwcm9wZXJ0eVZhbHVlLT5sZW5ndGggPSAwOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5U3RyaW5nKFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCh2YWx1ZSkpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLCBzaXplX3QgdmFsdWVTaXplKSB7CisKKyAgICBWZWN0b3I8dWludDhfdD4gYnl0ZUFycmF5OworICAgIGJ5dGVBcnJheS5hcHBlbmRBcnJheSh2YWx1ZSwgdmFsdWVTaXplKTsKKworICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMobU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXkpKTsKK30KKworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgZW5jcnlwdF9kZWNyeXB0X2NvbW1vbihBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAmc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplLCBib29sIGVuY3J5cHQpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCBzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5zZXRDaXBoZXJBbGdvcml0aG0oKml0ZXIsIFN0cmluZzgoY2lwaGVyQWxnb3JpdGhtKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjOworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAga2V5SWRWZWMuYXBwZW5kQXJyYXkoa2V5SWQsIGtLZXlJZFNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGlucHV0VmVjOworICAgIGlucHV0VmVjLmFwcGVuZEFycmF5KGlucHV0LCBkYXRhU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gaXZWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtJdlNpemUgPSAxNjsKKyAgICBpdlZlYy5hcHBlbmRBcnJheShpdiwga0l2U2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gb3V0cHV0VmVjOworICAgIGlmIChlbmNyeXB0KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmVuY3J5cHQoKml0ZXIsIGtleUlkVmVjLCBpbnB1dFZlYywgaXZWZWMsIG91dHB1dFZlYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+ZGVjcnlwdCgqaXRlciwga2V5SWRWZWMsIGlucHV0VmVjLCBpdlZlYywgb3V0cHV0VmVjKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtZW1jcHkob3V0cHV0LCBvdXRwdXRWZWMuYXJyYXkoKSwgb3V0cHV0VmVjLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZW5jcnlwdChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVpbnQ4X3QgKm91dHB1dCwgc2l6ZV90IGRhdGFTaXplKSB7CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIGVuY3J5cHRfZGVjcnlwdF9jb21tb24obU9iaiwgKnNlc3Npb25JZCwgY2lwaGVyQWxnb3JpdGhtLCBrZXlJZCwgaXYsCisgICAgICAgICAgICBpbnB1dCwgb3V0cHV0LCBkYXRhU2l6ZSwgdHJ1ZSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2RlY3J5cHQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSkgeworICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBlbmNyeXB0X2RlY3J5cHRfY29tbW9uKG1PYmosICpzZXNzaW9uSWQsIGNpcGhlckFsZ29yaXRobSwga2V5SWQsIGl2LAorICAgICAgICAgICAgaW5wdXQsIG91dHB1dCwgZGF0YVNpemUsIGZhbHNlKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2lnbihBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnNldE1hY0FsZ29yaXRobSgqaXRlciwgU3RyaW5nOChtYWNBbGdvcml0aG0pKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBrZXlJZFZlYy5hcHBlbmRBcnJheShrZXlJZCwga0tleUlkU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWVzc2FnZVZlYzsKKyAgICBtZXNzYWdlVmVjLmFwcGVuZEFycmF5KG1lc3NhZ2UsIG1lc3NhZ2VTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBzaWduYXR1cmVWZWM7CisgICAgc3RhdHVzID0gbU9iai0+bURybS0+c2lnbigqaXRlciwga2V5SWRWZWMsIG1lc3NhZ2VWZWMsIHNpZ25hdHVyZVZlYyk7CisgICAgaWYgKHNpZ25hdHVyZVZlYy5zaXplKCkgPiAqc2lnbmF0dXJlU2l6ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TSE9SVF9CVUZGRVI7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbWVtY3B5KHNpZ25hdHVyZSwgc2lnbmF0dXJlVmVjLmFycmF5KCksIHNpZ25hdHVyZVZlYy5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3ZlcmlmeShBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+c2V0TWFjQWxnb3JpdGhtKCppdGVyLCBTdHJpbmc4KG1hY0FsZ29yaXRobSkpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlYzsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGtleUlkVmVjLmFwcGVuZEFycmF5KGtleUlkLCBrS2V5SWRTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBtZXNzYWdlVmVjOworICAgIG1lc3NhZ2VWZWMuYXBwZW5kQXJyYXkobWVzc2FnZSwgbWVzc2FnZVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNpZ25hdHVyZVZlYzsKKyAgICBzaWduYXR1cmVWZWMuYXBwZW5kQXJyYXkoc2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKTsKKworICAgIGJvb2wgbWF0Y2g7CisgICAgc3RhdHVzID0gbU9iai0+bURybS0+dmVyaWZ5KCppdGVyLCBrZXlJZFZlYywgbWVzc2FnZVZlYywgc2lnbmF0dXJlVmVjLCBtYXRjaCk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICByZXR1cm4gbWF0Y2ggPyBBTUVESUFfT0sgOiBBTUVESUFfRFJNX1ZFUklGWV9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTdkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUV4dHJhY3RvciIKKworCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CisgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CisgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CisKK307CisKK2V4dGVybiAiQyIgeworCitFWFBPUlQKK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIEFNZWRpYUV4dHJhY3RvciAqbURhdGEgPSBuZXcgQU1lZGlhRXh0cmFjdG9yKCk7CisgICAgbURhdGEtPm1JbXBsID0gbmV3IE51TWVkaWFFeHRyYWN0b3IoKTsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBjb25zdCBjaGFyICpsb2NhdGlvbikgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIGxvY2F0aW9uKTsKKyAgICAvLyBUT0RPOiBhZGQgaGVhZGVyIHN1cHBvcnQKKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlKHBhdGgpIG11c3QgYmUgY2FsbGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKKyAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKKyAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKKyAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7CisKKyAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7CisKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOworICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOworICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKK0VYUE9SVAorc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICByZXR1cm4gbURhdGEtPm1JbXBsLT5jb3VudFRyYWNrcygpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tSW1wbC0+Z2V0VHJhY2tGb3JtYXQoaWR4LCAmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBBTE9HVigic2VsZWN0VHJhY2soJXp1KSIsIGlkeCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNlbGVjdFRyYWNrKGlkeCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIHNpemVfdCBpZHgpIHsKKyAgICBBTE9HVigidW5zZWxlY3RUcmFjayglenUpIiwgaWR4KTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+dW5zZWxlY3RUcmFjayhpZHgpKTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICAvL0FMT0dWKCJhZHZhbmNlIik7CisgICAgcmV0dXJuIG1EYXRhLT5tSW1wbC0+YWR2YW5jZSgpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yICpleCwgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNmbW9kZTsKKyAgICBpZiAobW9kZSA9PSBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DKSB7CisgICAgICAgIHNmbW9kZSA9IGFuZHJvaWQ6Ok1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOworICAgIH0gZWxzZSBpZiAobW9kZSA9PSBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkMpIHsKKyAgICAgICAgc2Ztb2RlID0gYW5kcm9pZDo6TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzsKKyAgICB9IGVsc2UgeworICAgICAgICBzZm1vZGUgPSBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOworICAgIH0KKworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXgtPm1JbXBsLT5zZWVrVG8oc2Vla1Bvc1VzLCBzZm1vZGUpKTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSkgeworICAgIC8vQUxPR1YoInJlYWRTYW1wbGVEYXRhIik7CisgICAgc3A8QUJ1ZmZlcj4gdG1wID0gbmV3IEFCdWZmZXIoYnVmZmVyLCBjYXBhY2l0eSk7CisgICAgaWYgKG1EYXRhLT5tSW1wbC0+cmVhZFNhbXBsZURhdGEodG1wKSA9PSBPSykgeworICAgICAgICByZXR1cm4gdG1wLT5zaXplKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworRVhQT1JUCit1aW50MzJfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIGludCBzYW1wbGVGbGFncyA9IDA7CisgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5nZXRTYW1wbGVNZXRhKCZtZXRhKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwpICYmIHZhbCAhPSAwKSB7CisgICAgICAgIHNhbXBsZUZsYWdzIHw9IEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzYW1wbGVGbGFncyB8PSBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEOworICAgIH0KKyAgICByZXR1cm4gc2FtcGxlRmxhZ3M7Cit9CisKK0VYUE9SVAoraW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBzaXplX3QgaWR4OworICAgIGlmIChtRGF0YS0+bUltcGwtPmdldFNhbXBsZVRyYWNrSW5kZXgoJmlkeCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaWR4OworfQorCitFWFBPUlQKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIGludDY0X3QgdGltZTsKKyAgICBpZiAobURhdGEtPm1JbXBsLT5nZXRTYW1wbGVUaW1lKCZ0aW1lKSAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiB0aW1lOworfQorCitFWFBPUlQKK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yICpleCkgeworCisgICAgaWYgKGV4LT5tUHNzaEJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoUHNzaEluZm8qKSBleC0+bVBzc2hCdWYtPmRhdGEoKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIGV4LT5tSW1wbC0+Z2V0RmlsZUZvcm1hdCgmZm9ybWF0KTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgaWYoIWZvcm1hdC0+ZmluZEJ1ZmZlcigicHNzaCIsICZidWZmZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHRoZSBmb3JtYXQgb2YgdGhlIGJ1ZmZlciBpcyAxIG9yIG1vcmUgb2Y6CisgICAgLy8gICAgeworICAgIC8vICAgICAgICAxNiBieXRlIHV1aWQKKyAgICAvLyAgICAgICAgNCBieXRlIGRhdGEgbGVuZ3RoIE4KKyAgICAvLyAgICAgICAgTiBieXRlcyBvZiBkYXRhCisgICAgLy8gICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc291cmNlIGRhdGEuCisgICAgLy8gU2luY2Ugd2UgZ290IHRoZSBkYXRhIGZyb20gc3RhZ2VmcmlnaHQsIHdlIHRydXN0IGl0IGlzIHZhbGlkIGFuZCBwcm9wZXJseSBmb3JtYXR0ZWQuCisgICAgY29uc3QgdWludDhfdCogZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBsZW4gPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgbnVtZW50cmllcyA9IDA7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgbnVtZW50cmllcysrOworCisgICAgICAgIC8vIHNraXAgdXVpZAorICAgICAgICBkYXRhICs9IDE2OworICAgICAgICBsZW4gLT0gMTY7CisKKyAgICAgICAgLy8gZ2V0IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSAqKCh1aW50MzJfdCopZGF0YSk7CisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgbGVuIC09IDQ7CisKKyAgICAgICAgLy8gc2tpcCB0aGUgZGF0YQorICAgICAgICBkYXRhICs9IGRhdGFsZW47CisgICAgICAgIGxlbiAtPSBkYXRhbGVuOworICAgIH0KKworICAgIC8vIHRoZXJlIGFyZSA8bnVtZW50cmllcz4gaW4gdGhlIHNvdXJjZSBidWZmZXIsIHdlIG5lZWQKKyAgICAvLyAoc291cmNlIGJ1ZmZlciBzaXplKSAtIChzaXplb2YodWludDMyX3QpICogbnVtZW50cmllcykgKyBzaXplb2Yoc2l6ZV90KQorICAgIC8vICArICgoc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSAqIG51bWVudHJpZXMpIGJ5dGVzIGZvciB0aGUgUHNzaEluZm8gc3RydWN0dXJlCisgICAgLy8gT3IgaW4gb3RoZXIgd29yZHMsIHRoZSBkYXRhIGxlbmd0aHMgaW4gdGhlIHNvdXJjZSBzdHJ1Y3R1cmUgYXJlIHJlcGxhY2VkIGJ5IHNpemVfdAorICAgIC8vICh3aGljaCBtYXkgYmUgdGhlIHNhbWUgc2l6ZSBvciBsYXJnZXIsIGZvciA2NCBiaXQpLCBhbmQgaW4gYWRkaXRpb24gdGhlcmUgaXMgYW4KKyAgICAvLyBleHRyYSBwb2ludGVyIGZvciBlYWNoIGVudHJ5LCBhbmQgYW4gZXh0cmEgc2l6ZV90IGZvciB0aGUgZW50aXJlIFBzc2hJbmZvLgorICAgIHNpemVfdCBuZXdzaXplID0gYnVmZmVyLT5zaXplKCkgLSAoc2l6ZW9mKHVpbnQzMl90KSAqIG51bWVudHJpZXMpICsgc2l6ZW9mKHNpemVfdCkKKyAgICAgICAgICAgICsgKChzaXplb2Yodm9pZCopICsgc2l6ZW9mKHNpemVfdCkpICogbnVtZW50cmllcyk7CisgICAgZXgtPm1Qc3NoQnVmID0gbmV3IEFCdWZmZXIobmV3c2l6ZSk7CisgICAgZXgtPm1Qc3NoQnVmLT5zZXRSYW5nZSgwLCBuZXdzaXplKTsKKworICAgIC8vIGNvcHkgZGF0YQorICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVpbnQ4X3QqIGRzdCA9IGV4LT5tUHNzaEJ1Zi0+ZGF0YSgpOworICAgIHVpbnQ4X3QqIGRzdGRhdGEgPSBkc3QgKyBzaXplb2Yoc2l6ZV90KSArIG51bWVudHJpZXMgKiBzaXplb2YoUHNzaEVudHJ5KTsKKyAgICAqKChzaXplX3QqKWRzdCkgPSBudW1lbnRyaWVzOworICAgIGRzdCArPSBzaXplb2Yoc2l6ZV90KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgeworICAgICAgICAvLyBjb3B5IHV1aWQKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCAxNik7CisgICAgICAgIHNyYyArPSAxNjsKKyAgICAgICAgZHN0ICs9IDE2OworCisgICAgICAgIC8vIGdldC9jb3B5IGRhdGEgbGVuZ3RoCisgICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSAqKCh1aW50MzJfdCopc3JjKTsKKyAgICAgICAgKigoc2l6ZV90Kilkc3QpID0gZGF0YWxlbjsKKyAgICAgICAgc3JjICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIGRzdCArPSBzaXplb2Yoc2l6ZV90KTsKKworICAgICAgICAvLyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgZGVzdGluYXRpb24gaXMgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgZGF0YSwgd2hpY2ggd2Ugc3RvcmUKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGFycmF5IG9mIFBzc2hFbnRyeQorICAgICAgICAqKCh2b2lkKiopZHN0KSA9IGRzdGRhdGE7CisgICAgICAgIGRzdCArPSBzaXplb2Yodm9pZCopOworCisgICAgICAgIC8vIGNvcHkgdGhlIGFjdHVhbCBkYXRhCisgICAgICAgIG1lbWNweShkc3RkYXRhLCBzcmMsIGRhdGFsZW4pOworICAgICAgICBkc3RkYXRhICs9IGRhdGFsZW47CisgICAgICAgIHNyYyArPSBkYXRhbGVuOworICAgIH0KKworICAgIHJldHVybiAoUHNzaEluZm8qKSBleC0+bVBzc2hCdWYtPmRhdGEoKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKEFNZWRpYUV4dHJhY3RvciAqZXgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKKyAgICBpZihleC0+bUltcGwtPmdldFNhbXBsZU1ldGEoJm1ldGEpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpjcnlwdGVkZGF0YTsKKyAgICBzaXplX3QgY3J5cHRlZHNpemU7CisgICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2Yoc2l6ZV90KTsKKworICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKKyAgICBzaXplX3QgY2xlYXJzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZjbGVhcmRhdGEsICZjbGVhcnNpemUpKSB7CisgICAgICAgIGlmIChjbGVhcnNpemUgIT0gY3J5cHRlZHNpemUpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0d28gbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBzaXplX3Qga2V5c2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0lWLCAmdHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgICAgIGlmIChrZXlzaXplICE9IDE2KSB7CisgICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IHZvaWQgKml2OworICAgIHNpemVfdCBpdnNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKKyAgICAgICAgaWYgKGl2c2l6ZSAhPSAxNikgeworICAgICAgICAgICAgLy8gSVZzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG1vZGU7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtb2RlKSkgeworICAgICAgICBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOworICAgIH0KKworICAgIHJldHVybiBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICh1aW50OF90Kikga2V5LAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBpdiwKKyAgICAgICAgICAgIChjcnlwdG9pbmZvX21vZGVfdCkgbW9kZSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjbGVhcmRhdGEsCisgICAgICAgICAgICAoc2l6ZV90KikgY3J5cHRlZGRhdGEpOworfQorCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU0ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFGb3JtYXQiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0cnVjdCBBTWVkaWFGb3JtYXQgeworICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworICAgIFN0cmluZzggbURlYnVnOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1TdHJpbmdDYWNoZTsKK307CisKK2V4dGVybiAiQyIgeworCisvLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICooKHNwPEFNZXNzYWdlPiopZGF0YSk7CisgICAgcmV0dXJuIG1EYXRhOworfQorCit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCkgeworICAgICooKHNwPEFNZXNzYWdlPiopZGVzdCkgPSBtRGF0YS0+bUZvcm1hdDsKK30KKworCisvKgorICogcHVibGljIGZ1bmN0aW9uIGZvbGxvdworICovCitFWFBPUlQKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQgKm1EYXRhKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBkZWxldGUgbURhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworCitFWFBPUlQKK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQgKm1EYXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IGYgPSBtRGF0YS0+bUZvcm1hdDsKKyAgICBTdHJpbmc4IHJldDsKKyAgICBpbnQgbnVtID0gZi0+Y291bnRFbnRyaWVzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICByZXQuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmLT5nZXRFbnRyeU5hbWVBdChpLCAmdCk7CisgICAgICAgIHJldC5hcHBlbmQobmFtZSk7CisgICAgICAgIHJldC5hcHBlbmQoIjogIik7CisgICAgICAgIHN3aXRjaCAodCkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kSW50MzIobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiaW50MzIoJSIgUFJJZDMyICIpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZEludDY0KG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImludDY0KCUiIFBSSWQ2NCAiKSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVNpemU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kU2l6ZShuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJzaXplX3QoJXp1KSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kRmxvYXQobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiZmxvYXQoJWYpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZERvdWJsZShuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJkb3VibGUoJWYpIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRTdHJpbmcobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgic3RyaW5nKCVzKSIsIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImRhdGEiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgidW5rbm93biglZCkiLCB0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXQuYXBwZW5kKCJ9Iik7CisgICAgbURhdGEtPm1EZWJ1ZyA9IHJldDsKKyAgICByZXR1cm4gbURhdGEtPm1EZWJ1Zy5zdHJpbmcoKTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NChuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZEZsb2F0KG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kU2l6ZShuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0c2l6ZSkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZjsKKyAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKG5hbWUsICZidWYpKSB7CisgICAgICAgICpkYXRhID0gYnVmLT5kYXRhKCkgKyBidWYtPm9mZnNldCgpOworICAgICAgICAqb3V0c2l6ZSA9IGJ1Zi0+c2l6ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqIG1EYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KSB7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLT5tU3RyaW5nQ2FjaGUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChtRGF0YS0+bVN0cmluZ0NhY2hlLmtleUF0KGkpLnN0cmluZygpLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtRGF0YS0+bVN0cmluZ0NhY2hlLnJlbW92ZUl0ZW1zQXQoaSwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTdHJpbmcgdG1wOworICAgIGlmIChtRGF0YS0+bUZvcm1hdC0+ZmluZFN0cmluZyhuYW1lLCAmdG1wKSkgeworICAgICAgICBTdHJpbmc4IHJldCh0bXAuY19zdHIoKSk7CisgICAgICAgIG1EYXRhLT5tU3RyaW5nQ2FjaGUuYWRkKFN0cmluZzgobmFtZSksIHJldCk7CisgICAgICAgICpvdXQgPSByZXQuc3RyaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50MzIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEludDMyKG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0SW50NjQobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEZsb2F0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0RmxvYXQobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICAvLyBBTWVzc2FnZTo6c2V0U3RyaW5nKCkgbWFrZXMgYSBjb3B5IG9mIHRoZSBzdHJpbmcKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldFN0cmluZyhuYW1lLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIHRoZSBBQnVmZmVyKHZvaWQqLCBzaXplX3QpIGNvbnN0cnVjdG9yIGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGRhdGEsIHNvIGNyZWF0ZQorICAgIC8vIGEgbmV3IGJ1ZmZlciBhbmQgY29weSB0aGUgZGF0YSBpbnRvIGl0CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgbWVtY3B5KGJ1Zi0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICBidWYtPnNldFJhbmdlKDAsIHNpemUpOworICAgIC8vIEFNZXNzYWdlOjpzZXRCdWZmZXIoKSBpbmNyZWFzZXMgdGhlIHJlZmNvdW50IG9mIHRoZSBidWZmZXIKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEJ1ZmZlcihuYW1lLCBidWYpOworfQorCisKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFID0gImFhYy1wcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCA9ICJjaGFubmVsLWNvdW50IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSyA9ICJjaGFubmVsLW1hc2siOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUID0gImNvbG9yLWZvcm1hdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiA9ICJkdXJhdGlvblVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwgPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFID0gImZyYW1lLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgPSAibWF4LWlucHV0LXNpemUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiA9ICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUgPSAic2FtcGxlLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggPSAid2lkdGgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFID0gInN0cmlkZSI7CisKKworfSAvLyBleHRlcm4gIkMiCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzQyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDxOZGtNZWRpYUZvcm1hdC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2codm9pZCopOwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjAzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhTXV4ZXIiCisKKworI2luY2x1ZGUgIk5ka01lZGlhTXV4ZXIuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RydWN0IEFNZWRpYU11eGVyIHsKKyAgICBzcDxNZWRpYU11eGVyPiBtSW1wbDsKKworfTsKKworZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpIHsKKyAgICBBTE9HVigiY3RvciIpOworICAgIEFNZWRpYU11eGVyICptRGF0YSA9IG5ldyBBTWVkaWFNdXhlcigpOworICAgIG1EYXRhLT5tSW1wbCA9IG5ldyBNZWRpYU11eGVyKGZkLCAoYW5kcm9pZDo6TWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0KWZvcm1hdCk7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciAqbXV4ZXIpIHsKKyAgICBBTE9HVigiZHRvciIpOworICAgIGRlbGV0ZSBtdXhlcjsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyICptdXhlciwgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmd0aXR1ZGUpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c2V0TG9jYXRpb24obGF0aXR1ZGUgKiAxMDAwMCwgbG9uZ3RpdHVkZSAqIDEwMDAwKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50KEFNZWRpYU11eGVyICptdXhlciwgaW50IGRlZ3JlZXMpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+c2V0T3JpZW50YXRpb25IaW50KGRlZ3JlZXMpKTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyICptdXhlciwgY29uc3QgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoZm9ybWF0LCAmbXNnKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG11eGVyLT5tSW1wbC0+YWRkVHJhY2sobXNnKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIgKm11eGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnN0YXJ0KCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0b3AoQU1lZGlhTXV4ZXIgKm11eGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnN0b3AoKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKKyAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pIHsKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcigodm9pZCopKGRhdGEgKyBpbmZvLT5vZmZzZXQpLCBpbmZvLT5zaXplKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKAorICAgICAgICAgICAgbXV4ZXItPm1JbXBsLT53cml0ZVNhbXBsZURhdGEoYnVmLCB0cmFja0lkeCwgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzLCBpbmZvLT5mbGFncykpOworfQorCisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmluZGV4IGI4OTUwMjcuLjY5N2ZiMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCkBAIC0xMywxOCArMTMsMjggQEAKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgU2VydmljZVV0aWxpdGllcy5jcHAKKworIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQorTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5CisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCiAgICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAogICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgQXVkaW9NaXhlci5jcHAuYXJtICAgICAgICAgIFwKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwICAgICAgXAotICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwICAgICAgICBcCisgICAgUGF0Y2hQYW5lbC5jcHAKIAogTE9DQUxfU1JDX0ZJTEVTICs9IFN0YXRlUXVldWUuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCkBAIC00NiwxMiArNTYsMTUgQEAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYnNjaGVkdWxpbmdfcG9saWN5IFwKICAgICBsaWJjcHVzdGF0cyBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJzZXJ2aWNldXRpbGl0eQogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ZsaW5nZXIKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RNaXhlci5jcHAgRmFzdE1peGVyU3RhdGUuY3BwIEF1ZGlvV2F0Y2hkb2cuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gRmFzdFRocmVhZC5jcHAgRmFzdFRocmVhZFN0YXRlLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RDYXB0dXJlLmNwcCBGYXN0Q2FwdHVyZVN0YXRlLmNwcAogCiBMT0NBTF9DRkxBR1MgKz0gLURTVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz0nIlN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAiJwogCkBAIC03MiwxMCArODUsMjEgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLQl0ZXN0LXJlc2FtcGxlLmNwcCAJCQlcCisgICAgdGVzdC1yZXNhbXBsZS5jcHAgICAgICAgICAgIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJzbmRmaWxlCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcmVzYW1wbGVyIFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKKyAgICBsaWJkbCBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nCiAKIExPQ0FMX01PRFVMRTo9IHRlc3QtcmVzYW1wbGUKIApAQCAtODgsNyArMTEyLDExIEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAgICAgQXVkaW9SZXNhbXBsZXIuY3BwLmFybSBcCiAgICAgQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybQorICAgIEF1ZGlvUmVzYW1wbGVyU2luYy5jcHAuYXJtIFwKKyAgICBBdWRpb1Jlc2FtcGxlckR5bi5jcHAuYXJtCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMzNiMTlhNC4uZTQ4YWYyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTgyLDYgKzgyLDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb0ZsaW5nZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrSGFyZHdhcmVMb2NrZWRTdHJpbmdbXSA9ICJIYXJkd2FyZSBsb2NrIGlzIHRha2VuXG4iOworc3RhdGljIGNvbnN0IGNoYXIga0NsaWVudExvY2tlZFN0cmluZ1tdID0gIkNsaWVudCBsb2NrIGlzIHRha2VuXG4iOwogCiAKIG5zZWNzX3QgQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzID0ga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3M7CkBAIC0xMDQsNiArMTA1LDM2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorY29uc3QgY2hhciAqZm9ybWF0VG9TdHJpbmcoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNOgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOiByZXR1cm4gInBjbTE2IjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOiByZXR1cm4gInBjbTgiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOiByZXR1cm4gInBjbTMyIjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOiByZXR1cm4gInBjbTguMjQiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHJldHVybiAicGNtZmxvYXQiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDogcmV0dXJuICJwY20yNCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9NUDM6IHJldHVybiAibXAzIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BTVJfTkI6IHJldHVybiAiYW1yLW5iIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BTVJfV0I6IHJldHVybiAiYW1yLXdiIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUM6IHJldHVybiAiYWFjIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9IRV9BQUNfVjE6IHJldHVybiAiaGUtYWFjLXYxIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9IRV9BQUNfVjI6IHJldHVybiAiaGUtYWFjLXYyIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9WT1JCSVM6IHJldHVybiAidm9yYmlzIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9PUFVTOiByZXR1cm4gIm9wdXMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzogcmV0dXJuICJhYy0zIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzogcmV0dXJuICJlLWFjLTMiOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCiBzdGF0aWMgaW50IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQogewogICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CkBAIC0xMjEsNyArMTUyLDcgQEAKICAgICBpZiAocmMpIHsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uICE9IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7CisgICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7CiAgICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwogICAgICAgICByYyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBvdXQ7CkBAIC0xMzgsNiArMTY5LDcgQEAKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKICAgICA6IEJuQXVkaW9GbGluZ2VyKCksCiAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2KE5VTEwpLAorICAgICAgbUF1ZGlvSHdEZXZzKE5VTEwpLAogICAgICAgbUhhcmR3YXJlU3RhdHVzKEFVRElPX0hXX0lETEUpLAogICAgICAgbU1hc3RlclZvbHVtZSgxLjBmKSwKICAgICAgIG1NYXN0ZXJNdXRlKGZhbHNlKSwKQEAgLTE0NiwxNCArMTc4LDE2IEBACiAgICAgICBtQnROcmVjSXNPZmYoZmFsc2UpLAogICAgICAgbUlzTG93UmFtRGV2aWNlKHRydWUpLAogICAgICAgbUlzRGV2aWNlVHlwZUtub3duKGZhbHNlKSwKLSAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApCisgICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKSwKKyAgICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSgwKQogewogICAgIGdldHBpZF9jYWNoZWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgYm9vbCBkb0xvZyA9IChwcm9wZXJ0eV9nZXQoInJvLnRlc3RfaGFybmVzcyIsIHZhbHVlLCAiMCIpID4gMCkgJiYgKGF0b2kodmFsdWUpID09IDEpOwogICAgIGlmIChkb0xvZykgewotICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiKTsKKyAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSk7CiAgICAgfQorCiAjaWZkZWYgVEVFX1NJTksKICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIwIik7CiAgICAgaW50IGRlYnVnZ2FibGUgPSBhdG9pKHZhbHVlKTsKQEAgLTE2MiwxMiArMTk2LDE2IEBACiAgICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwogICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7CiAgICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkKKyAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQorICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewogICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKQorICAgIH0KKyAgICBpZiAodGVlRW5hYmxlZCAmIDIpIHsKICAgICAgICAgbVRlZVNpbmtPdXRwdXRFbmFibGVkID0gdHJ1ZTsKLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpCisgICAgfQorICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewogICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTE5MSw2ICsyMjksOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbVBhdGNoUGFuZWwgPSBuZXcgUGF0Y2hQYW5lbCh0aGlzKTsKKwogICAgIG1Nb2RlID0gQVVESU9fTU9ERV9OT1JNQUw7CiB9CiAKQEAgLTIxMCw2ICsyNTAsMTggQEAKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpKTsKICAgICAgICAgZGVsZXRlIG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpOwogICAgIH0KKworICAgIC8vIFRlbGwgbWVkaWEubG9nIHNlcnZpY2UgYWJvdXQgYW55IG9sZCB3cml0ZXJzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFMb2dTZXJ2aWNlPiBtZWRpYUxvZ1NlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gbVVucmVnaXN0ZXJlZFdyaXRlcnMuc2l6ZSgpOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGlNZW1vcnkobVVucmVnaXN0ZXJlZFdyaXRlcnMudG9wKCktPmdldElNZW1vcnkoKSk7CisgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5wb3AoKTsKKyAgICAgICAgICAgIG1lZGlhTG9nU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKQEAgLTI0OSw3ICszMDEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTI3MSwxNyArMzIzLDE3IEBACiAgICAgfQogCiAgICAgcmVzdWx0LmFwcGVuZCgiR2xvYmFsIHNlc3Npb24gcmVmczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiBzZXNzaW9uIHBpZCBjb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICBzZXNzaW9uICAgcGlkIGNvdW50XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqciA9IG1BdWRpb1Nlc3Npb25SZWZzW2ldOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTdkICUzZCAlM2RcbiIsIHItPm1TZXNzaW9uaWQsIHItPm1QaWQsIHItPm1DbnQpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICU3ZCAlNWQgJTVkXG4iLCByLT5tU2Vzc2lvbmlkLCByLT5tUGlkLCByLT5tQ250KTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0yOTYsNyArMzQ4LDcgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0zNDQsNyArMzk2LDE2IEBACiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2wgY2xpZW50TG9ja2VkID0gZHVtcFRyeUxvY2sobUNsaWVudExvY2spOworICAgICAgICBpZiAoIWNsaWVudExvY2tlZCkgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0NsaWVudExvY2tlZFN0cmluZyk7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQogICAgICAgICBkdW1wQ2xpZW50cyhmZCwgYXJncyk7CisgICAgICAgIGlmIChjbGllbnRMb2NrZWQpIHsKKyAgICAgICAgICAgIG1DbGllbnRMb2NrLnVubG9jaygpOworICAgICAgICB9CisKICAgICAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAKICAgICAgICAgLy8gZHVtcCBwbGF5YmFjayB0aHJlYWRzCkBAIC0zNTcsNiArNDE4LDEzIEBACiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIGR1bXAgb3JwaGFuIGVmZmVjdCBjaGFpbnMKKyAgICAgICAgaWYgKG1PcnBoYW5FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHdyaXRlKGZkLCAiICBPcnBoYW4gRWZmZWN0IENoYWluc1xuIiwgc3RybGVuKCIgIE9ycGhhbiBFZmZlY3QgQ2hhaW5zXG4iKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcnBoYW5FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaSktPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIGR1bXAgYWxsIGhhcmR3YXJlIGRldnMKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKQEAgLTM4OCw4ICs0NTYsOSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+IEF1ZGlvRmxpbmdlcjo6cmVnaXN0ZXJQaWRfbChwaWRfdCBwaWQpCitzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4gQXVkaW9GbGluZ2VyOjpyZWdpc3RlclBpZChwaWRfdCBwaWQpCiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CiAgICAgLy8gSWYgcGlkIGlzIGFscmVhZHkgaW4gdGhlIG1DbGllbnRzIHdwPD4gbWFwLCB0aGVuIHVzZSB0aGF0IGVudHJ5CiAgICAgLy8gKGZvciB3aGljaCBwcm9tb3RlKCkgaXMgYWx3YXlzICE9IDApLCBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBDbGllbnQuCiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpLnByb21vdGUoKTsKQEAgLTQwMywxNiArNDcyLDQ0IEBACiAKIHNwPE5CTG9nOjpXcml0ZXI+IEF1ZGlvRmxpbmdlcjo6bmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ncywgcmV0dXJuIGEgZHVtbXkgd3JpdGVyIHRoYXQgZG9lcyBub3RoaW5nCiAgICAgaWYgKG1Mb2dNZW1vcnlEZWFsZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9Ci0gICAgc3A8SU1lbW9yeT4gc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKLSAgICBzcDxOQkxvZzo6V3JpdGVyPiB3cml0ZXIgPSBuZXcgTkJMb2c6OldyaXRlcihzaXplLCBzaGFyZWQpOwogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7Ci0gICAgaWYgKGJpbmRlciAhPSAwKSB7Ci0gICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlciktPnJlZ2lzdGVyV3JpdGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSk7CisgICAgLy8gU2ltaWxhcmx5IGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIG1lZGlhLmxvZyBzZXJ2aWNlLCBhbHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgIGlmIChiaW5kZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9Ci0gICAgcmV0dXJuIHdyaXRlcjsKKyAgICBzcDxJTWVkaWFMb2dTZXJ2aWNlPiBtZWRpYUxvZ1NlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKSk7CisgICAgc3A8SU1lbW9yeT4gc2hhcmVkID0gbUxvZ01lbW9yeURlYWxlci0+YWxsb2NhdGUoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKTsKKyAgICAvLyBJZiBhbGxvY2F0aW9uIGZhaWxzLCBjb25zdWx0IHRoZSB2ZWN0b3Igb2YgcHJldmlvdXNseSB1bnJlZ2lzdGVyZWQgd3JpdGVycworICAgIC8vIGFuZCBnYXJiYWdlLWNvbGxlY3Qgb25lIG9yIG1vcmUgdGhlbSB1bnRpbCBhbiBhbGxvY2F0aW9uIHN1Y2NlZWRzCisgICAgaWYgKHNoYXJlZCA9PSAwKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2spOworICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnNpemUoKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUGljayB0aGUgb2xkZXN0IHN0YWxlIHdyaXRlciB0byBnYXJiYWdlLWNvbGxlY3QKKyAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBpTWVtb3J5KG1VbnJlZ2lzdGVyZWRXcml0ZXJzWzBdLT5nZXRJTWVtb3J5KCkpOworICAgICAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgIG1lZGlhTG9nU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdGhlIG1lZGlhLmxvZyByZW1vdGUgcmVmZXJlbmNlIHRvIElNZW1vcnkgaXMgZ29uZS4gIFdoZW4gb3VyIGxhc3QgbG9jYWwKKyAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gSU1lbW9yeSBhbHNvIGRyb3BzIHRvIHplcm8gYXQgZW5kIG9mIHRoaXMgYmxvY2ssCisgICAgICAgICAgICAgICAgLy8gdGhlIElNZW1vcnkgZGVzdHJ1Y3RvciB3aWxsIGRlYWxsb2NhdGUgdGhlIHJlZ2lvbiBmcm9tIG1Mb2dNZW1vcnlEZWFsZXIuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZS1hdHRlbXB0IHRoZSBhbGxvY2F0aW9uCisgICAgICAgICAgICBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOworICAgICAgICAgICAgaWYgKHNoYXJlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEV2ZW4gYWZ0ZXIgZ2FyYmFnZS1jb2xsZWN0aW5nIGFsbCBvbGQgd3JpdGVycywgdGhlcmUgaXMgc3RpbGwgbm90IGVub3VnaCBtZW1vcnksCisgICAgICAgIC8vIHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKKyAgICB9CitzdWNjZXNzOgorICAgIG1lZGlhTG9nU2VydmljZS0+cmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKKyAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoc2l6ZSwgc2hhcmVkKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnVucmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4mIHdyaXRlcikKQEAgLTQyNCwxMyArNTIxLDEwIEBACiAgICAgaWYgKGlNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5sb2ciKSk7Ci0gICAgaWYgKGJpbmRlciAhPSAwKSB7Ci0gICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUxvZ1NlcnZpY2U+KGJpbmRlciktPnVucmVnaXN0ZXJXcml0ZXIoaU1lbW9yeSk7Ci0gICAgICAgIC8vIE5vdyB0aGUgbWVkaWEubG9nIHJlbW90ZSByZWZlcmVuY2UgdG8gSU1lbW9yeSBpcyBnb25lLgotICAgICAgICAvLyBXaGVuIG91ciBsYXN0IGxvY2FsIHJlZmVyZW5jZSB0byBJTWVtb3J5IGFsc28gZHJvcHMgdG8gemVybywKLSAgICAgICAgLy8gdGhlIElNZW1vcnkgZGVzdHJ1Y3RvciB3aWxsIGRlYWxsb2NhdGUgdGhlIHJlZ2lvbiBmcm9tIG1NZW1vcnlEZWFsZXIuCi0gICAgfQorICAgIC8vIFJhdGhlciB0aGFuIHJlbW92aW5nIHRoZSB3cml0ZXIgaW1tZWRpYXRlbHksIGFwcGVuZCBpdCB0byBhIHF1ZXVlIG9mIG9sZCB3cml0ZXJzIHRvCisgICAgLy8gYmUgZ2FyYmFnZS1jb2xsZWN0ZWQgbGF0ZXIuICBUaGlzIGFsbG93cyB1cyB0byBjb250aW51ZSB0byB2aWV3IG9sZCBsb2dzIGZvciBhIHdoaWxlLgorICAgIE11dGV4OjpBdXRvbG9jayBfbChtVW5yZWdpc3RlcmVkV3JpdGVyc0xvY2spOworICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzLnB1c2god3JpdGVyKTsKIH0KIAogLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKQEAgLTQ0MSwxMyArNTM1LDEyIEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgaW50ICpzZXNzaW9uSWQsCi0gICAgICAgIFN0cmluZzgmIG5hbWUsCiAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CkBAIC00NjUsMTAgKzU1OCwyOSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJzaW9uIG9mIDgtYml0IFBDTSB0byAxNi1iaXQgUENNLAotICAgIC8vIGFuZCB3ZSBkb24ndCB5ZXQgc3VwcG9ydCA4LjI0IG9yIDMyLWJpdCBQQ00KLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlZCIsIGZvcm1hdCk7CisgICAgLy8gZnVydGhlciBzYW1wbGUgcmF0ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBzYW1wbGUgcmF0ZSAldSIsIHNhbXBsZVJhdGUpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gZnVydGhlciBjaGFubmVsIG1hc2sgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGZvcm1hdCBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCAmJiBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIHNoYXJlZEJ1ZmZlciBpcyBub24tMCBidXQgaGFzIE5VTEwgcG9pbnRlcigpIik7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC00NzYsNyArNTg4LDYgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKmVmZmVjdFRocmVhZCA9IE5VTEw7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igb3V0cHV0IGhhbmRsZSAlZCIsIG91dHB1dCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtNDg0LDI0ICs1OTUsMjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAotICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7Ci0KLSAgICAgICAgQUxPR1YoImNyZWF0ZVRyYWNrKCkgc2Vzc2lvbklkOiAlZCIsIChzZXNzaW9uSWQgPT0gTlVMTCkgPyAtMiA6ICpzZXNzaW9uSWQpOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKmVmZmVjdFRocmVhZCA9IE5VTEw7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW4gZWZmZWN0IGNoYWluIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBpcyBwcmVzZW50IG9uIGFub3RoZXIKICAgICAgICAgICAgIC8vIG91dHB1dCB0aHJlYWQgYW5kIG1vdmUgaXQgaGVyZS4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0ID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpICE9IG91dHB1dCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9ucyA9IHQtPmhhc0F1ZGlvU2Vzc2lvbigqc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24obFNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9ucyAmIFBsYXliYWNrVGhyZWFkOjpFRkZFQ1RfU0VTU0lPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkID0gdC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBpZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKQEAgLTUxOSw2ICs2MjksNyBAQAogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdFRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBubyByaXNrIG9mIGRlYWRsb2NrIGJlY2F1c2UgQXVkaW9GbGluZ2VyOjptTG9jayBpcyBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGxTZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKQEAgLTUzOCwyMyArNjQ5LDI3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIHMgZm9yIHNlcnZlcidzIHBpZCwgbiBmb3Igbm9ybWFsIG1peGVyIG5hbWUsIGYgZm9yIGZhc3QgaW5kZXgKLSAgICAgICAgbmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiczolZDtuOiVkO2Y6JWQiLCBnZXRwaWRfY2FjaGVkLCB0cmFjay0+bmFtZSgpIC0gQXVkaW9NaXhlcjo6VFJBQ0swLAotICAgICAgICAgICAgICAgIHRyYWNrLT5mYXN0SW5kZXgoKSk7Ci0gICAgICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBUcmFjayBzbyB0aGF0IHRoZSBDbGllbnQKLSAgICAgICAgLy8gZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUxvY2sgaGVsZAotICAgICAgICBjbGllbnQuY2xlYXIoKTsKLSAgICAgICAgdHJhY2suY2xlYXIoKTsKKwogICAgIH0KIAotRXhpdDoKLSAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgVHJhY2sgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgLy8gRG9uJ3QgaG9sZCBtQ2xpZW50TG9jayB3aGVuIHJlbGVhc2luZyB0aGUgcmVmZXJlbmNlIG9uIHRoZSB0cmFjayBhcyB0aGUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aWxsIGFjcXVpcmUgaXQuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgZ290byBFeGl0OwogICAgIH0KKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CisgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOworCitFeGl0OgorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKIH0KIApAQCAtNTY5LDE3ICs2ODQsNiBAQAogICAgIHJldHVybiB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKIH0KIAotaW50IEF1ZGlvRmxpbmdlcjo6Y2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKLSAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImNoYW5uZWxDb3VudCgpIHVua25vd24gdGhyZWFkICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiB0aHJlYWQtPmNoYW5uZWxDb3VudCgpOwotfQotCiBhdWRpb19mb3JtYXRfdCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTY5OSw5ICs4MDMsMTQgQEAKICAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTUlDX01VVEU7Ci0gICAgcmV0ID0gZGV2LT5zZXRfbWljX211dGUoZGV2LCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkZXYtPnNldF9taWNfbXV0ZShkZXYsIHN0YXRlKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0ID0gcmVzdWx0OworICAgICAgICB9CisgICAgfQogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTc5Niw3ICs5MDUsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIGlmIChvdXRwdXQpIHsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC04NDUsNyArOTU0LDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBmbG9hdCB2b2x1bWU7Ci0gICAgaWYgKG91dHB1dCkgeworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiAwLjBmOwpAQCAtODc4LDggKzk4Nyw4IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICAvLyBpb0hhbmRsZSA9PSAwIG1lYW5zIHRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQotICAgIGlmIChpb0hhbmRsZSA9PSAwKSB7CisgICAgLy8gQVVESU9fSU9fSEFORExFX05PTkUgbWVhbnMgdGhlIHBhcmFtZXRlcnMgYXJlIGdsb2JhbCB0byB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlCisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIHN0YXR1c190IGZpbmFsX3Jlc3VsdCA9IE5PX0VSUk9SOwogICAgICAgICB7CkBAIC05NjEsNyArMTA3MCw3IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHsKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgU3RyaW5nOCBvdXRfczg7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKQEAgLTEwMDAsNyArMTEwOSw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19HRVRfSU5QVVRfQlVGRkVSX1NJWkU7Ci0gICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOwogICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CiAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CkBAIC0xMDYxLDIxICsxMTcwLDMyIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQogewotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGNsaWVudEFkZGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKIAotICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShwaWQpIDwgMCkgewotICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCBwaWQgJWQiLCBub3RpZmljYXRpb25DbGllbnQuZ2V0KCksIHBpZCk7CisgICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKSA8IDApIHsKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHBpZCAlZCIsIG5vdGlmaWNhdGlvbkNsaWVudC5nZXQoKSwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQocGlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHBpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudEFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIC8vIG1DbGllbnRMb2NrIHNob3VsZCBub3QgYmUgaGVsZCBoZXJlIGJlY2F1c2UgVGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnQoKSB3aWxsIGxvY2sgdGhlCisgICAgLy8gVGhyZWFkQmFzZSBtdXRleCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgaXMgVGhyZWFkQmFzZTo6bUxvY2sgdGhlbiBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrLgorICAgIGlmIChjbGllbnRBZGRlZCkgewogICAgICAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCiAgICAgICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewpAQCAtMTA5MSw4ICsxMjExLDEwIEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKKyAgICB9CiAKICAgICBBTE9HVigiJWQgZGllZCwgcmVsZWFzaW5nIGl0cyBzZXNzaW9ucyIsIHBpZCk7CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTExMTUsMTcgKzEyMzcsMTggQEAKICAgICB9CiB9CiAKLS8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpCit2b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CiAgICAgfQogfQogCi0vLyByZW1vdmVDbGllbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyByZW1vdmVDbGllbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6cmVtb3ZlQ2xpZW50X2wocGlkX3QgcGlkKQogewogICAgIEFMT0dWKCJyZW1vdmVDbGllbnRfbCgpIHBpZCAlZCwgY2FsbGluZyBwaWQgJWQiLCBwaWQsCkBAIC0xMTYzLDcgKzEyODYsNyBAQAogICAgIC8vIDEgTUIgb2YgYWRkcmVzcyBzcGFjZSBpcyBnb29kIGZvciAzMiB0cmFja3MsIDggYnVmZmVycyBlYWNoLCA0IEtCL2J1ZmZlcgogfQogCi0vLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6Q2xpZW50Ojp+Q2xpZW50KCkKIHsKICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVDbGllbnRfbChtUGlkKTsKQEAgLTEyMTIsNyArMTMzNSw3IEBACiB7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CiAgICAgbUF1ZGlvRmxpbmdlci0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1QaWQpOwpAQCAtMTIzMCwyMCArMTM1MywyNCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKKyAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiByZWNvcmRUcmFjazsKICAgICBzcDxSZWNvcmRIYW5kbGU+IHJlY29yZEhhbmRsZTsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwotICAgIFJlY29yZFRocmVhZCAqdGhyZWFkOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQ7CiAgICAgaW50IGxTZXNzaW9uSWQ7CiAKKyAgICBjYmxrLmNsZWFyKCk7CisgICAgYnVmZmVycy5jbGVhcigpOworCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwogICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCIpOwpAQCAtMTI1MSwxNiArMTM3OCwzMSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAvLyBmdXJ0aGVyIHNhbXBsZSByYXRlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQorICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIHNhbXBsZSByYXRlICV1Iiwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBhZGQgY2xpZW50IHRvIGxpc3QKLSAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gMTYtYml0IFBDTQorICAgIGlmICghKGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGNoYW5uZWwgbWFzayBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVSZWNvcmRUcmFja19sKCkKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKKyAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGNoZWNrUmVjb3JkVGhyZWFkX2wgZmFpbGVkIik7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTI3NSw0MiArMTQxNyw1OCBAQAogICAgICAgICB9CiAKICAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7CisgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CiAKLSAgICAgICAgLy8gSWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQogICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOwogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gY3JlYXRlIG5ldyByZWNvcmQgdHJhY2suCi0gICAgICAgIC8vIFRoZSByZWNvcmQgdHJhY2sgdXNlcyBvbmUgdHJhY2sgaW4gbUhhcmR3YXJlTWl4ZXJUaHJlYWQgYnkgY29udmVudGlvbi4KKyAgICAgICAgQUxPR1YoIm9wZW5SZWNvcmQoKSBsU2Vzc2lvbklkOiAlZCBpbnB1dCAlZCIsIGxTZXNzaW9uSWQsIGlucHV0KTsKKwogICAgICAgICAvLyBUT0RPOiB0aGUgdWlkIHNob3VsZCBiZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgdG8gb3BlblJlY29yZAogICAgICAgICByZWNvcmRUcmFjayA9IHRocmVhZC0+Y3JlYXRlUmVjb3JkVHJhY2tfbChjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGxTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGxTZXNzaW9uSWQsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGlkLCAmbFN0YXR1cyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZWNvcmRUcmFjayA9PSAwKSk7CisKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBBdWRpb1JlY29yZCB0byBiZSBjcmVhdGVkIG9uIHRoaXMKKyAgICAgICAgICAgIC8vIHNlc3Npb24gYW5kIG1vdmUgaXQgdG8gdGhpcyB0aHJlYWQuCisgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKChhdWRpb19zZXNzaW9uX3QpbFNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUKLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1Mb2NrIGhlbGQKLSAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtQ2xpZW50TG9jayBoZWxkCisgICAgICAgIC8vIERvbid0IGhvbGQgbUNsaWVudExvY2sgd2hlbiByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSBvbiB0aGUgdHJhY2sgYXMgdGhlCisgICAgICAgIC8vIGRlc3RydWN0b3Igd2lsbCBhY3F1aXJlIGl0LgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyByZXR1cm4gdG8gaGFuZGxlIHRvIGNsaWVudAorICAgIGNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOworICAgIGJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworCisgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKLSAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHJlY29yZEhhbmRsZTsKIH0KIApAQCAtMTMyMCw2ICsxNDc4LDkgQEAKIAogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvRmxpbmdlcjo6bG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMzk4LDcgKzE1NTksNyBAQAogICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgbmV3IEF1ZGlvSHdEZXZpY2UobmFtZSwgZGV2LCBmbGFncykpOworICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKIAogICAgIEFMT0dJKCJsb2FkSHdNb2R1bGUoKSBMb2FkZWQgJXMgYXVkaW8gaW50ZXJmYWNlIGZyb20gJXMgKCVzKSBoYW5kbGUgJWQiLAogICAgICAgICAgIG5hbWUsIGRldi0+Y29tbW9uLm1vZHVsZS0+bmFtZSwgZGV2LT5jb21tb24ubW9kdWxlLT5pZCwgaGFuZGxlKTsKQEAgLTE0NDAsMTE3ICsxNjAxLDE1NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCh0aHJlYWQtPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgLy8gQSBzZXNzaW9uIGNhbiBvbmx5IGJlIG9uIG9uZSB0aHJlYWQsIHNvIGV4aXQgYWZ0ZXIgZmlyc3QgbWF0Y2gKKyAgICAgICAgICAgIFN0cmluZzggcmVwbHkgPSB0aHJlYWQtPmdldFBhcmFtZXRlcnMoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkMpKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIocmVwbHkpOworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKworc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZD4gQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0gICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgPyAqcFNhbXBsaW5nUmF0ZSA6IDA7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgPyAqcENoYW5uZWxNYXNrIDogMDsKLSAgICBjb25maWcuZm9ybWF0ID0gKHBGb3JtYXQgIT0gTlVMTCkgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIGlmIChvZmZsb2FkSW5mbykgewotICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOworICAgIGlmIChvdXRId0RldiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtID0gTlVMTDsKLSAgICBBdWRpb0h3RGV2aWNlICpvdXRId0RldjsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZIYWwgPSBvdXRId0Rldi0+aHdEZXZpY2UoKTsKKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgfQogCisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CisKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7CisKKyAgICAvLyBGT1IgVEVTVElORyBPTkxZOgorICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGFsbG93cyBvdmVycmlkaW5nIHRoZSBhdWRpbyBwb2xpY3kgc2V0dGluZ3MKKyAgICAvLyBhbmQgZm9yY2luZyBhIHNwZWNpZmljIGZvcm1hdCBvciBjaGFubmVsIG1hc2sgdG8gdGhlIEhBTC9TaW5rIGRldmljZSBmb3IgdGVzdGluZy4KKyAgICBpZiAoIShmbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkpIHsKKyAgICAgICAgLy8gQ2hlY2sgb25seSBmb3IgTm9ybWFsIE1peGluZyBtb2RlCisgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24pIHsKKyAgICAgICAgICAgIC8vIFNwZWNpZnkgZm9ybWF0ICh1bmNvbW1lbnQgb25lIGJlbG93IHRvIGNob29zZSkKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOworICAgICAgICAgICAgLy8gQUxPR1YoIm9wZW5PdXRwdXRfbCgpIHVwZ3JhZGluZyBmb3JtYXQgdG8gJSMwOHgiLCBjb25maWctPmZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAvLyBTcGVjaWZ5IGNoYW5uZWwgbWFzayAodW5jb21tZW50IG9uZSBiZWxvdyB0byBjaG9vc2UpCisgICAgICAgICAgICAvL2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KDQpOyAgLy8gZm9yIFVTQiA0Y2gKKyAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgIC8vICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYLCAoMSA8PCA0KSAtIDEpOyAgLy8gYW5vdGhlciA0Y2ggZXhhbXBsZQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgIG91dFN0cmVhbSwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgb3V0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dFN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbU91dChvdXRId0Rldiwgb3V0U3RyZWFtLCBmbGFncyk7CisKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZDsKKyAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG9mZmxvYWQgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkKKyAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtGb3JtYXQoY29uZmlnLT5mb3JtYXQpCisgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBtaXhlciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CiAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgbW9kdWxlICVkIERldmljZSAleCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsIENoYW5uZWxzICV4LCBmbGFncyAleCIsCiAgICAgICAgICAgICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgKHBEZXZpY2VzICE9IE5VTEwpID8gKnBEZXZpY2VzIDogMCwKLSAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAoZGV2aWNlcyAhPSBOVUxMKSA/ICpkZXZpY2VzIDogMCwKKyAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgb2ZmbG9hZEluZm8gJXAgdmVyc2lvbiAweCUwNHgiLAotICAgICAgICAgIG9mZmxvYWRJbmZvLCBvZmZsb2FkSW5mbyA9PSBOVUxMID8gLTEgOiBvZmZsb2FkSW5mby0+dmVyc2lvbiApOwogCi0gICAgaWYgKHBEZXZpY2VzID09IE5VTEwgfHwgKnBEZXZpY2VzID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCpkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIG91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsICpwRGV2aWNlcyk7Ci0gICAgaWYgKG91dEh3RGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2SGFsID0gb3V0SHdEZXYtPmh3RGV2aWNlKCk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLQotICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX09VVFBVVF9PUEVOOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJlYW0pOwotCi0gICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICBBTE9HVigib3Blbk91dHB1dCgpIG9wZW5PdXRwdXRTdHJlYW0gcmV0dXJuZWQgb3V0cHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgIgotICAgICAgICAgICAgIkNoYW5uZWxzICV4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgb3V0U3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBzdGF0dXMpOwotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBvdXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbmV3IEF1ZGlvU3RyZWFtT3V0KG91dEh3RGV2LCBvdXRTdHJlYW0sIGZsYWdzKTsKLQotICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIG9mZmxvYWQgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHx8Ci0gICAgICAgICAgICAoY29uZmlnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgfHwKLSAgICAgICAgICAgIChjb25maWcuY2hhbm5lbF9tYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7Ci0KLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBMYXRlbmN5TXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKLSAgICAgICAgfQorICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQgPSBvcGVuT3V0cHV0X2wobW9kdWxlLCBvdXRwdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIGZsYWdzKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgKmxhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwogCiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CiAKICAgICAgICAgLy8gdGhlIGZpcnN0IHByaW1hcnkgb3V0cHV0IG9wZW5lZCBkZXNpZ25hdGVzIHRoZSBwcmltYXJ5IGh3IGRldmljZQogICAgICAgICBpZiAoKG1QcmltYXJ5SGFyZHdhcmVEZXYgPT0gTlVMTCkgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkpIHsKICAgICAgICAgICAgIEFMT0dJKCJVc2luZyBtb2R1bGUgJWQgaGFzIHRoZSBwcmltYXJ5IGF1ZGlvIGludGVyZmFjZSIsIG1vZHVsZSk7Ci0gICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2ID0gb3V0SHdEZXY7CisgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2ID0gdGhyZWFkLT5nZXRPdXRwdXQoKS0+YXVkaW9Id0RldjsKIAogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTU9ERTsKLSAgICAgICAgICAgIGh3RGV2SGFsLT5zZXRfbW9kZShod0RldkhhbCwgbU1vZGUpOworICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKS0+c2V0X21vZGUobVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKSwgbU1vZGUpOwogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKKworICAgICAgICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC0xNTYzLDcgKzE3NjIsNyBAQAogICAgIGlmICh0aHJlYWQxID09IE5VTEwgfHwgdGhyZWFkMiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJvcGVuRHVwbGljYXRlT3V0cHV0KCkgd3Jvbmcgb3V0cHV0IG1peGVyIHR5cGUgZm9yIG91dHB1dCAlZCBvciAlZCIsIG91dHB1dDEsCiAgICAgICAgICAgICAgICAgb3V0cHV0Mik7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKQEAgLTE1NzEsNyArMTc3MCw3IEBACiAgICAgdGhyZWFkLT5hZGRPdXRwdXRUcmFjayh0aHJlYWQyKTsKICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgotICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKICAgICByZXR1cm4gaWQ7CiB9CiAKQEAgLTE2MjEsMjIgKzE4MjAsMzUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQsIG91dHB1dCwgTlVMTCk7CisgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCwgb3V0cHV0LCBOVUxMKTsKICAgICB9CiAgICAgdGhyZWFkLT5leGl0KCk7CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KIAogICAgIGlmICh0aHJlYWQtPnR5cGUoKSAhPSBUaHJlYWRCYXNlOjpEVVBMSUNBVElORykgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOwotICAgICAgICBBTE9HX0FTU0VSVChvdXQgIT0gTlVMTCwgIm91dCBzaG91bGRuJ3QgYmUgTlVMTCIpOwotICAgICAgICAvLyBmcm9tIG5vdyBvbiB0aHJlYWQtPm1PdXRwdXQgaXMgTlVMTAotICAgICAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7Ci0gICAgICAgIGRlbGV0ZSBvdXQ7CisgICAgICAgIGNsb3NlT3V0cHV0RmluaXNoKHRocmVhZCk7CiAgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRGaW5pc2goc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0ID0gdGhyZWFkLT5jbGVhck91dHB1dCgpOworICAgIEFMT0dfQVNTRVJUKG91dCAhPSBOVUxMLCAib3V0IHNob3VsZG4ndCBiZSBOVUxMIik7CisgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tT3V0cHV0IGlzIE5VTEwKKyAgICBvdXQtPmh3RGV2KCktPmNsb3NlX291dHB1dF9zdHJlYW0ob3V0LT5od0RldigpLCBvdXQtPnN0cmVhbSk7CisgICAgZGVsZXRlIG91dDsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKQoreworICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgdGhyZWFkLT5leGl0KCk7CisgICAgY2xvc2VPdXRwdXRGaW5pc2godGhyZWFkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTY2OCw1OCArMTg4MCw3NiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBOVUxMOwotICAgIHN0cnVjdCBhdWRpb19jb25maWcgY29uZmlnOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IChwU2FtcGxpbmdSYXRlICE9IE5VTEwpID8gKnBTYW1wbGluZ1JhdGUgOiAwOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAocENoYW5uZWxNYXNrICE9IE5VTEwpID8gKnBDaGFubmVsTWFzayA6IDA7Ci0gICAgY29uZmlnLmZvcm1hdCA9IChwRm9ybWF0ICE9IE5VTEwpID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgdWludDMyX3QgcmVxU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcmVxQ2hhbm5lbHMgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7Ci0gICAgQXVkaW9Id0RldmljZSAqaW5Id0RldjsKKyAgICBpZiAoKmRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotICAgIGlmIChwRGV2aWNlcyA9PSBOVUxMIHx8ICpwRGV2aWNlcyA9PSAwKSB7CisgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworCisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KKyAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkPiBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlKTsKKyAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CisgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmICgqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgKmlucHV0ID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgfQogCi0gICAgaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCAqcERldmljZXMpOwotICAgIGlmIChpbkh3RGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCisgICAgYXVkaW9fY29uZmlnX3QgaGFsY29uZmlnID0gKmNvbmZpZzsKICAgICBhdWRpb19od19kZXZpY2VfdCAqaW5Id0hhbCA9IGluSHdEZXYtPmh3RGV2aWNlKCk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLQotICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtKTsKLSAgICBBTE9HVigib3BlbklucHV0KCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlZCwgQ2hhbm5lbHMgJXgsICIKLSAgICAgICAgICAgICJzdGF0dXMgJWQiLAorICAgIGF1ZGlvX3N0cmVhbV9pbl90ICppblN0cmVhbSA9IE5VTEw7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3Blbl9pbnB1dF9zdHJlYW0oaW5Id0hhbCwgKmlucHV0LCBkZXZpY2UsICZoYWxjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKKyAgICBBTE9HVigib3BlbklucHV0X2woKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCIKKyAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJXgsIGZsYWdzICUjeCwgc3RhdHVzICVkIiwKICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBoYWxjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICBoYWxjb25maWcuZm9ybWF0LAorICAgICAgICAgICAgaGFsY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgc3RhdHVzKTsKIAogICAgIC8vIElmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIGFuZCB3ZSBjYW4gaGFuZGxlIHRoZQogICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4gVGhlIEF1ZGlvRmxpbmdlciBjYW4KICAgICAvLyByZXNhbXBsZSB0aGUgaW5wdXQgYW5kIGRvIG1vbm8gdG8gc3RlcmVvIG9yIHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb25zIG9uIDE2IGJpdCBQQ00gaW5wdXRzLgogICAgIGlmIChzdGF0dXMgPT0gQkFEX1ZBTFVFICYmCi0gICAgICAgIHJlcUZvcm1hdCA9PSBjb25maWcuZm9ybWF0ICYmIGNvbmZpZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKLSAgICAgICAgKGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSAyICogcmVxU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAocG9wY291bnQoY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmIChwb3Bjb3VudChyZXFDaGFubmVscykgPD0gRkNDXzIpKSB7Ci0gICAgICAgIEFMT0dWKCJvcGVuSW5wdXQoKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0ID09IGhhbGNvbmZpZy5mb3JtYXQgJiYgaGFsY29uZmlnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAoaGFsY29uZmlnLnNhbXBsZV9yYXRlIDw9IDIgKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgorICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmCisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpKSB7CisgICAgICAgIC8vIEZJWE1FIGRlc2NyaWJlIHRoZSBjaGFuZ2UgcHJvcG9zZWQgYnkgSEFMIChzYXZlIG9sZCB2YWx1ZXMgc28gd2UgY2FuIGxvZyB0aGVtIGhlcmUpCisgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbSA9IE5VTEw7Ci0gICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsIGlkLCAqcERldmljZXMsICZjb25maWcsICZpblN0cmVhbSk7CisgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHJlYW0sIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UpOworICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIGluU3RyZWFtICE9IE5VTEwpIHsKQEAgLTE3MzMsMTcgKzE5NjMsMTcgQEAKICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKICAgICAgICAgICAgIFRFRV9TSU5LX09MRCwgICAvLyBjb3B5IGlucHV0IHVzaW5nIGFuIGV4aXN0aW5nIHBpcGUKICAgICAgICAgfSBraW5kOwotICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhpblN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmaW5TdHJlYW0tPmNvbW1vbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wY291bnQoaW5TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJmluU3RyZWFtLT5jb21tb24pKSk7CisgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSwgaGFsY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwogICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rID09IDApIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7CiAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIG1SZWNvcmRUZWVTaW5rLT5mb3JtYXQoKSkpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwpAQCAtMTc3MywzOSArMjAwMywyNiBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG5ldyBBdWRpb1N0cmVhbUluKGluSHdEZXYsIGluU3RyZWFtKTsKKyAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1Jbihpbkh3RGV2LCBpblN0cmVhbSk7CiAKICAgICAgICAgLy8gU3RhcnQgcmVjb3JkIHRocmVhZAogICAgICAgICAvLyBSZWNvcmRUaHJlYWQgcmVxdWlyZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotICAgICAgICB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG5ldyBSZWNvcmRUaHJlYWQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIG1SZWNvcmRUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKLSAgICAgICAgQUxPR1YoIm9wZW5JbnB1dCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwU2FtcGxpbmdSYXRlID0gcmVxU2FtcGxpbmdSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENoYW5uZWxNYXNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwQ2hhbm5lbE1hc2sgPSByZXFDaGFubmVsczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKLSAgICAgICAgcmV0dXJuIGlkOworICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOworICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICB9CiAKKyAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgyNywyNiArMjA0NCw3MiBAQAogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCwgaW5wdXQsIE5VTEwpOworCisgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQorICAgICAgICAvLyBvbiBhdCBsZWFzdCBvbmUgZWZmZWN0LiBXZSBtdXN0IGVpdGhlciBtb3ZlIHRoZSBjaGFpbiB0byBhbiBleGlzdGluZyB0aHJlYWQgd2l0aCB0aGUKKyAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCisgICAgICAgIC8vIG5ldyBjYXB0dXJlIG9uIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnMgPSB0aHJlYWQtPmdldEVmZmVjdENoYWluc19sKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBtYXhpbXVtIG9uZSBjaGFpbiBwZXIgcmVjb3JkIHRocmVhZAorICAgICAgICAgICAgaWYgKGVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoYWluID0gZWZmZWN0Q2hhaW5zWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiBhIHJlY29yZCB0aHJlYWQgaXMgYWxyZWFkeSBvcGVuZWQgd2l0aCBhIGNsaWVudCBvbiB0aGUgc2FtZSBzZXNzaW9uLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaW4gY2FzZSBvZiBvdmVybGFwIGJldHdlZW4gb25lIHRocmVhZCB0ZWFyIGRvd24gYW5kIHRoZQorICAgICAgICAgICAgLy8gY3JlYXRpb24gb2YgaXRzIHJlcGxhY2VtZW50CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPFJlY29yZFRocmVhZD4gdCA9IG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodC0+aGFzQXVkaW9TZXNzaW9uKGNoYWluLT5zZXNzaW9uSWQoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpIGZvdW5kIHRocmVhZCAlZCBmb3IgZWZmZWN0IHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5pZCgpLCBjaGFpbi0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICB0LT5hZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcHV0IHRoZSBjaGFpbiBhc2lkZSBpZiB3ZSBjb3VsZCBub3QgZmluZCBhIHJlY29yZCB0aHJlYWQgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIGlkLgorICAgICAgICAgICAgaWYgKGkgPT0gbVJlY29yZFRocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQsIGlucHV0LCBOVUxMKTsKICAgICAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbShpbnB1dCk7CiAgICAgfQotICAgIHRocmVhZC0+ZXhpdCgpOwotICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCi0gICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCisgICAgLy8gRklYTUU6IGNhbGxpbmcgdGhyZWFkLT5leGl0KCkgd2l0aG91dCBtTG9jayBoZWxkIHNob3VsZCBub3QgYmUgbmVlZGVkIGFueW1vcmUgbm93IHRoYXQKKyAgICAvLyB3ZSBoYXZlIGEgZGlmZmVyZW50IGxvY2sgZm9yIG5vdGlmaWNhdGlvbiBjbGllbnQKKyAgICBjbG9zZUlucHV0RmluaXNoKHRocmVhZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEZpbmlzaChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICB0aHJlYWQtPmV4aXQoKTsKICAgICBBdWRpb1N0cmVhbUluICppbiA9IHRocmVhZC0+Y2xlYXJJbnB1dCgpOwogICAgIEFMT0dfQVNTRVJUKGluICE9IE5VTEwsICJpbiBzaG91bGRuJ3QgYmUgTlVMTCIpOwogICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bUlucHV0IGlzIE5VTEwKICAgICBpbi0+aHdEZXYoKS0+Y2xvc2VfaW5wdXRfc3RyZWFtKGluLT5od0RldigpLCBpbi0+c3RyZWFtKTsKICAgICBkZWxldGUgaW47Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0U3RyZWFtT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpCit7CisgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CisgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVigic2V0U3RyZWFtT3V0cHV0KCkgc3RyZWFtICVkIHRvIG91dHB1dCAlZCIsIHN0cmVhbSwgb3V0cHV0KTsKKyAgICBBTE9HVigiaW52YWxpZGF0ZVN0cmVhbSgpIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKQEAgLTE4NTcsMjQgKzIxMjAsMzAgQEAKIH0KIAogCi1pbnQgQXVkaW9GbGluZ2VyOjpuZXdBdWRpb1Nlc3Npb25JZCgpCithdWRpb191bmlxdWVfaWRfdCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvVW5pcXVlSWQoKQogewogICAgIHJldHVybiBuZXh0VW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCwgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAKLSAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0Ci0gICAgLy8gaXMgbGlrZWx5IHByb3hpZWQgYnkgbWVkaWFzZXJ2ZXIgKGUuZyBDYW1lcmFTZXJ2aWNlKSBhbmQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKCkgY2FuIGJlCi0gICAgLy8gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcGlkIGxlYXZpbmcgYSBzdGFsZSBzZXNzaW9uIHJlZmVyZW5jZS4gIEFsc28gd2UgZG9uJ3Qga25vdyBob3cKLSAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShjYWxsZXIpIDwgMCkgewotICAgICAgICBBTE9HVigiYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkgdW5rbm93biBjbGllbnQgJWQgZm9yIHNlc3Npb24gJWQiLCBjYWxsZXIsIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAvLyBJZ25vcmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBwcm9jZXNzZXMgbm90IGtub3duIGFzIG5vdGlmaWNhdGlvbiBjbGllbnQuIFRoZSByZXF1ZXN0CisgICAgICAgIC8vIGlzIGxpa2VseSBwcm94aWVkIGJ5IG1lZGlhc2VydmVyIChlLmcgQ2FtZXJhU2VydmljZSkgYW5kIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpIGNhbiBiZQorICAgICAgICAvLyBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCBwaWQgbGVhdmluZyBhIHN0YWxlIHNlc3Npb24gcmVmZXJlbmNlLiAgQWxzbyB3ZSBkb24ndCBrbm93IGhvdworICAgICAgICAvLyB0byBjbGVhciB0aGlzIHJlZmVyZW5jZSBpZiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkoY2FsbGVyKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKSB1bmtub3duIGNsaWVudCAlZCBmb3Igc2Vzc2lvbiAlZCIsIGNhbGxlciwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CkBAIC0xODkwLDExICsyMTU5LDE0IEBACiAgICAgQUxPR1YoIiBhZGRlZCBuZXcgZW50cnkgZm9yICVkIiwgYXVkaW9TZXNzaW9uKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQordm9pZCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIpOworICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKKyAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICAgICAgY2FsbGVyID0gcGlkOworICAgIH0KICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBudW07IGkrKykgewogICAgICAgICBBdWRpb1Nlc3Npb25SZWYgKnJlZiA9IG1BdWRpb1Nlc3Npb25SZWZzLml0ZW1BdChpKTsKQEAgLTE5NTYsNyArMjIyOCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sICh0LT5tTG9jayk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBlZmZlY3RzIGZyb20gdGhlIGNoYWluCiAgICAgICAgICAgICB3aGlsZSAoZWMtPm1FZmZlY3RzLnNpemUoKSkgewogICAgICAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWMtPm1FZmZlY3RzWzBdOwpAQCAtMTk5Myw3ICsyMjY1LDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpuZXh0VW5pcXVlSWQoKQogewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworICAgIHJldHVybiAodWludDMyX3QpIGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKkF1ZGlvRmxpbmdlcjo6cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSBjb25zdApAQCAtMjAyMyw3ICsyMjk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIApAQCAtMjE4NSw3ICsyNDU3LDcgQEAKIAogICAgICAgICAvLyByZXR1cm4gZWZmZWN0IGRlc2NyaXB0b3IKICAgICAgICAgKnBEZXNjID0gZGVzYzsKLSAgICAgICAgaWYgKGlvID09IDAgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICAgICAgLy8gaWYgdGhlIG91dHB1dCByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JFZmZlY3QoKSBpcyByZW1vdmVkIGJlZm9yZSB3ZSBsb2NrIHRoZQogICAgICAgICAgICAgLy8gbXV0ZXggYmVsb3csIHRoZSBjYWxsIHRvIGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgYmVsb3cgd2lsbCBkZXRlY3QgaXQKICAgICAgICAgICAgIC8vIGFuZCB3ZSB3aWxsIGV4aXQgc2FmZWx5CkBAIC0yMjAwLDcgKzI0NzIsNyBAQAogICAgICAgICAvLyBJZiBvdXRwdXQgaXMgMCBoZXJlLCBzZXNzaW9uSWQgaXMgbmVpdGhlciBTRVNTSU9OX09VVFBVVF9TVEFHRSBub3IgU0VTU0lPTl9PVVRQVVRfTUlYCiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCiAgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKLSAgICAgICAgaWYgKGlvID09IDApIHsKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CiAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KICAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQpAQCAtMjIyNSw3ICsyNDk3LDcgQEAKICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKLSAgICAgICAgICAgIGlmIChpbyA9PSAwICYmIG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgbVBsYXliYWNrVGhyZWFkcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCgpIGdvdCBpbyAlZCBmb3IgZWZmZWN0ICVzIiwgaW8sIGRlc2MubmFtZSk7CkBAIC0yMjM4LDkgKzI1MTAsMTcgQEAKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBlZmZlY3QgdG8gYmUgY3JlYXRlZCBvbiB0aGlzCisgICAgICAgICAgICAvLyBzZXNzaW9uIGFuZCB1c2VkIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLgorICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbCgoYXVkaW9fc2Vzc2lvbl90KXNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7CisgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKIAogICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IG9uIHNlbGVjdGVkIG91dHB1dCB0aHJlYWQKICAgICAgICAgaGFuZGxlID0gdGhyZWFkLT5jcmVhdGVFZmZlY3RfbChjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHksIHNlc3Npb25JZCwKQEAgLTIyNDgsMTIgKzI1MjgsMTUgQEAKICAgICAgICAgaWYgKGhhbmRsZSAhPSAwICYmIGlkICE9IE5VTEwpIHsKICAgICAgICAgICAgICppZCA9IGhhbmRsZS0+aWQoKTsKICAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KICAgICB9CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC0yMjk5LDYgKzI1ODIsMTYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIHRocmVhZCBoYXMgYSBjaGFubmVsIGNvdW50IG9mIEZDQ18yLCB3aGljaCBpcworICAgIC8vIGN1cnJlbnRseSByZXF1aXJlZCBmb3IgKG1vc3QpIGVmZmVjdHMuIFByZXZlbnQgbW92aW5nIHRoZSBlZmZlY3QgY2hhaW4gaGVyZSByYXRoZXIKKyAgICAvLyB0aGFuIGRpc2FibGluZyB0aGUgYWRkRWZmZWN0X2woKSBjYWxsIGluIGRzdFRocmVhZCBiZWxvdy4KKyAgICBpZiAoZHN0VGhyZWFkLT5tQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGVmZmVjdCBjaGFpbiBmYWlsZWQgYmVjYXVzZSIKKyAgICAgICAgICAgICAgICAiIGRlc3RpbmF0aW9uIHRocmVhZCAlcCBjaGFubmVsIGNvdW50KCV1KSAhPSAldSIsCisgICAgICAgICAgICAgICAgZHN0VGhyZWFkLCBkc3RUaHJlYWQtPm1DaGFubmVsQ291bnQsIEZDQ18yKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIC8vIHJlbW92ZSBjaGFpbiBmaXJzdC4gVGhpcyBpcyB1c2VmdWwgb25seSBpZiByZWNvbmZpZ3VyaW5nIGVmZmVjdCBjaGFpbiBvbiBzYW1lIG91dHB1dCB0aHJlYWQsCiAgICAgLy8gc28gdGhhdCBhIG5ldyBjaGFpbiBpcyBjcmVhdGVkIHdpdGggY29ycmVjdCBwYXJhbWV0ZXJzIHdoZW4gZmlyc3QgZWZmZWN0IGlzIGFkZGVkLiBUaGlzIGlzCiAgICAgLy8gb3RoZXJ3aXNlIHVubmVjZXNzYXJ5IGFzIHJlbW92ZUVmZmVjdF9sKCkgd2lsbCByZW1vdmUgdGhlIGNoYWluIHdoZW4gbGFzdCBlZmZlY3QgaXMKQEAgLTIzOTcsNiArMjY5MCw0OSBAQAogCiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cHV0T3JwaGFuRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWNoYWluLT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJwdXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR1coInB1dE9ycGhhbkVmZmVjdENoYWluX2wgY2hhaW4gZm9yIHNlc3Npb24gJWQgYWxyZWFkeSBwcmVzZW50Iiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgbU9ycGhhbkVmZmVjdENoYWlucy5hZGQoc2Vzc2lvbiwgY2hhaW4pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gQXVkaW9GbGluZ2VyOjpnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJnZXRPcnBoYW5FZmZlY3RDaGFpbl9sIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gY2hhaW47Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjp1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZWZmZWN0LT5zZXNzaW9uSWQoKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU9ycGhhbkVmZmVjdENoYWlucy5pbmRleE9mS2V5KHNlc3Npb24pOworICAgIEFMT0dWKCJ1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMgc2Vzc2lvbiAlZCBpbmRleCAlZCIsIHNlc3Npb24sIGluZGV4KTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAoY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyByZW1vdmluZyBlZmZlY3QgY2hhaW4gYXQgaW5kZXggJWQiLCBpbmRleCk7CisgICAgICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKwogc3RydWN0IEVudHJ5IHsKICNkZWZpbmUgTUFYX05BTUUgMzIgICAgIC8vICVZJW0lZCVIJU0lU18lZC53YXYKICAgICBjaGFyIG1OYW1lW01BWF9OQU1FXTsKQEAgLTI0NzMsMjQgKzI4MDksMjYgQEAKICAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCiAgICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgICAgICBpZiAodGVlRmQgPj0gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKICAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKICAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCiAgICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwogICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPD0gRkNDXzIpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOwogICAgICAgICAgICAgd2F2SGVhZGVyWzIyXSA9IGNoYW5uZWxDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzCiAgICAgICAgICAgICB3YXZIZWFkZXJbMjRdID0gc2FtcGxlUmF0ZTsgICAgICAgICAvLyBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgd2F2SGVhZGVyWzI1XSA9IHNhbXBsZVJhdGUgPj4gODsKLSAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBjaGFubmVsQ291bnQgKiAyOyAgIC8vIGJsb2NrIGFsaWdubWVudAorICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50CisgICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7CiAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7CiAgICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwogICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOworI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCisgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0jZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNAotICAgICAgICAgICAgICAgIHNob3J0IGJ1ZmZlcltURUVfU0lOS19SRUFEICogRkNDXzJdOwogICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IFRFRV9TSU5LX1JFQUQ7CiAgICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSB0ZWVTb3VyY2UtPnJlYWQoYnVmZmVyLCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKQEAgLTI1MDMsMTQgKzI4NDEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjdHVhbCA8PSAoc3NpemVfdCljb3VudCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogZnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICB0b3RhbCArPSBhY3R1YWw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CiAgICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkgLSA4OworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OworICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQogICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwogICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKICAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNzMyMDE0NC4uMTAwMzAxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMTgsNiArMTgsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZMSU5HRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZMSU5HRVJfSAogCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgpAQCAtNDksOSArNTAsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKworI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlICJBdWRpb1dhdGNoZG9nLmgiCisjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtNjAsOCArNjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190Oworc3RydWN0IGVmZmVjdF9wYXJhbV9jYmxrX3Q7CiBjbGFzcyBBdWRpb01peGVyOwogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKQEAgLTgxLDkgKzg1LDYgQEAKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3MgPSBzZWNvbmRzKDMpOwogCi0jZGVmaW5lIE1BWF9HQUlOIDQwOTYuMGYKLSNkZWZpbmUgTUFYX0dBSU5fSU5UIDB4MTAwMAotCiAjZGVmaW5lIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKIGNsYXNzIEF1ZGlvRmxpbmdlciA6CkBAIC0xMDIsMjkgKzEwMywzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgIHZpcnR1YWwgc3A8SUF1ZGlvUmVjb3JkPiBvcGVuUmVjb3JkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CkBAIC0xNTYsMTQgKzE1OCwxMyBAQAogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CkBAIC0xNzQsMTUgKzE3NSwxNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzayk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCkBAIC0xOTEsMTEgKzE5NCwxMSBAQAogCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbik7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpOwogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykgY29uc3Q7CiAKQEAgLTIxMCw3ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpOwogCkBAIC0yMjQsNiArMjI3LDMwIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKTsKIAorICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyk7CisKKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8qIExpc3QgZXhpc3RpbmcgYXVkaW8gcGF0Y2hlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOworCisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8qIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uICovCisgICAgdmlydHVhbCBhdWRpb19od19zeW5jX3QgZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMjM1LDggKzI2MiwxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgbmV3V3JpdGVyX2woc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgdW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiYgd3JpdGVyKTsKIHByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTG9nTWVtb3J5U2l6ZSA9IDEwICogMTAyNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAgKiAxMDI0OwogICAgIHNwPE1lbW9yeURlYWxlcj4gICAgbUxvZ01lbW9yeURlYWxlcjsgICAvLyA9PSAwIHdoZW4gTkJMb2cgaXMgZGlzYWJsZWQKKyAgICAvLyBXaGVuIGEgbG9nIHdyaXRlciBpcyB1bnJlZ2lzdGVyZWQsIGl0IGlzIGRvbmUgbGF6aWx5IHNvIHRoYXQgbWVkaWEubG9nIGNhbiBjb250aW51ZSB0byBzZWUgaXQKKyAgICAvLyBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZS4gIFRoZSBtZW1vcnkgaXMgb25seSBmcmVlZCB3aGVuIGl0IGlzIG5lZWRlZCBmb3IgYW5vdGhlciBsb2cgd3JpdGVyLgorICAgIFZlY3Rvcjwgc3A8TkJMb2c6OldyaXRlcj4gPiBtVW5yZWdpc3RlcmVkV3JpdGVyczsKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jazsKIHB1YmxpYzoKIAogICAgIGNsYXNzIFN5bmNFdmVudDsKQEAgLTI0OSw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgIHN5bmNfZXZlbnRfY2FsbGJhY2tfdCBjYWxsQmFjaywKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKKyAgICAgICAgICAgICAgICAgIHdwPFJlZkJhc2U+IGNvb2tpZSkKICAgICAgICAgOiBtVHlwZSh0eXBlKSwgbVRyaWdnZXJTZXNzaW9uKHRyaWdnZXJTZXNzaW9uKSwgbUxpc3RlbmVyU2Vzc2lvbihsaXN0ZW5lclNlc3Npb24pLAogICAgICAgICAgIG1DYWxsYmFjayhjYWxsQmFjayksIG1Db29raWUoY29va2llKQogICAgICAgICB7fQpAQCAtMjYyLDE0ICsyOTMsMTQgQEAKICAgICAgICAgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVRyaWdnZXJTZXNzaW9uOyB9CiAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtTGlzdGVuZXJTZXNzaW9uOyB9Ci0gICAgICAgIHZvaWQgKmNvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIG1Db29raWU7IH0KKyAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKCkgY29uc3QgeyByZXR1cm4gbUNvb2tpZTsgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgICBjb25zdCBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IG1UeXBlOwogICAgICAgICAgIGNvbnN0IGludCBtVHJpZ2dlclNlc3Npb247CiAgICAgICAgICAgY29uc3QgaW50IG1MaXN0ZW5lclNlc3Npb247CiAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IG1DYWxsYmFjazsKLSAgICAgICAgICB2b2lkICogY29uc3QgbUNvb2tpZTsKKyAgICAgICAgICBjb25zdCB3cDxSZWZCYXNlPiBtQ29va2llOwogICAgICAgICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAgICAgfTsKIApAQCAtMjc3LDcgKzMwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5lclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKTsKIAogcHJpdmF0ZToKICAgICBjbGFzcyBBdWRpb0h3RGV2aWNlOyAgICAvLyBmd2QgZGVjbGFyYXRpb24gZm9yIGZpbmRTdWl0YWJsZUh3RGV2X2wKQEAgLTMwMCw2ICszMzEsNDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CiAKKyAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgdG8gdHJ1ZSB0byBlbmFibGUgZ3JlYXRlciB0aGFuIHN0ZXJlbyBvdXRwdXQKKyAgICAvLyBmb3IgdGhlIE1peGVyVGhyZWFkIGFuZCBkZXZpY2Ugc2luay4gIE51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkIGlzCisgICAgLy8gRkNDXzIgPD0gY2hhbm5lbHMgPD0gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUy4KKyAgICBzdGF0aWMgY29uc3QgYm9vbCBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscyA9IHRydWU7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgY2hhbm5lbCBtYXNrIGlzIHBlcm1pdHRlZCBmb3IgdGhlIFBDTSBzaW5rIGluIHRoZSBNaXhlclRocmVhZAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7CisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKKyAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgeworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCisgICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uIHRvIHRydWUgdG8gdXNlIGV4dGVuZGVkIHByZWNpc2lvbiBpbiBNaXhlclRocmVhZAorICAgIHN0YXRpYyBjb25zdCBib29sIGtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiA9IHRydWU7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZm9ybWF0IGlzIHBlcm1pdHRlZCBmb3IgdGhlIFBDTSBzaW5rIGluIHRoZSBNaXhlclRocmVhZAorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgICAgICAgICByZXR1cm4ga0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gc3RhbmRieSBkZWxheSBmb3IgTUlYRVIgYW5kIERVUExJQ0FUSU5HIHBsYXliYWNrIHRocmVhZHMgaXMgcmVhZCBmcm9tIHByb3BlcnR5CiAgICAgLy8gcm8uYXVkaW8uZmxpbmdlcl9zdGFuZGJ5dGltZV9tcyBvciBkZWZhdWx0cyB0byBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcwogICAgIHN0YXRpYyBuc2Vjc190ICAgICAgICAgIG1TdGFuZGJ5VGltZUluTnNlY3M7CkBAIC0zOTQsNiArNDY4LDggQEAKIAogI2luY2x1ZGUgIkVmZmVjdHMuaCIKIAorI2luY2x1ZGUgIlBhdGNoUGFuZWwuaCIKKwogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawogICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgpAQCAtNDI3LDcgKzUwMyw2IEBACiAgICAgcHVibGljOgogICAgICAgICBSZWNvcmRIYW5kbGUoY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+UmVjb3JkSGFuZGxlKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKQEAgLTQ0MywxNSArNTE4LDM5IEBACiAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpjaGVja1BsYXliYWNrVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICAgICAgICAgICAgTWl4ZXJUaHJlYWQgKmNoZWNrTWl4ZXJUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKmNoZWNrUmVjb3JkVGhyZWFkX2woYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpIGNvbnN0OworICAgICAgICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IG9wZW5JbnB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICAgICAgICB2b2lkIGNsb3NlT3V0cHV0RmluaXNoKHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQpOworICAgICAgICAgICAgICB2b2lkIGNsb3NlSW5wdXRGaW5pc2goc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpOworCiAgICAgICAgICAgICAgIC8vIG5vIHJhbmdlIGNoZWNrLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1NdXRlX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGU7IH0KICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIGRvZXNuJ3QgY2hlY2sgcGVyLXRocmVhZCBzdHJlYW0gdm9sdW1lLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgZmxvYXQgc3RyZWFtVm9sdW1lX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZTsgfQotICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMik7CisgICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMik7CiAKLSAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYW4gYXVkaW9faW9faGFuZGxlX3QsIHNlc3Npb24gSUQsIG9yIGVmZmVjdCBJRAorICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgZWZmZWN0IElELCBvciBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCisgICAgICAgICAgICAgIC8vIFRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLCBidXQgdGhlIG5hbWVzcGFjZXMgYXJlIGFjdHVhbGx5IGluZGVwZW5kZW50CisgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIHNlcGFyYXRlIEtleWVkVmVjdG9ycyBmb3IgZWFjaCBraW5kIG9mIElELgorICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHVpbnQzMl90LCBidXQgaXMgY2FzdCB0byBzaWduZWQgZm9yIHNvbWUgSURzLgorICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIEFQSSBkb2VzIG5vdCBoYW5kbGUgcm9sbG92ZXIgdG8gemVybyAoZm9yIHVuc2lnbmVkIElEcyksCisgICAgICAgICAgICAgIC8vICAgICAgIG9yIGZyb20gcG9zaXRpdmUgdG8gbmVnYXRpdmUgKGZvciBzaWduZWQgSURzKS4KKyAgICAgICAgICAgICAgLy8gICAgICAgVGh1cyBpdCBtYXkgZmFpbCBieSByZXR1cm5pbmcgYW4gSUQgb2YgdGhlIHdyb25nIHNpZ24sCisgICAgICAgICAgICAgIC8vICAgICAgIG9yIGJ5IHJldHVybmluZyBhIG5vbi11bmlxdWUgSUQuCiAgICAgICAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogCiAgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQsCkBAIC00NjcsMTAgKzU2NiwyNiBAQAogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlQ2xpZW50X2wocGlkX3QgcGlkKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKTsKLQogICAgICAgICAgICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZWRfbCgpOwogICAgICAgICAgICAgICAgIHZvaWQgb25Ob25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZSgpOwogCisgICAgICAgICAgICAgICAgLy8gU3RvcmUgYW4gZWZmZWN0IGNoYWluIHRvIG1PcnBoYW5FZmZlY3RDaGFpbnMga2V5ZWQgdmVjdG9yLgorICAgICAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgdGhyZWFkIGV4aXRzIGFuZCBlZmZlY3RzIGFyZSBzdGlsbCBhdHRhY2hlZCB0byBpdC4KKyAgICAgICAgICAgICAgICAvLyBJZiBlZmZlY3RzIGFyZSBsYXRlciBjcmVhdGVkIG9uIHRoZSBzYW1lIHNlc3Npb24sIHRoZXkgd2lsbCByZXVzZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgIC8vIGVmZmVjdCBjaGFpbiBhbmQgc2FtZSBpbnN0YW5jZXMgaW4gdGhlIGVmZmVjdCBsaWJyYXJ5LgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBBTFJFQURZX0VYSVNUUyBpZiBhIGNoYWluIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBhbHJlYWR5IGV4aXN0cyBpbgorICAgICAgICAgICAgICAgIC8vIG1PcnBoYW5FZmZlY3RDaGFpbnMuIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgICAgICAgICAvLyBjaGFpbiBmb3IgYSBnaXZlbiBzZXNzaW9uIGFuZCBpdCBpcyBhdHRhY2hlZCB0byBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lLgorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwdXRPcnBoYW5FZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOworICAgICAgICAgICAgICAgIC8vIEdldCBhbiBlZmZlY3QgY2hhaW4gZm9yIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zIGFuZCByZW1vdmUKKyAgICAgICAgICAgICAgICAvLyBpdCBpZiBmb3VuZC4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZCAodGhpcyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSkuCisgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGdldE9ycGhhbkVmZmVjdENoYWluX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSBsYXN0IGVmZmVjdCBoYW5kbGUgb24gYW4gZWZmZWN0IGluc3RhbmNlIGlzIHJlbW92ZWQuIElmIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgYmVsb25ncyB0byBhbiBlZmZlY3QgY2hhaW4gaW4gbU9ycGhhbkVmZmVjdENoYWlucywgdGhlIGNoYWluIGlzIHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVtb3ZlZCBmcm9tIG1PcnBoYW5FZmZlY3RDaGFpbnMgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgZWZmZWN0LgorICAgICAgICAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3Qgd2FzIGZvdW5kIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisKICAgICBjbGFzcyBBdWRpb0h3RGV2aWNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtNDc4LDEwICs1OTMsMTEgQEAKICAgICAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSAgICA9IDB4MiwKICAgICAgICAgfTsKIAotICAgICAgICBBdWRpb0h3RGV2aWNlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCisgICAgICAgIEF1ZGlvSHdEZXZpY2UoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICBGbGFncyBmbGFncykKLSAgICAgICAgICAgIDogbU1vZHVsZU5hbWUoc3RyZHVwKG1vZHVsZU5hbWUpKQorICAgICAgICAgICAgOiBtSGFuZGxlKGhhbmRsZSksIG1Nb2R1bGVOYW1lKHN0cmR1cChtb2R1bGVOYW1lKSkKICAgICAgICAgICAgICwgbUh3RGV2aWNlKGh3RGV2aWNlKQogICAgICAgICAgICAgLCBtRmxhZ3MoZmxhZ3MpIHsgfQogICAgICAgICAvKnZpcnR1YWwqLyB+QXVkaW9Id0RldmljZSgpIHsgZnJlZSgodm9pZCAqKW1Nb2R1bGVOYW1lKTsgfQpAQCAtNDk0LDEyICs2MTAsMTYgQEAKICAgICAgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFKSk7CiAgICAgICAgIH0KIAorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQogICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uOyB9CisKICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbUhhbmRsZTsKICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IG1Nb2R1bGVOYW1lOwogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqIGNvbnN0IG1Id0RldmljZTsKLSAgICAgICAgRmxhZ3MgbUZsYWdzOworICAgICAgICBjb25zdCBGbGFncyBtRmxhZ3M7CiAgICAgfTsKIAogICAgIC8vIEF1ZGlvU3RyZWFtT3V0IGFuZCBBdWRpb1N0cmVhbUluIGFyZSBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCkBAIC01MDksNyArNjI5LDcgQEAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1PdXQgewogICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCBhdWRpb0h3RGV2OwogICAgICAgICBhdWRpb19zdHJlYW1fb3V0X3QqIGNvbnN0IHN0cmVhbTsKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CisgICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwogCiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90KiBod0RldigpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7IH0KIApAQCAtNTM3LDcgKzY1NywxMSBAQAogICAgIH07CiAKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKLQorICAgICAgICAgICAgICAgIC8vIHByb3RlY3RzIG1DbGllbnRzIGFuZCBtTm90aWZpY2F0aW9uQ2xpZW50cy4KKyAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIGxvY2tlZCBhZnRlciBtTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaWYgYm90aCBtdXN0IGJlIGxvY2tlZAorICAgICAgICAgICAgICAgIC8vIGF2b2lkcyBhY3F1aXJpbmcgQXVkaW9GbGluZ2VyOjptTG9jayBmcm9tIGluc2lkZSB0aHJlYWQgbG9vcC4KKyAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50TG9jazsKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUNsaWVudExvY2sKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCB3cDxDbGllbnQ+ID4gICAgIG1DbGllbnRzOyAgIC8vIHNlZSB+Q2xpZW50KCkKIAogICAgICAgICAgICAgICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2s7CkBAIC01ODYsOCArNzEwLDEzIEBACiAKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CiAKKyAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUNsaWVudExvY2sKICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHBpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisKICAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dFVuaXF1ZUlkOyAgLy8gdXBkYXRlZCBieSBhbmRyb2lkX2F0b21pY19pbmMKKyAgICAgICAgICAgICAgICAvLyBuZXh0VW5pcXVlSWQoKSByZXR1cm5zIHVpbnQzMl90LCBidXQgdGhpcyBpcyBkZWNsYXJlZCBpbnQzMl90CisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgYXRvbWljIG9wZXJhdGlvbnMgcmVxdWlyZSBhbiBpbnQzMl90CisKICAgICAgICAgICAgICAgICBhdWRpb19tb2RlX3QgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnROcmVjSXNPZmY7CiAKQEAgLTYwMSwxMiArNzMwLDE3IEBACiAgICAgICAgICAgICAgICAgVmVjdG9yIDwgc3A8U3luY0V2ZW50PiA+IG1QZW5kaW5nU3luY0V2ZW50czsgLy8gc3luYyBldmVudHMgYXdhaXRpbmcgZm9yIGEgc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIGNyZWF0ZWQKIAorICAgICAgICAgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2l0aG91dCBhIHZhbGlkIHRocmVhZAorICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fc2Vzc2lvbl90ICwgc3A8RWZmZWN0Q2hhaW4+ID4gbU9ycGhhbkVmZmVjdENoYWluczsKKwogcHJpdmF0ZToKLSAgICBzcDxDbGllbnQ+ICByZWdpc3RlclBpZF9sKHBpZF90IHBpZCk7ICAgIC8vIGFsd2F5cyByZXR1cm5zIG5vbi0wCisgICAgc3A8Q2xpZW50PiAgcmVnaXN0ZXJQaWQocGlkX3QgcGlkKTsgICAgLy8gYWx3YXlzIHJldHVybnMgbm9uLTAKIAogICAgIC8vIGZvciB1c2UgZnJvbSBkZXN0cnVjdG9yCiAgICAgc3RhdHVzX3QgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgIHZvaWQgICAgICAgIGNsb3NlT3V0cHV0SW50ZXJuYWxfbChzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkKTsKICAgICBzdGF0dXNfdCAgICBjbG9zZUlucHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworICAgIHZvaWQgICAgICAgIGNsb3NlSW5wdXRJbnRlcm5hbF9sKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKTsKIAogI2lmZGVmIFRFRV9TSU5LCiAgICAgLy8gYWxsIHJlY29yZCB0aHJlYWRzIHNlcmlhbGx5IHNoYXJlIGEgY29tbW9uIHRlZSBzaW5rLCB3aGljaCBpcyByZS1jcmVhdGVkIG9uIGZvcm1hdCBjaGFuZ2UKQEAgLTYzNCw3ICs3NjgsNyBAQAogICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgxMDAwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICNlbmRpZgogCiAgICAgLy8gVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIHZhcmlhYmxlIHdpdGhvdXQgbUxvY2ssIGJ1dCB0aGUgdmFyaWFibGUgaXMgdXBkYXRlZCB1bmRlciBtTG9jay4gIFNvCkBAIC02NDcsMTAgKzc4MSwxNyBAQAogICAgIGJvb2wgICAgbUlzTG93UmFtRGV2aWNlOwogICAgIGJvb2wgICAgbUlzRGV2aWNlVHlwZUtub3duOwogICAgIG5zZWNzX3QgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWU7ICAvLyB3aGVuIGEgZ2xvYmFsIGVmZmVjdCB3YXMgbGFzdCBlbmFibGVkCisKKyAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKKworICAgIHVpbnQzMl90ICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsgICAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgcHJpbWFyeSBvdXRwdXQsIG9yIHplcm8gaWYgbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhcmR3YXJlTG9jawogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKK2NvbnN0IGNoYXIgKmZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCBmOTI0MjFlLi5mZDI4ZWExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC0zNCw2NSArMzUsMzQ1IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaD4KICNpbmNsdWRlIDxjb21tb25fdGltZS9jY19oZWxwZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgogCisjaW5jbHVkZSAiQXVkaW9NaXhlck9wcy5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIAorLy8gVGhlIEZDQ18yIG1hY3JvIHJlZmVycyB0byB0aGUgRml4ZWQgQ2hhbm5lbCBDb3VudCBvZiAyIGZvciB0aGUgbGVnYWN5IGludGVnZXIgbWl4ZXIuCisjaWZuZGVmIEZDQ18yCisjZGVmaW5lIEZDQ18yIDIKKyNlbmRpZgorCisvLyBMb29rIGZvciBNT05PX0hBQ0sgZm9yIGFueSBNb25vIGhhY2sgaW52b2x2aW5nIGxlZ2FjeSBtb25vIGNoYW5uZWwgdG8KKy8vIHN0ZXJlbyBjaGFubmVsIGNvbnZlcnNpb24uCisKKy8qIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcgd2lsbCBzaG93IGV4YWN0bHkgd2hpY2ggcHJvY2VzcyBob29rIGFuZCB0cmFjayBob29rIGlzCisgKiBiZWluZyB1c2VkLiBUaGlzIGlzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBsb2cgc3BhbSwgc28gZG9uJ3QgZW5hYmxlIHVubGVzcyB5b3UKKyAqIGFyZSB2ZXJpZnlpbmcgdGhlIGhvb2sgYmFzZWQgY29kZS4KKyAqLworLy8jZGVmaW5lIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorLy9kZWZpbmUgQUxPR1ZWIHByaW50ZiAgLy8gZm9yIHRlc3QtbWl4ZXIuY3BwCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworLy8gU2V0IGtVc2VOZXdNaXhlciB0byB0cnVlIHRvIHVzZSB0aGUgbmV3IG1peGVyIGVuZ2luZS4gT3RoZXJ3aXNlIHRoZQorLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQuICBUaGlzIGlzIGZhbHNlIGZvciBub3cuCitzdGF0aWMgY29uc3QgYm9vbCBrVXNlTmV3TWl4ZXIgPSBmYWxzZTsKKworLy8gU2V0IGtVc2VGbG9hdCB0byB0cnVlIHRvIGFsbG93IGZsb2F0aW5nIGlucHV0IGludG8gdGhlIG1peGVyIGVuZ2luZS4KKy8vIElmIGtVc2VOZXdNaXhlciBpcyBmYWxzZSwgdGhpcyBpcyBpZ25vcmVkIG9yIG1heSBiZSBvdmVycmlkZGVuIGludGVybmFsbHkKKy8vIGJlY2F1c2Ugb2YgZG93bm1peC91cG1peCBzdXBwb3J0Lgorc3RhdGljIGNvbnN0IGJvb2wga1VzZUZsb2F0ID0gdHJ1ZTsKKworLy8gU2V0IHRvIGRlZmF1bHQgY29weSBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgZm9yIGlucHV0IHByb2Nlc3NpbmcuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtDb3B5QnVmZmVyRnJhbWVDb3VudCA9IDI1NjsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSA6IEF1ZGlvQnVmZmVyUHJvdmlkZXIoKSwKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIoTlVMTCksIG1Eb3dubWl4SGFuZGxlKE5VTEwpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAorICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLAorICAgICAgICBtT3V0cHV0RnJhbWVTaXplKG91dHB1dEZyYW1lU2l6ZSksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQoYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1Mb2NhbEJ1ZmZlckRhdGEoTlVMTCksCisgICAgICAgIG1Db25zdW1lZCgwKQoreworICAgIEFMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApKCV6dSwgJXp1LCAlenUpIiwgdGhpcywKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUsIGJ1ZmZlckZyYW1lQ291bnQpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5wdXRGcmFtZVNpemUgPCBvdXRwdXRGcmFtZVNpemUgJiYgYnVmZmVyRnJhbWVDb3VudCA9PSAwLAorICAgICAgICAgICAgIlJlcXVpcmVzIGxvY2FsIGJ1ZmZlciBpZiBpbnB1dEZyYW1lU2l6ZSglenUpIDwgb3V0cHV0RnJhbWVTaXplKCV6dSkiLAorICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQpIHsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Mb2NhbEJ1ZmZlckRhdGEsIDMyLCBtTG9jYWxCdWZmZXJGcmFtZUNvdW50ICogbU91dHB1dEZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0F1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6fkNvcHlCdWZmZXJQcm92aWRlcigpCit7CisgICAgQUxPR1YoIn5Db3B5QnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCBwdHMpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6Z2V0TmV4dEJ1ZmZlciglcCAoJXp1KSwgJWxsZCkiLAorICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBwdHMpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIocEJ1ZmZlciwgcHRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsIHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBwdHMpOworICAgICAgICAvLyBBdCBvbmUgdGltZSBhbiB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIgaGFkCisgICAgICAgIC8vIHJlcyA9PSBPSyBhbmQgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAsIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gbm93IDcvMTgvMjAxNC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnkgQVBJIHNwZWMsIGlmIHJlcyAhPSBPSywgdGhlbiBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMC4KKyAgICAgICAgLy8gYnV0IHRoZXJlIG1heSBiZSBpbXByb3BlciBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAgIEFMT0dfQVNTRVJUKHJlcyA9PSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsgLy8gbm90IG5lZWRlZCBieSBBUEkgc3BlYywgYnV0IHRvIGJlIHNhZmUuCisgICAgICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIG1Db25zdW1lZCA9IDA7CisgICAgfQorICAgIEFMT0dfQVNTRVJUKG1Db25zdW1lZCA8IG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGNvdW50ID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQsIG1CdWZmZXIuZnJhbWVDb3VudCAtIG1Db25zdW1lZCk7CisgICAgY291bnQgPSBtaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OworICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikKK3sKKyAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpyZWxlYXNlQnVmZmVyKCVwKCV6dSkpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBMT0dfQUxXQVlTX0ZBVEFMX0lGKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gMCwgIkludmFsaWQgZnJhbWVjb3VudCIpOworICAgIG1Db25zdW1lZCArPSBwQnVmZmVyLT5mcmFtZUNvdW50OyAvLyBUT0RPOiB1cGRhdGUgZm9yIGVmZmljaWVuY3kgdG8gcmV1c2UgZXhpc3RpbmcgY29udGVudAorICAgIGlmIChtQ29uc3VtZWQgIT0gMCAmJiBtQ29uc3VtZWQgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgIH0KKyAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OkNvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIG1Db25zdW1lZCA9IDA7Cit9CisKK0F1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSAgLy8gc2V0IGJ1ZmZlckZyYW1lQ291bnQgdG8gMCB0byBkbyBpbi1wbGFjZQoreworICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCAldSAlZCkiLAorICAgICAgICAgICAgdGhpcywgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssIGZvcm1hdCwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCk7CisgICAgaWYgKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlCisgICAgICAgICAgICB8fCBFZmZlY3RDcmVhdGUoJnNEd25tRnhEZXNjLnV1aWQsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVELAorICAgICAgICAgICAgICAgICAgICAmbURvd25taXhIYW5kbGUpICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICAvLyBjaGFubmVsIGlucHV0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIHBlci10cmFjaworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGlucHV0Q2hhbm5lbE1hc2s7ICAgLy8gRklYTUU6IFNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrOyAvLyBGSVhNRTogc2hvdWxkIGJlIGJpdHMKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gZm9ybWF0OworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKKyAgICAgLy8gcHJvY2VzcygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBkaXJlY3RseSAoc2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkpCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8CisgICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcubWFzayA9IG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2s7CisKKyAgICAgaW50IGNtZFN0YXR1czsKKyAgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisKKyAgICAgLy8gQ29uZmlndXJlIGRvd25taXhlcgorICAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgLypjbWRDb2RlKi8sIHNpemVvZihlZmZlY3RfY29uZmlnX3QpIC8qY21kU2l6ZSovLAorICAgICAgICAgICAgICZtRG93bm1peENvbmZpZyAvKnBDbWREYXRhKi8sCisgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGNvbmZpZ3VyaW5nIGRvd25taXhlciIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLy8gRW5hYmxlIGRvd25taXhlcgorICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIFNldCBkb3dubWl4IHR5cGUKKyAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQorICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKyAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQorICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOworICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7CisgICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7CisgICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7CisgICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7CisgICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7CisgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9QQVJBTSAvKiBjbWRDb2RlICovLCBkb3dubWl4UGFyYW1TaXplIC8qIGNtZFNpemUgKi8sCisgICAgICAgICAgICAgcGFyYW0gLypwQ21kRGF0YSovLCAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgZnJlZShwYXJhbSk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIHNldHRpbmcgZG93bm1peCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZG93bm1peCB0eXBlIHNldCB0byAlZCIsIChpbnQpIGRvd25taXhUeXBlKTsKIH0KIAogQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6On5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXIgZGVsZXRpbmcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCJ+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOwogICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLAotICAgICAgICBpbnQ2NF90IHB0cykgewotICAgIC8vQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkiKTsKLSAgICBpZiAodGhpcy0+bVRyYWNrQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHBCdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gcEJ1ZmZlci0+cmF3OwotICAgICAgICAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdzsKLSAgICAgICAgICAgIC8vIGluLXBsYWNlIHNvIG92ZXJ3cml0ZSB0aGUgYnVmZmVyIGNvbnRlbnRzLCBoYXMgYmVlbiBzZXQgaW4gcHJlcGFyZVRyYWNrRm9yRG93bm1peCgpCi0gICAgICAgICAgICAvL21Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7Cit2b2lkIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPSBjb25zdF9jYXN0PHZvaWQgKj4oc3JjKTsKKyAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBkc3Q7CisgICAgLy8gbWF5IGJlIGluLXBsYWNlIGlmIHNyYyA9PSBkc3QuCisgICAgc3RhdHVzX3QgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAmbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLCAmbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisgICAgQUxPR0VfSUYocmVzICE9IE9LLCAiRG93bm1peEJ1ZmZlclByb3ZpZGVyIGVycm9yICVkIiwgcmVzKTsKK30KIAotICAgICAgICAgICAgcmVzID0gKCptRG93bm1peEhhbmRsZSktPnByb2Nlc3MobURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICZtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIsICZtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyKTsKLSAgICAgICAgICAgIC8vQUxPR1YoImdldE5leHRCdWZmZXIgaXMgZG93bm1peGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKCkgZXJyb3I6IE5VTEwgdHJhY2sgYnVmZmVyIHByb3ZpZGVyIik7CisvKiBjYWxsIG9uY2UgaW4gYSBwdGhyZWFkX29uY2UgaGFuZGxlci4gKi8KKy8qc3RhdGljKi8gc3RhdHVzX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmluaXQoKQoreworICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAorICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotfQorICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7CiAKLXZvaWQgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKSB7Ci0gICAgLy9BTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoKSIpOwotICAgIGlmICh0aGlzLT5tVHJhY2tCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigpIGVycm9yOiBOVUxMIHRyYWNrIGJ1ZmZlciBwcm92aWRlciIpOworICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgeworICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJnNEd25tRnhEZXNjKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIHNEd25tRnhEZXNjLm5hbWUpOworICAgICAgICAgICAgaWYgKG1lbWNtcCgmc0R3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzRHdubUZ4RGVzYy5uYW1lLCBzRHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7CisgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisgICAgQUxPR1dfSUYoIXNJc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOworICAgIHJldHVybiBOT19JTklUOwogfQogCisvKnN0YXRpYyovIGJvb2wgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNJc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKKy8qc3RhdGljKi8gZWZmZWN0X2Rlc2NyaXB0b3JfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0R3bm1GeERlc2M7CisKK0F1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1TYW1wbGVTaXplKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1JbnB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSksCisgICAgICAgIG1PdXRwdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spKQoreworICAgIEFMT0dWKCJSZW1peEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4KSAlenUgJXp1IiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICBtSW5wdXRDaGFubmVscywgbU91dHB1dENoYW5uZWxzKTsKKyAgICAvLyBUT0RPOiBjb25zaWRlciBjaGFubmVsIHJlcHJlc2VudGF0aW9uIGluIGluZGV4IGFycmF5IGZvcm11bGF0aW9uCisgICAgLy8gV2UgaWdub3JlIGNoYW5uZWwgcmVwcmVzZW50YXRpb24sIGFuZCBqdXN0IHVzZSB0aGUgYml0cy4KKyAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXlfaW5pdGlhbGl6YXRpb24obUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoaW5wdXRDaGFubmVsTWFzaykpOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgc3JjLCBtSW5wdXRDaGFubmVscywgbUlkeEFyeSwgbVNhbXBsZVNpemUsIGZyYW1lcyk7Cit9CisKK0F1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG91dHB1dEZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGlucHV0Rm9ybWF0KSwKKyAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShvdXRwdXRGb3JtYXQpLAorICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1DaGFubmVscyhjaGFubmVscyksCisgICAgICAgIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCisgICAgICAgIG1PdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KQoreworICAgIEFMT0dWKCJSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKCVwKSglZCwgJSN4LCAlI3gpIiwgdGhpcywgY2hhbm5lbHMsIGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1PdXRwdXRGb3JtYXQsIHNyYywgbUlucHV0Rm9ybWF0LCBmcmFtZXMgKiBtQ2hhbm5lbHMpOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ib29sIEF1ZGlvTWl4ZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSA9IGZhbHNlOwotCi1lZmZlY3RfZGVzY3JpcHRvcl90IEF1ZGlvTWl4ZXI6OmR3bm1GeERlc2M7CiAKIC8vIEVuc3VyZSBtQ29uZmlndXJlZE5hbWVzIGJpdG1hc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkgb24gYWxsIGFyY2hpdGVjdHVyZXMuCiAvLyBUaGUgdmFsdWUgb2YgMSA8PCB4IGlzIHVuZGVmaW5lZCBpbiBDIHdoZW4geCA+PSAzMi4KQEAgLTEwMSwyMCArMzgyLDEyIEBACiAgICAgOiAgIG1UcmFja05hbWVzKDApLCBtQ29uZmlndXJlZE5hbWVzKChtYXhOdW1UcmFja3MgPj0gMzIgPyAwIDogMSA8PCBtYXhOdW1UcmFja3MpIC0gMSksCiAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCiB7Ci0gICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBiZXlvbmQgc3RlcmVvCi0gICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRSgyID09IE1BWF9OVU1fQ0hBTk5FTFMpOwotCiAgICAgQUxPR19BU1NFUlQobWF4TnVtVHJhY2tzIDw9IE1BWF9OVU1fVFJBQ0tTLCAibWF4TnVtVHJhY2tzICV1ID4gTUFYX05VTV9UUkFDS1MgJXUiLAogICAgICAgICAgICAgbWF4TnVtVHJhY2tzLCBNQVhfTlVNX1RSQUNLUyk7CiAKICAgICAvLyBBdWRpb01peGVyIGlzIG5vdCB5ZXQgY2FwYWJsZSBvZiBtb3JlIHRoYW4gMzIgYWN0aXZlIHRyYWNrIGlucHV0cwogICAgIEFMT0dfQVNTRVJUKDMyID49IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIE1BWF9OVU1fVFJBQ0tTICVkIiwgTUFYX05VTV9UUkFDS1MpOwogCi0gICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbXVsdGktY2hhbm5lbCBvdXRwdXQgYmV5b25kIHN0ZXJlbwotICAgIEFMT0dfQVNTRVJUKDIgPT0gTUFYX05VTV9DSEFOTkVMUywgImJhZCBNQVhfTlVNX0NIQU5ORUxTICVkIiwgTUFYX05VTV9DSEFOTkVMUyk7Ci0KLSAgICBMb2NhbENsb2NrIGxjOwotCiAgICAgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZzSW5pdFJvdXRpbmUpOwogCiAgICAgbVN0YXRlLmVuYWJsZWRUcmFja3M9IDA7CkBAIC0xMzMsMzAgKzQwNiwxMCBAQAogICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IE1BWF9OVU1fVFJBQ0tTIDsgaSsrKSB7CiAgICAgICAgIHQtPnJlc2FtcGxlciA9IE5VTEw7CiAgICAgICAgIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0Kys7CiAgICAgfQogCi0gICAgLy8gZmluZCBtdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgaWYgd2UgaGF2ZSB0byBwbGF5IG11bHRpY2hhbm5lbCBjb250ZW50Ci0gICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgaW50IHJldCA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb01peGVyKCkgZXJyb3IgJWQgcXVlcnlpbmcgbnVtYmVyIG9mIGVmZmVjdHMiLCByZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKLSAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZkd25tRnhEZXNjKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIGR3bm1GeERlc2MubmFtZSk7Ci0gICAgICAgICAgICBpZiAobWVtY21wKCZkd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZHdubUZ4RGVzYy5uYW1lLCBkd25tRnhEZXNjLmltcGxlbWVudG9yKTsKLSAgICAgICAgICAgICAgICBpc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dFX0lGKCFpc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOwogfQogCiBBdWRpb01peGVyOjp+QXVkaW9NaXhlcigpCkBAIC0xNjUsNiArNDE4LDcgQEAKICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewogICAgICAgICBkZWxldGUgdC0+cmVzYW1wbGVyOwogICAgICAgICBkZWxldGUgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGRlbGV0ZSB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKICAgICAgICAgdCsrOwogICAgIH0KICAgICBkZWxldGUgW10gbVN0YXRlLm91dHB1dFRlbXA7CkBAIC0xNzYsMzIgKzQzMCw1MiBAQAogICAgIG1TdGF0ZS5tTG9nID0gbG9nOwogfQogCi1pbnQgQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKQoraW50IEF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKQogeworICAgIGlmICghaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGZvcm1hdCAoJSN4KSIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgdWludDMyX3QgbmFtZXMgPSAofm1UcmFja05hbWVzKSAmIG1Db25maWd1cmVkTmFtZXM7CiAgICAgaWYgKG5hbWVzICE9IDApIHsKICAgICAgICAgaW50IG4gPSBfX2J1aWx0aW5fY3R6KG5hbWVzKTsKICAgICAgICAgQUxPR1YoImFkZCB0cmFjayAoJWQpIiwgbik7Ci0gICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKICAgICAgICAgLy8gYXNzdW1lIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgdGhlIHRyYWNrLCBleGNlcHQgd2hlcmUgbm90ZWQgYmVsb3cKICAgICAgICAgdHJhY2tfdCogdCA9ICZtU3RhdGUudHJhY2tzW25dOwogICAgICAgICB0LT5uZWVkcyA9IDA7Ci0gICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU47Ci0gICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU47Ci0gICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAotICAgICAgICAvLyB0LT5wcmV2Vm9sdW1lWzBdCi0gICAgICAgIC8vIHQtPnByZXZWb2x1bWVbMV0KKworICAgICAgICAvLyBJbnRlZ2VyIHZvbHVtZS4KKyAgICAgICAgLy8gQ3VycmVudGx5IGludGVnZXIgdm9sdW1lIGlzIGtlcHQgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KKyAgICAgICAgLy8gV2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlciBwYXRoIGlzIHJlbW92ZWQuCisgICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UOworICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVDsKKyAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OworICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7CiAgICAgICAgIHQtPnZvbHVtZUluY1swXSA9IDA7CiAgICAgICAgIHQtPnZvbHVtZUluY1sxXSA9IDA7CiAgICAgICAgIHQtPmF1eExldmVsID0gMDsKICAgICAgICAgdC0+YXV4SW5jID0gMDsKKyAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKKworICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCisgICAgICAgIHQtPm1Wb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tVm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1Wb2x1bWVJbmNbMF0gPSAwLjsKKyAgICAgICAgdC0+bVZvbHVtZUluY1sxXSA9IDAuOworICAgICAgICB0LT5tQXV4TGV2ZWwgPSAwLjsKKyAgICAgICAgdC0+bUF1eEluYyA9IDAuOworICAgICAgICB0LT5tUHJldkF1eExldmVsID0gMC47CisKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCi0gICAgICAgIC8vIHQtPnByZXZBdXhMZXZlbAogICAgICAgICAvLyB0LT5mcmFtZUNvdW50Ci0gICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CisgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgIHQtPmVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgdC0+Zm9ybWF0ID0gMTY7Ci0gICAgICAgIHQtPmNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7CisgICAgICAgIHQtPmNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgIHQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICAgICAgLy8gc2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciAqKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCiAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKQEAgLTIxNSw1MiArNDg5LDExNiBAQAogICAgICAgICAvLyBzZXRQYXJhbWV0ZXIobmFtZSwgVFJBQ0ssIE1BSU5fQlVGRkVSLCBtaXhCdWZmZXIpIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKICAgICAgICAgdC0+bWFpbkJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHQtPmF1eEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHQtPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuXSwgbiwgY2hhbm5lbE1hc2spOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJBQ0swICsgbjsKKyAgICAgICAgdC0+bU1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHQtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlcgorICAgICAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tTWl4ZXJDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KHQsIG4pOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgY2hhbm5lbE1hc2sgKCUjeCkiLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSgweCV4KSBmYWlsZWQsIGVycm9yIHByZXBhcmluZyB0cmFjayBmb3IgZG93bm1peCIsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2spOworICAgICAgICAvLyBpbml0VHJhY2tEb3dubWl4KCkgbWF5IGNoYW5nZSB0aGUgaW5wdXQgZm9ybWF0IHJlcXVpcmVtZW50LgorICAgICAgICAvLyBJZiB5b3UgZGVzaXJlIGZsb2F0aW5nIHBvaW50IGlucHV0IHRvIHRoZSBtaXhlciwgaXQgbWF5IGNoYW5nZQorICAgICAgICAvLyB0byBpbnRlZ2VyIGJlY2F1c2UgdGhlIGRvd25taXhlciByZXF1aXJlcyBpbnRlZ2VyIHRvIHByb2Nlc3MuCisgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKKyAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodCwgbik7CisgICAgICAgIG1UcmFja05hbWVzIHw9IDEgPDwgbjsKKyAgICAgICAgcmV0dXJuIFRSQUNLMCArIG47CiAgICAgfQorICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgb3V0IG9mIGF2YWlsYWJsZSB0cmFja3MiKTsKICAgICByZXR1cm4gLTE7CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6aW52YWxpZGF0ZVN0YXRlKHVpbnQzMl90IG1hc2spCiB7Ci0gICAgaWYgKG1hc2spIHsKKyAgICBpZiAobWFzayAhPSAwKSB7CiAgICAgICAgIG1TdGF0ZS5uZWVkc0NoYW5nZWQgfD0gbWFzazsKICAgICAgICAgbVN0YXRlLmhvb2sgPSBwcm9jZXNzX192YWxpZGF0ZTsKICAgICB9CiAgfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjppbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtLCBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrKQotewotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1hc2spOwotICAgIEFMT0dfQVNTRVJUKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKSAmJiBjaGFubmVsQ291bnQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIGlmIChjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgIHBUcmFjay0+Y2hhbm5lbE1hc2sgPSBtYXNrOwotICAgICAgICBwVHJhY2stPmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLSAgICAgICAgQUxPR1YoImluaXRUcmFja0Rvd25taXgodHJhY2s9JWQsIG1hc2s9MHgleCkgY2FsbHMgcHJlcGFyZVRyYWNrRm9yRG93bm1peCgpIiwKLSAgICAgICAgICAgICAgICB0cmFja051bSwgbWFzayk7Ci0gICAgICAgIHN0YXR1cyA9IHByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja051bSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOdW0pOworLy8gQ2FsbGVkIHdoZW4gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQgZm9yIGEgdHJhY2sgbmFtZQorLy8gVE9ETzogRml4IERvd25taXhidWZmZXJwcm9maWRlciBub3QgdG8gKHBvc3NpYmx5KSBjaGFuZ2UgbWl4ZXIgaW5wdXQgZm9ybWF0LAorLy8gd2hpY2ggd2lsbCBzaW1wbGlmeSB0aGlzIGxvZ2ljLgorYm9vbCBBdWRpb01peGVyOjpzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spIHsKKyAgICB0cmFja190ICZ0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CisKKyAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay5jaGFubmVsTWFzaworICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay5tTWl4ZXJDaGFubmVsTWFzaykgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQogICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgorICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IGJvb2wgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkID0gdHJhY2subU1peGVyQ2hhbm5lbENvdW50ICE9IG1peGVyQ2hhbm5lbENvdW50OworCisgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKKyAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxDb3VudCk7CisgICAgdHJhY2suY2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOworICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OworICAgIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKKyAgICB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKworICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KKyAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldk1peGVySW5Gb3JtYXQgPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKKyAgICB0cmFjay5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKKyAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywKKyAgICAgICAgICAgICJpbml0VHJhY2tEb3dubWl4IGVycm9yICVkLCB0cmFjayBjaGFubmVsIG1hc2sgJSN4LCBtaXhlciBjaGFubmVsIG1hc2sgJSN4IiwKKyAgICAgICAgICAgIHN0YXR1cywgdHJhY2suY2hhbm5lbE1hc2ssIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKTsKKworICAgIGNvbnN0IGJvb2wgbWl4ZXJJbkZvcm1hdENoYW5nZWQgPSBwcmV2TWl4ZXJJbkZvcm1hdCAhPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKKyAgICBpZiAobWl4ZXJJbkZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsgLy8gYmVjYXVzZSBvZiBkb3dubWl4ZXIsIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQorICAgIH0KKworICAgIGlmICh0cmFjay5yZXNhbXBsZXIgJiYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkIHx8IG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCkpIHsKKyAgICAgICAgLy8gcmVzYW1wbGVyIGlucHV0IGZvcm1hdCBvciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgorICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLnNhbXBsZVJhdGU7CisgICAgICAgIGRlbGV0ZSB0cmFjay5yZXNhbXBsZXI7CisgICAgICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CisgICAgICAgIHRyYWNrLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsgLy8gd2l0aG91dCByZXNhbXBsZXIsIHRyYWNrIHJhdGUgaXMgZGV2aWNlIHNhbXBsZSByYXRlLgorICAgICAgICAvLyByZWNyZWF0ZSB0aGUgcmVzYW1wbGVyIHdpdGggdXBkYXRlZCBmb3JtYXQsIGNoYW5uZWxzLCBzYXZlZCBzYW1wbGVSYXRlLgorICAgICAgICB0cmFjay5zZXRSZXNhbXBsZXIocmVzZXRUb1NhbXBsZVJhdGUgLyp0cmFja1NhbXBsZVJhdGUqLywgbVNhbXBsZVJhdGUgLypkZXZTYW1wbGVSYXRlKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKSB7CitzdGF0dXNfdCBBdWRpb01peGVyOjppbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3sKKyAgICAvLyBPbmx5IHJlbWl4ICh1cG1peCBvciBkb3dubWl4KSBpZiB0aGUgdHJhY2sgYW5kIG1peGVyL2RldmljZSBjaGFubmVsIG1hc2tzCisgICAgLy8gYXJlIG5vdCB0aGUgc2FtZSBhbmQgbm90IGhhbmRsZWQgaW50ZXJuYWxseSwgYXMgbW9ubyAtPiBzdGVyZW8gY3VycmVudGx5IGlzLgorICAgIGlmIChwVHJhY2stPmNoYW5uZWxNYXNrICE9IHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmICEocFRyYWNrLT5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICYmIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgeworICAgICAgICByZXR1cm4gcHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgfQorICAgIC8vIG5vIHJlbWl4IG5lY2Vzc2FyeQorICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSIsIHRyYWNrTmFtZSk7CiAKICAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoaXMgdHJhY2sgaGFkIHByZXZpb3VzbHkgYmVlbiBjb25maWd1cmVkIHdpdGggYSBkb3dubWl4ZXIsIGRlbGV0ZSBpdAogICAgICAgICBBTE9HVigiIGRlbGV0aW5nIG9sZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyOwogICAgICAgICBkZWxldGUgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKICAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiBub3RoaW5nIHRvIGRvLCBubyBkb3dubWl4ZXIgdG8gZGVsZXRlIik7CiAgICAgfQpAQCAtMjcyLDEwMSArNjEwLDY2IEBACiAKICAgICAvLyBkaXNjYXJkIHRoZSBwcmV2aW91cyBkb3dubWl4ZXIgaWYgdGhlcmUgd2FzIG9uZQogICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTmFtZSk7CisgICAgaWYgKERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgeworICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsIG5vdyBvbmx5IFBDTSAxNiAqLywKKyAgICAgICAgICAgICAgICBwVHJhY2stPnNhbXBsZVJhdGUsIHBUcmFjay0+c2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwogCi0gICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKLSAgICBpbnQzMl90IHN0YXR1czsKLQotICAgIGlmICghaXNNdWx0aWNoYW5uZWxDYXBhYmxlKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSBmYWlsczogbWl4ZXIgZG9lc24ndCBzdXBwb3J0IG11bHRpY2hhbm5lbCBjb250ZW50IiwKLSAgICAgICAgICAgICAgICB0cmFja05hbWUpOwotICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOworICAgICAgICBpZiAocERicC0+aXNWYWxpZCgpKSB7IC8vIGlmIGNvbnN0cnVjdG9yIGNvbXBsZXRlZCBwcm9wZXJseQorICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4CisgICAgICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKKyAgICAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHBEYnA7CiAgICAgfQogCi0gICAgaWYgKEVmZmVjdENyZWF0ZSgmZHdubUZ4RGVzYy51dWlkLAotICAgICAgICAgICAgcFRyYWNrLT5zZXNzaW9uSWQgLypzZXNzaW9uSWQqLywgLTIgLyppb0lkIG5vdCByZWxldmFudCBoZXJlLCB1c2luZyByYW5kb20gdmFsdWUqLywKLSAgICAgICAgICAgICZwRGJwLT5tRG93bm1peEhhbmRsZS8qcEhhbmRsZSovKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCVkKSBmYWlsczogZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyIGVmZmVjdCIsIHRyYWNrTmFtZSk7Ci0gICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7Ci0gICAgfQotCi0gICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBUcmFjay0+Y2hhbm5lbE1hc2s7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBwVHJhY2stPnNhbXBsZVJhdGU7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBUcmFjay0+c2FtcGxlUmF0ZTsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOwotICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHByb3ZpZGVyLCBhbmQgZnJhbWUgY291bnQgd2lsbCBub3QgYmUgdXNlZCBhcyB0aGUgZG93bm1peCBlZmZlY3QKLSAgICAvLyBwcm9jZXNzKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IChzZWUgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSkKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAotICAgICAgICAgICAgRUZGRUNUX0NPTkZJR19GT1JNQVQgfCBFRkZFQ1RfQ09ORklHX0FDQ19NT0RFOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5tYXNrID0gcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcubWFzazsKLQotICAgIHsvLyBzY29wZSBmb3IgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIGdvdG8gbGFiZWwgIm5vRG93bm1peEZvckFjdGl2ZVRyYWNrIgotICAgICAgICBpbnQgY21kU3RhdHVzOwotICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLQotICAgICAgICAvLyBDb25maWd1cmUgYW5kIGVuYWJsZSBkb3dubWl4ZXIKLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKLSAgICAgICAgICAgICAgICAmcERicC0+bURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICAgICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgICAgIGlmICgoc3RhdHVzICE9IDApIHx8IChjbWRTdGF0dXMgIT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfQotICAgICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9FTkFCTEUgLypjbWRDb2RlKi8sIDAgLypjbWRTaXplKi8sIE5VTEwgLypwQ21kRGF0YSovLAotICAgICAgICAgICAgICAgICZyZXBseVNpemUgLypyZXBseVNpemUqLywgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgICAgIGlmICgoc3RhdHVzICE9IDApIHx8IChjbWRTdGF0dXMgIT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCB3aGlsZSBlbmFibGluZyBkb3dubWl4ZXIgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBkb3dubWl4IHR5cGUKLSAgICAgICAgLy8gcGFyYW1ldGVyIHNpemUgcm91bmRlZCBmb3IgcGFkZGluZyBvbiAzMmJpdCBib3VuZGFyeQotICAgICAgICBjb25zdCBpbnQgcHNpemVQYWRkZWQgPSAoKHNpemVvZihkb3dubWl4X3BhcmFtc190KSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKLSAgICAgICAgY29uc3QgaW50IGRvd25taXhQYXJhbVNpemUgPQotICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZVBhZGRlZCArIHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKikgbWFsbG9jKGRvd25taXhQYXJhbVNpemUpOwotICAgICAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoZG93bm1peF9wYXJhbXNfdCk7Ci0gICAgICAgIGNvbnN0IGRvd25taXhfcGFyYW1zX3QgZG93bm1peFBhcmFtID0gRE9XTk1JWF9QQVJBTV9UWVBFOwotICAgICAgICBtZW1jcHkocGFyYW0tPmRhdGEsICZkb3dubWl4UGFyYW0sIHBhcmFtLT5wc2l6ZSk7Ci0gICAgICAgIGNvbnN0IGRvd25taXhfdHlwZV90IGRvd25taXhUeXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7Ci0gICAgICAgIHBhcmFtLT52c2l6ZSA9IHNpemVvZihkb3dubWl4X3R5cGVfdCk7Ci0gICAgICAgIG1lbWNweShwYXJhbS0+ZGF0YSArIHBzaXplUGFkZGVkLCAmZG93bm1peFR5cGUsIHBhcmFtLT52c2l6ZSk7Ci0KLSAgICAgICAgc3RhdHVzID0gKCpwRGJwLT5tRG93bm1peEhhbmRsZSktPmNvbW1hbmQocERicC0+bURvd25taXhIYW5kbGUsCi0gICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZS8qIGNtZFNpemUgKi8sCi0gICAgICAgICAgICAgICAgcGFyYW0gLypwQ21uZERhdGEqLywgJnJlcGx5U2l6ZSAvKnJlcGx5U2l6ZSovLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLQotICAgICAgICBmcmVlKHBhcmFtKTsKLQotICAgICAgICBpZiAoKHN0YXR1cyAhPSAwKSB8fCAoY21kU3RhdHVzICE9IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgd2hpbGUgc2V0dGluZyBkb3dubWl4IHR5cGUgZm9yIHRyYWNrICVkIiwgc3RhdHVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkb3dubWl4IHR5cGUgc2V0IHRvICVkIGZvciB0cmFjayAlZCIsIChpbnQpIGRvd25taXhUeXBlLCB0cmFja05hbWUpOwotICAgICAgICB9Ci0gICAgfS8vIGVuZCBvZiBzY29wZSBmb3IgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIGdvdG8gbGFiZWwgIm5vRG93bm1peEZvckFjdGl2ZVRyYWNrIgotCi0gICAgLy8gaW5pdGlhbGl6YXRpb24gc3VjY2Vzc2Z1bDoKLSAgICAvLyAtIGtlZXAgdHJhY2sgb2YgdGhlIHJlYWwgYnVmZmVyIHByb3ZpZGVyIGluIGNhc2UgaXQgd2FzIHNldCBiZWZvcmUKLSAgICBwRGJwLT5tVHJhY2tCdWZmZXJQcm92aWRlciA9IHBUcmFjay0+YnVmZmVyUHJvdmlkZXI7Ci0gICAgLy8gLSB3ZSdsbCB1c2UgdGhlIGRvd25taXggZWZmZWN0IGludGVncmF0ZWQgaW5zaWRlIHRoaXMKLSAgICAvLyAgICB0cmFjaydzIGJ1ZmZlciBwcm92aWRlciwgYW5kIHdlJ2xsIHVzZSBpdCBhcyB0aGUgdHJhY2sncyBidWZmZXIgcHJvdmlkZXIKLSAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gcERicDsKLSAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcERicDsKLQorICAgIC8vIEVmZmVjdCBkb3dubWl4ZXIgZG9lcyBub3QgYWNjZXB0IHRoZSBjaGFubmVsIGNvbnZlcnNpb24uICBMZXQncyB1c2Ugb3VyIHJlbWl4ZXIuCisgICAgUmVtaXhCdWZmZXJQcm92aWRlciogcFJicCA9IG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+Y2hhbm5lbE1hc2ssCisgICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLCBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgIC8vIFJlbWl4IGFsd2F5cyBmaW5kcyBhIGNvbnZlcnNpb24gd2hlcmVhcyBEb3dubWl4ZXIgZWZmZWN0IGFib3ZlIG1heSBmYWlsLgorICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwUmJwOworICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCi1ub0Rvd25taXhGb3JBY3RpdmVUcmFjazoKLSAgICBkZWxldGUgcERicDsKLSAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICByZXR1cm4gTk9fSU5JVDsKK3ZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkiLCB0cmFja05hbWUpOworICAgIGlmIChwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkgd2l0aCBmb3JtYXQgJSN4IiwgdHJhY2tOYW1lLCBwVHJhY2stPm1Gb3JtYXQpOworICAgIC8vIGRpc2NhcmQgdGhlIHByZXZpb3VzIHJlZm9ybWF0dGVyIGlmIHRoZXJlIHdhcyBvbmUKKyAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHBUcmFjaywgdHJhY2tOYW1lKTsKKyAgICAvLyBvbmx5IGNvbmZpZ3VyZSByZWZvcm1hdHRlciBpZiBuZWVkZWQKKyAgICBpZiAocFRyYWNrLT5tRm9ybWF0ICE9IHBUcmFjay0+bU1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwVHJhY2stPmNoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBwVHJhY2stPm1Gb3JtYXQsIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjaykKK3sKKyAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAocFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgfQorICAgIGlmIChwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+YnVmZmVyUHJvdmlkZXIpOworICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9NaXhlcjo6ZGVsZXRlVHJhY2tOYW1lKGludCBuYW1lKQpAQCAtMzg1LDYgKzY4OCw4IEBACiAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKICAgICAvLyBkZWxldGUgdGhlIGRvd25taXhlcgogICAgIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CisgICAgLy8gZGVsZXRlIHRoZSByZWZvcm1hdHRlcgorICAgIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOwogCiAgICAgbVRyYWNrTmFtZXMgJj0gfigxPDxuYW1lKTsKIH0KQEAgLTQxNSw2ICs3MjAsNzMgQEAKICAgICB9CiB9CiAKKy8qIFNldHMgdGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBmb3IgdGhlIEF1ZGlvTWl4ZXIuCisgKgorICogVGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBhcmUgdXNlZCB0byB0cmFuc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzCisgKiB2b2x1bWUgdG8gdGhlIHNldCB2b2x1bWUuICByYW1wIGNvbnRyb2xzIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4KKyAqIEl0cyB2YWx1ZSBpcyB0eXBpY2FsbHkgb25lIHN0YXRlIGZyYW1lY291bnQgcGVyaW9kLCBidXQgbWF5IGFsc28gYmUgMCwKKyAqIG1lYW5pbmcgImltbWVkaWF0ZS4iCisgKgorICogRklYTUU6IDEpIFZvbHVtZSByYW1wIGlzIGVuYWJsZWQgb25seSBpZiB0aGVyZSBpcyBhIG5vbnplcm8gaW50ZWdlciBpbmNyZW1lbnQKKyAqIGV2ZW4gaWYgdGhlcmUgaXMgYSBub256ZXJvIGZsb2F0aW5nIHBvaW50IGluY3JlbWVudCAoaW4gdGhhdCBjYXNlLCB0aGUgdm9sdW1lCisgKiBjaGFuZ2UgaXMgaW1tZWRpYXRlKS4gIFRoaXMgcmVzdHJpY3Rpb24gc2hvdWxkIGJlIGNoYW5nZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyCisgKiBpcyByZW1vdmVkIChzZWUgIzIpLgorICogRklYTUU6IDIpIEludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyBhcmUgdXNlZCBmb3IgTGVnYWN5IG1peGluZyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQKKyAqIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gbmV3Vm9sdW1lIHNldCB2b2x1bWUgdGFyZ2V0IGluIGZsb2F0aW5nIHBvaW50IFswLjAsIDEuMF0uCisgKiBAcGFyYW0gcmFtcCBudW1iZXIgb2YgZnJhbWVzIHRvIGluY3JlbWVudCBvdmVyLiBpZiByYW1wIGlzIDAsIHRoZSB2b2x1bWUKKyAqIHNob3VsZCBiZSBzZXQgaW1tZWRpYXRlbHkuICBDdXJyZW50bHkgcmFtcCBzaG91bGQgbm90IGV4Y2VlZCA2NTUzNSAoZnJhbWVzKS4KKyAqIEBwYXJhbSBwSW50U2V0Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIFU0LjEyIGludGVnZXIgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50UHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBVNC4yOCBpbnRlZ2VyIHByZXZpb3VzIHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50Vm9sdW1lSW5jIHBvaW50ZXIgdG8gdGhlIFU0LjI4IGluY3JlbWVudCBwZXIgb3V0cHV0IGF1ZGlvIGZyYW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBTZXRWb2x1bWUgcG9pbnRlciB0byB0aGUgZmxvYXQgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwUHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBmbG9hdCBwcmV2aW91cyB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFZvbHVtZUluYyBwb2ludGVyIHRvIHRoZSBmbG9hdCBpbmNyZW1lbnQgcGVyIG91dHB1dCBhdWRpbyBmcmFtZSwgc2V0IG9uIHJldHVybi4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdm9sdW1lIGhhcyBjaGFuZ2VkLCBmYWxzZSBpZiB2b2x1bWUgaXMgc2FtZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoZmxvYXQgbmV3Vm9sdW1lLCBpbnQzMl90IHJhbXAsCisgICAgICAgIGludDE2X3QgKnBJbnRTZXRWb2x1bWUsIGludDMyX3QgKnBJbnRQcmV2Vm9sdW1lLCBpbnQzMl90ICpwSW50Vm9sdW1lSW5jLAorICAgICAgICBmbG9hdCAqcFNldFZvbHVtZSwgZmxvYXQgKnBQcmV2Vm9sdW1lLCBmbG9hdCAqcFZvbHVtZUluYykgeworICAgIGlmIChuZXdWb2x1bWUgPT0gKnBTZXRWb2x1bWUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKiBzZXQgdGhlIGZsb2F0aW5nIHBvaW50IHZvbHVtZSB2YXJpYWJsZXMgKi8KKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgICpwVm9sdW1lSW5jID0gKG5ld1ZvbHVtZSAtICpwU2V0Vm9sdW1lKSAvIHJhbXA7CisgICAgICAgICpwUHJldlZvbHVtZSA9ICpwU2V0Vm9sdW1lOworICAgIH0gZWxzZSB7CisgICAgICAgICpwVm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOworICAgIH0KKyAgICAqcFNldFZvbHVtZSA9IG5ld1ZvbHVtZTsKKworICAgIC8qIHNldCB0aGUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyAqLworICAgIGludDMyX3QgaW50Vm9sdW1lID0gbmV3Vm9sdW1lICogQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7CisgICAgaWYgKGludFZvbHVtZSA+IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UKSB7CisgICAgICAgIGludFZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOworICAgIH0gZWxzZSBpZiAoaW50Vm9sdW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdm9sdW1lICUuN2ciLCBuZXdWb2x1bWUpOworICAgICAgICBpbnRWb2x1bWUgPSAwOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZm9yIHNhZmV0eSBjaGVjay4KKyAgICB9CisgICAgaWYgKGludFZvbHVtZSA9PSAqcEludFNldFZvbHVtZSkgeworICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7CisgICAgICAgIC8qIFRPRE86IGludGVnZXIvZmxvYXQgd29ya2Fyb3VuZDogaWdub3JlIGZsb2F0aW5nIHZvbHVtZSByYW1wICovCisgICAgICAgICpwVm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAqcEludFZvbHVtZUluYyA9ICgoaW50Vm9sdW1lIC0gKnBJbnRTZXRWb2x1bWUpIDw8IDE2KSAvIHJhbXA7CisgICAgICAgICpwSW50UHJldlZvbHVtZSA9ICgqcEludFZvbHVtZUluYyA9PSAwID8gaW50Vm9sdW1lIDogKnBJbnRTZXRWb2x1bWUpIDw8IDE2OworICAgIH0gZWxzZSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gaW50Vm9sdW1lIDw8IDE2OworICAgIH0KKyAgICAqcEludFNldFZvbHVtZSA9IGludFZvbHVtZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBBdWRpb01peGVyOjpzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB0YXJnZXQsIGludCBwYXJhbSwgdm9pZCAqdmFsdWUpCiB7CiAgICAgbmFtZSAtPSBUUkFDSzA7CkBAIC00MjksMTYgKzgwMSwxMCBAQAogICAgIGNhc2UgVFJBQ0s6CiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odmFsdWUpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay5jaGFubmVsTWFzayAhPSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGNoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpICYmIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbE1hc2sgPSBtYXNrOwotICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICAvLyB0aGUgbWFzayBoYXMgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/Ci0gICAgICAgICAgICAgICAgaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSwgbWFzayk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCBtYXNrKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtNDU2LDE1ICs4MjIsMzcgQEAKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPUk1BVDoKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZPUk1BVDogeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay5tRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdHJhY2subUZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBGT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAvLyBGSVhNRSBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgc2V0dGluZyB0aGUgZG93bm1peCB0eXBlIGZyb20gQXVkaW9GbGluZ2VyPwogICAgICAgICAvLyAgICAgICAgIGZvciBhIHNwZWNpZmljIHRyYWNrPyBvciBwZXIgbWl4ZXI/CiAgICAgICAgIC8qIGNhc2UgRE9XTk1JWF9UWVBFOgogICAgICAgICAgICAgYnJlYWsgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBNSVhFUl9GT1JNQVQ6IHsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAodHJhY2subU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIHRyYWNrLm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBNSVhFUl9DSEFOTkVMX01BU0s6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRyYWNrOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTQ4OSw4NSArODc3LDc3IEBACiAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBSQU1QX1ZPTFVNRToKICAgICBjYXNlIFZPTFVNRToKICAgICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICBjYXNlIFZPTFVNRTA6Ci0gICAgICAgIGNhc2UgVk9MVU1FMToKLSAgICAgICAgICAgIGlmICh0cmFjay52b2x1bWVbcGFyYW0tVk9MVU1FMF0gIT0gdmFsdWVJbnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFZPTFVNRSwgVk9MVU1FMC8xOiAlMDR4KSIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdHJhY2sudm9sdW1lW3BhcmFtLVZPTFVNRTBdIDw8IDE2OwotICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lSW5jW3BhcmFtLVZPTFVNRTBdID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF07Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgdm9sSW5jID0gZCAvIGludDMyX3QobVN0YXRlLmZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVJbmNbcGFyYW0tVk9MVU1FMF0gPSB2b2xJbmM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2xJbmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVYTEVWRUw6Ci0gICAgICAgICAgICAvL0FMT0dfQVNTRVJUKDAgPD0gdmFsdWVJbnQgJiYgdmFsdWVJbnQgPD0gTUFYX0dBSU5fSU5ULCAiYmFkIGF1eCBsZXZlbCAlZCIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmICh0cmFjay5hdXhMZXZlbCAhPSB2YWx1ZUludCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVk9MVU1FLCBBVVhMRVZFTDogJTA0eCkiLCB2YWx1ZUludCk7Ci0gICAgICAgICAgICAgICAgdHJhY2sucHJldkF1eExldmVsID0gdHJhY2suYXV4TGV2ZWwgPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2suYXV4TGV2ZWwgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IFZPTFVNRSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZBdXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLmF1eEluYyA9IHZvbEluYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbEluYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtU3RhdGUuZnJhbWVDb3VudCA6IDAsCisgICAgICAgICAgICAgICAgICAgICZ0cmFjay5hdXhMZXZlbCwgJnRyYWNrLnByZXZBdXhMZXZlbCwgJnRyYWNrLmF1eEluYywKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1BdXhMZXZlbCwgJnRyYWNrLm1QcmV2QXV4TGV2ZWwsICZ0cmFjay5tQXV4SW5jKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIEFVWExFVkVMOiAlMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCB0cmFjay5hdXhMZXZlbCk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXBhcmFtID49IFZPTFVNRTAgJiYgKHVuc2lnbmVkKXBhcmFtIDwgVk9MVU1FMCArIE1BWF9OVU1fVk9MVU1FUykgeworICAgICAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbVN0YXRlLmZyYW1lQ291bnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLCAmdHJhY2sucHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1Wb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwgJnRyYWNrLm1QcmV2Vm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2subVZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKCVzLCBWT0xVTUUlZDogJTA0eCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHBhcmFtIC0gVk9MVU1FMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdm9sdW1lOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfRkFUQUwoImJhZCB0YXJnZXQiKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyOiBiYWQgdGFyZ2V0ICVkIiwgdGFyZ2V0KTsKICAgICB9CiB9CiAKLWJvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UmVzYW1wbGVyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQorYm9vbCBBdWRpb01peGVyOjp0cmFja190OjpzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQogewotICAgIGlmICh2YWx1ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IHJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gdmFsdWU7CisgICAgaWYgKHRyYWNrU2FtcGxlUmF0ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IHJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IHRyYWNrU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHRyYWNrU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGlmIChyZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGluZyByZXNhbXBsZXIgZnJvbSB0cmFjayAlZCBIeiB0byBkZXZpY2UgJWQgSHoiLCB2YWx1ZSwgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNyZWF0aW5nIHJlc2FtcGxlciBmcm9tIHRyYWNrICVkIEh6IHRvIGRldmljZSAlZCBIeiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1NhbXBsZVJhdGUsIGRldlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5OwogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGxvd2VzdCBxdWFsaXR5IGxldmVsIHJlc2FtcGxlciBpZiB1c2UgY2FzZSBpc24ndCBtdXNpYyBvciB2aWRlbwogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgZmxhd2VkIGZvciBkeW5hbWljIHNhbXBsZSByYXRlcywgYXMgd2UgY2hvb3NlIHRoZSByZXNhbXBsZXIKICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHJhdGlvLCBidXQgdGhhdCBjb3VsZCBjaGFuZ2UgbGF0ZXIuCiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggdHJhY2tzIHdpdGggc3RhdGljIHJhdGlvcyB2cy4gZHluYW1pYyByYXRpb3MuCi0gICAgICAgICAgICAgICAgaWYgKCEoKHZhbHVlID09IDQ0MTAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDgwMDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09IDQ4MDAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDQxMDApKSkgewotICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZOworICAgICAgICAgICAgICAgIGlmICghKCh0cmFja1NhbXBsZVJhdGUgPT0gNDQxMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0ODAwMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAodHJhY2tTYW1wbGVSYXRlID09IDQ4MDAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDQxMDApKSkgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgTU9OT19IQUNLLiBSZXNhbXBsZXIgc2VlcyAjY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlcgorICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgorICAgICAgICAgICAgICAgIGNvbnN0IGludCByZXNhbXBsZXJDaGFubmVsQ291bnQgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICA/IG1NaXhlckNoYW5uZWxDb3VudCA6IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBBTE9HVlYoIkNyZWF0aW5nIHJlc2FtcGxlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdCglI3gpIGNoYW5uZWxzKCVkKSBkZXZTYW1wbGVSYXRlKCV1KSBxdWFsaXR5KCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCByZXNhbXBsZXJDaGFubmVsQ291bnQsIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIHNlZXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyLCBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgPyBNQVhfTlVNX0NIQU5ORUxTIDogY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXJDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZTYW1wbGVSYXRlLCBxdWFsaXR5KTsKICAgICAgICAgICAgICAgICByZXNhbXBsZXItPnNldExvY2FsVGltZUZyZXEoc0xvY2FsVGltZUZyZXEpOwogICAgICAgICAgICAgfQpAQCAtNTc3LDIxICs5NTcsNTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWlubGluZQotdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4KQorLyogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdm9sdW1lIHJhbXAgaGFzIGNvbXBsZXRlZCBhbmQgY2xlYXJzIHRoZSBpbmNyZW1lbnQKKyAqIHZhcmlhYmxlcyBhcHByb3ByaWF0ZWx5LgorICoKKyAqIEZJWE1FOiBUaGVyZSBpcyBjb2RlIHRvIGhhbmRsZSBpbnQvZmxvYXQgcmFtcCB2YXJpYWJsZSBzd2l0Y2hvdmVyIHNob3VsZCBpdCBub3QKKyAqIGNvbXBsZXRlIHdpdGhpbiBhIG1peGVyIGJ1ZmZlciBwcm9jZXNzaW5nIGNhbGwsIGJ1dCBpdCBpcyBwcmVmZXJyZWQgdG8gYXZvaWQgc3dpdGNob3ZlcgorICogZHVlIHRvIHByZWNpc2lvbiBpc3N1ZXMuICBUaGUgc3dpdGNob3ZlciBjb2RlIGlzIGluY2x1ZGVkIGZvciBsZWdhY3kgY29kZSBwdXJwb3NlcworICogYW5kIGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGludGVnZXIgdm9sdW1lIGlzIHJlbW92ZWQuCisgKgorICogSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gY2xlYXIgb25seSB0aGUgdm9sdW1lSW5jIGludGVnZXIgdmFyaWFibGUgYmVjYXVzZQorICogaWYgb25lIGNoYW5uZWwgcmVxdWlyZXMgcmFtcGluZywgYWxsIGNoYW5uZWxzIGFyZSByYW1wZWQuCisgKgorICogVGhlcmUgaXMgYSBiaXQgb2YgZHVwbGljYXRlZCBjb2RlIGhlcmUsIGJ1dCBpdCBrZWVwcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICovCitpbmxpbmUgdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0KQogewotICAgIGZvciAodWludDMyX3QgaT0wIDsgaTxNQVhfTlVNX0NIQU5ORUxTIDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKHZvbHVtZUluY1tpXT4wKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA+PSB2b2x1bWVbaV0pKSB8fAotICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKLSAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7Ci0gICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldPDwxNjsKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVZvbHVtZUluY1tpXSAhPSAwICYmIGZhYnMobVZvbHVtZVtpXSAtIG1QcmV2Vm9sdW1lW2ldKSA8PSBmYWJzKG1Wb2x1bWVJbmNbaV0pKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldIDw8IDE2OworICAgICAgICAgICAgICAgIG1Wb2x1bWVJbmNbaV0gPSAwLjsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSA9IG1Wb2x1bWVbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoInJhbXA6ICVmICVmICVmIiwgbVZvbHVtZVtpXSwgbVByZXZWb2x1bWVbaV0sIG1Wb2x1bWVJbmNbaV0pOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB1NF8yOF9mcm9tX2Zsb2F0KG1QcmV2Vm9sdW1lW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodm9sdW1lSW5jW2ldPDApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpIDw9IHZvbHVtZVtpXSkpKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldIDw8IDE2OworICAgICAgICAgICAgICAgIG1Wb2x1bWVJbmNbaV0gPSAwLjsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSA9IG1Wb2x1bWVbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoInJhbXA6ICVkICVkICVkIiwgdm9sdW1lW2ldIDw8IDE2LCBwcmV2Vm9sdW1lW2ldLCB2b2x1bWVJbmNbaV0pOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldICA9IGZsb2F0X2Zyb21fdTRfMjgocHJldlZvbHVtZVtpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgLyogVE9ETzogYXV4IGlzIGFsd2F5cyBpbnRlZ2VyIHJlZ2FyZGxlc3Mgb2Ygb3V0cHV0IGJ1ZmZlciB0eXBlICovCiAgICAgaWYgKGF1eCkgewogICAgICAgICBpZiAoKChhdXhJbmM+MCkgJiYgKCgocHJldkF1eExldmVsK2F1eEluYyk+PjE2KSA+PSBhdXhMZXZlbCkpIHx8Ci0gICAgICAgICAgICAoKGF1eEluYzwwKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpIDw9IGF1eExldmVsKSkpIHsKKyAgICAgICAgICAgICAgICAoKGF1eEluYzwwKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpIDw9IGF1eExldmVsKSkpIHsKICAgICAgICAgICAgIGF1eEluYyA9IDA7Ci0gICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbDw8MTY7CisgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgIG1BdXhJbmMgPSAwLjsKKyAgICAgICAgICAgIG1QcmV2QXV4TGV2ZWwgPSBtQXV4TGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL0FMT0dWKCJhdXggcmFtcDogJWQgJWQgJWQiLCBhdXhMZXZlbCA8PCAxNiwgcHJldkF1eExldmVsLCBhdXhJbmMpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjEwLDIxICsxMDI2LDE2IEBACiAgICAgbmFtZSAtPSBUUkFDSzA7CiAgICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CiAKLSAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIHVwZGF0ZSByZXF1aXJlZD8KLSAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyICE9IGJ1ZmZlclByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9NaXhlcjo6c2V0QnVmZmVyUHJvdmlkZXIoJXApIGZvciBkb3dubWl4IiwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIGZvciBhIHRyYWNrIHRoYXQgZ2V0cyBkb3dubWl4ZWQgY29uc2lzdHMgaW46Ci0gICAgICAgICAgICAvLyAgMS8gc2V0dGluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSAiZG93bm1peCAvIGJ1ZmZlciBwcm92aWRlciIgd3JhcHBlcgotICAgICAgICAgICAgLy8gICAgIHNvIGl0J3MgdGhlIG9uZSB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBwcm92aWRlciBpcyBuZWVkZWQsCi0gICAgICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmJ1ZmZlclByb3ZpZGVyID0gbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgIC8vICAyLyBzYXZpbmcgdGhlIGJ1ZmZlciBwcm92aWRlciBmb3IgdGhlIHRyYWNrIHNvIHRoZSB3cmFwcGVyIGNhbiB1c2UgaXQKLSAgICAgICAgICAgIC8vICAgICB3aGVuIGl0IGRvd25taXhlcy4KLSAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQorICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgIH0KKworICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKKyAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygmbVN0YXRlLnRyYWNrc1tuYW1lXSk7CiB9CiAKIApAQCAtNjU3LDYgKzEwNjgsOSBAQAogCiAgICAgLy8gY29tcHV0ZSBldmVyeXRoaW5nIHdlIG5lZWQuLi4KICAgICBpbnQgY291bnRBY3RpdmVUcmFja3MgPSAwOworICAgIC8vIFRPRE86IGZpeCBhbGwxNkJpdHNTdGVyZU5vUmVzYW1wbGUgbG9naWMgdG8KKyAgICAvLyBlaXRoZXIgcHJvcGVybHkgaGFuZGxlIG11dGVkIHRyYWNrcyAoaXQgc2hvdWxkIGlnbm9yZSB0aGVtKQorICAgIC8vIG9yIHJlbW92ZSBhbHRvZ2V0aGVyIGFzIGFuIG9ic29sZXRlIG9wdGltaXphdGlvbi4KICAgICBib29sIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSB0cnVlOwogICAgIGJvb2wgcmVzYW1wbGluZyA9IGZhbHNlOwogICAgIGJvb2wgdm9sdW1lUmFtcCA9IGZhbHNlOwpAQCAtNjY4LDM5ICsxMDgyLDQ3IEBACiAgICAgICAgIGNvdW50QWN0aXZlVHJhY2tzKys7CiAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgICAgICB1aW50MzJfdCBuID0gMDsKKyAgICAgICAgLy8gRklYTUUgY2FuIG92ZXJmbG93IChtYXNrIGlzIG9ubHkgMyBiaXRzKQogICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQuY2hhbm5lbENvdW50IC0gMTsKLSAgICAgICAgbiB8PSBORUVEU19GT1JNQVRfMTY7Ci0gICAgICAgIG4gfD0gdC5kb2VzUmVzYW1wbGUoKSA/IE5FRURTX1JFU0FNUExFX0VOQUJMRUQgOiBORUVEU19SRVNBTVBMRV9ESVNBQkxFRDsKKyAgICAgICAgaWYgKHQuZG9lc1Jlc2FtcGxlKCkpIHsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfUkVTQU1QTEU7CisgICAgICAgIH0KICAgICAgICAgaWYgKHQuYXV4TGV2ZWwgIT0gMCAmJiB0LmF1eEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuIHw9IE5FRURTX0FVWF9FTkFCTEVEOworICAgICAgICAgICAgbiB8PSBORUVEU19BVVg7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAodC52b2x1bWVJbmNbMF18dC52b2x1bWVJbmNbMV0pIHsKICAgICAgICAgICAgIHZvbHVtZVJhbXAgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgewotICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFX0VOQUJMRUQ7CisgICAgICAgICAgICBuIHw9IE5FRURTX01VVEU7CiAgICAgICAgIH0KICAgICAgICAgdC5uZWVkcyA9IG47CiAKLSAgICAgICAgaWYgKChuICYgTkVFRFNfTVVURV9fTUFTSykgPT0gTkVFRFNfTVVURV9FTkFCTEVEKSB7CisgICAgICAgIGlmIChuICYgTkVFRFNfTVVURSkgewogICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX25vcDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0FVWF9fTUFTSykgPT0gTkVFRFNfQVVYX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGlmIChuICYgTkVFRFNfQVVYKSB7CiAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfUkVTQU1QTEVfX01BU0spID09IE5FRURTX1JFU0FNUExFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGlmIChuICYgTkVFRFNfUkVTQU1QTEUpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKKyAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX1JFU0FNUExFLCB0Lm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXggKyByZXNhbXBsZSIsIGkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA9PSBORUVEU19DSEFOTkVMXzEpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fMTZCaXRzTW9ubzsKKyAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50ID09IDIgLy8gVE9ETzogTU9OT19IQUNLLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTyA6IFRSQUNLVFlQRV9OT1JFU0FNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+PSBORUVEU19DSEFOTkVMXzIpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fMTZCaXRzU3RlcmVvOworICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIGkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTcxMCw3ICsxMTMyLDcgQEAKIAogICAgIC8vIHNlbGVjdCB0aGUgcHJvY2Vzc2luZyBob29rcwogICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcykgeworICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKICAgICAgICAgaWYgKHJlc2FtcGxpbmcpIHsKICAgICAgICAgICAgIGlmICghc3RhdGUtPm91dHB1dFRlbXApIHsKICAgICAgICAgICAgICAgICBzdGF0ZS0+b3V0cHV0VGVtcCA9IG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07CkBAIC03MzEsNyArMTE1MywxNyBAQAogICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nOwogICAgICAgICAgICAgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgJiYgIXZvbHVtZVJhbXApIHsKICAgICAgICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19NVVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgcHJldmVudHMgYSBtdXRlZCB0cmFjayBmcm9tIGFjcXVpcmluZyBhIHByb2Nlc3MgaG9vay4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyBpZiB0aGUgdHJhY2sgaXMgTU9OTyBhcyB0aGF0IHJlcXVpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgZHVlIHRvIGltcGxpY2l0IGNoYW5uZWwgZHVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVyZW8gb3IgTXVsdGljaGFubmVsIHNob3VsZCBhY3R1YWxseSBiZSBmaW5lIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzQ2LDE2ICsxMTc4LDE1IEBACiAKICAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAgLy8gdHJhY2sgaG9va3MgZm9yIHN1YnNlcXVlbnQgbWl4ZXIgcHJvY2VzcwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcykgeworICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKICAgICAgICAgYm9vbCBhbGxNdXRlZCA9IHRydWU7CiAgICAgICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CiAgICAgICAgIHdoaWxlIChlbikgewogICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0Lm5lZWRzIHw9IE5FRURTX01VVEVfRU5BQkxFRDsKKyAgICAgICAgICAgIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKKyAgICAgICAgICAgICAgICB0Lm5lZWRzIHw9IE5FRURTX01VVEU7CiAgICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX25vcDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYWxsTXV0ZWQgPSBmYWxzZTsKQEAgLTc2NSw3ICsxMTk2LDExIEBACiAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX25vcDsKICAgICAgICAgfSBlbHNlIGlmIChhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlKSB7CiAgICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewotICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOworICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgICAgIC8vIE11dGVkIHNpbmdsZSB0cmFja3MgaGFuZGxlZCBieSBhbGxNdXRlZCBhYm92ZS4KKyAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LCB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03NzUsMTUgKzEyMTAsMTUgQEAKIHZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fZ2VuZXJpY1Jlc2FtcGxlXG4iKTsKICAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CiAKICAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCiAgICAgaWYgKGF1eCAhPSBOVUxMKSB7CiAgICAgICAgIC8vIGFsd2F5cyByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gd2hlbiBzZW5kaW5nIHRvIGF1eGlsaWFyeSBidWZmZXIgdG8gYmUgYWJsZQogICAgICAgICAvLyB0byBhcHBseSBzZW5kIGxldmVsIGFmdGVyIHJlc2FtcGxpbmcKLSAgICAgICAgLy8gVE9ETzogbW9kaWZ5IGVhY2ggcmVzYW1wbGVyIHRvIHN1cHBvcnQgYXV4IGNoYW5uZWw/Ci0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU4sIFVOSVRZX0dBSU4pOwotICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MzJfdCkpOwogICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSkgewogICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CkBAIC03OTIsNyArMTIyNyw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU4sIFVOSVRZX0dBSU4pOworICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CiAgICAgICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOwogICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CiAgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKQEAgLTgwMCwxNCArMTIzNSwxNCBAQAogCiAgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT52b2x1bWVbMF0sIHQtPnZvbHVtZVsxXSk7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKICAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19ub3AodHJhY2tfdCogdCBfX3VudXNlZCwgaW50MzJfdCogb3V0IF9fdW51c2VkLAorICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCBfX3VudXNlZCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4IF9fdW51c2VkKQogewogfQogCkBAIC04ODMsOSArMTMxOCwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzU3RlcmVvXG4iKTsKICAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4odC0+aW4pOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewpAQCAtOTc0LDkgKzE0MTAsMTAgQEAKICAgICB0LT5pbiA9IGluOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQogeworICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c01vbm9cbiIpOwogICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPih0LT5pbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CkBAIC0xMDY0LDggKzE1MDEsOCBAQAogLy8gbm8tb3AgY2FzZQogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fbm9wXG4iKTsKICAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgIHNpemVfdCBidWZTaXplID0gc3RhdGUtPmZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCkgKiBNQVhfTlVNX0NIQU5ORUxTOwogICAgIHdoaWxlIChlMCkgewogICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IGJ1ZmZlciB0bwogICAgICAgICAvLyBhdm9pZCBtdWx0aXBsZSBtZW1zZXQoKSBvbiBzYW1lIGJ1ZmZlcgpAQCAtMTA4NCw3ICsxNTIxLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGUwICY9IH4oZTEpOwogCi0gICAgICAgICAgICBtZW1zZXQodDEubWFpbkJ1ZmZlciwgMCwgYnVmU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQodDEubWFpbkJ1ZmZlciwgMCwgc3RhdGUtPmZyYW1lQ291bnQgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQxLm1NaXhlckZvcm1hdCkpOwogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKGUxKSB7CkBAIC0xMTEwLDYgKzE1NDgsNyBAQAogLy8gZ2VuZXJpYyBjb2RlIHdpdGhvdXQgcmVzYW1wbGluZwogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmdcbiIpOwogICAgIGludDMyX3Qgb3V0VGVtcFtCTE9DS1NJWkUgKiBNQVhfTlVNX0NIQU5ORUxTXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogCiAgICAgLy8gYWNxdWlyZSBlYWNoIHRyYWNrJ3MgYnVmZmVyCkBAIC0xMTU0LDcgKzE1OTMsNyBAQAogICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBCTE9DS1NJWkU7CiAgICAgICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSkgeworICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewogICAgICAgICAgICAgICAgICAgICBhdXggPSB0LmF1eEJ1ZmZlciArIG51bUZyYW1lczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgewpAQCAtMTE2Niw5ICsxNjA1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LmZyYW1lQ291bnQgPiBvdXRGcmFtZXMpP291dEZyYW1lczp0LmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgKEJMT0NLU0laRS1vdXRGcmFtZXMpKk1BWF9OVU1fQ0hBTk5FTFMsIGluRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKSAqIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKQEAgLTExOTIsOCArMTYzMSwxMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAob3V0LCBvdXRUZW1wLCBCTE9DS1NJWkUpOwotICAgICAgICAgICAgb3V0ICs9IEJMT0NLU0laRTsKKworICAgICAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LCBvdXRUZW1wLCB0MS5tTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIC8vIFRPRE86IGZpeCB1Z2x5IGNhc3RpbmcgZHVlIHRvIGNob2ljZSBvZiBvdXQgcG9pbnRlciB0eXBlCisgICAgICAgICAgICBvdXQgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPigodWludDhfdCopb3V0CisgICAgICAgICAgICAgICAgICAgICsgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7CiAgICAgICAgICAgICBudW1GcmFtZXMgKz0gQkxPQ0tTSVpFOwogICAgICAgICB9IHdoaWxlIChudW1GcmFtZXMgPCBzdGF0ZS0+ZnJhbWVDb3VudCk7CiAgICAgfQpAQCAtMTIxMiwxMCArMTY1Niw5IEBACiAvLyBnZW5lcmljIGNvZGUgd2l0aCByZXNhbXBsaW5nCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nXG4iKTsKICAgICAvLyB0aGlzIGNvbnN0IGp1c3QgbWVhbnMgdGhhdCBsb2NhbCB2YXJpYWJsZSBvdXRUZW1wIGRvZXNuJ3QgY2hhbmdlCiAgICAgaW50MzJfdCogY29uc3Qgb3V0VGVtcCA9IHN0YXRlLT5vdXRwdXRUZW1wOwotICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGludDMyX3QpICogTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50OwotCiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogCiAgICAgdWludDMyX3QgZTAgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKQEAgLTEyMzYsMjAgKzE2NzksMjAgQEAKICAgICAgICAgfQogICAgICAgICBlMCAmPSB+KGUxKTsKICAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKLSAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemUpOworICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKCpvdXRUZW1wKSAqIHQxLm1NaXhlckNoYW5uZWxDb3VudCAqIHN0YXRlLT5mcmFtZUNvdW50KTsKICAgICAgICAgd2hpbGUgKGUxKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CiAgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOwogICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKCh0Lm5lZWRzICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewogICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIGdvb2Z5LCBvbiB0aGUgcmVzYW1wbGluZyBjYXNlIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIuCi0gICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRSkgewogICAgICAgICAgICAgICAgIHQucmVzYW1wbGVyLT5zZXRQVFMocHRzKTsKICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAsIG51bUZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjY4LDE0ICsxNzExLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBvdXRGcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgb3V0RnJhbWVzKk1BWF9OVU1fQ0hBTk5FTFMsIHQuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIG91dEZyYW1lcyAqIHQubU1peGVyQ2hhbm5lbENvdW50LCB0LmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CiAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyArPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgbnVtRnJhbWVzKTsKKyAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LAorICAgICAgICAgICAgICAgIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LCBudW1GcmFtZXMgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOwogICAgIH0KIH0KIApAQCAtMTI4Myw2ICsxNzI3LDcgQEAKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmdcbiIpOwogICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gc3RhdGUtPmVuYWJsZWRUcmFja3MgaGFzIGV4YWN0bHkKICAgICAvLyBvbmUgYml0IHNldC4gIFRoZSBhc3NlcnRzIGJlbG93IHdvdWxkIHZlcmlmeSB0aGlzLCBidXQgYXJlIGNvbW1lbnRlZCBvdXQKICAgICAvLyBzaW5jZSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QgaXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuCkBAIC0xMjk0LDYgKzE3MzksNyBAQAogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LmJ1ZmZlcik7CiAKICAgICBpbnQzMl90KiBvdXQgPSB0Lm1haW5CdWZmZXI7CisgICAgZmxvYXQgKmZvdXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0KTsKICAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAKICAgICBjb25zdCBpbnQxNl90IHZsID0gdC52b2x1bWVbMF07CkBAIC0xMzA3LDE1MCArMTc1Myw2OCBAQAogCiAgICAgICAgIC8vIGluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgodW5zaWduZWQgbG9uZylpbiAmIDMpKSB7Ci0gICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBudW1GcmFtZXMqTUFYX05VTV9DSEFOTkVMUypzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoKCh1bnNpZ25lZCBsb25nKWluICYgMyksICJwcm9jZXNzIHN0ZXJlbyB0cmFjazogaW5wdXQgYnVmZmVyIGFsaWdubWVudCBwYjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJWQsIGNoYW5uZWxzICVkLCBuZWVkcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgaW4sIGksIHQuY2hhbm5lbENvdW50LCB0Lm5lZWRzKTsKKyAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCgodWludHB0cl90KWluKSAmIDMpKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBudW1GcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwKKyAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOiBtaXNhbGlnbmVkIGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgIiAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgsIHZvbHVtZSAlMDh4IHZmbCAlZiB2ZnIgJWYiLAorICAgICAgICAgICAgICAgICAgICBpbiwgaSwgdC5jaGFubmVsQ291bnQsIHQubmVlZHMsIHZybCwgdC5tVm9sdW1lWzBdLCB0Lm1Wb2x1bWVbMV0pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7CiAKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU4gfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTikpIHsKLSAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCi0gICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgorICAgICAgICBzd2l0Y2ggKHQubU1peGVyRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKICAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCi0gICAgICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICAgICAgciA9IGNsYW1wMTYocik7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKTsKKyAgICAgICAgICAgICAgICAqZm91dCsrID0gZmxvYXRfZnJvbV9xNF8yNyhsKTsKKyAgICAgICAgICAgICAgICAqZm91dCsrID0gZmxvYXRfZnJvbV9xNF8yNyhyKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBJbiBjYXNlIG9mIGxhdGVyIGludDE2X3Qgc2luayBvdXRwdXQsCisgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBhbmQgY2xhbXBpbmcgaXMgZG9uZSBieSBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKS4KICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKLSAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOX0lOVCB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOX0lOVCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2b2x1bWUgaXMgYm9vc3RlZCwgc28gd2UgbWlnaHQgbmVlZCB0byBjbGFtcCBldmVuIHRob3VnaAorICAgICAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAvLyBjbGFtcGluZy4uLgorICAgICAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKKyAgICAgICAgICAgICAgICAgICAgciA9IGNsYW1wMTYocik7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXIgZm9ybWF0OiAlZCIsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OwogICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKICAgICB9CiB9CiAKLSNpZiAwCi0vLyAyIHRyYWNrcyBpcyBhbHNvIGEgY29tbW9uIGNhc2UKLS8vIE5FVkVSIHVzZWQgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzX192YWxpZGF0ZSgpCi0vLyBvbmx5IHVzZSBpZiB0aGUgMiB0cmFja3MgaGF2ZSB0aGUgc2FtZSBvdXRwdXQgYnVmZmVyCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKQotewotICAgIGludCBpOwotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0KLSAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICBjb25zdCB0cmFja190JiB0MCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMCh0MC5idWZmZXIpOwotCi0gICAgZW4gJj0gfigxPDxpKTsKLSAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICBjb25zdCB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMSh0MS5idWZmZXIpOwotCi0gICAgY29uc3QgaW50MTZfdCAqaW4wOwotICAgIGNvbnN0IGludDE2X3QgdmwwID0gdDAudm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIwID0gdDAudm9sdW1lWzFdOwotICAgIHNpemVfdCBmcmFtZUNvdW50MCA9IDA7Ci0KLSAgICBjb25zdCBpbnQxNl90ICppbjE7Ci0gICAgY29uc3QgaW50MTZfdCB2bDEgPSB0MS52b2x1bWVbMF07Ci0gICAgY29uc3QgaW50MTZfdCB2cjEgPSB0MS52b2x1bWVbMV07Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQxID0gMDsKLQotICAgIC8vRklYTUU6IG9ubHkgd29ya3MgaWYgdHdvIHRyYWNrcyB1c2Ugc2FtZSBidWZmZXIKLSAgICBpbnQzMl90KiBvdXQgPSB0MC5tYWluQnVmZmVyOwotICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICBjb25zdCBpbnQxNl90ICpidWZmID0gTlVMTDsKLQotCi0gICAgd2hpbGUgKG51bUZyYW1lcykgewotCi0gICAgICAgIGlmIChmcmFtZUNvdW50MCA9PSAwKSB7Ci0gICAgICAgICAgICBiMC5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRQVFMgPSBjYWxjdWxhdGVPdXRwdXRQVFModDAsIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCAtIHQwLm1haW5CdWZmZXIpOwotICAgICAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIwLCBvdXRwdXRQVFMpOwotICAgICAgICAgICAgaWYgKGIwLmkxNiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBidWZmID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW4wID0gYnVmZjsKLSAgICAgICAgICAgICAgICBiMC5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbjAgPSBiMC5pMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZUNvdW50MCA9IGIwLmZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKLSAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUyh0MSwgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IC0gdDAubWFpbkJ1ZmZlcik7Ci0gICAgICAgICAgICB0MS5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjEsIG91dHB1dFBUUyk7Ci0gICAgICAgICAgICBpZiAoYjEuaTE2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbjEgPSBidWZmOwotICAgICAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluMSA9IGIxLmkxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lQ291bnQxID0gYjEuZnJhbWVDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBmcmFtZUNvdW50MCA8IGZyYW1lQ291bnQxP2ZyYW1lQ291bnQwOmZyYW1lQ291bnQxOwotCi0gICAgICAgIG51bUZyYW1lcyAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIGZyYW1lQ291bnQwIC09IG91dEZyYW1lczsKLSAgICAgICAgZnJhbWVDb3VudDEgLT0gb3V0RnJhbWVzOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGludDMyX3QgbDAgPSAqaW4wKys7Ci0gICAgICAgICAgICBpbnQzMl90IHIwID0gKmluMCsrOwotICAgICAgICAgICAgbDAgPSBtdWwobDAsIHZsMCk7Ci0gICAgICAgICAgICByMCA9IG11bChyMCwgdnIwKTsKLSAgICAgICAgICAgIGludDMyX3QgbCA9ICppbjErKzsKLSAgICAgICAgICAgIGludDMyX3QgciA9ICppbjErKzsKLSAgICAgICAgICAgIGwgPSBtdWxBZGQobCwgdmwxLCBsMCkgPj4gMTI7Ci0gICAgICAgICAgICByID0gbXVsQWRkKHIsIHZyMSwgcjApID4+IDEyOwotICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOwotICAgICAgICAgICAgciA9IGNsYW1wMTYocik7Ci0gICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7Ci0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKLSAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKLSAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGUgW10gYnVmZjsKLX0KLSNlbmRpZgotCiBpbnQ2NF90IEF1ZGlvTWl4ZXI6OmNhbGN1bGF0ZU91dHB1dFBUUyhjb25zdCB0cmFja190JiB0LCBpbnQ2NF90IGJhc2VQVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RnJhbWVJbmRleCkKIHsKLSAgICBpZiAoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMgPT0gYmFzZVBUUykKKyAgICBpZiAoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMgPT0gYmFzZVBUUykgewogICAgICAgICByZXR1cm4gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7CisgICAgfQogCiAgICAgcmV0dXJuIGJhc2VQVFMgKyAoKG91dHB1dEZyYW1lSW5kZXggKiBzTG9jYWxUaW1lRnJlcSkgLyB0LnNhbXBsZVJhdGUpOwogfQpAQCAtMTQ2MSw3ICsxODI1LDQxNCBAQAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvTWl4ZXI6OnNJbml0Um91dGluZSgpCiB7CiAgICAgTG9jYWxDbG9jayBsYzsKLSAgICBzTG9jYWxUaW1lRnJlcSA9IGxjLmdldExvY2FsRnJlcSgpOworICAgIHNMb2NhbFRpbWVGcmVxID0gbGMuZ2V0TG9jYWxGcmVxKCk7IC8vIGZvciB0aGUgcmVzYW1wbGVyCisKKyAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aW5pdCgpOyAvLyBmb3IgdGhlIGRvd25taXhlcgorfQorCisvKiBUT0RPOiBjb25zaWRlciB3aGV0aGVyIHRoaXMgbGV2ZWwgb2Ygb3B0aW1pemF0aW9uIGlzIG5lY2Vzc2FyeS4KKyAqIFBlcmhhcHMganVzdCBzdGljayB3aXRoIGEgc2luZ2xlIGZvciBsb29wLgorICovCisKKy8vIE5lZWRzIHRvIGRlcml2ZSBhIGNvbXBpbGUgdGltZSBjb25zdGFudCAoY29uc3RleHByKS4gIENvdWxkIGJlIHRhcmdldGVkIHRvIGdvCisvLyB0byBhIE1PTk9WT0wgbWl4dHlwZSBiYXNlZCBvbiBNQVhfTlVNX1ZPTFVNRVMsIGJ1dCB0aGF0J3MgYW4gdW5uZWNlc3NhcnkgY29tcGxpY2F0aW9uLgorI2RlZmluZSBNSVhUWVBFX01PTk9WT0wobWl4dHlwZSkgKG1peHR5cGUgPT0gTUlYVFlQRV9NVUxUSSA/IE1JWFRZUEVfTVVMVElfTU9OT1ZPTCA6IFwKKyAgICAgICAgbWl4dHlwZSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZID8gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MIDogbWl4dHlwZSkKKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgorc3RhdGljIHZvaWQgdm9sdW1lUmFtcE11bHRpKHVpbnQzMl90IGNoYW5uZWxzLCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBUViAqdm9sLCBjb25zdCBUViAqdm9saW5jLCBUQVYgKnZvbGEsIFRBViB2b2xhaW5jKQoreworICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAxPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRSwgMj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgMz4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNj4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgorc3RhdGljIHZvaWQgdm9sdW1lTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIGNvbnN0IFRWICp2b2wsIFRBViB2b2xhKQoreworICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA1PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA4PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQorICogQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKKyAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjp2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKKyAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXAsIEF1ZGlvTWl4ZXI6OnRyYWNrX3QgKnQpCit7CisgICAgaWYgKFVTRUZMT0FUVk9MKSB7CisgICAgICAgIGlmIChyYW1wKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+bVByZXZWb2x1bWUsIHQtPm1Wb2x1bWVJbmMsICZ0LT5wcmV2QXV4TGV2ZWwsIHQtPmF1eEluYyk7CisgICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7CisgICAgICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT5tVm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmFtcCkgeworICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPnByZXZWb2x1bWUsIHQtPnZvbHVtZUluYywgJnQtPnByZXZBdXhMZXZlbCwgdC0+YXV4SW5jKTsKKyAgICAgICAgICAgIGlmIChBREpVU1RWT0wpIHsKKyAgICAgICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPnZvbHVtZSwgdC0+YXV4TGV2ZWwpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBUaGlzIHByb2Nlc3MgaG9vayBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0cmFjayB3aXRob3V0CisgKiBhdXggYnVmZmVyLCB2b2x1bWUgcmFtcCwgb3IgcmVzYW1wbGluZy4KKyAqIFRPRE86IFVwZGF0ZSB0aGUgaG9vayBzZWxlY3Rpb246IHRoaXMgY2FuIHByb3Blcmx5IGhhbmRsZSBhdXggYW5kIHJhbXAuCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjayhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCit7CisgICAgQUxPR1ZWKCJwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFja1xuIik7CisgICAgLy8gQ0xaIGlzIGZhc3RlciB0aGFuIENUWiBvbiBBUk0sIHRob3VnaCByZWFsbHkgbm90IHN1cmUgaWYgdHJ1ZSBhZnRlciAzMSAtIGNsei4KKyAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgQUxPR19BU1NFUlQoKDEgPDwgaSkgPT0gc3RhdGUtPmVuYWJsZWRUcmFja3MsICJtb3JlIHRoYW4gMSB0cmFjayBlbmFibGVkIik7CisgICAgdHJhY2tfdCAqdCA9ICZzdGF0ZS0+dHJhY2tzW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxzID0gdC0+bU1peGVyQ2hhbm5lbENvdW50OworICAgIFRPKiBvdXQgPSByZWludGVycHJldF9jYXN0PFRPKj4odC0+bWFpbkJ1ZmZlcik7CisgICAgVEEqIGF1eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEEqPih0LT5hdXhCdWZmZXIpOworICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworCisgICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7IG51bUZyYW1lczsgKSB7CisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LT5idWZmZXIpOworICAgICAgICAvLyBnZXQgaW5wdXQgYnVmZmVyCisgICAgICAgIGIuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAgICAgY29uc3QgaW50NjRfdCBvdXRwdXRQVFMgPSBjYWxjdWxhdGVPdXRwdXRQVFMoKnQsIHB0cywgc3RhdGUtPmZyYW1lQ291bnQgLSBudW1GcmFtZXMpOworICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYiwgb3V0cHV0UFRTKTsKKyAgICAgICAgY29uc3QgVEkgKmluID0gcmVpbnRlcnByZXRfY2FzdDxUSSo+KGIucmF3KTsKKworICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrOiBidXMgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciAlcCB0cmFjayAlcCwgY2hhbm5lbHMgJWQsIG5lZWRzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGluLCB0LCB0LT5jaGFubmVsQ291bnQsIHQtPm5lZWRzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7CisgICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCBmYWxzZT4gKAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wLCB0KTsKKworICAgICAgICBvdXQgKz0gb3V0RnJhbWVzICogY2hhbm5lbHM7CisgICAgICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgYXV4ICs9IGNoYW5uZWxzOworICAgICAgICB9CisgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CisKKyAgICAgICAgLy8gcmVsZWFzZSBidWZmZXIKKyAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOworICAgIH0KKyAgICBpZiAocmFtcCkgeworICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gZG8gcmVzYW1wbGluZyB0aGVuIG1peGluZywKKyAqIHB1bGxpbmcgZnJvbSB0aGUgdHJhY2sncyB1cHN0cmVhbSBBdWRpb0J1ZmZlclByb3ZpZGVyLgorICoKKyAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBUTyogdGVtcCwgVEEqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX19SZXNhbXBsZVxuIik7CisgICAgdC0+cmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHQtPnNhbXBsZVJhdGUpOworICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworICAgIGlmIChyYW1wIHx8IGF1eCAhPSBOVUxMKSB7CisgICAgICAgIC8vIGlmIHJhbXA6ICAgICAgICByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gdG8gdGVtcCBidWZmZXIgYW5kIHNjYWxlL21peCBpbiAybmQgc3RlcC4KKyAgICAgICAgLy8gaWYgYXV4ICE9IE5VTEw6IHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciB0aGVuIGFwcGx5IHNlbmQgbGV2ZWwuCisKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKFRPKSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKXRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKworICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCisgICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgsIHJhbXAsIHQpOworCisgICAgfSBlbHNlIHsgLy8gY29uc3RhbnQgdm9sdW1lIGdhaW4KKyAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUodC0+bVZvbHVtZVswXSwgdC0+bVZvbHVtZVsxXSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKW91dCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOworICAgIH0KK30KKworLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBtaXggYSB0cmFjaywgd2hlbiBubyByZXNhbXBsaW5nIGlzIHJlcXVpcmVkLgorICogVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgcHJlc2VudCBpbiB0LT5pbi4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX19Ob1Jlc2FtcGxlXG4iKTsKKyAgICBjb25zdCBUSSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBUSSAqPih0LT5pbik7CisKKyAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCisgICAgICAgICAgICBvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHQtPm5lZWRzUmFtcCgpLCB0KTsKKworICAgIC8vIE1JWFRZUEVfTU9OT0VYUEFORCByZWFkcyBhIHNpbmdsZSBpbnB1dCBjaGFubmVsIGFuZCBleHBhbmRzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KKyAgICAvLyBNSVhUWVBFX01VTFRJIHJlYWRzIE5DSEFOIGlucHV0IGNoYW5uZWxzIGFuZCBwbGFjZXMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgorICAgIGluICs9IChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgPyBmcmFtZUNvdW50IDogZnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudDsKKyAgICB0LT5pbiA9IGluOworfQorCisvKiBUaGUgTWl4ZXIgZW5naW5lIGdlbmVyYXRlcyBlaXRoZXIgaW50MzJfdCAoUTRfMjcpIG9yIGZsb2F0IGRhdGEuCisgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBlbmdpbmUgYnVmZmVycworICogdG8gdGhlIGRlc2lyZWQgbWl4ZXIgb3V0cHV0IGZvcm1hdCwgZWl0aGVyIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0LgorICovCit2b2lkIEF1ZGlvTWl4ZXI6OmNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAorICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KQoreworICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtZW1jcHkob3V0LCBpbiwgc2FtcGxlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsgLy8gTUVNQ1BZLiBUT0RPIG9wdGltaXplIG91dAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKGludDE2X3QqKW91dCwgKGZsb2F0Kilpbiwgc2FtcGxlQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcTRfMjcoKGZsb2F0KilvdXQsIChpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICAvLyB0d28gaW50MTZfdCBhcmUgcHJvZHVjZWQgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKW91dCwgKGludDMyX3QqKWluLCBzYW1wbGVDb3VudCA+PiAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUmV0dXJucyB0aGUgcHJvcGVyIHRyYWNrIGhvb2sgdG8gdXNlIGZvciBtaXhpbmcgdGhlIHRyYWNrIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisgKi8KK0F1ZGlvTWl4ZXI6Omhvb2tfdCBBdWRpb01peGVyOjpnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCBfX3VudXNlZCkKK3sKKyAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfX25vcDsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfXzE2Qml0c01vbm87CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfXzE2Qml0c1N0ZXJlbzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgIHJldHVybiB0cmFja19fbm9wOworICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgaW50MzJfdCAvKlRBKi8+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpXAorICAgICAgICAgICAgICAgICAgICB0cmFja19fUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01PTk9FWFBBTkQsIGZsb2F0LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NT05PRVhQQU5ELCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6CisgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgZmxvYXQsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm5zIHRoZSBwcm9wZXIgcHJvY2VzcyBob29rIGZvciBtaXhpbmcgdHJhY2tzLiBDdXJyZW50bHkgd29ya3Mgb25seSBmb3IKKyAqIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywgYSBtaXggaW52b2x2aW5nIG9uZSB0cmFjaywgbm8gcmVzYW1wbGluZy4KKyAqCisgKiBUT0RPOiBEdWUgdG8gdGhlIHNwZWNpYWwgbWl4aW5nIGNvbnNpZGVyYXRpb25zIG9mIGR1cGxpY2F0aW5nIHRvCisgKiBhIHN0ZXJlbyBvdXRwdXQgdHJhY2ssIHRoZSBpbnB1dCB0cmFjayBjYW5ub3QgYmUgTU9OTy4gIFRoaXMgc2hvdWxkIGJlCisgKiBwcmV2ZW50ZWQgYnkgdGhlIGNhbGxlci4KKyAqLworQXVkaW9NaXhlcjo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlcjo6Z2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KQoreworICAgIGlmIChwcm9jZXNzVHlwZSAhPSBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0spIHsgLy8gT25seSBOT1JFU0FNUExFT05FVFJBQ0sKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHByb2Nlc3NUeXBlOiAlZCIsIHByb2Nlc3NUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgha1VzZU5ld01peGVyICYmIGNoYW5uZWxDb3VudCA9PSBGQ0NfMiAmJiBtaXhlckluRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBpbnQzMl90IC8qVEEqLz47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCA0M2FlYjg2Li4zYjk3MmJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKQEAgLTI2LDEwICsyNiwxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCi0jaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CiAKKy8vIEZJWE1FIFRoaXMgaXMgYWN0dWFsbHkgdW5pdHkgZ2Fpbiwgd2hpY2ggbWlnaHQgbm90IGJlIG1heCBpbiBmdXR1cmUsIGV4cHJlc3NlZCBpbiBVLjEyCisjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVAorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ4LDE0ICs1MSwxNCBAQAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX1RSQUNLUyA9IDMyOwogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgbWl4ZXIKIAotICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiAyIGNoYW5uZWxzIGZvciBvdXRwdXQuCi0gICAgLy8gVGhlcmUgaXMgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgdHJhY2tzIGRvd24tbWl4ZWQgdG8gMiBjaGFubmVsIG91dHB1dCB2aWEgYSBkb3duLW1peCBlZmZlY3QuCi0gICAgLy8gQWRkaW5nIHN1cHBvcnQgZm9yID4gMiBjaGFubmVsIG91dHB1dCB3b3VsZCByZXF1aXJlIG1vcmUgdGhhbiBzaW1wbHkgY2hhbmdpbmcgdGhpcyB2YWx1ZS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IDI7CisgICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDggY2hhbm5lbHMgZm9yIG91dHB1dC4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IDg7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVk9MVU1FUyA9IDI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gODsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7CiAKLSAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTiA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTl9JTlQgPSAweDEwMDA7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0ICAgIFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOwogCiAgICAgZW51bSB7IC8vIG5hbWVzCiAKQEAgLTc3LDYgKzgwLDggQEAKICAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAogICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCiAgICAgICAgIERPV05NSVhfVFlQRSAgICA9IDBYNDAwNCwKKyAgICAgICAgTUlYRVJfRk9STUFUICAgID0gMHg0MDA1LCAvLyBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgIE1JWEVSX0NIQU5ORUxfTUFTSyA9IDB4NDAwNiwgLy8gQ2hhbm5lbCBtYXNrIGZvciBtaXhlciBvdXRwdXQKICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtOTAsNiArOTUsNyBAQAogICAgICAgICBSRU1PVkUgICAgICAgICAgPSAweDQxMDIsIC8vIFJlbW92ZSB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgaXMgcmVzdG9yZWQgdG8gdGhlIG1peCBzYW1wbGUgcmF0ZS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSQU1QX1ZPTFVNRSBhbmQgVk9MVU1FICg4IGNoYW5uZWxzIG1heCkKKyAgICAgICAgLy8gRklYTUUgdXNlIGZsb2F0IGZvciB0aGVzZSAzIHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKICAgICAgICAgVk9MVU1FMCAgICAgICAgID0gMHg0MjAwLAogICAgICAgICBWT0xVTUUxICAgICAgICAgPSAweDQyMDEsCiAgICAgICAgIEFVWExFVkVMICAgICAgICA9IDB4NDIxMCwKQEAgLTk5LDcgKzEwNSwxMCBAQAogICAgIC8vIEZvciBhbGwgQVBJcyB3aXRoICJuYW1lIjogVFJBQ0swIDw9IG5hbWUgPCBUUkFDSzAgKyBNQVhfTlVNX1RSQUNLUwogCiAgICAgLy8gQWxsb2NhdGUgYSB0cmFjayBuYW1lLiAgUmV0dXJucyBuZXcgdHJhY2sgbmFtZSBpZiBzdWNjZXNzZnVsLCAtMSBvbiBmYWlsdXJlLgotICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgLy8gVGhlIGZhaWx1cmUgY291bGQgYmUgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGNoYW5uZWxNYXNrIG9yIGZvcm1hdCwgb3IgdGhhdAorICAgIC8vIHRoZSB0cmFjayBjYXBhY2l0eSBvZiB0aGUgbWl4ZXIgaXMgZXhjZWVkZWQuCisgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOwogCiAgICAgLy8gRnJlZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZQogICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZShpbnQgbmFtZSk7CkBAIC0xMTcsMzUgKzEyNiwzNCBAQAogCiAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CiAKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICByZXR1cm4gZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCB8fAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzMyX0JJVCB8fAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIH0KKwogcHJpdmF0ZToKIAogICAgIGVudW0geworICAgICAgICAvLyBGSVhNRSB0aGlzIHJlcHJlc2VudGF0aW9uIHBlcm1pdHMgdXAgdG8gOCBjaGFubmVscwogICAgICAgICBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLICAgPSAweDAwMDAwMDA3LAotICAgICAgICBORUVEU19GT1JNQVRfX01BU0sgICAgICAgICAgPSAweDAwMDAwMEYwLAotICAgICAgICBORUVEU19NVVRFX19NQVNLICAgICAgICAgICAgPSAweDAwMDAwMTAwLAotICAgICAgICBORUVEU19SRVNBTVBMRV9fTUFTSyAgICAgICAgPSAweDAwMDAxMDAwLAotICAgICAgICBORUVEU19BVVhfX01BU0sgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBlbnVtIHsKLSAgICAgICAgTkVFRFNfQ0hBTk5FTF8xICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8xICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwgICAvLyBtb25vCisgICAgICAgIE5FRURTX0NIQU5ORUxfMiAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsICAgLy8gc3RlcmVvCiAKLSAgICAgICAgTkVFRFNfRk9STUFUXzE2ICAgICAgICAgICAgID0gMHgwMDAwMDAxMCwKKyAgICAgICAgLy8gc2FtcGxlIGZvcm1hdCBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGFuZCBpcyBhc3N1bWVkIHRvIGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCiAKLSAgICAgICAgTkVFRFNfTVVURV9ESVNBQkxFRCAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfTVVURV9FTkFCTEVEICAgICAgICAgID0gMHgwMDAwMDEwMCwKLQotICAgICAgICBORUVEU19SRVNBTVBMRV9ESVNBQkxFRCAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19SRVNBTVBMRV9FTkFCTEVEICAgICAgPSAweDAwMDAxMDAwLAotCi0gICAgICAgIE5FRURTX0FVWF9ESVNBQkxFRCAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19BVVhfRU5BQkxFRCAgICAgID0gMHgwMDAxMDAwMCwKKyAgICAgICAgTkVFRFNfTVVURSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICAgICAgTkVFRFNfUkVTQU1QTEUgICAgICAgICAgICAgID0gMHgwMDAwMTAwMCwKKyAgICAgICAgTkVFRFNfQVVYICAgICAgICAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKICAgICB9OwogCiAgICAgc3RydWN0IHN0YXRlX3Q7CiAgICAgc3RydWN0IHRyYWNrX3Q7Ci0gICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyOwogCiAgICAgdHlwZWRlZiB2b2lkICgqaG9va190KSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwpAQCAtMTU0LDE2ICsxNjIsMTcgQEAKICAgICBzdHJ1Y3QgdHJhY2tfdCB7CiAgICAgICAgIHVpbnQzMl90ICAgIG5lZWRzOwogCisgICAgICAgIC8vIFRPRE86IEV2ZW50dWFsbHkgcmVtb3ZlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSBzZXR0aW5ncwogICAgICAgICB1bmlvbiB7Ci0gICAgICAgIGludDE2X3QgICAgIHZvbHVtZVtNQVhfTlVNX0NIQU5ORUxTXTsgLy8gWzBdMy4xMiBmaXhlZCBwb2ludAorICAgICAgICBpbnQxNl90ICAgICB2b2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gVTQuMTIgZml4ZWQgcG9pbnQgKHRvcCBiaXQgc2hvdWxkIGJlIHplcm8pCiAgICAgICAgIGludDMyX3QgICAgIHZvbHVtZVJMOwogICAgICAgICB9OwogCi0gICAgICAgIGludDMyX3QgICAgIHByZXZWb2x1bWVbTUFYX05VTV9DSEFOTkVMU107CisgICAgICAgIGludDMyX3QgICAgIHByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CiAKLSAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lSW5jW01BWF9OVU1fQ0hBTk5FTFNdOworICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsKICAgICAgICAgaW50MzJfdCAgICAgYXV4SW5jOwogICAgICAgICBpbnQzMl90ICAgICBwcmV2QXV4TGV2ZWw7CiAKQEAgLTE3Myw3ICsxODIsNyBAQAogICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OwogCiAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsgICAvLyAxIG9yIDIsIHJlZHVuZGFudCB3aXRoIChuZWVkcyAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spCi0gICAgICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsgICAgICAgICAvLyBhbHdheXMgMTYKKyAgICAgICAgdWludDhfdCAgICAgdW51c2VkX3BhZGRpbmc7IC8vIGZvcm1lcmx5IGZvcm1hdCwgd2FzIGFsd2F5cyAxNgogICAgICAgICB1aW50MTZfdCAgICBlbmFibGVkOyAgICAgICAgLy8gYWN0dWFsbHkgYm9vbAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKIApAQCAtMTk2LDQ4ICsyMDUsMTU5IEBACiAgICAgICAgIGludDMyX3QqICAgICAgICAgICBhdXhCdWZmZXI7CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCi0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gNCBieXRlcworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7IC8vIHByb3ZpZGVyIHdyYXBwZXIgZm9yIHJlZm9ybWF0dGluZy4KKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKiAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyB3cmFwcGVyIGZvciBjaGFubmVsIGNvbnZlcnNpb24uCiAKICAgICAgICAgaW50MzJfdCAgICAgc2Vzc2lvbklkOwogCi0gICAgICAgIGludDMyX3QgICAgIHBhZGRpbmdbMl07CisgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyRm9ybWF0OyAgICAgLy8gb3V0cHV0IG1peCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsgICAgICAgICAgLy8gaW5wdXQgdHJhY2sgZm9ybWF0CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckluRm9ybWF0OyAgIC8vIG1peCBpbnRlcm5hbCBmb3JtYXQgQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHRyYWNrIG11c3QgYmUgY29udmVydGVkIHRvIHRoaXMgZm9ybWF0LgorCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgICAgIC8vIGZsb2F0aW5nIHBvaW50IHNldCB2b2x1bWUKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gZmxvYXRpbmcgcG9pbnQgcHJldmlvdXMgdm9sdW1lCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsgIC8vIGZsb2F0aW5nIHBvaW50IHZvbHVtZSBpbmNyZW1lbnQKKworICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IGF1eCBsZXZlbAorICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldkF1eExldmVsOyAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgcHJldiBhdXggbGV2ZWwKKyAgICAgICAgZmxvYXQgICAgICAgICAgbUF1eEluYzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IGF1eCBpbmNyZW1lbnQKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckNoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQ7CiAKLSAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOworICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CisgICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOwogICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTDsgfQogICAgICAgICB2b2lkICAgICAgICByZXNldFJlc2FtcGxlcigpIHsgaWYgKHJlc2FtcGxlciAhPSBOVUxMKSByZXNhbXBsZXItPnJlc2V0KCk7IH0KLSAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCk7CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7CiAgICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCkgOiAwOyB9OwogICAgIH07CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpwcm9jZXNzX2hvb2tfdCkoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKKwogICAgIC8vIHBhZCB0byAzMi1ieXRlcyB0byBmaWxsIGNhY2hlIGxpbmUKICAgICBzdHJ1Y3Qgc3RhdGVfdCB7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICBlbmFibGVkVHJhY2tzOwogICAgICAgICB1aW50MzJfdCAgICAgICAgbmVlZHNDaGFuZ2VkOwogICAgICAgICBzaXplX3QgICAgICAgICAgZnJhbWVDb3VudDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICgqaG9vaykoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgTlVMTAorICAgICAgICBwcm9jZXNzX2hvb2tfdCAgaG9vazsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgTlVMTAogICAgICAgICBpbnQzMl90ICAgICAgICAgKm91dHB1dFRlbXA7CiAgICAgICAgIGludDMyX3QgICAgICAgICAqcmVzYW1wbGVUZW1wOwogICAgICAgICBOQkxvZzo6V3JpdGVyKiAgbUxvZzsKICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc2VydmVkWzFdOwogICAgICAgICAvLyBGSVhNRSBhbGxvY2F0ZSBkeW5hbWljYWxseSB0byBzYXZlIHNvbWUgbWVtb3J5IHdoZW4gbWF4TnVtVHJhY2tzIDwgTUFYX05VTV9UUkFDS1MKLSAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU107IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisgICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAgICAgfTsKIAotICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdGhhdCB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgYnkgYSBjYWxsIHRvIGEgZG93bm1peCBlZmZlY3QKLSAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKKyAgICAvLyBCYXNlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgY2xhc3MgdXNlZCBmb3IgRG93bk1peGVyQnVmZmVyUHJvdmlkZXIsIFJlbWl4QnVmZmVyUHJvdmlkZXIsCisgICAgLy8gYW5kIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuCisgICAgLy8gSXQgaGFuZGxlcyBhIHByaXZhdGUgYnVmZmVyIGZvciB1c2UgaW4gY29udmVydGluZyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrcyBmcm9tIHRoZQorICAgIC8vIGlucHV0IGRhdGEgdG8gYSBmb3JtIGFjY2VwdGFibGUgYnkgdGhlIG1peGVyLgorICAgIC8vIFRPRE86IE1ha2UgYSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciB3aGVuIGludGVnZXJzIGFyZSBlbnRpcmVseSByZW1vdmVkIGZyb20gdGhlCisgICAgLy8gcHJvY2Vzc2luZyBwaXBlbGluZS4KKyAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CiAgICAgcHVibGljOgorICAgICAgICAvLyBVc2UgYSBwcml2YXRlIGJ1ZmZlciBvZiBidWZmZXJGcmFtZUNvdW50IGZyYW1lcyAoZWFjaCBmcmFtZSBpcyBvdXRwdXRGcmFtZVNpemUgYnl0ZXMpLgorICAgICAgICAvLyBJZiBidWZmZXJGcmFtZUNvdW50IGlzIDAsIG5vIHByaXZhdGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZgorICAgICAgICAvLyB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyJ3MgYnVmZmVycyBpcyBwZXJmb3JtZWQgYnkgY29weUZyYW1lcygpLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLCBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB+Q29weUJ1ZmZlclByb3ZpZGVyKCk7CisKKyAgICAgICAgLy8gT3ZlcnJpZGVzIEF1ZGlvQnVmZmVyUHJvdmlkZXIgbWV0aG9kcwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwotICAgICAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwogCisgICAgICAgIC8vIE90aGVyIHB1YmxpYyBtZXRob2RzCisKKyAgICAgICAgLy8gY2FsbCB0aGlzIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciB0byB0aGUgdXBzdHJlYW0gcHJvdmlkZXIuCisgICAgICAgIC8vIHRyZWF0IGl0IGFzIGFuIGF1ZGlvIGRpc2NvbnRpbnVpdHkgZm9yIGZ1dHVyZSBzYW1wbGVzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCisgICAgICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKKyAgICAgICAgLy8gc29tZSBwcm92aWRlcnMgd2lsbCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYXJiaXRyYXJ5IGJ1ZmZlcnMgb3V0c2lkZQorICAgICAgICAvLyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpID0gMDsKKworICAgICAgICAvLyBzZXQgdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlci4gQ29uc2lkZXIgY2FsbGluZyAicmVzZXQiIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICAgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyID0gcDsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBtVHJhY2tCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0RnJhbWVTaXplOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0RnJhbWVTaXplOworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtQnVmZmVyOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50OworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBtTG9jYWxCdWZmZXJEYXRhOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29uc3VtZWQ7CisgICAgfTsKKworICAgIC8vIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBwcm92aWRlCisgICAgLy8gcG9zaXRpb24gZGVwZW5kZW50IGRvd25taXhpbmcgYnkgYW4gQXVkaW8gRWZmZWN0LgorICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworICAgICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtRG93bm1peEhhbmRsZSAhPSBOVUxMOyB9CisKKyAgICAgICAgc3RhdGljIHN0YXR1c190IGluaXQoKTsKKyAgICAgICAgc3RhdGljIGJvb2wgaXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkgeyByZXR1cm4gc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsgfQorCisgICAgcHJvdGVjdGVkOgogICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICAgbURvd25taXhIYW5kbGU7CiAgICAgICAgIGVmZmVjdF9jb25maWdfdCAgICBtRG93bm1peENvbmZpZzsKKworICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgorICAgICAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzRHdubUZ4RGVzYzsKKyAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKKyAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsKKyAgICAgICAgLy8gRklYTUU6IHNob3VsZCB3ZSBhbGxvdyBlZmZlY3RzIG91dHNpZGUgb2YgdGhlIGZyYW1ld29yaz8KKyAgICAgICAgLy8gV2UgbmVlZCB0byBoZXJlLiBBIHNwZWNpYWwgaW9JZCB0aGF0IG11c3QgYmUgPD0gLTIgc28gaXQgZG9lcyBub3QgbWFwIHRvIGEgc2Vzc2lvbi4KKyAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVEID0gLTI7CisgICAgfTsKKworICAgIC8vIFJlbWl4QnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHBlcmZvcm0gYW4KKyAgICAvLyB1cG1peCBvciBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KKyAgICBjbGFzcyBSZW1peEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemU7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dENoYW5uZWxzOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0Q2hhbm5lbHM7CisgICAgICAgIGludDhfdCAgICAgICAgICAgICAgIG1JZHhBcnlbc2l6ZW9mKHVpbnQzMl90KSo4XTsgLy8gMzIgYml0cyA9PiBjaGFubmVsIGluZGljZXMKKyAgICB9OworCisgICAgLy8gUmVmb3JtYXRCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gY29udmVydCB0aGUgaW5wdXQgZGF0YQorICAgIC8vIHRvIGFuIGFjY2VwdGFibGUgbWl4ZXIgaW5wdXQgZm9ybWF0IHR5cGUuCisgICAgY2xhc3MgUmVmb3JtYXRCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgIG1DaGFubmVsczsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUlucHV0Rm9ybWF0OworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtT3V0cHV0Rm9ybWF0OwogICAgIH07CiAKICAgICAvLyBiaXRtYXNrIG9mIGFsbG9jYXRlZCB0cmFjayBuYW1lcywgd2hlcmUgYml0IDAgY29ycmVzcG9uZHMgdG8gVFJBQ0swIGV0Yy4KQEAgLTI1NSwxOCArMzc1LDIwIEBACiBwcml2YXRlOgogICAgIHN0YXRlX3QgICAgICAgICBtU3RhdGUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAotICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCi0gICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3QgZHdubUZ4RGVzYzsKLSAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgotICAgIHN0YXRpYyBib29sICAgICAgICAgICAgICAgIGlzTXVsdGljaGFubmVsQ2FwYWJsZTsKLQogICAgIC8vIENhbGwgYWZ0ZXIgY2hhbmdpbmcgZWl0aGVyIHRoZSBlbmFibGVkIHN0YXR1cyBvZiBhIHRyYWNrLCBvciBwYXJhbWV0ZXJzIG9mIGFuIGVuYWJsZWQgdHJhY2suCiAgICAgLy8gT0sgdG8gY2FsbCBtb3JlIG9mdGVuIHRoYW4gdGhhdCwgYnV0IHVubmVjZXNzYXJ5LgogICAgIHZvaWQgaW52YWxpZGF0ZVN0YXRlKHVpbnQzMl90IG1hc2spOwogCi0gICAgc3RhdGljIHN0YXR1c190IGluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0sIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2spOworICAgIGJvb2wgc2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayk7CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdW51c2VkIHRyYWNrTmFtZS90cmFja051bSBmcm9tIGZ1bmN0aW9ucyBiZWxvdy4KKyAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtKTsKICAgICBzdGF0aWMgdm9pZCB1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOworICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKKyAgICBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spOwogCiAgICAgc3RhdGljIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwpAQCAtMjg2LDEwICs0MDgsNiBAQAogICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CiAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOwotI2lmIDAKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19Ud29UcmFja3MxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKLSNlbmRpZgogCiAgICAgc3RhdGljIGludDY0X3QgY2FsY3VsYXRlT3V0cHV0UFRTKGNvbnN0IHRyYWNrX3QmIHQsIGludDY0X3QgYmFzZVBUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZyYW1lSW5kZXgpOwpAQCAtMjk3LDYgKzQxNSw1MyBAQAogICAgIHN0YXRpYyB1aW50NjRfdCAgICAgICAgIHNMb2NhbFRpbWVGcmVxOwogICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCAgIHNPbmNlQ29udHJvbDsKICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzSW5pdFJvdXRpbmUoKTsKKworICAgIC8qIG11bHRpLWZvcm1hdCB2b2x1bWUgbWl4aW5nIGZ1bmN0aW9uIChjYWxscyB0ZW1wbGF0ZSBmdW5jdGlvbnMKKyAgICAgKiBpbiBBdWRpb01peGVyT3BzLmgpLiAgVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiAgIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAgICAgKiAgIFVTRUZMT0FUVk9MIChzZXQgdG8gdHJ1ZSBpZiBmbG9hdCB2b2x1bWUgaXMgdXNlZCkKKyAgICAgKiAgIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKKyAgICAgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAgICAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgICAgICogICBUQTogaW50MzJfdCAoUTQuMjcpCisgICAgICovCisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKKyAgICAgICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wLCBBdWRpb01peGVyOjp0cmFja190ICp0KTsKKworICAgIC8vIG11bHRpLWZvcm1hdCBwcm9jZXNzIGhvb2tzCisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CisKKyAgICAvLyBtdWx0aS1mb3JtYXQgdHJhY2sgaG9va3MKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB0cmFja19fTm9SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAorICAgICAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCk7CisKKyAgICAvLyBob29rIHR5cGVzCisgICAgZW51bSB7CisgICAgICAgIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICB9OworICAgIGVudW0geworICAgICAgICBUUkFDS1RZUEVfTk9QLAorICAgICAgICBUUkFDS1RZUEVfUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFLAorICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8sCisgICAgfTsKKworICAgIC8vIGZ1bmN0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgdGhlIHByb3BlciBwcm9jZXNzIGFuZCB0cmFjayBob29rcy4KKyAgICBzdGF0aWMgcHJvY2Vzc19ob29rX3QgZ2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CisgICAgc3RhdGljIGhvb2tfdCBnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNzZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIEJlaGF2aW9yIG9mIGlzX3NhbWU8Pjo6dmFsdWUgaXMgdHJ1ZSBpZiB0aGUgdHlwZXMgYXJlIGlkZW50aWNhbCwKKyAqIGZhbHNlIG90aGVyd2lzZS4gSWRlbnRpY2FsIHRvIHRoZSBTVEwgc3RkOjppc19zYW1lLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzX3NhbWUKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19zYW1lPFQsIFQ+ICAvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworCisvKiBNaXhNdWwgaXMgYSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRvciB0byBzY2FsZSBhbiBhdWRpbyBpbnB1dCBzaWduYWwKKyAqIGJ5IGEgdm9sdW1lIGdhaW4sIHdpdGggdGhlIGZvcm11bGE6CisgKgorICogTyh1dHB1dCkgPSBJKG5wdXQpICogVihvbHVtZSkKKyAqCisgKiBUaGUgb3V0cHV0LCBpbnB1dCwgYW5kIHZvbHVtZSBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuCisgKiBUaGVyZSBhcmUgMjcgdmFyaWFudHMsIG9mIHdoaWNoIDE0IGFyZSBhY3R1YWxseSBkZWZpbmVkIGluIGFuCisgKiBleHBsaWNpdGx5IHRlbXBsYXRlZCBjbGFzcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHR5cGUgdmFyaWFibGVzIGFuZCB0aGUgdW5kZXJseWluZyBtZWFuaW5nOgorICoKKyAqIE91dHB1dCB0eXBlICAgICAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQgWy0xLDFdCisgKiBJbnB1dCBzaWduYWwgdHlwZSBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0IFstMSwxXQorICogVm9sdW1lIHR5cGUgICAgICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQgWy0xLDFdCisgKgorICogRm9yIGhpZ2ggcHJlY2lzaW9uIGF1ZGlvLCBvbmx5IHRoZSA8VE8sIFRJLCBUVj4gPSA8ZmxvYXQsIGZsb2F0LCBmbG9hdD4KKyAqIG5lZWRzIHRvIGJlIGFjY2VsZXJhdGVkLiBUaGlzIGlzIHBlcmhhcHMgdGhlIGVhc2llc3QgZm9ybSB0byBkbyBxdWlja2x5IGFzIHdlbGwuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFY+CitpbmxpbmUgVE8gTWl4TXVsKFRJIHZhbHVlLCBUViB2b2x1bWUpIHsKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKGZhbHNlKTsKKyAgICAvLyBzaG91bGQgbm90IGJlIGhlcmUgOi0pLgorICAgIC8vIFRvIGF2b2lkIG1pc3Rha2VzLCB0aGlzIHRlbXBsYXRlIGlzIGFsd2F5cyBzcGVjaWFsaXplZC4KKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MTZfdD4oaW50MTZfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MTZfdD4oaW50MzJfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gKHZhbHVlID4+IDEyKSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PihpbnQxNl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqICh2b2x1bWUgPj4gMTYpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDMyX3Q+KGludDMyX3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuICh2YWx1ZSA+PiAxMikgKiAodm9sdW1lID4+IDE2KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQxNl90PihmbG9hdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MzJfdD4oZmxvYXQgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI4KTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBpbnQxNl90PihmbG9hdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KE1peE11bDxmbG9hdCwgZmxvYXQsIGludDE2X3Q+KHZhbHVlLCB2b2x1bWUpKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgaW50MzJfdD4oZmxvYXQgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQzMl90Pih2YWx1ZSwgdm9sdW1lKSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAoMTUgKyAxMikpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSkgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgaW50MTZfdCwgaW50MzJfdD4oaW50MTZfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDFVTEwgPDwgKDE1ICsgMjgpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSAqIHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQxNl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MzJfdCwgaW50MTZfdD4oaW50MzJfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MTZfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+KGludDE2X3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQzMl90LCBpbnQzMl90PihpbnQzMl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQzMl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKKy8qIFJlcXVpcmVkIGZvciBmbG9hdGluZyBwb2ludCB2b2x1bWUuICBTb21lIGFyZSBuZWVkZWQgZm9yIGNvbXBpbGF0aW9uIGJ1dAorICogYXJlIG5vdCBuZWVkZWQgaW4gZXhlY3V0aW9uIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbCBidWlsZCBieQorICogYW4gb3B0aW1pemluZyBjb21waWxlci4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBmbG9hdD4oZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZmxvYXRfZnJvbV9xXzE1ID0gMS4gLyAoMSA8PCAxNSk7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogZmxvYXRfZnJvbV9xXzE1OworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGZsb2F0PihpbnQzMl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHU0XzEyX2Zyb21fZmxvYXQgPSAoMSA8PCAxMik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogdTRfMTJfZnJvbV9mbG9hdDsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBmbG9hdD4oaW50MTZfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PiBSdW50aW1lIFNob3VsZCBub3QgYmUgaGVyZSIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgZmxvYXQ+KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcV8xNV9mcm9tX2Zsb2F0ID0gKDEgPDwgMTUpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIHFfMTVfZnJvbV9mbG9hdDsKK30KKworLyoKKyAqIE1peEFjY3VtIGlzIHVzZWQgdG8gYWRkIGludG8gYW4gYWNjdW11bGF0b3IgcmVnaXN0ZXIgb2YgYSBwb3NzaWJseSBkaWZmZXJlbnQKKyAqIHR5cGUuIFRoZSBUTyBhbmQgVEkgdHlwZXMgYXJlIHRoZSBzYW1lIGFzIE1peE11bC4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJPgoraW5saW5lIHZvaWQgTWl4QWNjdW0oVE8gKmF1eGFjY3VtLCBUSSB2YWx1ZSkgeworICAgIGlmICghaXNfc2FtZTxUTywgVEk+Ojp2YWx1ZSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhBY2N1bSB0eXBlIG5vdCBwcm9wZXJseSBzcGVjaWFsaXplZDogJXp1ICV6dVxuIiwKKyAgICAgICAgICAgICAgICBzaXplb2YoVE8pLCBzaXplb2YoVEkpKTsKKyAgICB9CisgICAgKmF1eGFjY3VtICs9IHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MTZfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQxNl90IHZhbHVlKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDE1KTsKKyAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MzJfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQzMl90IHZhbHVlKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI3KTsKKyAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxpbnQzMl90LCBpbnQxNl90PihpbnQzMl90ICphdXhhY2N1bSwgaW50MTZfdCB2YWx1ZSkgeworICAgICphdXhhY2N1bSArPSB2YWx1ZSA8PCAxMjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgTWl4QWNjdW08aW50MzJfdCwgZmxvYXQ+KGludDMyX3QgKmF1eGFjY3VtLCBmbG9hdCB2YWx1ZSkgeworICAgICphdXhhY2N1bSArPSBjbGFtcHE0XzI3X2Zyb21fZmxvYXQodmFsdWUpOworfQorCisvKiBNaXhNdWxBdXggaXMganVzdCBsaWtlIE1peE11bCBleGNlcHQgaXQgY29tYmluZXMgd2l0aAorICogYW4gYWNjdW11bGF0b3Igb3BlcmF0aW9uIE1peEFjY3VtLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQT4KK2lubGluZSBUTyBNaXhNdWxBdXgoVEkgdmFsdWUsIFRWIHZvbHVtZSwgVEEgKmF1eGFjY3VtKSB7CisgICAgTWl4QWNjdW08VEEsIFRJPihhdXhhY2N1bSwgdmFsdWUpOworICAgIHJldHVybiBNaXhNdWw8VE8sIFRJLCBUVj4odmFsdWUsIHZvbHVtZSk7Cit9CisKKy8qIE1JWFRZUEUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRoZSBzYW1wbGVzIGluIHRoZSBpbnB1dCBmcmFtZQorICogYXJlIG1peGVkIHdpdGggdm9sdW1lIGdhaW4gaW50byB0aGUgb3V0cHV0IGZyYW1lLgorICogU2VlIHRoZSB2b2x1bWVSYW1wTXVsdGkgZnVuY3Rpb25zIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgKi8KK2VudW0geworICAgIE1JWFRZUEVfTVVMVEksCisgICAgTUlYVFlQRV9NT05PRVhQQU5ELAorICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgTUlYVFlQRV9NVUxUSV9NT05PVk9MLAorICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCwKK307CisKKy8qCisgKiBUaGUgdm9sdW1lUmFtcE11bHRpIGFuZCB2b2x1bWVSYW1wIGZ1bmN0aW9ucyB0YWtlIGEgTUlYVFlQRQorICogd2hpY2ggaW5kaWNhdGVzIHRoZSBwZXItZnJhbWUgbWl4aW5nIGFuZCBhY2N1bXVsYXRpb24gc3RyYXRlZ3kuCisgKgorICogTUlYVFlQRV9NVUxUSToKKyAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICB2b2w6IHJlcHJlc2VudHMgYSB2b2x1bWUgYXJyYXkuCisgKgorICogICBUaGlzIGFjY3VtdWxhdGVzIGludG8gdGhlIG91dCBwb2ludGVyLgorICoKKyAqIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAqICAgU2luZ2xlIGlucHV0IGNoYW5uZWwuIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICBJbnB1dCBjaGFubmVsIGNvdW50IGlzIDEuCisgKiAgIHZvbDogcmVwcmVzZW50cyB2b2x1bWUgYXJyYXkuCisgKgorICogICBUaGlzIGFjY3VtdWxhdGVzIGludG8gdGhlIG91dCBwb2ludGVyLgorICoKKyAqIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgKiAgIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuCisgKiAgIFRPOiBpbnQxNl90IChRLjE1KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICB2b2w6IHJlcHJlc2VudHMgYSB2b2x1bWUgYXJyYXkuCisgKgorICogICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZIGRvZXMgbm90IGFjY3VtdWxhdGUgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICogICBTYW1lIGFzIE1JWFRZUEVfTVVMVEksIGJ1dCB1c2VzIG9ubHkgdm9sdW1lWzBdLgorICoKKyAqIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAqICAgU2FtZSBhcyBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBidXQgdXNlcyBvbmx5IHZvbHVtZVswXS4KKyAqCisgKi8KKwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitpbmxpbmUgdm9pZCB2b2x1bWVSYW1wTXVsdGkoVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgVFYgKnZvbCwgY29uc3QgVFYgKnZvbGluYywgVEFWICp2b2xhLCBUQVYgdm9sYWluYykKK3sKKyNpZmRlZiBBTE9HVlYKKyAgICBBTE9HVlYoInZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRTolZFxuIiwgTUlYVFlQRSk7CisjZW5kaWYKKyAgICBpZiAoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVEEgYXV4YWNjdW0gPSAwOworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbiwgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1eGFjY3VtIC89IE5DSEFOOworICAgICAgICAgICAgKmF1eCsrICs9IE1peE11bDxUQSwgVEEsIFRBVj4oYXV4YWNjdW0sICp2b2xhKTsKKyAgICAgICAgICAgIHZvbGFbMF0gKz0gdm9sYWluYzsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4sIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0KK30KKwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitpbmxpbmUgdm9pZCB2b2x1bWVNdWx0aShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBjb25zdCBUViAqdm9sLCBUQVYgdm9sYSkKK3sKKyNpZmRlZiBBTE9HVlYKKyAgICBBTE9HVlYoInZvbHVtZU11bHRpIE1JWFRZUEU6JWRcbiIsIE1JWFRZUEUpOworI2VuZGlmCisgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFRBIGF1eGFjY3VtID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4sIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1eGFjY3VtIC89IE5DSEFOOworICAgICAgICAgICAgKmF1eCsrICs9IE1peE11bDxUQSwgVEEsIFRBVj4oYXV4YWNjdW0sIHZvbGEpOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbiwgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9Cit9CisKK307CisKKyNlbmRpZiAvKiBBTkRST0lEX0FVRElPX01JWEVSX09QU19IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWE1MzI0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCi0jdW5kZWYgX19TVFJJQ1RfQU5TSV9fCi0jZGVmaW5lIF9fU1RESU5UX0xJTUlUUwotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciBrQ21kRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kIHRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKLQotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKLQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga0F1ZGlvQ29tbWFuZFRpbWVvdXQgPSAzMDAwMDAwMDAwTEw7IC8vIDMgc2Vjb25kcwotCi1uYW1lc3BhY2UgewotICAgIGV4dGVybiBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKLSAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpICwgbXBBdWRpb1BvbGljeShOVUxMKQotewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZTsKLSAgICBpbnQgZm9yY2VkX3ZhbDsKLSAgICBpbnQgcmM7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOwotICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwotICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZAotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1PdXRwdXQiKSwgdGhpcyk7Ci0gICAgLyogaW5zdGFudGlhdGUgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyICovCi0gICAgcmMgPSBod19nZXRfbW9kdWxlKEFVRElPX1BPTElDWV9IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBhdWRpb19wb2xpY3lfZGV2X29wZW4obW9kdWxlLCAmbXBBdWRpb1BvbGljeURldik7Ci0gICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBvcGVuIGF1ZGlvIHBvbGljeSBkZXZpY2UgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBtcEF1ZGlvUG9saWN5RGV2LT5jcmVhdGVfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsICZhcHNfb3BzLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBBdWRpb1BvbGljeSk7Ci0gICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBjcmVhdGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJjID0gbXBBdWRpb1BvbGljeS0+aW5pdF9jaGVjayhtcEF1ZGlvUG9saWN5KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBTE9HSSgiTG9hZGVkIGF1ZGlvIHBvbGljeSBmcm9tICVzICglcykiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+aWQpOwotCi0gICAgLy8gbG9hZCBhdWRpbyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCi0gICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRQcmVQcm9jZXNzb3JDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7Ci0gICAgfQotfQotCi1BdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQuY2xlYXIoKTsKLQotCi0gICAgLy8gcmVsZWFzZSBhdWRpbyBwcmUgcHJvY2Vzc2luZyByZXNvdXJjZXMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1JbnB1dFNvdXJjZXMudmFsdWVBdChpKTsKLSAgICB9Ci0gICAgbUlucHV0U291cmNlcy5jbGVhcigpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+bUVmZmVjdHMuY2xlYXIoKTsKLSAgICAgICAgZGVsZXRlIG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICB9Ci0gICAgbUlucHV0cy5jbGVhcigpOwotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgIT0gTlVMTCAmJiBtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpCi0gICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOwotICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpCi0gICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfY2xvc2UobXBBdWRpb1BvbGljeURldik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKLSAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKLX0KLQotYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKLQotICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKLSAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5zZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlLCBjb25maWcpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXQobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKLXsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3Bfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQpOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKLSAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKLQotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKLSAgICBhdWRpb19zb3VyY2VfdCBhbGlhc1NvdXJjZSA9IChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIDogaW5wdXRTb3VyY2U7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KGFsaWFzU291cmNlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0gICAgc3NpemVfdCBpZHggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIElucHV0RGVzYyAqaW5wdXREZXNjOwotICAgIGlmIChpZHggPCAwKSB7Ci0gICAgICAgIGlucHV0RGVzYyA9IG5ldyBJbnB1dERlc2MoYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7Ci0gICAgfQotCi0gICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIGlucHV0ICVkIiwgZWZmZWN0LT5tTmFtZSwgaW5wdXQpOwotICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0LT5tUGFyYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBmeC0+c2V0UGFyYW1ldGVyKGVmZmVjdC0+bVBhcmFtc1tqXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXREZXNjLT5tRWZmZWN0cy5hZGQoZngpOwotICAgIH0KLSAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgdHJ1ZSk7Ci0gICAgcmV0dXJuIGlucHV0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSW5wdXREZXNjICppbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIHNldFByZVByb2Nlc3NvckVuYWJsZWQoaW5wdXREZXNjLCBmYWxzZSk7Ci0gICAgZGVsZXRlIGlucHV0RGVzYzsKLSAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOwotfQotCi0vL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlc19mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dF9mb3JfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+cmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT51bnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2VmZmVjdF9lbmFibGVkKG1wQXVkaW9Qb2xpY3ksIGlkLCBlbmFibGVkKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZV9yZW1vdGVseShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3NvdXJjZV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc291cmNlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQotewotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIHNpemVfdCBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAobUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bVNlc3Npb25JZCA9PSBhdWRpb1Nlc3Npb24pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSBtSW5wdXRzLnNpemUoKSkgewotICAgICAgICAqY291bnQgPSAwOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3RzW2ldLT5kZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChpIDwgKmNvdW50KSB7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yc1tpXSA9IGRlc2M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7Ci0gICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKLSAgICB9Ci0gICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewotICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7Ci19Ci0KLXN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQotewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wSW50ZXJuYWxzKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBvbGljeU1hbmFnZXIgSW50ZXJmYWNlOiAlcFxuIiwgbXBBdWRpb1BvbGljeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKLSAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7Ci0gICAgICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrRGVhZGxvY2tlZFN0cmluZyk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGR1bXBJbnRlcm5hbHMoZmQpOwotICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtcEF1ZGlvUG9saWN5KSB7Ci0gICAgICAgICAgICBtcEF1ZGlvUG9saWN5LT5kdW1wKG1wQXVkaW9Qb2xpY3ksIGZkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAiY2FuJ3QgZHVtcCBBdWRpb1BvbGljeVNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFByZVByb2Nlc3NvckVuYWJsZWQoY29uc3QgSW5wdXREZXNjICppbnB1dERlc2MsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBjb25zdCBWZWN0b3I8c3A8QXVkaW9FZmZlY3Q+ID4gJmZ4VmVjdG9yID0gaW5wdXREZXNjLT5tRWZmZWN0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZ4VmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGZ4VmVjdG9yLml0ZW1BdChpKS0+c2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5BdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKLSAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQotewotICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci19Ci0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6On5BdWRpb0NvbW1hbmRUaHJlYWQoKQotewotICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3Qgaz0wOyBrIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0NvbW1hbmRzW2tdLT5tUGFyYW07Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9Db21tYW5kc1trXTsKLSAgICB9Ci0gICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4obU5hbWUuc3RyaW5nKCksIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBuc2Vjc190IHdhaXRUaW1lID0gSU5UNjRfTUFYOwotCi0gICAgbUxvY2subG9jaygpOwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBuc2Vjc190IGN1clRpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogZXhlY3V0ZSB0aGVtIGZyb20gaW5kZXggMCBhbmQgdXAKLSAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgPD0gY3VyVGltZSkgewotICAgICAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG1BdWRpb0NvbW1hbmRzWzBdOwotICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9ICpjb21tYW5kOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIHRvbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZUdlbmVyYXRvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVZvbHVtZSwgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXRSZWxhdGl2ZShtTG9jaywga0F1ZGlvQ29tbWFuZFRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewotICAgICAgICAgICAgICAgICAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IChTdG9wT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbGV0ZSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gSU5UNjRfTUFYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3YWl0VGltZSA9IG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSAtIGN1clRpbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jawotICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7Ci0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdFRpbWUpOwotICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgd2FraW5nIHVwIik7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Db21tYW5kVGhyZWFkICVwIER1bXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7Ci0gICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdDIuc3RyaW5nKCksIHJlc3VsdDIuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIENvbW1hbmRzOlxuIik7Ci0gICAgcmVzdWx0ID0gU3RyaW5nOChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgIENvbW1hbmQgVGltZSAgICAgICAgV2FpdCBwUGFyYW1cbiIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUF1ZGlvQ29tbWFuZHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCIgIExhc3QgQ29tbWFuZFxuIik7Ci0gICAgbUxhc3RDb21tYW5kLmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIFRvbmVEYXRhICpkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gTlVMTDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPTFVNRTsKLSAgICBWb2x1bWVEYXRhICpkYXRhID0gbmV3IFZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1Wb2x1bWUgPSB2b2x1bWU7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1BBUkFNRVRFUlM7Ci0gICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSBuZXcgUGFyYW1ldGVyc0RhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBpb0hhbmRsZTsKLSAgICBkYXRhLT5tS2V5VmFsdWVQYWlycyA9IFN0cmluZzgoa2V5VmFsdWVQYWlycyk7Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCBwYXJhbWV0ZXIgc3RyaW5nICVzLCBpbyAlZCAsZGVsYXkgJWQiLAotICAgICAgICAgICAga2V5VmFsdWVQYWlycywgaW9IYW5kbGUsIGRlbGF5TXMpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgc3RhdHVzID0gIGNvbW1hbmQtPm1TdGF0dXM7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0KLSAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTRVRfVk9JQ0VfVk9MVU1FOwotICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IG5ldyBWb2ljZVZvbHVtZURhdGEoKTsKLSAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsIHZvbHVtZSk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwotICAgICAgICBzdGF0dXMgPSAgY29tbWFuZC0+bVN0YXR1czsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7Ci0gICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfT1VUUFVUOwotICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gbmV3IFJlbGVhc2VPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci19Ci0KLS8vIGluc2VydENvbW1hbmRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6aW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMpCi17Ci0gICAgc3NpemVfdCBpOyAgLy8gbm90IHNpemVfdCBiZWNhdXNlIGkgd2lsbCBjb3VudCBkb3duIHRvIC0xCi0gICAgVmVjdG9yIDxBdWRpb0NvbW1hbmQgKj4gcmVtb3ZlZENvbW1hbmRzOwotICAgIGNvbW1hbmQtPm1UaW1lID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKGRlbGF5TXMpOwotCi0gICAgLy8gYWNxdWlyZSB3YWtlIGxvY2sgdG8gbWFrZSBzdXJlIGRlbGF5ZWQgY29tbWFuZHMgYXJlIHByb2Nlc3NlZAotICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIG1OYW1lLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBzYW1lIHBlbmRpbmcgY29tbWFuZHMgd2l0aCBsYXRlciB0aW1lIHN0YW1wcyBhbmQgZWxpbWluYXRlIHRoZW0KLSAgICBmb3IgKGkgPSBtQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgQXVkaW9Db21tYW5kICpjb21tYW5kMiA9IG1BdWRpb0NvbW1hbmRzW2ldOwotICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogbm8gbmVlZCB0byBzY2FuIHRoZSByZXN0IG9mIG1BdWRpb0NvbW1hbmRzCi0gICAgICAgIGlmIChjb21tYW5kMi0+bVRpbWUgPD0gY29tbWFuZC0+bVRpbWUpIGJyZWFrOwotICAgICAgICBpZiAoY29tbWFuZDItPm1Db21tYW5kICE9IGNvbW1hbmQtPm1Db21tYW5kKSBjb250aW51ZTsKLQotICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEyID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZDItPm1QYXJhbTsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7Ci0gICAgICAgICAgICBBTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwKLSAgICAgICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtMiA9IEF1ZGlvUGFyYW1ldGVyKGRhdGEyLT5tS2V5VmFsdWVQYWlycyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhcmFtLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKLSAgICAgICAgICAgICAgICBwYXJhbS5nZXRBdChqLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBhcmFtMi5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTI7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUyOwotICAgICAgICAgICAgICAgICAgICBwYXJhbTIuZ2V0QXQoaywga2V5MiwgdmFsdWUyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleTIgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIucmVtb3ZlKGtleTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgcGFyYW1ldGVyICVzIiwga2V5Mi5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIGFsbCBrZXlzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQsIHJlbW92ZSB0aGUgY29tbWFuZC4KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXBkYXRlIHRoZSBrZXkgdmFsdWUgcGFpcnMKLSAgICAgICAgICAgIGlmIChwYXJhbTIuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YTItPm1LZXlWYWx1ZVBhaXJzID0gcGFyYW0yLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKLSAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKLSAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCi0gICAgICAgICAgICBkZWxheU1zID0gMTsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKLSAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEyID0gKFZvbHVtZURhdGEgKiljb21tYW5kMi0+bVBhcmFtOwotICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKLSAgICAgICAgICAgIGlmIChkYXRhLT5tU3RyZWFtICE9IGRhdGEyLT5tU3RyZWFtKSBicmVhazsKLSAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOwotICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7Ci0gICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCi0gICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAotICAgICAgICAgICAgZGVsYXlNcyA9IDE7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBUlRfVE9ORToKLSAgICAgICAgY2FzZSBTVE9QX1RPTkU6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHJlbW92ZSBmaWx0ZXJlZCBjb21tYW5kcwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVtb3ZlZENvbW1hbmRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIC8vIHJlbW92ZWQgY29tbWFuZHMgYWx3YXlzIGhhdmUgdGltZSBzdGFtcHMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgY29tbWFuZAotICAgICAgICBmb3IgKHNpemVfdCBrID0gaSArIDE7IGsgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzW2tdID09IHJlbW92ZWRDb21tYW5kc1tqXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdXBwcmVzc2luZyBjb21tYW5kOiAlZCIsIG1BdWRpb0NvbW1hbmRzW2tdLT5tQ29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBmaWx0ZXJlZCwKLSAgICAgICAgICAgICAgICAvLyBjb21tYW5kLT5tUGFyYW0gaXMgZGVsZXRlZCBpbiB0aHJlYWRMb29wCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0NvbW1hbmRzW2tdLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0NvbW1hbmRzW2tdOwotICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KGspOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJlbW92ZWRDb21tYW5kcy5jbGVhcigpOwotCi0gICAgLy8gd2FpdCBmb3Igc3RhdHVzIG9ubHkgaWYgZGVsYXkgaXMgMAotICAgIGlmIChkZWxheU1zID09IDApIHsKLSAgICAgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gaW5zZXJ0IGNvbW1hbmQgYXQgdGhlIHJpZ2h0IHBsYWNlIGFjY29yZGluZyB0byBpdHMgdGltZSBzdGFtcAotICAgIEFMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsCi0gICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgKGludClpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7Ci0gICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkKLXsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0Iik7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXF1ZXN0RXhpdCgpOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZDo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwMmQgICAgICAlMDZkLiUwM2QgICUwMXUgICAgJXBcbiIsCi0gICAgICAgICAgICBtQ29tbWFuZCwKLSAgICAgICAgICAgIChpbnQpbnMycyhtVGltZSksCi0gICAgICAgICAgICAoaW50KW5zMm1zKG1UaW1lKSUxMDAwLAotICAgICAgICAgICAgbVdhaXRTdGF0dXMsCi0gICAgICAgICAgICBtUGFyYW0pOwotfQotCi0vKioqKioqKiBoZWxwZXJzIGZvciB0aGUgc2VydmljZV9vcHMgY2FsbGJhY2tzIGRlZmluZWQgYmVsb3cgKioqKioqKioqLwotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCi17Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoc3RyZWFtLCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKQotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCi17Ci0gICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigibXBBdWRpb1BvbGljeSA9PSBOVUxMIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfb2ZmbG9hZF9zdXBwb3J0ZWQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiSEFMIGRvZXMgbm90IGltcGxlbWVudCBpc19vZmZsb2FkX3N1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkKG1wQXVkaW9Qb2xpY3ksICZpbmZvKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW8gcHJlLXByb2Nlc3NpbmcgY29uZmlndXJhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BvbGljeVNlcnZpY2U6OmtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdID0gewotICAgIE1JQ19TUkNfVEFHLAotICAgIFZPSUNFX1VMX1NSQ19UQUcsCi0gICAgVk9JQ0VfRExfU1JDX1RBRywKLSAgICBWT0lDRV9DQUxMX1NSQ19UQUcsCi0gICAgQ0FNQ09SREVSX1NSQ19UQUcsCi0gICAgVk9JQ0VfUkVDX1NSQ19UQUcsCi0gICAgVk9JQ0VfQ09NTV9TUkNfVEFHCi19OwotCi0vLyByZXR1cm5zIHRoZSBhdWRpb19zb3VyY2VfdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSBuYW1lIG9yCi0vLyBBVURJT19TT1VSQ0VfQ05UIGlzIG5vIG1hdGNoIGZvdW5kCi1hdWRpb19zb3VyY2VfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IEFVRElPX1NPVVJDRV9NSUM7IGkgPCBBVURJT19TT1VSQ0VfQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrSW5wdXRTb3VyY2VOYW1lc1tpIC0gQVVESU9fU09VUkNFX01JQ10pID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJpbnB1dFNvdXJjZU5hbWVUb0VudW0gZm91bmQgc291cmNlICVzICVkIiwgbmFtZSwgaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGF1ZGlvX3NvdXJjZV90KWk7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKLXsKLSAgICAvLyAqY3VyU2l6ZSBpcyBhdCBsZWFzdCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpCi0gICAgc2l6ZV90IHBvcyA9ICgoKmN1clNpemUgLSAxICkgLyBzaXplICsgMSkgKiBzaXplOwotCi0gICAgaWYgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgewotICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKLSAgICB9Ci0gICAgKmN1clNpemUgPSBwb3MgKyBzaXplOwotICAgIHJldHVybiBwb3M7Ci19Ci0KLXNpemVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCi17Ci0gICAgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU0hPUlRfVEFHLCBzaXplb2YoU0hPUlRfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihzaG9ydCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKHNob3J0KWF0b2kobm9kZS0+dmFsdWUpOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHNob3J0ICVkIiwgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2Yoc2hvcnQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBJTlRfVEFHLCBzaXplb2YoSU5UX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoaW50KSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gYXRvaShub2RlLT52YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgaW50ICVkIiwgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEZMT0FUX1RBRywgc2l6ZW9mKEZMT0FUX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoZmxvYXQpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChmbG9hdClhdG9mKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBmbG9hdCAlZiIsKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7Ci0gICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBCT09MX1RBRywgc2l6ZW9mKEJPT0xfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihib29sKSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzdHJuY21wKG5vZGUtPnZhbHVlLCAiZmFsc2UiLCBzdHJsZW4oImZhbHNlIikgKyAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBib29sICVzIiwqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihib29sKTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU1RSSU5HX1RBRywgc2l6ZW9mKFNUUklOR19UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgbGVuID0gc3Rybmxlbihub2RlLT52YWx1ZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKTsKLSAgICAgICAgaWYgKCpjdXJTaXplICsgbGVuICsgMSA+ICp0b3RTaXplKSB7Ci0gICAgICAgICAgICAqdG90U2l6ZSA9ICpjdXJTaXplICsgbGVuICsgMTsKLSAgICAgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybmNweShwYXJhbSArICpjdXJTaXplLCBub2RlLT52YWx1ZSwgbGVuKTsKLSAgICAgICAgKmN1clNpemUgKz0gbGVuOwotICAgICAgICBwYXJhbVsqY3VyU2l6ZV0gPSAnXDAnOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHN0cmluZyAlcyIsIHBhcmFtICsgKmN1clNpemUgLSBsZW4pOwotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgICBBTE9HVygicmVhZFBhcmFtVmFsdWUoKSB1bmtub3duIHBhcmFtIHR5cGUgJXMiLCBub2RlLT5uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotZWZmZWN0X3BhcmFtX3QgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqcGFyYW07Ci0gICAgY25vZGUgKnZhbHVlOwotICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KTsKLSAgICBzaXplX3QgdG90U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCk7Ci0gICAgZWZmZWN0X3BhcmFtX3QgKmZ4X3BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHRvdFNpemUpOwotCi0gICAgcGFyYW0gPSBjb25maWdfZmluZChyb290LCBQQVJBTV9UQUcpOwotICAgIHZhbHVlID0gY29uZmlnX2ZpbmQocm9vdCwgVkFMVUVfVEFHKTsKLSAgICBpZiAocGFyYW0gPT0gTlVMTCAmJiB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHRyeSB0byBwYXJzZSBzaW1wbGUgcGFyYW1ldGVyIGZvcm0ge2ludCBpbnR9Ci0gICAgICAgIHBhcmFtID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGF0IGEgcGFpciBvZiByYW5kb20gc3RyaW5ncyBpcyByZWFkIGFzIDAgMAotICAgICAgICAgICAgaW50ICpwdHIgPSAoaW50ICopZnhfcGFyYW0tPmRhdGE7Ci0gICAgICAgICAgICBpbnQgKnB0cjIgPSAoaW50ICopKChjaGFyICopcGFyYW0gKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKTsKLSAgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcHRyICVwIHB0cjIgJXAiLCBwdHIsIHB0cjIpOwotICAgICAgICAgICAgKnB0cisrID0gYXRvaShwYXJhbS0+bmFtZSk7Ci0gICAgICAgICAgICAqcHRyID0gYXRvaShwYXJhbS0+dmFsdWUpOwotICAgICAgICAgICAgZnhfcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICBmeF9wYXJhbS0+dnNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgIHJldHVybiBmeF9wYXJhbTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBmeF9wYXJhbS0+cHNpemUgPSAwOwotICAgIHBhcmFtID0gcGFyYW0tPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChwYXJhbSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgcGFyYW0gb2YgdHlwZSAlcyIsIHBhcmFtLT5uYW1lKTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZShwYXJhbSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBmeF9wYXJhbS0+cHNpemUgKz0gc2l6ZTsKLSAgICAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dDsKLSAgICB9Ci0KLSAgICAvLyBhbGlnbiBzdGFydCBvZiB2YWx1ZSBmaWVsZCBvbiAzMiBiaXQgYm91bmRhcnkKLSAgICBjdXJTaXplID0gKChjdXJTaXplIC0gMSApIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwotCi0gICAgZnhfcGFyYW0tPnZzaXplID0gMDsKLSAgICB2YWx1ZSA9IHZhbHVlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAodmFsdWUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHZhbHVlIG9mIHR5cGUgJXMiLCB2YWx1ZS0+bmFtZSk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUodmFsdWUsIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZnhfcGFyYW0tPnZzaXplICs9IHNpemU7Ci0gICAgICAgIHZhbHVlID0gdmFsdWUtPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZ4X3BhcmFtOwotCi1lcnJvcjoKLSAgICBmcmVlKGZ4X3BhcmFtKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcnMoKSBsb2FkaW5nIHBhcmFtICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpwYXJhbSA9IGxvYWRFZmZlY3RQYXJhbWV0ZXIobm9kZSk7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLUF1ZGlvUG9saWN5U2VydmljZTo6SW5wdXRTb3VyY2VEZXNjICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRJbnB1dFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNub2RlICpyb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlKCkgZW1wdHkgZWxlbWVudCAlcyIsIHJvb3QtPm5hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSW5wdXRTb3VyY2VEZXNjICpzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2VEZXNjKCk7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3RybmNtcChlZmZlY3RzW2ldLT5tTmFtZSwgbm9kZS0+bmFtZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZSgpIGZvdW5kIGVmZmVjdCAlcyBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gZWZmZWN0cy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBlZmZlY3QgJXMgbm90IGluIGxpc3QiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoKmVmZmVjdHNbaV0pOyAgIC8vIGRlZXAgY29weQotICAgICAgICBsb2FkRWZmZWN0UGFyYW1ldGVycyhub2RlLCBlZmZlY3QtPm1QYXJhbXMpOwotICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlKCkgYWRkaW5nIGVmZmVjdCAlcyB1dWlkICUwOHgiLCBlZmZlY3QtPm1OYW1lLCBlZmZlY3QtPm1VdWlkLnRpbWVMb3cpOwotICAgICAgICBzb3VyY2UtPm1FZmZlY3RzLmFkZChlZmZlY3QpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHNvdXJjZS0+bUVmZmVjdHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZSgpIG5vIHZhbGlkIGVmZmVjdHMgZm91bmQgaW4gc291cmNlICVzIiwgcm9vdC0+bmFtZSk7Ci0gICAgICAgIGRlbGV0ZSBzb3VyY2U7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc291cmNlOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRJbnB1dFNvdXJjZXMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFBSRVBST0NFU1NJTkdfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXRTb3VyY2VOYW1lVG9FbnVtKG5vZGUtPm5hbWUpOwotICAgICAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2VzKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZXMoKSBsb2FkaW5nIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBJbnB1dFNvdXJjZURlc2MgKmRlc2MgPSBsb2FkSW5wdXRTb3VyY2Uobm9kZSwgZWZmZWN0cyk7Ci0gICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpFZmZlY3REZXNjICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBVVUlEX1RBRyk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGlmIChBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKG5vZGUtPnZhbHVlLCAmdXVpZCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEVmZmVjdERlc2Mocm9vdC0+bmFtZSwgdXVpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEVGRkVDVFNfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RzKCkgbG9hZGluZyBlZmZlY3QgJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbG9hZEVmZmVjdChub2RlKTsKLSAgICAgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVmZmVjdHMuYWRkKGVmZmVjdCk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZFByZVByb2Nlc3NvckNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0czsKLSAgICBsb2FkRWZmZWN0cyhyb290LCBlZmZlY3RzKTsKLSAgICBsb2FkSW5wdXRTb3VyY2VzKHJvb3QsIGVmZmVjdHMpOwotCi0gICAgLy8gZGVsZXRlIGVmZmVjdHMgdG8gZml4IG1lbW9yeSBsZWFrLgotICAgIC8vIGFzIGVmZmVjdHMgaXMgbG9jYWwgdmFyIGFuZCB2YWxncmluZCB3b3VsZCB0cmVhdCB0aGlzIGFzIG1lbW9yeSBsZWFrCi0gICAgLy8gYW5kIGFsdGhvdWdoIGl0IG9ubHkgZGlkIGluIG1lZGlhc2VydmVyIGluaXQsIGJ1dCBmcmVlIGl0IGluIGNhc2UgbWVkaWFzZXJ2ZXIgcmVib290Ci0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBlZmZlY3RzW2ldOwotICAgIH0KLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSB0byB0aGUgcG9saWN5IG1hbmFnZXIgKi8KLWV4dGVybiAiQyIgewotCi0KLXN0YXRpYyBhdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5sb2FkSHdNb2R1bGUobmFtZSk7Ci19Ci0KLS8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUoKQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dCh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzKTsKLX0KLQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBhZi0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKTsKLX0KLQotc3RhdGljIGludCBhcHNfY2xvc2Vfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfcmVzdG9yZV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOwotfQotCi0vLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUoKSwgYW5kIGFjb3VzdGljcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcykKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+b3BlbklucHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Ci19Ci0KLXN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKLX0KLQotc3RhdGljIGludCBhcHNfY2xvc2VfaW5wdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5jbG9zZUlucHV0KGlucHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3N0cmVhbV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+c2V0U3RyZWFtT3V0cHV0KHN0cmVhbSwgb3V0cHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfbW92ZV9lZmZlY3RzKHZvaWQgKnNlcnZpY2UsIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjX291dHB1dCwgZHN0X291dHB1dCk7Ci19Ci0KLXN0YXRpYyBjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQotewotICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKLSAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGt2X3BhaXJzLCBkZWxheV9tcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zKTsKLX0KLQotc3RhdGljIGludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCi1zdGF0aWMgaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKLX0KLQotfTsgLy8gZXh0ZXJuICJDIgotCi1uYW1lc3BhY2UgewotICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wcyA9IHsKLSAgICAgICAgb3Blbl9vdXRwdXQgICAgICAgICAgIDogYXBzX29wZW5fb3V0cHV0LAotICAgICAgICBvcGVuX2R1cGxpY2F0ZV9vdXRwdXQgOiBhcHNfb3Blbl9kdXBfb3V0cHV0LAotICAgICAgICBjbG9zZV9vdXRwdXQgICAgICAgICAgOiBhcHNfY2xvc2Vfb3V0cHV0LAotICAgICAgICBzdXNwZW5kX291dHB1dCAgICAgICAgOiBhcHNfc3VzcGVuZF9vdXRwdXQsCi0gICAgICAgIHJlc3RvcmVfb3V0cHV0ICAgICAgICA6IGFwc19yZXN0b3JlX291dHB1dCwKLSAgICAgICAgb3Blbl9pbnB1dCAgICAgICAgICAgIDogYXBzX29wZW5faW5wdXQsCi0gICAgICAgIGNsb3NlX2lucHV0ICAgICAgICAgICA6IGFwc19jbG9zZV9pbnB1dCwKLSAgICAgICAgc2V0X3N0cmVhbV92b2x1bWUgICAgIDogYXBzX3NldF9zdHJlYW1fdm9sdW1lLAotICAgICAgICBzZXRfc3RyZWFtX291dHB1dCAgICAgOiBhcHNfc2V0X3N0cmVhbV9vdXRwdXQsCi0gICAgICAgIHNldF9wYXJhbWV0ZXJzICAgICAgICA6IGFwc19zZXRfcGFyYW1ldGVycywKLSAgICAgICAgZ2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX2dldF9wYXJhbWV0ZXJzLAotICAgICAgICBzdGFydF90b25lICAgICAgICAgICAgOiBhcHNfc3RhcnRfdG9uZSwKLSAgICAgICAgc3RvcF90b25lICAgICAgICAgICAgIDogYXBzX3N0b3BfdG9uZSwKLSAgICAgICAgc2V0X3ZvaWNlX3ZvbHVtZSAgICAgIDogYXBzX3NldF92b2ljZV92b2x1bWUsCi0gICAgICAgIG1vdmVfZWZmZWN0cyAgICAgICAgICA6IGFwc19tb3ZlX2VmZmVjdHMsCi0gICAgICAgIGxvYWRfaHdfbW9kdWxlICAgICAgICA6IGFwc19sb2FkX2h3X21vZHVsZSwKLSAgICAgICAgb3Blbl9vdXRwdXRfb25fbW9kdWxlIDogYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSwKLSAgICAgICAgb3Blbl9pbnB1dF9vbl9tb2R1bGUgIDogYXBzX29wZW5faW5wdXRfb25fbW9kdWxlLAotICAgIH07Ci19OyAvLyBuYW1lc3BhY2UgPHVubmFtZWQ+Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODE2MGYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6Ci0gICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsCi0vLyAgICBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UsCi0gICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Ci17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPjsKLQotcHVibGljOgotICAgIC8vIGZvciBCaW5kZXJTZXJ2aWNlCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNlcnZpY2VOYW1lKCkgQU5EUk9JRF9BUEkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX3BvbGljeSI7IH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgLy8KLSAgICAvLyBCbkF1ZGlvUG9saWN5U2VydmljZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQotICAgIC8vCi0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gMCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi0gICAgLy8KLSAgICAvLyBIZWxwZXJzIGZvciB0aGUgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdAotICAgIC8vIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgcG9saWN5IHNlcnZpY2UuCi0gICAgLy8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvUG9saWN5U2VydmljZSgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBkdW1wSW50ZXJuYWxzKGludCBmZCk7Ci0KLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCi0gICAgLy8gRm9yIGF1ZGlvIGNvbmZpZyBjb21tYW5kcywgaXQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYXVkaW8gZmxpbmdlciByZXF1aXJlcyB0aGF0IHRoZSBjYWxsaW5nCi0gICAgLy8gcHJvY2VzcyAodXNlcikgaGFzIHBlcm1pc3Npb24gdG8gbW9kaWZ5IGF1ZGlvIHNldHRpbmdzLgotICAgIGNsYXNzIEF1ZGlvQ29tbWFuZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmQ7Ci0gICAgcHVibGljOgotCi0gICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCi0gICAgICAgICAgICBTRVRfVk9MVU1FLAotICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCi0gICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLAotICAgICAgICAgICAgU1RPUF9PVVRQVVQsCi0gICAgICAgICAgICBSRUxFQVNFX09VVFBVVAotICAgICAgICB9OwotCi0gICAgICAgIEF1ZGlvQ29tbWFuZFRocmVhZCAoU3RyaW5nOCBuYW1lLCBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKTsKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Db21tYW5kVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0gICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLQotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wVG9uZUNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHBhcmFtZXRlcnNDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2ljZVZvbHVtZUNvbW1hbmQoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7Ci0KLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgcmVxdWVzdGVkIHRvbmUgcGxheWJhY2sgZXZlbnQKLSAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kIHsKLQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0NvbW1hbmQoKQotICAgICAgICAgICAgOiBtQ29tbWFuZCgtMSkge30KLQotICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgotICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKLSAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCi0gICAgICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBjb21tYW5kIHN0YXR1cwotICAgICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBjYWxsZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCi0gICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhICptUGFyYW07ICAgICAvLyBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvQ29tbWFuZERhdGEoKSB7fQotICAgICAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBmbG9hdCBtVm9sdW1lOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFBhcmFtZXRlcnNEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFZvaWNlVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgaW50IG1TZXNzaW9uOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFJlbGVhc2VPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgIH07Ci0KLSAgICAgICAgTXV0ZXggICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwotICAgICAgICBWZWN0b3IgPEF1ZGlvQ29tbWFuZCAqPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgotICAgICAgICBBdWRpb0NvbW1hbmQgbUxhc3RDb21tYW5kOyAgICAgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCi0gICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCi0gICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7Ci0gICAgfTsKLQotICAgIGNsYXNzIEVmZmVjdERlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAobmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCkgeyB9Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgotICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBzaXplIGFuZCB2c2l6ZSBhcmUgcm91bmRlZCB1cCB0byBhbiBpbnQgYm91bmRhcnkgZm9yIGFsbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9yaWdTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT5wc2l6ZSArIDMpICYgfjMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmlnUGFyYW0tPnZzaXplICsgMykgJiB+Myk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpkdXBQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2Mob3JpZ1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHVwUGFyYW0sIG9yaWdQYXJhbSwgb3JpZ1NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIHBhcmFtIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGFsc28gZG9uZSBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZXMgb2YgNCBieXRlcyBvcmlnaW5hbGx5LiBJbiB0aGVvcnkgd2Ugc2hvdWxkIG1lbWNweSBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcGFyYW0gc2l6ZSwgdGhhdCBpcyB3aXRob3V0IHJvdW5kaW5nIHZzaXplLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLmFkZChkdXBQYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0RGVzYygpIHsKLSAgICAgICAgICAgIGZyZWUobU5hbWUpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtUGFyYW1zLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtUGFyYW1zW2tdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGFyICptTmFtZTsKLSAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKLSAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOwotICAgIH07Ci0KLSAgICBjbGFzcyBJbnB1dFNvdXJjZURlc2MgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW5wdXRTb3VyY2VEZXNjKCkge30KLSAgICAgICAgLyp2aXJ0dWFsKi8gfklucHV0U291cmNlRGVzYygpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUVmZmVjdHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbUVmZmVjdHNbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IG1FZmZlY3RzOwotICAgIH07Ci0KLQotICAgIGNsYXNzIElucHV0RGVzYyB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnB1dERlc2MoaW50IHNlc3Npb24pIDogbVNlc3Npb25JZChzZXNzaW9uKSB7fQotICAgICAgICAvKnZpcnR1YWwqLyB+SW5wdXREZXNjKCkge30KLSAgICAgICAgY29uc3QgaW50IG1TZXNzaW9uSWQ7Ci0gICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID5tRWZmZWN0czsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXTsKLQotICAgIHZvaWQgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChjb25zdCBJbnB1dERlc2MgKmlucHV0RGVzYywgYm9vbCBlbmFibGVkKTsKLSAgICBzdGF0dXNfdCBsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHN0YXR1c190IGxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIEVmZmVjdERlc2MgKmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpOwotICAgIHN0YXR1c190IGxvYWRJbnB1dFNvdXJjZXMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2VOYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIElucHV0U291cmNlRGVzYyAqbG9hZElucHV0U291cmNlKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOwotICAgIHZvaWQgbG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcyk7Ci0gICAgZWZmZWN0X3BhcmFtX3QgKmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpOwotICAgIHNpemVfdCByZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKLSAgICBzaXplX3QgZ3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKLQotICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgotICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7Ci0KLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwotICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgSW5wdXRTb3VyY2VEZXNjKiA+IG1JbnB1dFNvdXJjZXM7Ci0gICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBJbnB1dERlc2MqID4gbUlucHV0czsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCBlNWNjZWIxLi4xZjdhNjEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTIyLDkgKzIyLDExIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jLmgiCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJDdWJpYy5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRHluLmgiCiAKICNpZmRlZiBfX2FybV9fCiAjaW5jbHVkZSA8bWFjaGluZS9jcHUtZmVhdHVyZXMuaD4KQEAgLTM5LDggKzQxLDggQEAKIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJPcmRlcjEgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotICAgIEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKLSAgICAgICAgQXVkaW9SZXNhbXBsZXIoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBMT1dfUVVBTElUWSksIG1YMEwoMCksIG1YMFIoMCkgeworICAgIEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBMT1dfUVVBTElUWSksIG1YMEwoMCksIG1YMFIoMCkgewogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKQEAgLTc3LDYgKzc5LDkgQEAKICAgICBpbnQgbVgwUjsKIH07CiAKKy8qc3RhdGljKi8KK2NvbnN0IGRvdWJsZSBBdWRpb1Jlc2FtcGxlcjo6a1BoYXNlTXVsdGlwbGllciA9IDFMIDw8IEF1ZGlvUmVzYW1wbGVyOjprTnVtUGhhc2VCaXRzOworCiBib29sIEF1ZGlvUmVzYW1wbGVyOjpxdWFsaXR5SXNTdXBwb3J0ZWQoc3JjX3F1YWxpdHkgcXVhbGl0eSkKIHsKICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKQEAgLTg1LDYgKzkwLDkgQEAKICAgICBjYXNlIE1FRF9RVUFMSVRZOgogICAgIGNhc2UgSElHSF9RVUFMSVRZOgogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDUsNyArMTEzLDcgQEAKICAgICAgICAgaWYgKCplbmRwdHIgPT0gJ1wwJykgewogICAgICAgICAgICAgZGVmYXVsdFF1YWxpdHkgPSAoc3JjX3F1YWxpdHkpIGw7CiAgICAgICAgICAgICBBTE9HRCgiZm9yY2luZyBBdWRpb1Jlc2FtcGxlciBxdWFsaXR5IHRvICVkIiwgZGVmYXVsdFF1YWxpdHkpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRRdWFsaXR5IDwgREVGQVVMVF9RVUFMSVRZIHx8IGRlZmF1bHRRdWFsaXR5ID4gVkVSWV9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0UXVhbGl0eSA8IERFRkFVTFRfUVVBTElUWSB8fCBkZWZhdWx0UXVhbGl0eSA+IERZTl9ISUdIX1FVQUxJVFkpIHsKICAgICAgICAgICAgICAgICBkZWZhdWx0UXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI1LDYgKzEzMywxMiBAQAogICAgICAgICByZXR1cm4gMjA7CiAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKICAgICAgICAgcmV0dXJuIDM0OworICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICAgICAgcmV0dXJuIDY7CisgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgorICAgICAgICByZXR1cm4gMTI7CiAgICAgfQogfQogCkBAIC0xMzIsNyArMTQ2LDcgQEAKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogc3RhdGljIHVpbnQzMl90IGN1cnJlbnRNSHogPSAwOwogCi1BdWRpb1Jlc2FtcGxlciogQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKK0F1ZGlvUmVzYW1wbGVyKiBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpIHsKIAogICAgIGJvb2wgYXRGaW5hbFF1YWxpdHk7CkBAIC0xNDgsNiArMTYyLDE2IEBACiAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvKiBpZiB0aGUgY2FsbGVyIHJlcXVlc3RzIERFRkFVTFRfUVVBTElUWSBhbmQgYWYucmVzYW1wbGVyLnByb3BlcnR5CisgICAgICogaGFzIG5vdCBiZWVuIHNldCwgdGhlIHRhcmdldCByZXNhbXBsZXIgcXVhbGl0eSBpcyBzZXQgdG8gRFlOX01FRF9RVUFMSVRZLAorICAgICAqIGFuZCBhbGxvd2VkIHRvICJ0aHJvdHRsZSIgZG93biB0byBEWU5fTE9XX1FVQUxJVFkgaWYgbmVjZXNzYXJ5CisgICAgICogZHVlIHRvIGVzdGltYXRlZCBDUFUgbG9hZCBvZiBoYXZpbmcgdG9vIG1hbnkgYWN0aXZlIHJlc2FtcGxlcnMKKyAgICAgKiAodGhlIGNvZGUgYmVsb3cgdGhlIGlmKS4KKyAgICAgKi8KKyAgICBpZiAocXVhbGl0eSA9PSBERUZBVUxUX1FVQUxJVFkpIHsKKyAgICAgICAgcXVhbGl0eSA9IERZTl9NRURfUVVBTElUWTsKKyAgICB9CisKICAgICAvLyBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBDUFUgbG9hZCB0aHJvdHRsaW5nIGRvZXNuJ3QgYWNjb3VudCBmb3Igd2hldGhlciByZXNhbXBsZXIgaXMgYWN0aXZlCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7CiAgICAgZm9yICg7OykgewpAQCAtMTYyLDcgKzE4Niw2IEBACiAgICAgICAgIC8vIG5vdCBlbm91Z2ggQ1BVIGF2YWlsYWJsZSBmb3IgcHJvcG9zZWQgcXVhbGl0eSBsZXZlbCwgc28gdHJ5IG5leHQgbG93ZXN0IGxldmVsCiAgICAgICAgIHN3aXRjaCAocXVhbGl0eSkgewogICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlIERFRkFVTFRfUVVBTElUWToKICAgICAgICAgY2FzZSBMT1dfUVVBTElUWToKICAgICAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc1LDYgKzE5OCwxNSBAQAogICAgICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICAgICAgcXVhbGl0eSA9IEhJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICAgICAgICAgIGF0RmluYWxRdWFsaXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICAgICAgICAgIHF1YWxpdHkgPSBEWU5fTE9XX1FVQUxJVFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgorICAgICAgICAgICAgcXVhbGl0eSA9IERZTl9NRURfUVVBTElUWTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CkBAIC0xODMsMjIgKzIxNSw0MyBAQAogCiAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgZGVmYXVsdDoKLSAgICBjYXNlIERFRkFVTFRfUVVBTElUWToKICAgICBjYXNlIExPV19RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIGxpbmVhciBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyT3JkZXIxKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBjdWJpYyBSZXNhbXBsZXIiKTsKLSAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyQ3ViaWMoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSElHSF9RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIEhJR0hfUVVBTElUWSBzaW5jIFJlc2FtcGxlciIpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgVkVSWV9ISUdIX1FVQUxJVFkgc2luYyBSZXNhbXBsZXIgPSAlZCIsIHF1YWxpdHkpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyU2luYyhpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgIGNhc2UgRFlOX0hJR0hfUVVBTElUWToKKyAgICAgICAgQUxPR1YoIkNyZWF0ZSBkeW5hbWljIFJlc2FtcGxlciA9ICVkIiwgcXVhbGl0eSk7CisgICAgICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgIGlmIChxdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJEeW48aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD4oaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gbmV3IEF1ZGlvUmVzYW1wbGVyRHluPGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+KGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yMDcsMjYgKzI2MCwyNiBAQAogICAgIHJldHVybiByZXNhbXBsZXI7CiB9CiAKLUF1ZGlvUmVzYW1wbGVyOjpBdWRpb1Jlc2FtcGxlcihpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKK0F1ZGlvUmVzYW1wbGVyOjpBdWRpb1Jlc2FtcGxlcihpbnQgaW5DaGFubmVsQ291bnQsCiAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkgOgotICAgIG1CaXREZXB0aChiaXREZXB0aCksIG1DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JblNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JbnB1dEluZGV4KDApLAotICAgICAgICAgICAgbVBoYXNlRnJhY3Rpb24oMCksIG1Mb2NhbFRpbWVGcmVxKDApLAotICAgICAgICAgICAgbVBUUyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyksIG1RdWFsaXR5KHF1YWxpdHkpIHsKLSAgICAvLyBzYW5pdHkgY2hlY2sgb24gZm9ybWF0Ci0gICAgaWYgKChiaXREZXB0aCAhPSAxNikgfHwoaW5DaGFubmVsQ291bnQgPCAxKSB8fCAoaW5DaGFubmVsQ291bnQgPiAyKSkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCwgJWQgYml0cywgJWQgY2hhbm5lbHMiLCBiaXREZXB0aCwKLSAgICAgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCk7Ci0gICAgICAgIC8vIEFMT0dfQVNTRVJUKDApOworICAgICAgICBtQ2hhbm5lbENvdW50KGluQ2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JblNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksIG1JbnB1dEluZGV4KDApLAorICAgICAgICBtUGhhc2VGcmFjdGlvbigwKSwgbUxvY2FsVGltZUZyZXEoMCksCisgICAgICAgIG1QVFMoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpLCBtUXVhbGl0eShxdWFsaXR5KSB7CisKKyAgICBjb25zdCBpbnQgbWF4Q2hhbm5lbHMgPSBxdWFsaXR5IDwgRFlOX0xPV19RVUFMSVRZID8gMiA6IDg7CisgICAgaWYgKGluQ2hhbm5lbENvdW50IDwgMQorICAgICAgICAgICAgfHwgaW5DaGFubmVsQ291bnQgPiBtYXhDaGFubmVscykgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbnN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0ICVkIHF1YWxpdHkgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgIHF1YWxpdHksIGluQ2hhbm5lbENvdW50KTsKICAgICB9CiAgICAgaWYgKHNhbXBsZVJhdGUgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQgSHoiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQgSHoiLCBzYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICAvLyBpbml0aWFsaXplIGNvbW1vbiBtZW1iZXJzCiAgICAgbVZvbHVtZVswXSA9IG1Wb2x1bWVbMV0gPSAwOwogICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0KIH0KIAogQXVkaW9SZXNhbXBsZXI6On5BdWRpb1Jlc2FtcGxlcigpIHsKQEAgLTI0NiwxMCArMjk5LDEyIEBACiAgICAgbVBoYXNlSW5jcmVtZW50ID0gKHVpbnQzMl90KSgoa1BoYXNlTXVsdGlwbGllciAqIGluU2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZSk7CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpIHsKK3ZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewogICAgIC8vIFRPRE86IEltcGxlbWVudCBhbnRpLXppcHBlciBmaWx0ZXIKLSAgICBtVm9sdW1lWzBdID0gbGVmdDsKLSAgICBtVm9sdW1lWzFdID0gcmlnaHQ7CisgICAgLy8gY29udmVydCB0byBVNC4xMiBmb3IgaW50ZXJuYWwgaW50ZWdlciB1c2UgKHJvdW5kIGRvd24pCisgICAgLy8gaW50ZWdlciB2b2x1bWUgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIDAgdG8gVU5JVFlfR0FJTi4KKyAgICBtVm9sdW1lWzBdID0gdTRfMTJfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKGxlZnQpKTsKKyAgICBtVm9sdW1lWzFdID0gdTRfMTJfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXI6OnNldExvY2FsVGltZUZyZXEodWludDY0X3QgZnJlcSkgewpAQCAtMzA1LDcgKzM2MCw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gQUxPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWQiLAogICAgIC8vICAgICAgb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwpAQCAtMzM5LDggKzM5NCw5IEBACiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBJbnRlcnAobVgwTCwgaW5bMF0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgb3V0W291dHB1dEluZGV4KytdICs9IHZyICogSW50ZXJwKG1YMFIsIGluWzFdLCBwaGFzZUZyYWN0aW9uKTsKICAgICAgICAgICAgIEFkdmFuY2UoJmlucHV0SW5kZXgsICZwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpCisgICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwpAQCAtNDAyLDcgKzQ1OCw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gQUxPR0UoInN0YXJ0aW5nIHJlc2FtcGxlICVkIGZyYW1lcywgaW5wdXRJbmRleD0lZCwgcGhhc2VGcmFjdGlvbj0lZCwgcGhhc2VJbmNyZW1lbnQ9JWQiLAogICAgIC8vICAgICAgb3V0RnJhbWVDb3VudCwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwpAQCAtNDM0LDggKzQ5MCw5IEBACiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdmwgKiBzYW1wbGU7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBzYW1wbGU7CiAgICAgICAgICAgICBBZHZhbmNlKCZpbnB1dEluZGV4LCAmcGhhc2VGcmFjdGlvbiwgcGhhc2VJbmNyZW1lbnQpOwotICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KQorICAgICAgICAgICAgaWYgKG91dHB1dEluZGV4ID09IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBwcm9jZXNzIGlucHV0IHNhbXBsZXMKQEAgLTUxNCw2ICs1NzEsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCAmb3V0cHV0SW5kZXgsIGludDMyX3QqIG91dCwgc2l6ZV90ICZpbnB1dEluZGV4LCBpbnQzMl90IHZsLCBpbnQzMl90IHZyLAogICAgICAgICAgICAgdWludDMyX3QgJnBoYXNlRnJhY3Rpb24sIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50KQogeworICAgICh2b2lkKW1heE91dFB0OyAvLyByZW1vdmUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5ncworICAgICh2b2lkKW1heEluSWR4OworICAgICh2b2lkKW91dHB1dEluZGV4OworICAgICh2b2lkKW91dDsKKyAgICAodm9pZClpbnB1dEluZGV4OworICAgICh2b2lkKXZsOworICAgICh2b2lkKXZyOworICAgICh2b2lkKXBoYXNlRnJhY3Rpb247CisgICAgKHZvaWQpcGhhc2VJbmNyZW1lbnQ7CisgICAgKHZvaWQpaW47CiAjZGVmaW5lIE1PX1BBUkFNNSAgICIzNiIgICAgICAgIC8vIG9mZnNldCBvZiBwYXJhbWV0ZXIgNSAob3V0cHV0SW5kZXgpCiAKICAgICBhc20oCkBAIC02MjUsNiArNjkyLDE2IEBACiAgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKICAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCkKIHsKKyAgICAodm9pZCltYXhPdXRQdDsgLy8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZ3MKKyAgICAodm9pZCltYXhJbklkeDsKKyAgICAodm9pZClvdXRwdXRJbmRleDsKKyAgICAodm9pZClvdXQ7CisgICAgKHZvaWQpaW5wdXRJbmRleDsKKyAgICAodm9pZCl2bDsKKyAgICAodm9pZCl2cjsKKyAgICAodm9pZClwaGFzZUZyYWN0aW9uOworICAgICh2b2lkKXBoYXNlSW5jcmVtZW50OworICAgICh2b2lkKWluOwogI2RlZmluZSBTVF9QQVJBTTUgICAgIjQwIiAgICAgLy8gb2Zmc2V0IG9mIHBhcmFtZXRlciA1IChvdXRwdXRJbmRleCkKICAgICBhc20oCiAgICAgICAgICJzdG1mZCAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgbHJ9XG4iCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDMzZTY0Y2UuLmNkYzZkOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQxLDE2ICs0MiwyMSBAQAogICAgICAgICBNRURfUVVBTElUWT0yLAogICAgICAgICBISUdIX1FVQUxJVFk9MywKICAgICAgICAgVkVSWV9ISUdIX1FVQUxJVFk9NCwKKyAgICAgICAgRFlOX0xPV19RVUFMSVRZPTUsCisgICAgICAgIERZTl9NRURfUVVBTElUWT02LAorICAgICAgICBEWU5fSElHSF9RVUFMSVRZPTcsCiAgICAgfTsKIAotICAgIHN0YXRpYyBBdWRpb1Jlc2FtcGxlciogY3JlYXRlKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LAorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKKworICAgIHN0YXRpYyBBdWRpb1Jlc2FtcGxlciogY3JlYXRlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGluQ2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5PURFRkFVTFRfUVVBTElUWSk7CiAKICAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIGluaXQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0TG9jYWxUaW1lRnJlcSh1aW50NjRfdCBmcmVxKTsKIAogICAgIC8vIHNldCB0aGUgUFRTIG9mIHRoZSBuZXh0IGJ1ZmZlciBvdXRwdXQgYnkgdGhlIHJlc2FtcGxlcgpAQCAtNjAsNyArNjYsNyBAQAogICAgIC8vIEEgbW9ubyBwcm92aWRlciBkZWxpdmVycyBhIHNlcXVlbmNlIG9mIHNhbXBsZXMuCiAgICAgLy8gQSBzdGVyZW8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBpbnRlcmxlYXZlZCBwYWlycyBvZiBzYW1wbGVzLgogICAgIC8vIE11bHRpLWNoYW5uZWwgcHJvdmlkZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgIC8vIEluIGVpdGhlciBjYXNlLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmaXhlZC1wb2ludCBzaWduZWQgUTE5LjEyLgorICAgIC8vIEluIGVpdGhlciBjYXNlLCAnb3V0JyBob2xkcyBpbnRlcmxlYXZlZCBwYWlycyBvZiBmaXhlZC1wb2ludCBRNC4yNy4KICAgICAvLyBUaGF0IGlzLCBmb3IgYSBtb25vIHByb3ZpZGVyLCB0aGVyZSBpcyBhbiBpbXBsaWNpdCB1cC1jaGFubmVsaW5nLgogICAgIC8vIFNpbmNlIHRoaXMgbWV0aG9kIGFjY3VtdWxhdGVzLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyAnb3V0JyBpbml0aWFsbHkuCiAgICAgLy8gRklYTUUgYXNzdW1lcyBwcm92aWRlciBpcyBhbHdheXMgc3VjY2Vzc2Z1bDsgaXQgc2hvdWxkIHJldHVybiB0aGUgYWN0dWFsIGZyYW1lIGNvdW50LgpAQCAtODEsOSArODcsOSBAQAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUGhhc2VNYXNrID0gKDFMVTw8a051bVBoYXNlQml0cyktMTsKIAogICAgIC8vIG11bHRpcGxpZXIgdG8gY2FsY3VsYXRlIGZpeGVkIHBvaW50IHBoYXNlIGluY3JlbWVudAotICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1BoYXNlTXVsdGlwbGllciA9IDFMIDw8IGtOdW1QaGFzZUJpdHM7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrUGhhc2VNdWx0aXBsaWVyOwogCi0gICAgQXVkaW9SZXNhbXBsZXIoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSk7CisgICAgQXVkaW9SZXNhbXBsZXIoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpOwogCiAgICAgLy8gcHJldmVudCBjb3B5aW5nCiAgICAgQXVkaW9SZXNhbXBsZXIoY29uc3QgQXVkaW9SZXNhbXBsZXImKTsKQEAgLTkxLDcgKzk3LDYgQEAKIAogICAgIGludDY0X3QgY2FsY3VsYXRlT3V0cHV0UFRTKGludCBvdXRwdXRGcmFtZUluZGV4KTsKIAotICAgIGNvbnN0IGludDMyX3QgbUJpdERlcHRoOwogICAgIGNvbnN0IGludDMyX3QgbUNoYW5uZWxDb3VudDsKICAgICBjb25zdCBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDMyX3QgbUluU2FtcGxlUmF0ZTsKQEAgLTEwNyw2ICsxMTIsNDcgQEAKICAgICB1aW50NjRfdCBtTG9jYWxUaW1lRnJlcTsKICAgICBpbnQ2NF90IG1QVFM7CiAKKyAgICAvLyByZXR1cm5zIHRoZSBpbkZyYW1lQ291bnQgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgb3V0RnJhbWVDb3VudCBmcmFtZXMuCisgICAgLy8KKyAgICAvLyBQbGFjZWQgaGVyZSB0byBiZSBhIGNvbnNpc3RlbnQgZm9yIGFsbCByZXNhbXBsZXJzLgorICAgIC8vCisgICAgLy8gUmlnaHQgbm93LCB3ZSB1c2UgdGhlIHVwcGVyIGJvdW5kIHdpdGhvdXQgcmVnYXJkcyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgICAvLyBpbnB1dCBidWZmZXIgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljLCBhcyBmb2xsb3dzOgorICAgIC8vCisgICAgLy8gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihvdXRGcmFtZUNvdW50KSptSW5TYW1wbGVSYXRlICsgKG1TYW1wbGVSYXRlIC0gMSkpL21TYW1wbGVSYXRlOworICAgIC8vCisgICAgLy8gVGhlIGRvdWJsZSBwcmVjaXNpb24gZXF1aXZhbGVudCAoZmxvYXQgbWF5IG5vdCBiZSBwcmVjaXNlIGVub3VnaCk6CisgICAgLy8gY2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KG91dEZyYW1lQ291bnQpICogbUluU2FtcGxlUmF0ZSAvIG1TYW1wbGVSYXRlKTsKKyAgICAvLworICAgIC8vIHRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIG1QaGFzZUluY3JlbWVudCBpcyByb3VuZGVkIGRvd24gZnJvbQorICAgIC8vICNwaGFzZXMgKiBtSW5TYW1wbGVSYXRlL21TYW1wbGVSYXRlIGFuZCB0aGUgZmFjdCB0aGF0IFN1bShGbG9vcih4KSkgPD0gRmxvb3IoU3VtKHgpKS4KKyAgICAvLyBodHRwOi8vd3d3LnByb29md2lraS5vcmcvd2lraS9TdW1fb2ZfRmxvb3JzX05vdF9HcmVhdGVyX1RoYW5fRmxvb3Jfb2ZfU3VtcworICAgIC8vCisgICAgLy8gKHNvIGxvbmcgYXMgZG91YmxlIHByZWNpc2lvbiBpcyBjb21wdXRlZCBhY2N1cmF0ZWx5IGVub3VnaCB0byBiZSBjb25zaWRlcmVkCisgICAgLy8gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBGbG9vcih4KSB2YWx1ZSBpbiBpbnQzMl90IGFyaXRobWV0aWM7IHRodXMgdGhpcworICAgIC8vIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGhvbGQgZm9yIGZsb2F0cykuCisgICAgLy8KKyAgICAvLyBUT0RPOgorICAgIC8vIEdyZWF0ZXIgYWNjdXJhY3kgYW5kIGEgdGlnaHQgYm91bmQgaXMgb2J0YWluZWQgYnk6CisgICAgLy8gMSkgc3VidHJhY3QgYW5kIGFkanVzdCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgYnVmZmVyLgorICAgIC8vIDIpIHVzaW5nIHRoZSBleGFjdCBpbnRlZ2VyIGZvcm11bGEgd2hlcmUgKGlnbm9yaW5nIDY0YiBjYXN0aW5nKQorICAgIC8vICBpbkZyYW1lQ291bnQgPSAobVBoYXNlSW5jcmVtZW50ICogKG91dEZyYW1lQ291bnQgLSAxKSArIG1QaGFzZUZyYWN0aW9uKSAvIHBoYXNlV3JhcExpbWl0OworICAgIC8vICBwaGFzZVdyYXBMaW1pdCBpcyB0aGUgd3JhcGFyb3VuZCAoMSA8PCBrTnVtUGhhc2VCaXRzKSwgaWYgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LgorICAgIC8vCisgICAgaW5saW5lIHNpemVfdCBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChzaXplX3Qgb3V0RnJhbWVDb3VudCkgeworICAgICAgICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihvdXRGcmFtZUNvdW50KSptSW5TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgKyAobVNhbXBsZVJhdGUgLSAxKSkvbVNhbXBsZVJhdGU7CisgICAgfQorCisgICAgaW5saW5lIGZsb2F0IGNsYW1wRmxvYXRWb2woZmxvYXQgdm9sdW1lKSB7CisgICAgICAgIGlmICh2b2x1bWUgPiBVTklUWV9HQUlOX0ZMT0FUKSB7CisgICAgICAgICAgICByZXR1cm4gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgfSBlbHNlIGlmICh2b2x1bWUgPj0gMC4pIHsKKyAgICAgICAgICAgIHJldHVybiB2b2x1bWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOyAgLy8gTmFOIG9yIG5lZ2F0aXZlIHZvbHVtZSBtYXBzIHRvIDAuCisgICAgfQorCiBwcml2YXRlOgogICAgIGNvbnN0IHNyY19xdWFsaXR5IG1RdWFsaXR5OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKaW5kZXggMThlNTllOS4uOGYxNGZmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcApAQCAtNjAsMTQgKzYwLDE1IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgLy8gZmV0Y2ggZmlyc3QgYnVmZmVyCiAgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIG1QVFMpOwotICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWRuIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CkBAIC05Nyw4ICs5OCw5IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIDIpKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluID0gbUJ1ZmZlci5pMTY7CiAgICAgICAgICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgICAgICAgICB9CkBAIC0xMjYsMTQgKzEyOCwxNSBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkIiwgbUJ1ZmZlci5yYXcsIG1CdWZmZXIuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIGludDE2X3QgKmluID0gbUJ1ZmZlci5pMTY7CkBAIC0xNjMsOCArMTY2LDkgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlT3V0cHV0UFRTKG91dHB1dEluZGV4IC8gMikpOwotICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2F2ZV9zdGF0ZTsgIC8vIHVnbHksIGJ1dCBlZmZpY2llbnQKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkbiIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIGluID0gbUJ1ZmZlci5pMTY7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaAppbmRleCAyMDNiOTMzLi5iMzE1ZGE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKQEAgLTI4LDggKzI4LDggQEAKIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJDdWJpYyA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CiBwdWJsaWM6Ci0gICAgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6Ci0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTUVEX1FVQUxJVFkpIHsKKyAgICBBdWRpb1Jlc2FtcGxlckN1YmljKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSA6CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBNRURfUVVBTElUWSkgewogICAgIH0KICAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWIyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlckR5biIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgiIC8vIFVTRV9ORU9OIGFuZCBVU0VfSU5MSU5FX0FTU0VNQkxZIGRlZmluZWQgaGVyZQorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpckdlbi5oIiAvLyByZXF1aXJlcyBtYXRoLmgKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckR5bi5oIgorCisvLyNkZWZpbmUgREVCVUdfUkVTQU1QTEVSCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIEluQnVmZmVyIGlzIGEgdHlwZSBhZ25vc3RpYyBpbnB1dCBidWZmZXIuCisgKgorICogTGF5b3V0IG9mIHRoZSBzdGF0ZSBidWZmZXIgZm9yIGhhbGZOdW1Db2Vmcz04LgorICoKKyAqIFtycnJycnJwcHBwcHBwcG5ubm5ubm5ucnJycnJycnJycnJycnJycnJyci4uLi4gcnJycnJycl0KKyAqICBTICAgICAgICAgICAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUgorICoKKyAqIFMgPSBtU3RhdGUKKyAqIEkgPSBtSW1wdWxzZQorICogUiA9IG1SaW5nRnVsbAorICogcCA9IHBhc3Qgc2FtcGxlcywgY29udm9sdXRlZCB3aXRoIHRoZSAocClvc2l0aXZlIHNpZGUgb2Ygc2luYygpCisgKiBuID0gZnV0dXJlIHNhbXBsZXMsIGNvbnZvbHV0ZWQgd2l0aCB0aGUgKG4pZWdhdGl2ZSBzaWRlIG9mIHNpbmMoKQorICogciA9IGV4dHJhIHNwYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIHJpbmcgYnVmZmVyCisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6SW5CdWZmZXIoKQorICAgIDogbVN0YXRlKE5VTEwpLCBtSW1wdWxzZShOVUxMKSwgbVJpbmdGdWxsKE5VTEwpLCBtU3RhdGVDb3VudCgwKQoreworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjp+SW5CdWZmZXIoKQoreworICAgIGluaXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjppbml0KCkKK3sKKyAgICBmcmVlKG1TdGF0ZSk7CisgICAgbVN0YXRlID0gTlVMTDsKKyAgICBtSW1wdWxzZSA9IE5VTEw7CisgICAgbVJpbmdGdWxsID0gTlVMTDsKKyAgICBtU3RhdGVDb3VudCA9IDA7Cit9CisKKy8vIHJlc2l6ZXMgdGhlIHN0YXRlIGJ1ZmZlciB0byBhY2NvbW1vZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmlsdGVyIGxlbmd0aAordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpyZXNpemUoaW50IENIQU5ORUxTLCBpbnQgaGFsZk51bUNvZWZzKQoreworICAgIC8vIGNhbGN1bGF0ZSBkZXNpcmVkIHN0YXRlIHNpemUKKyAgICBzaXplX3Qgc3RhdGVDb3VudCA9IGhhbGZOdW1Db2VmcyAqIENIQU5ORUxTICogMiAqIGtTdGF0ZVNpemVNdWx0aXBsZU9mRmlsdGVyTGVuZ3RoOworCisgICAgLy8gY2hlY2sgaWYgYnVmZmVyIG5lZWRzIHJlc2l6aW5nCisgICAgaWYgKG1TdGF0ZQorICAgICAgICAgICAgJiYgc3RhdGVDb3VudCA9PSBtU3RhdGVDb3VudAorICAgICAgICAgICAgJiYgbVJpbmdGdWxsLW1TdGF0ZSA9PSAoc3NpemVfdCkgKG1TdGF0ZUNvdW50LWhhbGZOdW1Db2VmcypDSEFOTkVMUykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBuZXcgYnVmZmVyCisgICAgVEkqIHN0YXRlID0gTlVMTDsKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnN0YXRlKSwgMzIsIHN0YXRlQ291bnQqc2l6ZW9mKCpzdGF0ZSkpOworICAgIG1lbXNldChzdGF0ZSwgMCwgc3RhdGVDb3VudCpzaXplb2YoKnN0YXRlKSk7CisKKyAgICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHN0YXRlCisgICAgaWYgKG1TdGF0ZSkgeworICAgICAgICBUSSogc3JjTG8gPSBtSW1wdWxzZSAtIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICAgICAgVEkqIHNyY0hpID0gbUltcHVsc2UgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIFRJKiBkc3QgPSBzdGF0ZTsKKworICAgICAgICBpZiAoc3JjTG8gPCBtU3RhdGUpIHsKKyAgICAgICAgICAgIGRzdCArPSBtU3RhdGUtc3JjTG87CisgICAgICAgICAgICBzcmNMbyA9IG1TdGF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjSGkgPiBtU3RhdGUgKyBtU3RhdGVDb3VudCkgeworICAgICAgICAgICAgc3JjSGkgPSBtU3RhdGUgKyBtU3RhdGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZHN0LCBzcmNMbywgKHNyY0hpIC0gc3JjTG8pICogc2l6ZW9mKCpzcmNMbykpOworICAgICAgICBmcmVlKG1TdGF0ZSk7CisgICAgfQorCisgICAgLy8gc2V0IGNsYXNzIG1lbWJlciB2YXJzCisgICAgbVN0YXRlID0gc3RhdGU7CisgICAgbVN0YXRlQ291bnQgPSBzdGF0ZUNvdW50OworICAgIG1JbXB1bHNlID0gc3RhdGUgKyBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7IC8vIGFjdHVhbGx5IG9uZSBzYW1wbGUgZ3JlYXRlciB0aGFuIG5lZWRlZAorICAgIG1SaW5nRnVsbCA9IHN0YXRlICsgbVN0YXRlQ291bnQgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7Cit9CisKKy8vIGNvcHkgaW4gdGhlIGlucHV0IGRhdGEgaW50byB0aGUgaGVhZCAoaW1wdWxzZStoYWxmTnVtQ29lZnMpIG9mIHRoZSBidWZmZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordGVtcGxhdGU8aW50IENIQU5ORUxTPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlYWRBZ2FpbihUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiwgY29uc3Qgc2l6ZV90IGlucHV0SW5kZXgpCit7CisgICAgVEkqIGhlYWQgPSBpbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Q0hBTk5FTFMgOyBpKyspIHsKKyAgICAgICAgaGVhZFtpXSA9IGluW2lucHV0SW5kZXgqQ0hBTk5FTFMgKyBpXTsKKyAgICB9Cit9CisKKy8vIGFkdmFuY2UgdGhlIGltcHVsc2UgcG9pbnRlciwgYW5kIGxvYWQgaW4gZGF0YSBpbnRvIHRoZSBoZWFkIChpbXB1bHNlK2hhbGZOdW1Db2VmcykKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6cmVhZEFkdmFuY2UoVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KQoreworICAgIGltcHVsc2UgKz0gQ0hBTk5FTFM7CisKKyAgICBpZiAoQ0NfVU5MSUtFTFkoaW1wdWxzZSA+PSBtUmluZ0Z1bGwpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBzaGlmdERvd24gPSBtUmluZ0Z1bGwgLSBtU3RhdGUgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIG1lbWNweShtU3RhdGUsIG1TdGF0ZStzaGlmdERvd24sIGhhbGZOdW1Db2VmcypDSEFOTkVMUyoyKnNpemVvZihUSSkpOworICAgICAgICBpbXB1bHNlIC09IHNoaWZ0RG93bjsKKyAgICB9CisgICAgcmVhZEFnYWluPENIQU5ORUxTPihpbXB1bHNlLCBoYWxmTnVtQ29lZnMsIGluLCBpbnB1dEluZGV4KTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkNvbnN0YW50czo6c2V0KAorICAgICAgICBpbnQgTCwgaW50IGhhbGZOdW1Db2VmcywgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUpCit7CisgICAgaW50IGJpdHMgPSAwOworICAgIGludCBsc2NhbGUgPSBpblNhbXBsZVJhdGUvb3V0U2FtcGxlUmF0ZSA8IDIgPyBMIC0gMSA6CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRpY19jYXN0PHVpbnQ2NF90PihMKSppblNhbXBsZVJhdGUvb3V0U2FtcGxlUmF0ZSk7CisgICAgZm9yIChpbnQgaT1sc2NhbGU7IGk7ICsrYml0cywgaT4+PTEpCisgICAgICAgIDsKKyAgICBtTCA9IEw7CisgICAgbVNoaWZ0ID0ga051bVBoYXNlQml0cyAtIGJpdHM7CisgICAgbUhhbGZOdW1Db2VmcyA9IGhhbGZOdW1Db2VmczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpBdWRpb1Jlc2FtcGxlckR5bigKKyAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpCisgICAgOiBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgcXVhbGl0eSksCisgICAgICBtUmVzYW1wbGVGdW5jKDApLCBtRmlsdGVyU2FtcGxlUmF0ZSgwKSwgbUZpbHRlclF1YWxpdHkoREVGQVVMVF9RVUFMSVRZKSwKKyAgICBtQ29lZkJ1ZmZlcihOVUxMKQoreworICAgIG1Wb2x1bWVTaW1kWzBdID0gbVZvbHVtZVNpbWRbMV0gPSAwOworICAgIC8vIFRoZSBBdWRpb1Jlc2FtcGxlciBiYXNlIGNsYXNzIGFzc3VtZXMgd2UgYXJlIGFsd2F5cyByZWFkeSBmb3IgMToxIHJlc2FtcGxpbmcuCisgICAgLy8gV2UgcmVzZXQgbUluU2FtcGxlUmF0ZSB0byAwLCBzbyBzZXRTYW1wbGVSYXRlKCkgd2lsbCBjYWxjdWxhdGUgZmlsdGVycyBmb3IKKyAgICAvLyBzZXRTYW1wbGVSYXRlKCkgZm9yIDE6MS4gKE1heSBiZSByZW1vdmVkIGlmIHByZWNhbGN1bGF0ZWQgZmlsdGVycyBhcmUgdXNlZC4pCisgICAgbUluU2FtcGxlUmF0ZSA9IDA7CisgICAgbUNvbnN0YW50cy5zZXQoMTI4LCA4LCBtU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOyAvLyBUT0RPOiBzZXQgYmV0dGVyCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6fkF1ZGlvUmVzYW1wbGVyRHluKCkKK3sKKyAgICBmcmVlKG1Db2VmQnVmZmVyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OmluaXQoKQoreworICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gMDsgLy8gYWx3YXlzIHRyaWdnZXIgbmV3IGZpbHRlciBnZW5lcmF0aW9uCisgICAgbUluQnVmZmVyLmluaXQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKK3sKKyAgICBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBpZiAoaXNfc2FtZTxUTywgZmxvYXQ+Ojp2YWx1ZSB8fCBpc19zYW1lPFRPLCBkb3VibGU+Ojp2YWx1ZSkgeworICAgICAgICBtVm9sdW1lU2ltZFswXSA9IHN0YXRpY19jYXN0PFRPPihsZWZ0KTsKKyAgICAgICAgbVZvbHVtZVNpbWRbMV0gPSBzdGF0aWNfY2FzdDxUTz4ocmlnaHQpOworICAgIH0gZWxzZSB7ICAvLyBpbnRlZ2VyIHJlcXVpcmVzIHNjYWxpbmcgdG8gVTRfMjggKHJvdW5kaW5nIGRvd24pCisgICAgICAgIC8vIGludGVnZXIgdm9sdW1lcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4gc28gdGhlcmUKKyAgICAgICAgLy8gYXJlIG5vIGlzc3VlcyB3aXRoIHNpZ25lZCBvdmVyZmxvdy4KKyAgICAgICAgbVZvbHVtZVNpbWRbMF0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgICAgICBtVm9sdW1lU2ltZFsxXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBtYXgoVCBhLCBUIGIpIHtyZXR1cm4gYSA+IGIgPyBhIDogYjt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgYWJzZGlmZihUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgLSBiIDogYiAtIGE7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6Y3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpCit7CisgICAgVEMqIGJ1ZiA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBhdHRlbiA9IDAuOTk5ODsgICAvLyB0byBhdm9pZCByaXBwbGUgb3ZlcmZsb3cKKyAgICBkb3VibGUgZmNyOworICAgIGRvdWJsZSB0YncgPSBmaXJLYWlzZXJUYncoYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuKTsKKworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmYnVmKSwgMzIsIChjLm1MKzEpKmMubUhhbGZOdW1Db2VmcypzaXplb2YoVEMpKTsKKyAgICBpZiAoaW5TYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZSkgeyAvLyB1cHNhbXBsZQorICAgICAgICBmY3IgPSBtYXgoMC41KnRid0NoZWF0IC0gdGJ3LzIsIHRidy8yKTsKKyAgICB9IGVsc2UgeyAvLyBkb3duc2FtcGxlCisgICAgICAgIGZjciA9IG1heCgwLjUqdGJ3Q2hlYXQqb3V0U2FtcGxlUmF0ZS9pblNhbXBsZVJhdGUgLSB0YncvMiwgdGJ3LzIpOworICAgIH0KKyAgICAvLyBjcmVhdGUgYW5kIHNldCBmaWx0ZXIKKyAgICBmaXJLYWlzZXJHZW4oYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4pOworICAgIGMubUZpckNvZWZzID0gYnVmOworICAgIGlmIChtQ29lZkJ1ZmZlcikgeworICAgICAgICBmcmVlKG1Db2VmQnVmZmVyKTsKKyAgICB9CisgICAgbUNvZWZCdWZmZXIgPSBidWY7CisjaWZkZWYgREVCVUdfUkVTQU1QTEVSCisgICAgLy8gcHJpbnQgYmFzaWMgZmlsdGVyIHN0YXRzCisgICAgcHJpbnRmKCJMOiVkICBobmM6JWQgIHN0b3BCYW5kQXR0ZW46JWxmICBmY3I6JWxmICBhdHRlbjolbGYgIHRidzolbGZcbiIsCisgICAgICAgICAgICBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW4sIHRidyk7CisgICAgLy8gdGVzdCB0aGUgZmlsdGVyIGFuZCByZXBvcnQgcmVzdWx0cworICAgIGRvdWJsZSBmcCA9IChmY3IgLSB0YncvMikvYy5tTDsKKyAgICBkb3VibGUgZnMgPSAoZmNyICsgdGJ3LzIpL2MubUw7CisgICAgZG91YmxlIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGU7CisgICAgZG91YmxlIHN0b3BNYXgsIHN0b3BSaXBwbGU7CisgICAgdGVzdEZpcihidWYsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCAvKnBhc3NTdGVwcyovIDEwMDAsIC8qc3RvcFN0ZXBzKi8gMTAwMDAwLAorICAgICAgICAgICAgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisgICAgcHJpbnRmKCJwYXNzYmFuZCglbGYsICVsZik6ICUuOGxmICUuOGxmICUuOGxmXG4iLCAwLiwgZnAsIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUpOworICAgIHByaW50Zigic3RvcGJhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjNsZlxuIiwgZnMsIDAuNSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisjZW5kaWYKK30KKworLy8gcmVjdXJzaXZlIGdjZC4gVXNpbmcgb2JqZHVtcCwgaXQgYXBwZWFycyB0aGUgdGFpbCByZWN1cnNpb24gaXMgY29udmVydGVkIHRvIGEgd2hpbGUgbG9vcC4KK3N0YXRpYyBpbnQgZ2NkKGludCBuLCBpbnQgbSkKK3sKKyAgICBpZiAobSA9PSAwKSB7CisgICAgICAgIHJldHVybiBuOworICAgIH0KKyAgICByZXR1cm4gZ2NkKG0sIG4gJSBtKTsKK30KKworc3RhdGljIGJvb2wgaXNDbG9zZShpbnQzMl90IG5ld1NhbXBsZVJhdGUsIGludDMyX3QgcHJldlNhbXBsZVJhdGUsCisgICAgICAgIGludDMyX3QgZmlsdGVyU2FtcGxlUmF0ZSwgaW50MzJfdCBvdXRTYW1wbGVSYXRlKQoreworCisgICAgLy8gZGlmZmVyZW50IHVwc2FtcGxpbmcgcmF0aW9zIGRvIG5vdCBuZWVkIGEgZmlsdGVyIGNoYW5nZS4KKyAgICBpZiAoZmlsdGVyU2FtcGxlUmF0ZSAhPSAwCisgICAgICAgICAgICAmJiBmaWx0ZXJTYW1wbGVSYXRlIDwgb3V0U2FtcGxlUmF0ZQorICAgICAgICAgICAgJiYgbmV3U2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gY2hlY2sgZGVzaWduIGNyaXRlcmlhIGFnYWluIGlmIGRvd25zYW1wbGluZyBpcyBkZXRlY3RlZC4KKyAgICBpbnQgcGRpZmYgPSBhYnNkaWZmKG5ld1NhbXBsZVJhdGUsIHByZXZTYW1wbGVSYXRlKTsKKyAgICBpbnQgYWRpZmYgPSBhYnNkaWZmKG5ld1NhbXBsZVJhdGUsIGZpbHRlclNhbXBsZVJhdGUpOworCisgICAgLy8gYWxsb3cgdXAgdG8gNiUgcmVsYXRpdmUgY2hhbmdlIGluY3JlbWVudHMuCisgICAgLy8gYWxsb3cgdXAgdG8gMTIlIGFic29sdXRlIGNoYW5nZSBpbmNyZW1lbnRzIChmcm9tIGZpbHRlciBkZXNpZ24pCisgICAgcmV0dXJuIHBkaWZmIDwgcHJldlNhbXBsZVJhdGU+PjQgJiYgYWRpZmYgPCBmaWx0ZXJTYW1wbGVSYXRlPj4zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6c2V0U2FtcGxlUmF0ZShpbnQzMl90IGluU2FtcGxlUmF0ZSkKK3sKKyAgICBpZiAobUluU2FtcGxlUmF0ZSA9PSBpblNhbXBsZVJhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IG9sZFNhbXBsZVJhdGUgPSBtSW5TYW1wbGVSYXRlOworICAgIGludDMyX3Qgb2xkSGFsZk51bUNvZWZzID0gbUNvbnN0YW50cy5tSGFsZk51bUNvZWZzOworICAgIHVpbnQzMl90IG9sZFBoYXNlV3JhcExpbWl0ID0gbUNvbnN0YW50cy5tTCA8PCBtQ29uc3RhbnRzLm1TaGlmdDsKKyAgICBib29sIHVzZVMzMiA9IGZhbHNlOworCisgICAgbUluU2FtcGxlUmF0ZSA9IGluU2FtcGxlUmF0ZTsKKworICAgIC8vIFRPRE86IEFkZCBwcmVjYWxjdWxhdGVkIEVxdWlyaXBwbGUgZmlsdGVycworCisgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ICE9IGdldFF1YWxpdHkoKSB8fAorICAgICAgICAgICAgIWlzQ2xvc2UoaW5TYW1wbGVSYXRlLCBvbGRTYW1wbGVSYXRlLCBtRmlsdGVyU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpKSB7CisgICAgICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gaW5TYW1wbGVSYXRlOworICAgICAgICBtRmlsdGVyUXVhbGl0eSA9IGdldFF1YWxpdHkoKTsKKworICAgICAgICAvLyBCZWdpbiBLYWlzZXIgRmlsdGVyIGNvbXB1dGF0aW9uCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBxdWFudGl6YXRpb24gZmxvb3IgZm9yIFMxNiBpcyBhYm91dCA5NmRiIC0gMTAqbG9nXzEwKCNsZW5ndGgpICsgM2RCLgorICAgICAgICAvLyBLZWVwIHRoZSBzdG9wIGJhbmQgYXR0ZW51YXRpb24gbm8gZ3JlYXRlciB0aGFuIDg0LTg1ZEIgZm9yIDMyIGxlbmd0aCBTMTYgZmlsdGVycworICAgICAgICAvLworICAgICAgICAvLyBGb3IgczMyIHdlIGtlZXAgdGhlIHN0b3AgYmFuZCBhdHRlbnVhdGlvbiBhdCB0aGUgc2FtZSBhcyAxNmIgcmVzb2x1dGlvbiwgYWJvdXQKKyAgICAgICAgLy8gOTYtOThkQgorICAgICAgICAvLworCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuOworICAgICAgICBkb3VibGUgdGJ3Q2hlYXQgPSAxLjsgLy8gaG93IG11Y2ggd2UgImNoZWF0IiBpbnRvIGFsaWFzaW5nCisgICAgICAgIGludCBoYWxmTGVuZ3RoOworICAgICAgICBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgLy8gMzJiIGNvZWZmaWNpZW50cywgNjQgbGVuZ3RoCisgICAgICAgICAgICB1c2VTMzIgPSB0cnVlOworICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDk4LjsKKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDQ4OworICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDQwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAxNi0zMiBsZW5ndGgKKyAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOworICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDgwLjsKKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDI0OworICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gRFlOX01FRF9RVUFMSVRZCisgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAzMi02NCBsZW5ndGgKKyAgICAgICAgICAgIC8vIG5vdGU6ID4gNjQgbGVuZ3RoIGZpbHRlcnMgd2l0aCAxNmIgY29lZnMgY2FuIGhhdmUgcXVhbnRpemF0aW9uIG5vaXNlIHByb2JsZW1zCisgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4NC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcG9seXBoYXNlcyBpbiB0aGUgZmlsdGVyYmFuay4KKyAgICAgICAgLy8gZm9yIDE2YiwgaXQgaXMgZGVzaXJhYmxlIHRvIGhhdmUgMl4oMTYvMikgPSAyNTYgcGhhc2VzLgorICAgICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlL1JlbGF0aW9uX0ludGVycG9sYXRpb25fRXJyb3JfUXVhbnRpemF0aW9uLmh0bWwKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgYXJlIGEgYml0IG1vcmUgbGF4IG9uIHRoaXMuCisKKyAgICAgICAgaW50IHBoYXNlcyA9IG1TYW1wbGVSYXRlIC8gZ2NkKG1TYW1wbGVSYXRlLCBpblNhbXBsZVJhdGUpOworCisgICAgICAgIC8vIFRPRE86IE9uY2UgZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2UgaXMgYW4gb3B0aW9uLCB0aGUgY29kZSBiZWxvdworICAgICAgICAvLyBzaG91bGQgYmUgbW9kaWZpZWQgdG8gZXhlY3V0ZSBvbmx5IHdoZW4gZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2UgaXMgZW5hYmxlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gYXMgYWJvdmUsICNwaGFzZXMgbGVzcyB0aGFuIDYzIGlzIHRvbyBmZXcgcGhhc2VzIGZvciBhY2N1cmF0ZSBsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgICAgLy8gd2UgaW5jcmVhc2UgdGhlIHBoYXNlcyB0byBjb21wZW5zYXRlLCBidXQgbW9yZSBwaGFzZXMgbWVhbnMgbW9yZSBtZW1vcnkgcGVyCisgICAgICAgIC8vIGZpbHRlciBhbmQgbW9yZSB0aW1lIHRvIGNvbXB1dGUgdGhlIGZpbHRlci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gaWYgd2Uga25vdyB0aGF0IHRoZSBmaWx0ZXIgd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljIHNhbXBsZSByYXRlIGNoYW5nZXMsCisgICAgICAgIC8vIHRoYXQgd291bGQgYWxsb3cgdXMgc2tpcCB0aGlzIHBhcnQgZm9yIGZpeGVkIHNhbXBsZSByYXRlIHJlc2FtcGxlcnMuCisgICAgICAgIC8vCisgICAgICAgIHdoaWxlIChwaGFzZXM8NjMpIHsKKyAgICAgICAgICAgIHBoYXNlcyAqPSAyOyAvLyB0aGlzIGNvZGUgb25seSBuZWVkZWQgdG8gc3VwcG9ydCBkeW5hbWljIHJhdGUgY2hhbmdlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBoYXNlcz49MjU2KSB7ICAvLyB0b28gbWFueSBwaGFzZXMsIGFsd2F5cyBpbnRlcnBvbGF0ZQorICAgICAgICAgICAgcGhhc2VzID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBmaWx0ZXIKKyAgICAgICAgbUNvbnN0YW50cy5zZXQocGhhc2VzLCBoYWxmTGVuZ3RoLCBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgY3JlYXRlS2Fpc2VyRmlyKG1Db25zdGFudHMsIHN0b3BCYW5kQXR0ZW4sCisgICAgICAgICAgICAgICAgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgdGJ3Q2hlYXQpOworICAgIH0gLy8gRW5kIEthaXNlciBmaWx0ZXIKKworICAgIC8vIHVwZGF0ZSBwaGFzZSBhbmQgc3RhdGUgYmFzZWQgb24gdGhlIG5ldyBmaWx0ZXIuCisgICAgY29uc3QgQ29uc3RhbnRzJiBjKG1Db25zdGFudHMpOworICAgIG1JbkJ1ZmZlci5yZXNpemUobUNoYW5uZWxDb3VudCwgYy5tSGFsZk51bUNvZWZzKTsKKyAgICBjb25zdCB1aW50MzJfdCBwaGFzZVdyYXBMaW1pdCA9IGMubUwgPDwgYy5tU2hpZnQ7CisgICAgLy8gdHJ5IHRvIHByZXNlcnZlIGFzIG11Y2ggb2YgdGhlIHBoYXNlIGZyYWN0aW9uIGFzIHBvc3NpYmxlIGZvciBvbi10aGUtZmx5IGNoYW5nZXMKKyAgICBtUGhhc2VGcmFjdGlvbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4obVBoYXNlRnJhY3Rpb24pCisgICAgICAgICAgICAqIHBoYXNlV3JhcExpbWl0IC8gb2xkUGhhc2VXcmFwTGltaXQ7CisgICAgbVBoYXNlRnJhY3Rpb24gJT0gcGhhc2VXcmFwTGltaXQ7IC8vIHNob3VsZCBub3QgZG8gYW55dGhpbmcsIGJ1dCBqdXN0IGluIGNhc2UuCisgICAgbVBoYXNlSW5jcmVtZW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHVpbnQ2NF90PihwaGFzZVdyYXBMaW1pdCkKKyAgICAgICAgICAgICogaW5TYW1wbGVSYXRlIC8gbVNhbXBsZVJhdGUpOworCisgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHJlc2FtcGxlciB0byB1c2UKKyAgICAvLyBjaGVjayBpZiBsb2NrZWQgcGhhc2UgKHdvcmtzIG9ubHkgaWYgbVBoYXNlSW5jcmVtZW50IGhhcyBubyAiZnJhY3Rpb25hbCBwaGFzZSBiaXRzIikKKyAgICBpbnQgbG9ja2VkID0gKG1QaGFzZUluY3JlbWVudCA8PCAoc2l6ZW9mKG1QaGFzZUluY3JlbWVudCkqOCAtIGMubVNoaWZ0KSkgPT0gMDsKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1QaGFzZUZyYWN0aW9uID0gbVBoYXNlRnJhY3Rpb24gPj4gYy5tU2hpZnQgPDwgYy5tU2hpZnQ7IC8vIHJlbW92ZSBmcmFjdGlvbmFsIHBoYXNlCisgICAgfQorCisgICAgLy8gc3RyaWRlIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmaWx0ZXIgY29lZmZpY2llbnRzIHByb2Nlc3NlZCBwZXIgbG9vcCBpdGVyYXRpb24uCisgICAgLy8gV2UgY3VycmVudGx5IG9ubHkgYWxsb3cgYSBzdHJpZGUgb2YgMTYgdG8gbWF0Y2ggd2l0aCBTSU1EIHByb2Nlc3NpbmcuCisgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWx0ZXIgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiwKKyAgICAvLyBvciBoYWxmIHRoZSBmaWx0ZXIgbGVuZ3RoIChtSGFsZk51bUNvZWZzKSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KKyAgICAvLworICAgIC8vIE5vdGU6IEEgc3RyaWRlIG9mIDIgaXMgYWNoaWV2ZWQgd2l0aCBub24tU0lNRCBwcm9jZXNzaW5nLgorICAgIGludCBzdHJpZGUgPSAoKGMubUhhbGZOdW1Db2VmcyAmIDcpID09IDApID8gMTYgOiAyOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyaWRlIDwgMTYsICJSZXNhbXBsZXIgc3RyaWRlIG11c3QgYmUgMTYgb3IgbW9yZSIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA8IDEgfHwgbUNoYW5uZWxDb3VudCA+IDgsCisgICAgICAgICAgICAiUmVzYW1wbGVyIGNoYW5uZWxzKCVkKSBtdXN0IGJlIGJldHdlZW4gMSB0byA4IiwgbUNoYW5uZWxDb3VudCk7CisgICAgLy8gc3RyaWRlIDE2IChmYWxscyBiYWNrIHRvIHN0cmlkZSAyIGZvciBtYWNoaW5lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IE5FT04pCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBzd2l0Y2ggKG1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MSwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDIsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwzLCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NCwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDUsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw2LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NywgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDgsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDEsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MiwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwzLCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDQsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NSwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw2LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDcsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8OCwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHX1JFU0FNUExFUgorICAgIHByaW50ZigiY2hhbm5lbHM6JWQgICVzICBzdHJpZGU6JWQgICVzICBjb2VmOiVkICBzaGlmdDolZFxuIiwKKyAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIGxvY2tlZCA/ICJsb2NrZWQiIDogImludGVycG9sYXRlZCIsCisgICAgICAgICAgICBzdHJpZGUsIHVzZVMzMiA/ICJTMzIiIDogIlMxNiIsIDIqYy5tSGFsZk51bUNvZWZzLCBjLm1TaGlmdCk7CisjZW5kaWYKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKK3sKKyAgICAodGhpcy0+Km1SZXNhbXBsZUZ1bmMpKHJlaW50ZXJwcmV0X2Nhc3Q8VE8qPihvdXQpLCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQoreworICAgIC8vIFRPRE8gTW9ubyAtPiBNb25vIGlzIG5vdCBzdXBwb3J0ZWQuIE9VVFBVVF9DSEFOTkVMUyByZWZsZWN0cyBtaW5pbXVtIG9mIHN0ZXJlbyBvdXQuCisgICAgY29uc3QgaW50IE9VVFBVVF9DSEFOTkVMUyA9IChDSEFOTkVMUyA8IDIpID8gMiA6IENIQU5ORUxTOworICAgIGNvbnN0IENvbnN0YW50cyYgYyhtQ29uc3RhbnRzKTsKKyAgICBjb25zdCBUQyogY29uc3QgY29lZnMgPSBtQ29uc3RhbnRzLm1GaXJDb2VmczsKKyAgICBUSSogaW1wdWxzZSA9IG1JbkJ1ZmZlci5nZXRJbXB1bHNlKCk7CisgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwOworICAgIHVpbnQzMl90IHBoYXNlRnJhY3Rpb24gPSBtUGhhc2VGcmFjdGlvbjsKKyAgICBjb25zdCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKKyAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOworICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiBPVVRQVVRfQ0hBTk5FTFM7CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VXcmFwTGltaXQgPSBjLm1MIDw8IGMubVNoaWZ0OworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAocGhhc2VJbmNyZW1lbnQgKiAodWludDY0X3Qpb3V0RnJhbWVDb3VudCArIHBoYXNlRnJhY3Rpb24pCisgICAgICAgICAgICAvIHBoYXNlV3JhcExpbWl0OworICAgIC8vIHNhbml0eSBjaGVjayB0aGF0IGluRnJhbWVDb3VudCBpcyBpbiBzaWduZWQgMzIgYml0IGludGVnZXIgcmFuZ2UuCisgICAgQUxPR19BU1NFUlQoMCA8PSBpbkZyYW1lQ291bnQgJiYgaW5GcmFtZUNvdW50IDwgKDFVIDw8IDMxKSk7CisKKyAgICAvL0FMT0dWKCJpbkZyYW1lQ291bnQ6JWQgIG91dEZyYW1lQ291bnQ6JWQiCisgICAgLy8gICAgICAgICIgIHBoYXNlSW5jcmVtZW50OiV1ICBwaGFzZUZyYWN0aW9uOiV1ICBwaGFzZVdyYXBMaW1pdDoldSIsCisgICAgLy8gICAgICAgIGluRnJhbWVDb3VudCwgb3V0RnJhbWVDb3VudCwgcGhhc2VJbmNyZW1lbnQsIHBoYXNlRnJhY3Rpb24sIHBoYXNlV3JhcExpbWl0KTsKKworICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgorICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCisgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCisgICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorCisgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCisgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgorICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CisgICAgICAgIC8vQUxPR1YoIkxPT1A6IGluRnJhbWVDb3VudDolZCAgb3V0cHV0SW5kZXg6JWQgIG91dEZyYW1lQ291bnQ6JWQiCisgICAgICAgIC8vICAgICAgICAiICBwaGFzZUZyYWN0aW9uOiV1ICBwaGFzZVdyYXBMaW1pdDoldSIsCisgICAgICAgIC8vICAgICAgICBpbkZyYW1lQ291bnQsIG91dHB1dEluZGV4LCBvdXRGcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCk7CisKKyAgICAgICAgLy8gY2hlY2sgaW5wdXRJbmRleCBvdmVyZmxvdworICAgICAgICBBTE9HX0FTU0VSVChpbnB1dEluZGV4IDw9IG1CdWZmZXIuZnJhbWVDb3VudCwgImlucHV0SW5kZXglZCA+IGZyYW1lQ291bnQlZCIsCisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgLy8gQnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5IChpbkZyYW1lQ291bnQgPiAwKS4KKyAgICAgICAgLy8gV2UgbWF5IG5vdCBmZXRjaCBhIG5ldyBidWZmZXIgaWYgdGhlIGV4aXN0aW5nIGRhdGEgaXMgc3VmZmljaWVudC4KKyAgICAgICAgd2hpbGUgKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwICYmIGluRnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRQVFMob3V0cHV0SW5kZXggLyBPVVRQVVRfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byByZXNhbXBsZV9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5GcmFtZUNvdW50IC09IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChwaGFzZUZyYWN0aW9uID49IHBoYXNlV3JhcExpbWl0KSB7IC8vIHJlYWQgaW4gZGF0YQorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci50ZW1wbGF0ZSByZWFkQWR2YW5jZTxDSEFOTkVMUz4oCisgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCBjLm1IYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFRJKj4obUJ1ZmZlci5yYXcpLCBpbnB1dEluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiAtPSBwaGFzZVdyYXBMaW1pdDsKKyAgICAgICAgICAgICAgICB3aGlsZSAocGhhc2VGcmFjdGlvbiA+PSBwaGFzZVdyYXBMaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUluQnVmZmVyLnRlbXBsYXRlIHJlYWRBZHZhbmNlPENIQU5ORUxTPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCBjLm1IYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUSSo+KG1CdWZmZXIucmF3KSwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiAtPSBwaGFzZVdyYXBMaW1pdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUSSo+KG1CdWZmZXIucmF3KTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIGNvbnN0IGludCBjb2VmU2hpZnQgPSBjLm1TaGlmdDsKKyAgICAgICAgY29uc3QgaW50IGhhbGZOdW1Db2VmcyA9IGMubUhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZVNpbWQgPSBtVm9sdW1lU2ltZDsKKworICAgICAgICAvLyBtYWluIHByb2Nlc3NpbmcgbG9vcAorICAgICAgICB3aGlsZSAoQ0NfTElLRUxZKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpKSB7CisgICAgICAgICAgICAvLyBjYXV0aW9uOiBmaXIoKSBpcyBpbmxpbmVkIGFuZCBtYXkgYmUgbGFyZ2UuCisgICAgICAgICAgICAvLyBvdXRwdXQgd2lsbCBiZSBsb2FkZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZnJvbSB0aGUgaW5wdXQgc2FtcGxlcyBpbiBpbXB1bHNlWy1oYWxmTnVtQ29lZnMrMV0uLi4gaW1wdWxzZVtoYWxmTnVtQ29lZnNdCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBwb2x5cGhhc2UgZmlsdGVyIG9mIChwaGFzZUZyYWN0aW9uIC8gcGhhc2VXcmFwTGltaXQpIGluIGNvZWZzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vQUxPR1YoIkxPT1AyOiBpbkZyYW1lQ291bnQ6JWQgIG91dHB1dEluZGV4OiVkICBvdXRGcmFtZUNvdW50OiVkIgorICAgICAgICAgICAgLy8gICAgICAgICIgIHBoYXNlRnJhY3Rpb246JXUgIHBoYXNlV3JhcExpbWl0OiV1IiwKKyAgICAgICAgICAgIC8vICAgICAgICBpbkZyYW1lQ291bnQsIG91dHB1dEluZGV4LCBvdXRGcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChwaGFzZUZyYWN0aW9uIDwgcGhhc2VXcmFwTGltaXQpOworICAgICAgICAgICAgZmlyPENIQU5ORUxTLCBMT0NLRUQsIFNUUklERT4oCisgICAgICAgICAgICAgICAgICAgICZvdXRbb3V0cHV0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgY29lZlNoaWZ0LCBoYWxmTnVtQ29lZnMsIGNvZWZzLAorICAgICAgICAgICAgICAgICAgICBpbXB1bHNlLCB2b2x1bWVTaW1kKTsKKworICAgICAgICAgICAgb3V0cHV0SW5kZXggKz0gT1VUUFVUX0NIQU5ORUxTOworCisgICAgICAgICAgICBwaGFzZUZyYWN0aW9uICs9IHBoYXNlSW5jcmVtZW50OworICAgICAgICAgICAgd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRJbmRleCA+PSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsgIC8vIG5lZWQgYSBuZXcgYnVmZmVyCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci50ZW1wbGF0ZSByZWFkQWR2YW5jZTxDSEFOTkVMUz4oaW1wdWxzZSwgaGFsZk51bUNvZWZzLCBpbiwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK2RvbmU6CisgICAgICAgIC8vIFdlIGFycml2ZSBoZXJlIHdoZW4gd2UncmUgZmluaXNoZWQgb3Igd2hlbiB0aGUgaW5wdXQgYnVmZmVyIHJ1bnMgb3V0LgorICAgICAgICAvLyBSZWdhcmRsZXNzIHdlIG5lZWQgdG8gcmVsZWFzZSB0aGUgaW5wdXQgYnVmZmVyIGlmIHdlJ3ZlIGFjcXVpcmVkIGl0LgorICAgICAgICBpZiAoaW5wdXRJbmRleCA+IDApIHsgIC8vIHdlJ3ZlIGFjcXVpcmVkIGEgYnVmZmVyIChhbHRlcm5hdGl2ZWx5IGNvdWxkIGNoZWNrIGZyYW1lQ291bnQpCisgICAgICAgICAgICBBTE9HX0FTU0VSVChpbnB1dEluZGV4ID09IGZyYW1lQ291bnQsICJpbnB1dEluZGV4KCVkKSAhPSBmcmFtZUNvdW50KCVkKSIsCisgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIGZyYW1lQ291bnQpOyAgLy8gbXVzdCBoYXZlIGJlZW4gZnVsbHkgcmVhZC4KKyAgICAgICAgICAgIGlucHV0SW5kZXggPSAwOworICAgICAgICAgICAgcHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICAgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICB9CisgICAgfQorCityZXNhbXBsZV9leGl0OgorICAgIC8vIGlucHV0SW5kZXggbXVzdCBiZSB6ZXJvIGluIGFsbCB0aHJlZSBjYXNlczoKKyAgICAvLyAoMSkgdGhlIGJ1ZmZlciBuZXZlciB3YXMgYmVlbiBhY3F1aXJlZDsgKDIpIHRoZSBidWZmZXIgd2FzCisgICAgLy8gcmVsZWFzZWQgYXQgImRvbmU6Ijsgb3IgKDMpIGdldE5leHRCdWZmZXIoKSBmYWlsZWQuCisgICAgQUxPR19BU1NFUlQoaW5wdXRJbmRleCA9PSAwLCAiUmVsZWFzaW5nOiBpbnB1dGluZGV4OiVkIGZyYW1lQ291bnQ6JWQgIHBoYXNlRnJhY3Rpb246JXUiLAorICAgICAgICAgICAgaW5wdXRJbmRleCwgbUJ1ZmZlci5mcmFtZUNvdW50LCBwaGFzZUZyYWN0aW9uKTsKKyAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7IC8vIHRoZXJlIG11c3QgYmUgbm8gZnJhbWVzIGluIHRoZSBidWZmZXIKKyAgICBtSW5CdWZmZXIuc2V0SW1wdWxzZShpbXB1bHNlKTsKKyAgICBtUGhhc2VGcmFjdGlvbiA9IHBoYXNlRnJhY3Rpb247Cit9CisKKy8qIGluc3RhbnRpYXRlIHRlbXBsYXRlcyB1c2VkIGJ5IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUgKi8KK3RlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+OwordGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48aW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4NmE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBBdWRpb1Jlc2FtcGxlckR5bgorICoKKyAqIFRoaXMgY2xhc3MgdGVtcGxhdGUgaXMgdXNlZCBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIGludGVnZXIgcmVzYW1wbGVycy4KKyAqCisgKiBUeXBlIHZhcmlhYmxlczoKKyAqIFRDID0gZmlsdGVyIGNvZWZmaWNpZW50IHR5cGUgKG9uZSBvZiBpbnQxNl90LCBpbnQzMl90LCBvciBmbG9hdCkKKyAqIFRJID0gaW5wdXQgZGF0YSB0eXBlIChvbmUgb2YgaW50MTZfdCBvciBmbG9hdCkKKyAqIFRPID0gb3V0cHV0IGRhdGEgdHlwZSAob25lIG9mIGludDMyX3Qgb3IgZmxvYXQpCisgKgorICogRm9yIGludGVnZXIgaW5wdXQgZGF0YSB0eXBlcyBUSSwgdGhlIGNvZWZmaWNpZW50IHR5cGUgVEMgaXMgZWl0aGVyIGludDE2X3Qgb3IgaW50MzJfdC4KKyAqIEZvciBmbG9hdCBpbnB1dCBkYXRhIHR5cGVzIFRJLCB0aGUgY29lZmZpY2llbnQgdHlwZSBUQyBpcyBmbG9hdC4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW46IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CitwdWJsaWM6CisgICAgQXVkaW9SZXNhbXBsZXJEeW4oaW50IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KTsKKworICAgIHZpcnR1YWwgfkF1ZGlvUmVzYW1wbGVyRHluKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCgpOworCisgICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpOworCisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKworcHJpdmF0ZToKKworICAgIGNsYXNzIENvbnN0YW50cyB7IC8vIHN0b3JlcyB0aGUgZmlsdGVyIGNvbnN0YW50cy4KKyAgICBwdWJsaWM6CisgICAgICAgIENvbnN0YW50cygpIDoKKyAgICAgICAgICAgIG1MKDApLCBtU2hpZnQoMCksIG1IYWxmTnVtQ29lZnMoMCksIG1GaXJDb2VmcyhOVUxMKQorICAgICAgICB7fQorICAgICAgICB2b2lkIHNldChpbnQgTCwgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgICAgICAgICBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgaW50IG1MOyAgICAgICAgICAgIC8vIGludGVycG9sYXRpb24gcGhhc2VzIGluIHRoZSBmaWx0ZXIuCisgICAgICAgICAgICAgICAgIGludCBtU2hpZnQ7ICAgICAgICAvLyByaWdodCBzaGlmdCB0byBnZXQgcG9seXBoYXNlIGluZGV4CisgICAgICAgIHVuc2lnbmVkIGludCBtSGFsZk51bUNvZWZzOyAvLyBmaWx0ZXIgaGFsZiAjY29lZnMKKyAgICAgICAgICAgY29uc3QgVEMqIG1GaXJDb2VmczsgICAgIC8vIHBvbHlwaGFzZSBmaWx0ZXIgYmFuaworICAgIH07CisKKyAgICBjbGFzcyBJbkJ1ZmZlciB7IC8vIGJ1ZmZlciBtYW5hZ2VtZW50IGZvciBpbnB1dCB0eXBlIFRJCisgICAgcHVibGljOgorICAgICAgICBJbkJ1ZmZlcigpOworICAgICAgICB+SW5CdWZmZXIoKTsKKyAgICAgICAgdm9pZCBpbml0KCk7CisKKyAgICAgICAgdm9pZCByZXNpemUoaW50IENIQU5ORUxTLCBpbnQgaGFsZk51bUNvZWZzKTsKKworICAgICAgICAvLyB1c2VkIGZvciBkaXJlY3QgbWFuYWdlbWVudCBvZiB0aGUgbUltcHVsc2UgcG9pbnRlcgorICAgICAgICBpbmxpbmUgVEkqIGdldEltcHVsc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbUltcHVsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXRJbXB1bHNlKFRJICppbXB1bHNlKSB7CisgICAgICAgICAgICBtSW1wdWxzZSA9IGltcHVsc2U7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CisgICAgICAgIGlubGluZSB2b2lkIHJlYWRBZ2FpbihUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCk7CisKKyAgICAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgorICAgICAgICBpbmxpbmUgdm9pZCByZWFkQWR2YW5jZShUSSomIGltcHVsc2UsIGNvbnN0IGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB0dW5pbmcgcGFyYW1ldGVyIGd1aWRlbGluZXM6IDIgPD0gbXVsdGlwbGUgPD0gOAorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtTdGF0ZVNpemVNdWx0aXBsZU9mRmlsdGVyTGVuZ3RoID0gNDsKKworICAgICAgICAvLyBpbiBnZW5lcmFsLCBtUmluZ0Z1bGwgPSBtU3RhdGUgKyBtU3RhdGVTaXplIC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTLgorICAgICAgICAgICBUSSogbVN0YXRlOyAgICAgIC8vIGJhc2UgcG9pbnRlciBmb3IgdGhlIGlucHV0IGJ1ZmZlciBzdG9yYWdlCisgICAgICAgICAgIFRJKiBtSW1wdWxzZTsgICAgLy8gY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25zZSAoY2VudGVyZWQpCisgICAgICAgICAgIFRJKiBtUmluZ0Z1bGw7ICAgLy8gbVN0YXRlIDw9IG1JbXB1bHNlIDwgbVJpbmdGdWxsCisgICAgICAgIHNpemVfdCBtU3RhdGVDb3VudDsgLy8gc2l6ZSBvZiBzdGF0ZSBpbiB1bml0cyBvZiBUSS4KKyAgICB9OworCisgICAgdm9pZCBjcmVhdGVLYWlzZXJGaXIoQ29uc3RhbnRzICZjLCBkb3VibGUgc3RvcEJhbmRBdHRlbiwKKyAgICAgICAgICAgIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlLCBkb3VibGUgdGJ3Q2hlYXQpOworCisgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KKyAgICB2b2lkIHJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKKyAgICAvLyBkZWZpbmUgYSBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbiB0eXBlIGZvciByZXNhbXBsZQorICAgIHR5cGVkZWYgdm9pZCAoQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OipyZXNhbXBsZV9BQlBfdCkoVE8qIG91dCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50LCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKKyAgICAvLyBkYXRhIC0gdGhlIGNvbnRpZ3VvdXMgc3RvcmFnZSBhbmQgbGF5b3V0IG9mIHRoZXNlIGlzIGltcG9ydGFudC4KKyAgICAgICAgICAgSW5CdWZmZXIgbUluQnVmZmVyOworICAgICAgICAgIENvbnN0YW50cyBtQ29uc3RhbnRzOyAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgY29lZmZpY2llbnQgcGFyYW1ldGVycworICAgIFRPIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpIG1Wb2x1bWVTaW1kWzJdOyAvLyBtdXN0IGJlIGFsaWduZWQgb3IgTkVPTiBtYXkgY3Jhc2gKKyAgICAgcmVzYW1wbGVfQUJQX3QgbVJlc2FtcGxlRnVuYzsgICAgIC8vIGNhbGxlZCBmdW5jdGlvbiBmb3IgcmVzYW1wbGluZworICAgICAgICAgICAgaW50MzJfdCBtRmlsdGVyU2FtcGxlUmF0ZTsgLy8gZGVzaWduZWQgZmlsdGVyIHNhbXBsZSByYXRlLgorICAgICAgICBzcmNfcXVhbGl0eSBtRmlsdGVyUXVhbGl0eTsgICAgLy8gZGVzaWduZWQgZmlsdGVyIHF1YWxpdHkuCisgICAgICAgICAgICAgIHZvaWQqIG1Db2VmQnVmZmVyOyAgICAgICAvLyBpZiBhIGZpbHRlciBpcyBjcmVhdGVkLCB0aGlzIGlzIG5vdCBudWxsCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjRiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApAQCAtMCwwICsxLDcwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX0dFTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBnZW5lcmF0ZXMgYSBzaW5lIHdhdmUgYXQgZXF1YWwgc3RlcHMuCisgKgorICogQXMgbW9zdCBvZiBvdXIgZnVuY3Rpb25zIHVzZSBzaW5lIG9yIGNvc2luZSBhdCBlcXVhbCBzdGVwcywKKyAqIGl0IGlzIHZlcnkgZWZmaWNpZW50IHRvIGNvbXB1dGUgdGhlbSB0aGF0IHdheSAoc2luZ2xlIG11bHRpcGx5IGFuZCBzdWJ0cmFjdCksCisgKiByYXRoZXIgdGhhbiBpbnZva2luZyB0aGUgbWF0aCBsaWJyYXJ5IHNpbigpIG9yIGNvcygpIGVhY2ggdGltZS4KKyAqCisgKiBTaW5lR2VuIHVzZXMgR29lcnR6ZWwncyBBbGdvcml0aG0gKGFzIGEgZ2VuZXJhdG9yIG5vdCBhIGZpbHRlcikKKyAqIHRvIGNhbGN1bGF0ZSBzaW5lKHdzdGFydCArIG4gKiB3c3RlcCkgb3IgY29zaW5lKHdzdGFydCArIG4gKiB3c3RlcCkKKyAqIGJ5IHN0ZXBwaW5nIHRocm91Z2ggMCwgMSwgLi4uIG4uCisgKgorICogZV5pKHdzdGFydCt3c3RlcCkgPSAyY29zKHdzdGVwKSAqIGVeaSh3c3RhcnQpIC0gZV5pKHdzdGFydC13c3RlcCkKKyAqCisgKiBvciBsb29raW5nIGF0IGp1c3QgdGhlIGltYWdpbmFyeSBzaW5lIHRlcm0sIGFzIHRoZSBjb3NpbmUgZm9sbG93cyBpZGVudGljYWxseToKKyAqCisgKiBzaW4od3N0YXJ0K3dzdGVwKSA9IDJjb3Mod3N0ZXApICogc2luKHdzdGFydCkgLSBzaW4od3N0YXJ0LXdzdGVwKQorICoKKyAqIEdvZXJ0emVsJ3MgYWxnb3JpdGhtIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIGFuZ2xlIGFkZGl0aW9uIGZvcm11bGEsCisgKiBlXmkod3N0YXJ0K3dzdGVwKSA9IGVeaSh3c3RhcnQpICogZV5pKHdzdGVwKSwgd2hpY2ggdGFrZXMgdXAgdG8KKyAqIDQgbXVsdGlwbGllcyBhbmQgMiBhZGRzIChvciAzKiBhbmQgMyspIGFuZCByZXF1aXJlcyBib3RoIHNpbmUgYW5kCisgKiBjb3NpbmUgZ2VuZXJhdGlvbiBkdWUgdG8gdGhlIGNvbXBsZXggKiBjb21wbGV4IG11bHRpcGx5IChmdWxsIHJvdGF0aW9uKS4KKyAqCisgKiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR29lcnR6ZWxfYWxnb3JpdGhtCisgKgorICovCisKK2NsYXNzIFNpbmVHZW4geworcHVibGljOgorICAgIFNpbmVHZW4oZG91YmxlIHdzdGFydCwgZG91YmxlIHdzdGVwLCBib29sIGNvc2luZSA9IGZhbHNlKSB7CisgICAgICAgIGlmIChjb3NpbmUpIHsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gY29zKHdzdGFydCk7CisgICAgICAgICAgICBtUHJldmlvdXMgPSBjb3Mod3N0YXJ0IC0gd3N0ZXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnQgPSBzaW4od3N0YXJ0KTsKKyAgICAgICAgICAgIG1QcmV2aW91cyA9IHNpbih3c3RhcnQgLSB3c3RlcCk7CisgICAgICAgIH0KKyAgICAgICAgbVR3b0NvcyA9IDIuKmNvcyh3c3RlcCk7CisgICAgfQorICAgIFNpbmVHZW4oZG91YmxlIGV4cE5vdywgZG91YmxlIGV4cFByZXYsIGRvdWJsZSB0d29Db3NTdGVwKSB7CisgICAgICAgIG1DdXJyZW50ID0gZXhwTm93OworICAgICAgICBtUHJldmlvdXMgPSBleHBQcmV2OworICAgICAgICBtVHdvQ29zID0gdHdvQ29zU3RlcDsKKyAgICB9CisgICAgaW5saW5lIGRvdWJsZSB2YWx1ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50OworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZHZhbmNlKCkgeworICAgICAgICBkb3VibGUgdG1wID0gbUN1cnJlbnQ7CisgICAgICAgIG1DdXJyZW50ID0gbUN1cnJlbnQqbVR3b0NvcyAtIG1QcmV2aW91czsKKyAgICAgICAgbVByZXZpb3VzID0gdG1wOworICAgIH0KKyAgICBpbmxpbmUgZG91YmxlIHZhbHVlQWR2YW5jZSgpIHsKKyAgICAgICAgZG91YmxlIHRtcCA9IG1DdXJyZW50OworICAgICAgICBtQ3VycmVudCA9IG1DdXJyZW50Km1Ud29Db3MgLSBtUHJldmlvdXM7CisgICAgICAgIG1QcmV2aW91cyA9IHRtcDsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZG91YmxlIG1DdXJyZW50OyAvLyBjdXJyZW50IHZhbHVlIG9mIHNpbmUvY29zaW5lCisgICAgZG91YmxlIG1QcmV2aW91czsgLy8gcHJldmlvdXMgdmFsdWUgb2Ygc2luZS9jb3NpbmUKKyAgICBkb3VibGUgbVR3b0NvczsgLy8gc3RlcHBpbmcgZmFjdG9yCit9OworCisvKgorICogZ2VuZXJhdGVzIGEgc2VyaWVzIG9mIHNpbmUgZ2VuZXJhdG9ycywgcGhhc2Ugb2Zmc2V0IGJ5IGZpeGVkIHN0ZXBzLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBwb2x5cGhhc2Ugc2luZSBnZW5lcmF0b3JzLCBvbmUgcGVyIHBvbHlwaGFzZQorICogaW4gdGhlIGZpbHRlciBjb2RlIGJlbG93LgorICoKKyAqIFRoZSBTaW5lR2VuIHJldHVybmVkIGJ5IHZhbHVlKCkgc3RhcnRzIGF0IGlubmVyU3RhcnQgPSBvdXRlclN0YXJ0ICsgbipvdXRlclN0ZXA7CisgKiBpbmNyZW1lbnRzIGJ5IGlubmVyU3RlcC4KKyAqCisgKi8KKworY2xhc3MgU2luZUdlbkdlbiB7CitwdWJsaWM6CisgICAgU2luZUdlbkdlbihkb3VibGUgb3V0ZXJTdGFydCwgZG91YmxlIG91dGVyU3RlcCwgZG91YmxlIGlubmVyU3RlcCwgYm9vbCBjb3NpbmUgPSBmYWxzZSkKKyAgICAgICAgICAgIDogbVNpbmVJbm5lckN1cihvdXRlclN0YXJ0LCBvdXRlclN0ZXAsIGNvc2luZSksCisgICAgICAgICAgICAgIG1TaW5lSW5uZXJQcmV2KG91dGVyU3RhcnQtaW5uZXJTdGVwLCBvdXRlclN0ZXAsIGNvc2luZSkKKyAgICB7CisgICAgICAgIG1Ud29Db3MgPSAyLipjb3MoaW5uZXJTdGVwKTsKKyAgICB9CisgICAgaW5saW5lIFNpbmVHZW4gdmFsdWUoKSB7CisgICAgICAgIHJldHVybiBTaW5lR2VuKG1TaW5lSW5uZXJDdXIudmFsdWUoKSwgbVNpbmVJbm5lclByZXYudmFsdWUoKSwgbVR3b0Nvcyk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkdmFuY2UoKSB7CisgICAgICAgIG1TaW5lSW5uZXJDdXIuYWR2YW5jZSgpOworICAgICAgICBtU2luZUlubmVyUHJldi5hZHZhbmNlKCk7CisgICAgfQorICAgIGlubGluZSBTaW5lR2VuIHZhbHVlQWR2YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIFNpbmVHZW4obVNpbmVJbm5lckN1ci52YWx1ZUFkdmFuY2UoKSwgbVNpbmVJbm5lclByZXYudmFsdWVBZHZhbmNlKCksIG1Ud29Db3MpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTaW5lR2VuIG1TaW5lSW5uZXJDdXI7IC8vIGdlbmVyYXRlIHRoZSBpbm5lciBzaW5lIHZhbHVlcyAoc3RlcHBlZCBieSBvdXRlclN0ZXApLgorICAgIFNpbmVHZW4gbVNpbmVJbm5lclByZXY7IC8vIGdlbmVyYXRlIHRoZSBpbm5lciBzaW5lIHByZXZpb3VzIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChiZWhpbmQgYnkgaW5uZXJTdGVwLCBzdGVwcGVkIGJ5IG91dGVyU3RlcCkuCisgICAgZG91YmxlIG1Ud29Db3M7IC8vIHRoZSBpbm5lciBzdGVwcGluZyBmYWN0b3IgZm9yIHRoZSByZXR1cm5lZCBTaW5lR2VuLgorfTsKKworc3RhdGljIGlubGluZSBkb3VibGUgc3FyKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIHggKiB4OworfQorCisvKgorICogcm91bmRzIGEgZG91YmxlIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgZm9yIEZJUiBjb2VmZmljaWVudHMuCisgKgorICogT25lIHZhcmlhbnQgdXNlcyBub2lzZSBzaGFwaW5nLCB3aGljaCBtdXN0IGtlZXAgZXJyb3IgaGlzdG9yeQorICogdG8gd29yayAodGhlIGVyciBwYXJhbWV0ZXIsIGluaXRpYWxpemVkIHRvIDApLgorICogVGhlIG90aGVyIHZhcmlhbnQgaXMgYSBub24tbm9pc2Ugc2hhcGVkIHZlcnNpb24gZm9yCisgKiBTMzIgY29lZmZpY2llbnRzIChub2lzZSBzaGFwaW5nIGRvZXNuJ3QgZ2FpbiBtdWNoKS4KKyAqCisgKiBDYXV0aW9uOiBObyBib3VuZHMgc2F0dXJhdGlvbiBpcyBhcHBsaWVkLCBidXQgaXNuJ3QgbmVlZGVkIGluIHRoaXMgY2FzZS4KKyAqCisgKiBAcGFyYW0geCBpcyB0aGUgdmFsdWUgdG8gcm91bmQuCisgKgorICogQHBhcmFtIG1heHZhbCBpcyB0aGUgbWF4aW11bSBpbnRlZ2VyIHNjYWxlIGZhY3RvciBleHByZXNzZWQgYXMgYW4gaW50NjQgKGZvciBoZWFkcm9vbSkuCisgKiBUeXBpY2FsbHkgdGhpcyBtYXkgYmUgdGhlIG1heGltdW0gcG9zaXRpdmUgaW50ZWdlcisxICh1c2luZyB0aGUgZmFjdCB0aGF0IGRvdWJsZSBwcmVjaXNpb24KKyAqIEZJUiBjb2VmZmljaWVudHMgZ2VuZXJhdGVkIGhlcmUgYXJlIG5ldmVyIHRoYXQgY2xvc2UgdG8gMS4wIHRvIHBvc2UgYW4gb3ZlcmZsb3cgY29uZGl0aW9uKS4KKyAqCisgKiBAcGFyYW0gZXJyIGlzIHRoZSBwcmV2aW91cyBlcnJvciAoYWN0dWFsIC0gcm91bmRlZCkgZm9yIHRoZSBwcmV2aW91cyByb3VuZGluZyBvcC4KKyAqIEZvciAxNmIgY29lZmZpY2llbnRzIHRoaXMgY2FuIGltcHJvdmUgc3RvcGJhbmQgZEIgcGVyZm9ybWFuY2UgYnkgdXAgdG8gMmRCLgorICoKKyAqIE1hbnkgdmFyaWFudHMgZXhpc3QgZm9yIHRoZSBub2lzZSBzaGFwaW5nOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05vaXNlX3NoYXBpbmcKKyAqCisgKi8KKworc3RhdGljIGlubGluZSBpbnQ2NF90IHRvaW50KGRvdWJsZSB4LCBpbnQ2NF90IG1heHZhbCwgZG91YmxlJiBlcnIpIHsKKyAgICBkb3VibGUgdmFsID0geCAqIG1heHZhbDsKKyAgICBkb3VibGUgaXZhbCA9IGZsb29yKHZhbCArIDAuNSArIGVyciowLjIpOworICAgIGVyciA9IHZhbCAtIGl2YWw7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGl2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGZsb29yKHggKiBtYXh2YWwgKyAwLjUpKTsKK30KKworLyoKKyAqIE1vZGlmaWVkIEJlc3NlbCBmdW5jdGlvbiBvZiB0aGUgZmlyc3Qga2luZAorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CZXNzZWxfZnVuY3Rpb24KKyAqCisgKiBUaGUgZm9ybXVsYXMgYXJlIHRha2VuIGZyb20gQWJyYW1vd2l0eiBhbmQgU3RlZ3VuLAorICogX0hhbmRib29rIG9mIE1hdGhlbWF0aWNhbCBGdW5jdGlvbnNfIChsaW5rcyBiZWxvdyk6CisgKgorICogaHR0cDovL3Blb3BsZS5tYXRoLnNmdS5jYS9+Y2JtL2FhbmRzL3BhZ2VfMzc1Lmh0bQorICogaHR0cDovL3Blb3BsZS5tYXRoLnNmdS5jYS9+Y2JtL2FhbmRzL3BhZ2VfMzc4Lmh0bQorICoKKyAqIGh0dHA6Ly9kbG1mLm5pc3QuZ292LzEwLjI1CisgKiBodHRwOi8vZGxtZi5uaXN0Lmdvdi8xMC40MAorICoKKyAqIE5vdGUgd2UgYXNzdW1lIHggaXMgbm9ubmVnYXRpdmUgKHRoZSBmdW5jdGlvbiBpcyBzeW1tZXRyaWMsCisgKiBwYXNzIGluIHRoZSBhYnNvbHV0ZSB2YWx1ZSBhcyBuZWVkZWQpLgorICoKKyAqIENvbnN0YW50cyBhcmUgY29tcGlsZSB0aW1lIGRlcml2ZWQgd2l0aCB0ZW1wbGF0ZXMgSTBUZXJtPD4gYW5kCisgKiBJMEFUZXJtPD4gdG8gdGhlIHByZWNpc2lvbiBvZiB0aGUgY29tcGlsZXIuICBUaGUgc2VyaWVzIGNhbiBiZSBleHBhbmRlZAorICogdG8gYW55IHByZWNpc2lvbiBuZWVkZWQsIGJ1dCBjdXJyZW50bHkgc2V0IGFyb3VuZCAyNGIgcHJlY2lzaW9uLgorICoKKyAqIFdlIHVzZSBhIGJpdCBvZiB0ZW1wbGF0ZSBtYXRoIGhlcmUsIGNvbnN0ZXhwciB3b3VsZCBwcm9iYWJseSBiZQorICogbW9yZSBhcHByb3ByaWF0ZSBmb3IgYSBDKysxMSBjb21waWxlci4KKyAqCisgKiBGb3IgdGhlIGludGVybWVkaWF0ZSByYW5nZSAzLjc1IDwgeCA8IDE1LCB3ZSB1c2UgbWluaW1heCBwb2x5bm9taWFsIGZpdC4KKyAqCisgKi8KKwordGVtcGxhdGUgPGludCBOPgorc3RydWN0IEkwVGVybSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IEkwVGVybTxOLTE+Ojp2YWx1ZSAvICg0LiAqIE4gKiBOKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgSTBUZXJtPDA+IHsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gMS47Cit9OworCit0ZW1wbGF0ZSA8aW50IE4+CitzdHJ1Y3QgSTBBVGVybSB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IEkwQVRlcm08Ti0xPjo6dmFsdWUgKiAoMi4qTi0xLikgKiAoMi4qTi0xLikgLyAoOC4gKiBOKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgSTBBVGVybTwwPiB7IC8vIDEvc3FydCgyKlBJKTsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIHZhbHVlID0gMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7Cit9OworCisjaWYgVVNFX0hPUk5FUlNfTUVUSE9ECisvKiBQb2x5bm9taWFsIGV2YWx1YXRpb24gb2YgQSArIEJ4ICsgQ3heMiArIER4XjMgKyAuLi4KKyAqIHVzaW5nIEhvcm5lcidzIE1ldGhvZDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JuZXInc19tZXRob2QKKyAqCisgKiBUaGlzIGhhcyBmZXdlciBtdWx0aXBsaWNhdGlvbnMgdGhhbiBFc3RyaW4ncyBtZXRob2QgYmVsb3csIGJ1dCBoYXMgYmFjayB0byBiYWNrCisgKiBmbG9hdGluZyBwb2ludCBkZXBlbmRlbmNpZXMuCisgKgorICogT24gQVJNIHRoaXMgYXBwZWFycyB0byB3b3JrIHNsb3dlciwgc28gVVNFX0hPUk5FUlNfTUVUSE9EIGlzIG5vdCBkZWZhdWx0IGVuYWJsZWQuCisgKi8KKworaW5saW5lIGRvdWJsZSBQb2x5Mihkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyB4ICogQjsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5NChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiAoQiArIHggKiAoQyArIHggKiAoRCkpKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Nyhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiAoQiArIHggKiAoQyArIHggKiAoRCArIHggKiAoRSArIHggKiAoRiArIHggKiAoRykpKSkpKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5OShkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIEgsIGRvdWJsZSBJLCBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgeCAqIChCICsgeCAqIChDICsgeCAqIChEICsgeCAqIChFICsgeCAqIChGICsgeCAqIChHICsgeCAqIChIICsgeCAqIChJKSkpKSkpKSk7Cit9CisKKyNlbHNlCisvKiBQb2x5bm9taWFsIGV2YWx1YXRpb24gb2YgQSArIEJ4ICsgQ3heMiArIER4XjMgKyAuLi4KKyAqIHVzaW5nIEVzdHJpbidzIE1ldGhvZDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Fc3RyaW4nc19zY2hlbWUKKyAqCisgKiBUaGlzIGlzIHR5cGljYWxseSBmYXN0ZXIsIHBlcmhhcHMgZ2FpbnMgYWJvdXQgNS0xMCUgb3ZlcmFsbCBvbiBBUk0gcHJvY2Vzc29ycworICogb3ZlciBIb3JuZXIncyBtZXRob2QgYWJvdmUuCisgKi8KKworaW5saW5lIGRvdWJsZSBQb2x5Mihkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyBCICogeDsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Myhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgeCwgZG91YmxlIHgyKSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgQyAqIHgyOworfQorCitpbmxpbmUgZG91YmxlIFBvbHkzKGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgQyAqIHggKiB4OworfQorCitpbmxpbmUgZG91YmxlIFBvbHk0KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgeCwgZG91YmxlIHgyKSB7CisgICAgcmV0dXJuIFBvbHkyKEEsIEIsIHgpICsgUG9seTIoQywgRCwgeCkgKiB4MjsgLy8gc2FtZSBhcyBwb2x5Mihwb2x5MiwgcG9seTIsIHgyKTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5NChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gUG9seTQoQSwgQiwgQywgRCwgeCwgeCAqIHgpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk3KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgeCkgeworICAgIGRvdWJsZSB4MiA9IHggKiB4OworICAgIHJldHVybiBQb2x5NChBLCBCLCBDLCBELCB4LCB4MikgKyBQb2x5MyhFLCBGLCBHLCB4LCB4MikgKiAoeDIgKiB4Mik7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTgoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSBILCBkb3VibGUgeCwgZG91YmxlIHgyLCBkb3VibGUgeDQpIHsKKyAgICByZXR1cm4gUG9seTQoQSwgQiwgQywgRCwgeCwgeDIpICsgUG9seTQoRSwgRiwgRywgSCwgeCwgeDIpICogeDQ7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTkoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSBILCBkb3VibGUgSSwgZG91YmxlIHgpIHsKKyAgICBkb3VibGUgeDIgPSB4ICogeDsKKyNpZiAxCisgICAgLy8gSXQgZG9lcyBub3Qgc2VlbSBmYXN0ZXIgdG8gZXhwbGljaXRseSBkZWNvbXBvc2UgUG9seTggaW50byBQb2x5NCwgYnV0CisgICAgLy8gY291bGQgZGVwZW5kIG9uIGNvbXBpbGVyIGZsb2F0aW5nIHBvaW50IHNjaGVkdWxpbmcuCisgICAgZG91YmxlIHg0ID0geDIgKiB4MjsKKyAgICByZXR1cm4gUG9seTgoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgeCwgeDIsIHg0KSArIEkgKiAoeDQgKiB4NCk7CisjZWxzZQorICAgIGRvdWJsZSB2YWwgPSBQb2x5NChBLCBCLCBDLCBELCB4LCB4Mik7CisgICAgZG91YmxlIHg0ID0geDIgKiB4MjsKKyAgICByZXR1cm4gdmFsICsgUG9seTQoRSwgRiwgRywgSCwgeCwgeDIpICogeDQgKyBJICogKHg0ICogeDQpOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBkb3VibGUgSTAoZG91YmxlIHgpIHsKKyAgICBpZiAoeCA8IDMuNzUpIHsKKyAgICAgICAgeCAqPSB4OworICAgICAgICByZXR1cm4gUG9seTcoSTBUZXJtPDA+Ojp2YWx1ZSwgSTBUZXJtPDE+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08Mj46OnZhbHVlLCBJMFRlcm08Mz46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw0Pjo6dmFsdWUsIEkwVGVybTw1Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDY+Ojp2YWx1ZSwgeCk7IC8vIGUgPCAxLjZlLTcKKyAgICB9CisgICAgaWYgKDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VyaWVzIGV4cGFuc2lvbiBjb2VmcyBhcmUgZWFzeSB0byBjYWxjdWxhdGUsIGJ1dCBhcmUgZXhwYW5kZWQgYXJvdW5kIDAsCisgICAgICAgICAqIHNvIGVycm9yIGlzIHVuZXF1YWwgb3ZlciB0aGUgaW50ZXJ2YWwgMCA8IHggPCAzLjc1LCB0aGUgZXJyb3IgYmVpbmcKKyAgICAgICAgICogc2lnbmlmaWNhbnRseSBiZXR0ZXIgbmVhciAwLgorICAgICAgICAgKgorICAgICAgICAgKiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byB1c2UgcHJlY2lzZSBtaW5pbWF4IHBvbHlub21pYWwgZml0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogV2UgdXNlIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBzb2x1dGlvbiBmb3IgMy43NSA8IHggPCAxNSwgYmFzZWQgb24KKyAgICAgICAgICogdGhlIHRhYmxlcyBpbiBCbGFpciBhbmQgRWR3YXJkcywgIlN0YWJsZSBSYXRpb25hbCBNaW5pbWF4IEFwcHJveGltYXRpb25zCisgICAgICAgICAqIHRvIHRoZSBNb2RpZmllZCBCZXNzZWwgRnVuY3Rpb25zIEkwKHgpIGFuZCBJMSh4KSIsIENoYWxrIEhpbGwgTnVjbGVhciBMYWJvcmF0b3J5LAorICAgICAgICAgKiBBRUNMLTQ5MjguCisgICAgICAgICAqCisgICAgICAgICAqIGh0dHA6Ly93d3cuaWFlYS5vcmcvaW5pcy9jb2xsZWN0aW9uL05DTENvbGxlY3Rpb25TdG9yZS9fUHVibGljLzA2LzE3OC82MTc4NjY3LnBkZgorICAgICAgICAgKgorICAgICAgICAgKiBTZWUgVGFibGUgMTEgZm9yIDAgPCB4IDwgMTU7IGUgPCAxMF4oLTcuMTMpLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlOiBCZXRhIGNhbm5vdCBleGNlZWQgMTUgKGhlbmNlIFN0b3BiYW5kIGNhbm5vdCBleGNlZWQgMTQ0ZEIgPSAyNGIpLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHNwZWVkcyB1cCBvdmVyYWxsIGNvbXB1dGF0aW9uIGJ5IGFib3V0IDQwJSBvdmVyIHVzaW5nIHRoZSBlbHNlIGNsYXVzZSBiZWxvdywKKyAgICAgICAgICogd2hpY2ggcmVxdWlyZXMgc3FydCBhbmQgZXhwLgorICAgICAgICAgKgorICAgICAgICAgKi8KKworICAgICAgICB4ICo9IHg7CisgICAgICAgIGRvdWJsZSBudW0gPSBQb2x5OSgtMC4xMzU0NDkzODQzMGU5LCAtMC4zMzE1Mzc1NDUxMmU4LAorICAgICAgICAgICAgICAgIC0wLjE5NDA2NjMxOTQ2ZTcsIC0wLjQ4MDU4MzE4NzgzZTUsCisgICAgICAgICAgICAgICAgLTAuNjMyNjk3ODMzNjBlMywgLTAuNDk1MjA3NzkwNzBlMSwKKyAgICAgICAgICAgICAgICAtMC4yNDk3MDkxMDM3MGUtMSwgLTAuNzQ3NDExNTk1NTBlLTQsCisgICAgICAgICAgICAgICAgLTAuMTgyNTc2MTI0NjBlLTYsIHgpOworICAgICAgICBkb3VibGUgeSA9IHggLSAyMjUuOyAvLyByZWZsZWN0aW9uIGFyb3VuZCAxNSAoc3F1YXJlZCkKKyAgICAgICAgZG91YmxlIGRlbiA9IFBvbHk0KC0wLjM0NTk4NzM3MTk2ZTgsIDAuMjM4NTI2NDMxODFlNiwKKyAgICAgICAgICAgICAgICAtMC43MDY5OTM4NzYyMGUzLCAwLjEwMDAwMDAwMDAwZTEsIHkpOworICAgICAgICByZXR1cm4gbnVtIC8gZGVuOworCisjaWYgSU9fRVhURU5ERURfQkVUQQorICAgICAgICAvKiBUYWJsZSA0MiBmb3IgeCA+IDE1OyBlIDwgMTBeKC04LjExKS4KKyAgICAgICAgICogVGhpcyBpcyB1c2VkIGZvciBCZXRhPjE1LCBidXQgaXMgZGlzYWJsZWQgaGVyZSBhcworICAgICAgICAgKiB3ZSBuZXZlciB1c2UgQmV0YSB0aGF0IGhpZ2guCisgICAgICAgICAqCisgICAgICAgICAqIE5PVEU6IFRoaXMgc2hvdWxkIGJlIGVuYWJsZWQgb25seSBmb3IgeCA+IDE1LgorICAgICAgICAgKi8KKworICAgICAgICBkb3VibGUgeSA9IDEuL3g7CisgICAgICAgIGRvdWJsZSB6ID0geSAtICgxLi8xNSk7CisgICAgICAgIGRvdWJsZSBudW0gPSBQb2x5MigwLjQxNTA3OTg2MTc0NmUxLCAtMC41MTQ5MDkyNDk2ZTEsIHopOworICAgICAgICBkb3VibGUgZGVuID0gUG9seTMoMC4xMDMxNTA3NjM4MjNlMiwgLTAuMTQxODE2ODc0MTNlMiwKKyAgICAgICAgICAgICAgICAwLjEwMDAwMDAwMDBlMSwgeik7CisgICAgICAgIHJldHVybiBleHAoeCkgKiBzcXJ0KHkpICogbnVtIC8gZGVuOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTk9UIFVTRUQsIGJ1dCByZWZlcmVuY2UgZm9yIGxhcmdlIEJldGEuCisgICAgICAgICAqCisgICAgICAgICAqIEFicmFtb3dpdHogYW5kIFN0ZWd1biBhc3ltcHRvdGljIGZvcm11bGEuCisgICAgICAgICAqIHdvcmtzIGZvciB4ID4gMy43NS4KKyAgICAgICAgICovCisgICAgICAgIGRvdWJsZSB5ID0gMS4veDsKKyAgICAgICAgcmV0dXJuIGV4cCh4KSAqIHNxcnQoeSkgKgorICAgICAgICAgICAgICAgIC8vIG5vdGU6IHJlY2lwcm9jYWwgc3F1YXJlcm9vdCBtYXkgYmUgZWFzaWVyIQorICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmFzdF9pbnZlcnNlX3NxdWFyZV9yb290CisgICAgICAgICAgICAgICAgUG9seTkoSTBBVGVybTwwPjo6dmFsdWUsIEkwQVRlcm08MT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTwyPjo6dmFsdWUsIEkwQVRlcm08Mz46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw0Pjo6dmFsdWUsIEkwQVRlcm08NT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw2Pjo6dmFsdWUsIEkwQVRlcm08Nz46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSTBBVGVybTw4Pjo6dmFsdWUsIHkpOyAvLyAoLi4uIGUpIDwgMS45ZS03CisgICAgfQorfQorCisvKiBBIHNwZWVkIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBNb2RpZmllZCBCZXNzZWwgSTAoKSB3aGljaCBpbmNvcnBvcmF0ZXMKKyAqIHRoZSBzcXJ0IGFuZCBudW1lcmF0b3IgbXVsdGlwbHkgYW5kIGRlbm9taW5hdG9yIGRpdmlkZSBpbnRvIHRoZSBjb21wdXRhdGlvbi4KKyAqIFRoaXMgc3BlZWRzIHVwIGZpbHRlciBjb21wdXRhdGlvbiBieSBhYm91dCAxMC0xNSUuCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIEkwU3FyUmF0KGRvdWJsZSB4MiwgZG91YmxlIG51bSwgZG91YmxlIGRlbikgeworICAgIGlmICh4MiA8ICgzLjc1ICogMy43NSkpIHsKKyAgICAgICAgcmV0dXJuIFBvbHk3KEkwVGVybTwwPjo6dmFsdWUsIEkwVGVybTwxPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDI+Ojp2YWx1ZSwgSTBUZXJtPDM+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08ND46OnZhbHVlLCBJMFRlcm08NT46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw2Pjo6dmFsdWUsIHgyKSAqIG51bSAvIGRlbjsgLy8gZSA8IDEuNmUtNworICAgIH0KKyAgICBudW0gKj0gUG9seTkoLTAuMTM1NDQ5Mzg0MzBlOSwgLTAuMzMxNTM3NTQ1MTJlOCwKKyAgICAgICAgICAgIC0wLjE5NDA2NjMxOTQ2ZTcsIC0wLjQ4MDU4MzE4NzgzZTUsCisgICAgICAgICAgICAtMC42MzI2OTc4MzM2MGUzLCAtMC40OTUyMDc3OTA3MGUxLAorICAgICAgICAgICAgLTAuMjQ5NzA5MTAzNzBlLTEsIC0wLjc0NzQxMTU5NTUwZS00LAorICAgICAgICAgICAgLTAuMTgyNTc2MTI0NjBlLTYsIHgyKTsgLy8gZSA8IDEwXigtNy4xMykuCisgICAgZG91YmxlIHkgPSB4MiAtIDIyNS47IC8vIHJlZmxlY3Rpb24gYXJvdW5kIDE1IChzcXVhcmVkKQorICAgIGRlbiAqPSBQb2x5NCgtMC4zNDU5ODczNzE5NmU4LCAwLjIzODUyNjQzMTgxZTYsCisgICAgICAgICAgICAtMC43MDY5OTM4NzYyMGUzLCAwLjEwMDAwMDAwMDAwZTEsIHkpOworICAgIHJldHVybiBudW0gLyBkZW47Cit9CisKKy8qCisgKiBjYWxjdWxhdGVzIHRoZSB0cmFuc2l0aW9uIGJhbmR3aWR0aCBmb3IgYSBLYWlzZXIgZmlsdGVyCisgKgorICogRm9ybXVsYSAzLjIuOCwgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4CisgKiBGb3JtdWxhIDcuNzYsIE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlLXRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNTQyCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIGlzIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgcGVyIGZpbHRlciBwaGFzZS4KKyAqCisgKiBAcGFyYW0gc3RvcEJhbmRBdHRlbiBpcyB0aGUgc3RvcCBiYW5kIGF0dGVudWF0aW9uIGRlc2lyZWQuCisgKgorICogQHJldHVybiB0aGUgdHJhbnNpdGlvbiBiYW5kd2lkdGggaW4gbm9ybWFsaXplZCBmcmVxdWVuY3kgKDAgPD0gZiA8PSAwLjUpCisgKi8KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGZpckthaXNlclRidyhpbnQgaGFsZk51bUNvZWYsIGRvdWJsZSBzdG9wQmFuZEF0dGVuKSB7CisgICAgcmV0dXJuIChzdG9wQmFuZEF0dGVuIC0gNy45NSkvKCgyLioxNC4zNikqaGFsZk51bUNvZWYpOworfQorCisvKgorICogY2FsY3VsYXRlcyB0aGUgZmlyIHRyYW5zZmVyIHJlc3BvbnNlIG9mIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIgYXQgdy4KKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBEVEZUIHRyYW5zZmVyIGNvZWZmaWNpZW50IEgodykgZm9yIDAgPD0gdyA8PSBQSSwgdXRpbGl6aW5nIHRoZQorICogZmFjdCB0aGF0IGhbbl0gaXMgc3ltbWV0cmljIChjb3NpbmVzIG9ubHksIG5vIGNvbXBsZXggYXJpdGhtZXRpYykuCisgKgorICogV2UgdXNlIEdvZXJ0emVsJ3MgYWxnb3JpdGhtIHRvIGFjY2VsZXJhdGUgdGhlIGNvbXB1dGF0aW9uIHRvIGVzc2VudGlhbGx5CisgKiBhIHNpbmdsZSBtdWx0aXBseSBhbmQgMiBhZGRzIHBlciBmaWx0ZXIgY29lZmZpY2llbnQgaFtdLgorICoKKyAqIEJlIGNhcmVmdWwgYmUgY2FyZWZ1bCB0byBjb25zaWRlciB0aGF0IGhbbl0gaXMgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciwKKyAqIHdpdGggTCBwaGFzZXMsIHNvIHJlc2NhbGluZyBIKHcpL0wgaXMgcHJvYmFibHkgd2hhdCB5b3UgZXhwZWN0IGZvciAidW5pdHkgZ2FpbiIsCisgKiBhcyB5b3Ugb25seSB1c2Ugb25lIG9mIHRoZSBwb2x5cGhhc2VzIGF0IGEgdGltZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGRvdWJsZSBmaXJUcmFuc2Zlcihjb25zdCBUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLCBkb3VibGUgdykgeworICAgIGRvdWJsZSBhY2N1bSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oY29lZlswXSkqMC41OyAgLy8gImNlbnRlciBjb2VmZmljaWVudCIgZnJvbSBmaXJzdCBiYW5rCisgICAgY29lZiArPSBoYWxmTnVtQ29lZjsgICAgLy8gc2tpcCBmaXJzdCBmaWx0ZXJiYW5rIChwaWNrZWQgdXAgYnkgdGhlIGxhc3QgZmlsdGVyYmFuaykuCisjaWYgU0xPV19GSVJUUkFOU0ZFUgorICAgIC8qIE9yaWdpbmFsIGNvZGUgZm9yIHJlZmVyZW5jZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgY29kZSBiZWxvdywgYnV0IHNsb3dlci4gKi8KKyAgICBmb3IgKGludCBpPTEgOyBpPD1MIDsgKytpKSB7CisgICAgICAgIGZvciAoaW50IGo9MCwgaXg9aSA7IGo8aGFsZk51bUNvZWYgOyArK2osIGl4Kz1MKSB7CisgICAgICAgICAgICBhY2N1bSArPSBjb3MoaXgqdykqc3RhdGljX2Nhc3Q8ZG91YmxlPigqY29lZisrKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBPdXIgb3ZlcmFsbCBmaWx0ZXIgaXMgc3RvcmVkIHN0cmlwZWQgYnkgcG9seXBoYXNlcywgbm90IGEgY29udGlndW91cyBoW25dLgorICAgICAqIFdlIGNvdWxkIGZldGNoIGNvZWZmaWNpZW50cyBpbiBhIG5vbi1jb250aWd1b3VzIGZhc2hpb24KKyAgICAgKiBidXQgdGhhdCB3aWxsIG5vdCBzY2FsZSB0byB2ZWN0b3IgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIFdlIGFwcGx5IEdvZXJ0emVsJ3MgYWxnb3JpdGhtIGRpcmVjdGx5IHRvIGVhY2ggcG9seXBoYXNlIGZpbHRlciBiYW5rIGluc3RlYWQgb2YKKyAgICAgKiB1c2luZyBjb3NpbmUgZ2VuZXJhdGlvbi9tdWx0aXBsaWNhdGlvbiwgdGhlcmVieSBzYXZpbmcgb25lIG11bHRpcGx5IHBlciBpbm5lciBsb29wLgorICAgICAqCisgICAgICogU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dvZXJ0emVsX2FsZ29yaXRobQorICAgICAqIEFsc286IE9wcGVuaGVpbSBhbmQgU2NoYWZlciwgX0Rpc2NyZXRlIFRpbWUgU2lnbmFsIFByb2Nlc3NpbmcsIDNlXywgcC4gNzIwLgorICAgICAqCisgICAgICogV2UgdXNlIHRoZSBiYXNpYyByZWN1cnNpb24gdG8gaW5jb3Jwb3JhdGUgdGhlIGNvc2luZSBzdGVwcyBpbnRvIHJlYWwgc2VxdWVuY2UgeFtuXToKKyAgICAgKiBzW25dID0geFtuXSArICgyY29zdykqc1tuLTFdICsgc1tuLTJdCisgICAgICoKKyAgICAgKiB5W25dID0gc1tuXSAtIGVeKGl3KXNbbi0xXQorICAgICAqICAgICAgPSBzdW1fe2s9LVxpbmZ0eX1ee259IHhba11lXigtaXcobi1rKSkKKyAgICAgKiAgICAgID0gZV4oLWl3bikgc3VtX3trPTB9XntufSB4W2tdZV4oaXdrKQorICAgICAqCisgICAgICogVGhlIHN1bW1hdGlvbiBjb250YWlucyB0aGUgZnJlcXVlbmN5IHN0ZXBzIHdlIHdhbnQgbXVsdGlwbGllZCBieSB0aGUgc291cmNlCisgICAgICogKHNpbWlsYXIgdG8gYSBEVEZUKS4KKyAgICAgKgorICAgICAqIFVzaW5nIHN5bW1ldHJ5LCBhbmQganVzdCB0aGUgcmVhbCBwYXJ0IChiZSBjYXJlZnVsLCB0aGlzIG11c3QgaGFwcGVuCisgICAgICogYWZ0ZXIgYW55IGludGVybmFsIGNvbXBsZXggbXVsdGlwbGljYXRpb25zKSwgdGhlIHBvbHlwaGFzZSBmaWx0ZXJiYW5rCisgICAgICogdHJhbnNmZXIgZnVuY3Rpb24gaXM6CisgICAgICoKKyAgICAgKiBIcHBbbiwgdywgd18wXSA9IHN1bV97az0wfV57bn0geFtrXSAqIGNvcyh3ayArIHdfMCkKKyAgICAgKiAgICAgICAgICAgICAgICA9IFJleyBlXihpd24gKyBpd18wKSB5W25dfQorICAgICAqICAgICAgICAgICAgICAgID0gY29zKHduK3dfMCkgKiBzW25dIC0gY29zKHcobisxKSt3XzApICogc1tuLTFdCisgICAgICoKKyAgICAgKiB1c2luZyB0aGUgZmFjdCB0aGF0IHNbbl0gb2YgcmVhbCB4W25dIGlzIHJlYWwuCisgICAgICoKKyAgICAgKi8KKyAgICBkb3VibGUgZGNvcyA9IDIuICogY29zKEwqdyk7CisgICAgaW50IHN0YXJ0ID0gKChoYWxmTnVtQ29lZikqTCArIDEpOworICAgIFNpbmVHZW4gY2MoKHN0YXJ0IC0gTCkgKiB3LCB3LCB0cnVlKTsgLy8gY29zaW5lCisgICAgU2luZUdlbiBjcChzdGFydCAqIHcsIHcsIHRydWUpOyAvLyBjb3NpbmUKKyAgICBmb3IgKGludCBpPTEgOyBpPD1MIDsgKytpKSB7CisgICAgICAgIGRvdWJsZSBzYyA9IDA7CisgICAgICAgIGRvdWJsZSBzcCA9IDA7CisgICAgICAgIGZvciAoaW50IGo9MCA7IGo8aGFsZk51bUNvZWYgOyArK2opIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXAgPSBzYzsKKyAgICAgICAgICAgIHNjICA9IHN0YXRpY19jYXN0PGRvdWJsZT4oKmNvZWYrKykgKyBkY29zKnNjIC0gc3A7CisgICAgICAgICAgICBzcCA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB3ZSBhcmUgYXdmdWxseSBjbGV2ZXIsIHdlIGNhbiBhcHBseSBHb2VydHplbCdzIGFsZ29yaXRobQorICAgICAgICAvLyBhZ2FpbiBvbiB0aGUgc2MgYW5kIHNwIHNlcXVlbmNlcyByZXR1cm5lZCBoZXJlLgorICAgICAgICBhY2N1bSArPSBjYy52YWx1ZUFkdmFuY2UoKSAqIHNjIC0gY3AudmFsdWVBZHZhbmNlKCkgKiBzcDsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gYWNjdW0qMi47Cit9CisKKy8qCisgKiBldmFsdWF0ZXMgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gfEgoZil8IGJvdW5kIGluIGEgYmFuZCByZWdpb24uCisgKgorICogVGhpcyBpcyB1c3VhbGx5IGRvbmUgd2l0aCBlcXVhbGx5IHNwYWNlZCBpbmNyZW1lbnRzIGluIHRoZSB0YXJnZXQgYmFuZCBpbiBxdWVzdGlvbi4KKyAqIFRoZSBwYXNzYmFuZCBpcyBvZnRlbiB2ZXJ5IHNtYWxsLCBhbmQgc2FtcGxlZCB0aGF0IHdheS4gVGhlIHN0b3BiYW5kIGlzIG9mdGVuIG11Y2gKKyAqIGxhcmdlci4KKyAqCisgKiBXZSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyIGhhcyBhbiBhZGRpdGlvbmFsIGJhbmsgYXQgdGhlIGVuZAorICogZm9yIGludGVycG9sYXRpb247IGhlbmNlIGl0IGlzIG92ZXJzcGVjaWZpZWQgZm9yIHRoZSBIKGYpIGNvbXB1dGF0aW9uLiAgVGh1cyB0aGUKKyAqIGZpcnN0IHBvbHlwaGFzZSBpcyBuZXZlciBhY3R1YWxseSBjaGVja2VkLCBleGNlcHRpbmcgaXRzIGZpcnN0IHRlcm0uCisgKgorICogSW4gdGhpcyBjb2RlIHdlIHVzZSB0aGUgZmlyVHJhbnNmZXIoKSBldmFsdWF0b3IgYWJvdmUsIHdoaWNoIHVzZXMgR29lcnR6ZWwncworICogYWxnb3JpdGhtIHRvIGNhbGN1bGF0ZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gYXQgZWFjaCBwb2ludC4KKyAqCisgKiBUT0RPOiBBbiBhbHRlcm5hdGl2ZSB3aXRoIGVxdWFsIHNwYWNpbmcgaXMgdGhlIEZGVC9ERlQuICBBbiBhbHRlcm5hdGl2ZSB3aXRoIHVuZXF1YWwKKyAqIHNwYWNpbmcgaXMgYSBjaGlycCB0cmFuc2Zvcm0uCisgKgorICogQHBhcmFtIGNvZWYgaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBmaWx0ZXIgYmFua3MKKyAqCisgKiBAcGFyYW0gTCBpcyB0aGUgbnVtYmVyIG9mIHBoYXNlcyAoZm9yIGludGVycG9sYXRpb24pCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIHNob3VsZCBiZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBhIHNpbmdsZQorICogcG9seXBoYXNlLgorICoKKyAqIEBwYXJhbSBmc3RhcnQgaXMgdGhlIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IHN0YXJ0LgorICoKKyAqIEBwYXJhbSBmZW5kIGlzIHRoZSBub3JtYWxpemVkIGZyZXF1ZW5jeSBlbmQuCisgKgorICogQHBhcmFtIHN0ZXBzIGlzIHRoZSBudW1iZXIgb2Ygc3RlcHMgdG8gdGFrZSAoc2FtcGxpbmcpIGJldHdlZW4gZnJlcXVlbmN5IHN0YXJ0IGFuZCBlbmQKKyAqCisgKiBAcGFyYW0gZmlyTWluIHJldHVybnMgdGhlIG1pbmltdW0gdHJhbnNmZXIgfEgoZil8IGZvdW5kCisgKgorICogQHBhcmFtIGZpck1heCByZXR1cm5zIHRoZSBtYXhpbXVtIHRyYW5zZmVyIHxIKGYpfCBmb3VuZAorICoKKyAqIDAgPD0gZiA8PSAwLjUuCisgKiBUaGlzIGlzIHVzZWQgdG8gdGVzdCBwYXNzYmFuZCBhbmQgc3RvcGJhbmQgcGVyZm9ybWFuY2UuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgdGVzdEZpcihjb25zdCBUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAorICAgICAgICBkb3VibGUgZnN0YXJ0LCBkb3VibGUgZmVuZCwgaW50IHN0ZXBzLCBkb3VibGUgJmZpck1pbiwgZG91YmxlICZmaXJNYXgpIHsKKyAgICBkb3VibGUgd3N0YXJ0ID0gZnN0YXJ0KigyLipNX1BJKTsKKyAgICBkb3VibGUgd2VuZCA9IGZlbmQqKDIuKk1fUEkpOworICAgIGRvdWJsZSB3c3RlcCA9ICh3ZW5kIC0gd3N0YXJ0KS9zdGVwczsKKyAgICBkb3VibGUgZm1heCwgZm1pbjsKKyAgICBkb3VibGUgdHJmID0gZmlyVHJhbnNmZXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIHdzdGFydCk7CisgICAgaWYgKHRyZjwwKSB7CisgICAgICAgIHRyZiA9IC10cmY7CisgICAgfQorICAgIGZtaW4gPSBmbWF4ID0gdHJmOworICAgIHdzdGFydCArPSB3c3RlcDsKKyAgICBmb3IgKGludCBpPTE7IGk8c3RlcHM7ICsraSkgeworICAgICAgICB0cmYgPSBmaXJUcmFuc2Zlcihjb2VmLCBMLCBoYWxmTnVtQ29lZiwgd3N0YXJ0KTsKKyAgICAgICAgaWYgKHRyZjwwKSB7CisgICAgICAgICAgICB0cmYgPSAtdHJmOworICAgICAgICB9CisgICAgICAgIGlmICh0cmY+Zm1heCkgeworICAgICAgICAgICAgZm1heCA9IHRyZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0cmY8Zm1pbikgeworICAgICAgICAgICAgZm1pbiA9IHRyZjsKKyAgICAgICAgfQorICAgICAgICB3c3RhcnQgKz0gd3N0ZXA7CisgICAgfQorICAgIC8vIHJlbm9ybWFsaXplIC0gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgaW50ZWdlciBmaWx0ZXIgdHlwZXMKKyAgICBkb3VibGUgbm9ybSA9IDEuLygoMVVMTDw8KHNpemVvZihUKSo4LTEpKSpMKTsKKworICAgIGZpck1pbiA9IGZtaW4gKiBub3JtOworICAgIGZpck1heCA9IGZtYXggKiBub3JtOworfQorCisvKgorICogZXZhbHVhdGVzIHRoZSB8SChmKXwgbG93cGFzcyBiYW5kIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIHRoZSBsb3dwYXNzIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciwKKyAqIGFuZCBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgZGVzaWduLiAgRm9yIHRoaXMgY2FzZSwgZnAgc2hvdWxkIGJlIHNldCB0byB0aGUKKyAqIHBhc3NiYW5kIG5vcm1hbGl6ZWQgZnJlcXVlbmN5IGZyb20gMCB0byAwLjUgZm9yIHRoZSBvdmVyYWxsIGZpbHRlciAodGh1cyBpdAorICogaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBiYW5rIHZhbHVlIC8gTCkuICBMaWtld2lzZSBmb3IgZnMuCisgKgorICogQHBhcmFtIGNvZWYgaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBmaWx0ZXIgYmFua3MKKyAqCisgKiBAcGFyYW0gTCBpcyB0aGUgbnVtYmVyIG9mIHBoYXNlcyAoZm9yIGludGVycG9sYXRpb24pCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIHNob3VsZCBiZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBhIHNpbmdsZQorICogcG9seXBoYXNlLgorICoKKyAqIEBwYXJhbSBmcCBpcyB0aGUgcGFzc2JhbmQgbm9ybWFsaXplZCBmcmVxdWVuY3ksIDAgPCBmcCA8IGZzIDwgMC41LgorICoKKyAqIEBwYXJhbSBmcyBpcyB0aGUgc3RvcGJhbmQgbm9ybWFsaXplZCBmcmVxdWVuY3ksIDAgPCBmcCA8IGZzIDwgMC41LgorICoKKyAqIEBwYXJhbSBwYXNzU3RlcHMgaXMgdGhlIG51bWJlciBvZiBwYXNzYmFuZCBzYW1wbGluZyBzdGVwcy4KKyAqCisgKiBAcGFyYW0gc3RvcFN0ZXBzIGlzIHRoZSBudW1iZXIgb2Ygc3RvcGJhbmQgc2FtcGxpbmcgc3RlcHMuCisgKgorICogQHBhcmFtIHBhc3NNaW4gaXMgdGhlIG1pbmltdW0gdmFsdWUgaW4gdGhlIHBhc3NiYW5kCisgKgorICogQHBhcmFtIHBhc3NNYXggaXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHBhc3NiYW5kICh1c2VmdWwgZm9yIHNjYWxpbmcpLiAgVGhpcyBzaG91bGQKKyAqIGJlIGxlc3MgdGhhbiAxLiwgdG8gYXZvaWQgc2luZSB3YXZlIHRlc3Qgb3ZlcmZsb3cuCisgKgorICogQHBhcmFtIHBhc3NSaXBwbGUgaXMgdGhlIHBhc3NiYW5kIHJpcHBsZS4gIFR5cGljYWxseSB0aGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gMC4xIGZvcgorICogYW4gYXVkaW8gZmlsdGVyLiAgR2VuZXJhbGx5IHNwZWFrZXIvaGVhZHBob25lIGRldmljZSBjaGFyYWN0ZXJpc3RpY3Mgd2lsbCBkb21pbmF0ZQorICogdGhlIHBhc3NiYW5kIHRlcm0uCisgKgorICogQHBhcmFtIHN0b3BNYXggaXMgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHN0b3BiYW5kLgorICoKKyAqIEBwYXJhbSBzdG9wUmlwcGxlIGlzIHRoZSBzdG9wYmFuZCByaXBwbGUsIGFsc28ga25vd24gYXMgc3RvcGJhbmQgYXR0ZW51YXRpb24uCisgKiBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIH44MGRCIGZvciBsb3cgcXVhbGl0eSwgYW5kIGdyZWF0ZXIgdGhhbgorICogfjEwMGRCIGZvciBmdWxsIDE2YiBxdWFsaXR5LCBvdGhlcndpc2UgYWxpYXNpbmcgbWF5IGJlY29tZSBub3RpY2VhYmxlLgorICoKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCB0ZXN0RmlyKGNvbnN0IFQqIGNvZWYsIGludCBMLCBpbnQgaGFsZk51bUNvZWYsCisgICAgICAgIGRvdWJsZSBmcCwgZG91YmxlIGZzLCBpbnQgcGFzc1N0ZXBzLCBpbnQgc3RvcFN0ZXBzLAorICAgICAgICBkb3VibGUgJnBhc3NNaW4sIGRvdWJsZSAmcGFzc01heCwgZG91YmxlICZwYXNzUmlwcGxlLAorICAgICAgICBkb3VibGUgJnN0b3BNYXgsIGRvdWJsZSAmc3RvcFJpcHBsZSkgeworICAgIGRvdWJsZSBmbWluLCBmbWF4OworICAgIHRlc3RGaXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIDAuLCBmcCwgcGFzc1N0ZXBzLCBmbWluLCBmbWF4KTsKKyAgICBkb3VibGUgZDEgPSAoZm1heCAtIGZtaW4pLzIuOworICAgIHBhc3NNaW4gPSBmbWluOworICAgIHBhc3NNYXggPSBmbWF4OworICAgIHBhc3NSaXBwbGUgPSAtMjAuKmxvZzEwKDEuIC0gZDEpOyAvLyBwYXNzYmFuZCByaXBwbGUKKyAgICB0ZXN0RmlyKGNvZWYsIEwsIGhhbGZOdW1Db2VmLCBmcywgMC41LCBzdG9wU3RlcHMsIGZtaW4sIGZtYXgpOworICAgIC8vIGZtaW4gaXMgcmVhbGx5IG5vdCBpbXBvcnRhbnQgZm9yIHRoZSBzdG9wYmFuZC4KKyAgICBzdG9wTWF4ID0gZm1heDsKKyAgICBzdG9wUmlwcGxlID0gLTIwLipsb2cxMChmbWF4KTsgLy8gc3RvcGJhbmQgcmlwcGxlL2F0dGVudWF0aW9uCit9CisKKy8qCisgKiBDYWxjdWxhdGVzIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIgYmFzZWQgb24gYSB3aW5kb3dlZCBzaW5jIGZ1bmN0aW9uLgorICoKKyAqIFRoZSB3aW5kb3dlZCBzaW5jIGlzIGFuIG9kZCBsZW5ndGggc3ltbWV0cmljIGZpbHRlciBvZiBleGFjdGx5IEwqaGFsZk51bUNvZWYqMisxCisgKiB0YXBzIGZvciB0aGUgZW50aXJlIGtlcm5lbC4gIFRoaXMgaXMgdGhlbiBkZWNvbXBvc2VkIGludG8gTCsxIHBvbHlwaGFzZSBmaWx0ZXJiYW5rcy4KKyAqIFRoZSBsYXN0IGZpbHRlcmJhbmsgaXMgdXNlZCBmb3IgaW50ZXJwb2xhdGlvbiBwdXJwb3NlcyAoYW5kIGlzIG1vc3RseSBjb21wb3NlZAorICogb2YgdGhlIGZpcnN0IGJhbmsgc2hpZnRlZCBieSBvbmUgc2FtcGxlKSwgYW5kIGlzIHVubmVjZXNzYXJ5IGlmIG9uZSBkb2VzCisgKiBub3QgZG8gaW50ZXJwb2xhdGlvbi4KKyAqCisgKiBXZSB1c2UgdGhlIGxhc3QgZmlsdGVyYmFuayBmb3Igc29tZSB0cmFuc2ZlciBmdW5jdGlvbiBjYWxjdWxhdGlvbiBwdXJwb3NlcywKKyAqIHNvIGl0IG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBhbnl3YXlzLgorICoKKyAqIEBwYXJhbSBjb2VmIGlzIHRoZSBjYWxsZXIgYWxsb2NhdGVkIHNwYWNlIGZvciBjb2VmZmljaWVudHMuICBUaGlzIHNob3VsZCBiZQorICogZXhhY3RseSAoTCsxKSpoYWxmTnVtQ29lZiBpbiBzaXplLgorICoKKyAqIEBwYXJhbSBMIGlzIHRoZSBudW1iZXIgb2YgcGhhc2VzIChmb3IgaW50ZXJwb2xhdGlvbikKKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWYgc2hvdWxkIGJlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIGEgc2luZ2xlCisgKiBwb2x5cGhhc2UuCisgKgorICogQHBhcmFtIHN0b3BCYW5kQXR0ZW4gaXMgdGhlIHN0b3BiYW5kIHZhbHVlLCBzaG91bGQgYmUgPjUwZEIuCisgKgorICogQHBhcmFtIGZjciBpcyBjdXRvZmYgZnJlcXVlbmN5L3NhbXBsaW5nIHJhdGUgKDwwLjUpLiAgQXQgdGhpcyBwb2ludCwgdGhlIGVuZXJneQorICogc2hvdWxkIGJlIDZkQiBsZXNzLiAoZmNyIGlzIHdoZXJlIHRoZSBhbXBsaXR1ZGUgZHJvcHMgYnkgaGFsZikuICBVc2UgdGhlCisgKiBmaXJLYWlzZXJUYncoKSB0byBjYWxjdWxhdGUgdGhlIHRyYW5zaXRpb24gYmFuZHdpZHRoLiAgZmNyIGlzIHRoZSBtaWRwb2ludAorICogYmV0d2VlbiB0aGUgc3RvcCBiYW5kIGFuZCB0aGUgcGFzcyBiYW5kIChmc3RvcCtmcGFzcykvMi4KKyAqCisgKiBAcGFyYW0gYXR0ZW4gaXMgdGhlIGF0dGVudWF0aW9uIChnZW5lcmFsbHkgc2xpZ2h0bHkgbGVzcyB0aGFuIDEpLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSB2b2lkIGZpckthaXNlckdlbihUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgZG91YmxlIGZjciwgZG91YmxlIGF0dGVuKSB7CisgICAgLy8KKyAgICAvLyBGb3JtdWxhIDMuMi41LCAzLjIuNywgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4CisgICAgLy8gRm9ybXVsYSA3Ljc1LCBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZS10aW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDU0MgorICAgIC8vCisgICAgLy8gU2VlIGFsc286IGh0dHA6Ly9tZWxvZGkuZWUud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9lZTUxOC9ub3Rlcy9sZWMxNy5wZGYKKyAgICAvLworICAgIC8vIEthaXNlciB3aW5kb3cgYW5kIGJldGEgcGFyYW1ldGVyCisgICAgLy8KKyAgICAvLyAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKKyAgICAvLyAgYmV0YSA9IHwgMC41ODQyKihBIC0gMjEpXjAuNCArIDAuMDc4ODYqKEEgLSAyMSkgICAyMSA8PSBBIDw9IDUwCisgICAgLy8gICAgICAgICB8IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA8IDIxCisgICAgLy8KKyAgICAvLyB3aXRoIEEgaXMgdGhlIGRlc2lyZWQgc3RvcC1iYW5kIGF0dGVudWF0aW9uIGluIGRCRlMKKyAgICAvLworICAgIC8vICAgIDMwIGRCICAgIDIuMjEwCisgICAgLy8gICAgNDAgZEIgICAgMy4zODQKKyAgICAvLyAgICA1MCBkQiAgICA0LjUzOAorICAgIC8vICAgIDYwIGRCICAgIDUuNjU4CisgICAgLy8gICAgNzAgZEIgICAgNi43NjQKKyAgICAvLyAgICA4MCBkQiAgICA3Ljg2NQorICAgIC8vICAgIDkwIGRCICAgIDguOTYwCisgICAgLy8gICAxMDAgZEIgICAxMC4wNTYKKworICAgIGNvbnN0IGludCBOID0gTCAqIGhhbGZOdW1Db2VmOyAvLyBub24tbmVnYXRpdmUgaGFsZgorICAgIGNvbnN0IGRvdWJsZSBiZXRhID0gMC4xMTAyICogKHN0b3BCYW5kQXR0ZW4gLSA4LjcpOyAvLyA+PSA1MGRCIGFsd2F5cworICAgIGNvbnN0IGRvdWJsZSB4c3RlcCA9ICgyLiAqIE1fUEkpICogZmNyIC8gTDsKKyAgICBjb25zdCBkb3VibGUgeGZyYWMgPSAxLiAvIE47CisgICAgY29uc3QgZG91YmxlIHlzY2FsZSA9IGF0dGVuICogTCAvIChJMChiZXRhKSAqIE1fUEkpOworICAgIGNvbnN0IGRvdWJsZSBzcXJiZXRhID0gc3FyKGJldGEpOworCisgICAgLy8gV2UgdXNlIHNpbmUgZ2VuZXJhdG9ycywgd2hpY2ggY29tcHV0ZXMgc2luZXMgb24gcmVndWxhciBzdGVwIGludGVydmFscy4KKyAgICAvLyBUaGlzIHNwZWVkcyB1cCBvdmVyYWxsIGNvbXB1dGF0aW9uIGFib3V0IDQwJSBmcm9tIGNvbXB1dGluZyB0aGUgc2luZSBkaXJlY3RseS4KKworICAgIFNpbmVHZW5HZW4gc2dnKDAuLCB4c3RlcCwgTCp4c3RlcCk7IC8vIGdlbmVyYXRlcyBzaW5lIGdlbmVyYXRvcnMgKG9uZSBwZXIgcG9seXBoYXNlKQorCisgICAgZm9yIChpbnQgaT0wIDsgaTw9TCA7ICsraSkgeyAvLyBnZW5lcmF0ZSBhbiBleHRyYSBzZXQgb2YgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAvLyBjb21wdXRhdGlvbiBmb3IgYSBzaW5nbGUgcG9seXBoYXNlIG9mIHRoZSBvdmVyYWxsIGZpbHRlci4KKyAgICAgICAgU2luZUdlbiBzZyA9IHNnZy52YWx1ZUFkdmFuY2UoKTsgLy8gY3VycmVudCBzaW5lIGdlbmVyYXRvciBmb3IgImoiIGlubmVyIGxvb3AuCisgICAgICAgIGRvdWJsZSBlcnIgPSAwOyAvLyBmb3Igbm9pc2Ugc2hhcGluZyBvbiBpbnQxNl90IGNvZWZmaWNpZW50cyAob3ZlciBlYWNoIHBvbHlwaGFzZSkKKworICAgICAgICBmb3IgKGludCBqPTAsIGl4PWkgOyBqPGhhbGZOdW1Db2VmIDsgKytqLCBpeCs9TCkgeworICAgICAgICAgICAgZG91YmxlIHk7CisgICAgICAgICAgICBpZiAoQ0NfTElLRUxZKGl4KSkgeworICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpeCk7CisKKyAgICAgICAgICAgICAgICAvLyBzaW5lIGdlbmVyYXRvcjogc2cudmFsdWVBZHZhbmNlKCkgcmV0dXJucyBzaW4oaXgqeHN0ZXApOworICAgICAgICAgICAgICAgIC8vIHkgPSBJMChiZXRhICogc3FydCgxLjAgLSBzcXIoeCAqIHhmcmFjKSkpICogeXNjYWxlICogc2cudmFsdWVBZHZhbmNlKCkgLyB4OworICAgICAgICAgICAgICAgIHkgPSBJMFNxclJhdChzcXJiZXRhICogKDEuMCAtIHNxcih4ICogeGZyYWMpKSwgeXNjYWxlICogc2cudmFsdWVBZHZhbmNlKCksIHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB5ID0gMi4gKiBhdHRlbiAqIGZjcjsgLy8gY2VudGVyIG9mIGZpbHRlciwgc2luYygwKSA9IDEuCisgICAgICAgICAgICAgICAgc2cuYWR2YW5jZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNfc2FtZTxULCBpbnQxNl90Pjo6dmFsdWUpIHsgLy8gaW50MTZfdCBuZWVkcyBub2lzZSBzaGFwaW5nCisgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSwgZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSkpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gYXNzdW1lZCBmbG9hdCBvciBkb3VibGUKKyAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4oeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjE2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9PUFNfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKKyNkZWZpbmUgVVNFX0lOTElORV9BU1NFTUJMWSAodHJ1ZSkKKyNlbHNlCisjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKGZhbHNlKQorI2VuZGlmCisKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZICYmIGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2Vsc2UKKyNkZWZpbmUgVVNFX05FT04gKGZhbHNlKQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNfc2FtZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3NhbWU8VCwgVD4gIC8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bFJMKGludCBsZWZ0LCBpbnQzMl90IGluLCB1aW50MzJfdCB2UkwpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGFzbSggInNtdWx0YiAlW291dF0sICVbaW5dLCAlW3ZSTF0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdlJMXSJyIih2UkwpCisgICAgICAgICAgICAgOiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzbSggInNtdWx0dCAlW291dF0sICVbaW5dLCAlW3ZSTF0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdlJMXSJyIih2UkwpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHYgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4odlJMKSA6IHN0YXRpY19jYXN0PGludDE2X3Q+KHZSTD4+MTYpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4oaW4pICogdikgPj4gMTYpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkKGludDE2X3QgaW4sIGludDE2X3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBhc20oICJzbWxhYmIgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgdiAqIGluOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUKK2ludDMyX3QgbXVsQWRkKGludDE2X3QgaW4sIGludDMyX3QgdiwgaW50MzJfdCBhKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBhc20oICJzbWxhd2IgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KHYpICogaW4pID4+IDE2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZChpbnQzMl90IGluLCBpbnQzMl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic21tbGEgJVtvdXRdLCAlW3ZdLCAlW2luXSwgJVthXSBcbiIKKyAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgIDogW2luXSIlciIoaW4pLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgOiApOworICAgIHJldHVybiBvdXQ7CisjZWxzZQorICAgIHJldHVybiBhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KHYpICogaW4pID4+IDMyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZFJMKGludCBsZWZ0LCB1aW50MzJfdCBpblJMLCBpbnQxNl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYXNtKCAic21sYWJiICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc20oICJzbWxhYnQgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHMgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STCkgOiBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMPj4xNik7CisgICAgcmV0dXJuIGEgKyB2ICogczsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZFJMKGludCBsZWZ0LCB1aW50MzJfdCBpblJMLCBpbnQzMl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYXNtKCAic21sYXdiICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc20oICJzbWxhd3QgJVtvdXRdLCAlW3ZdLCAlW2luUkxdLCAlW2FdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpblJMXSIlciIoaW5STCksIFt2XSJyIih2KSwgW2FdInIiKGEpCisgICAgICAgICAgICAgOiApOworICAgIH0KKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICBpbnQxNl90IHMgPSBsZWZ0ID8gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STCkgOiBzdGF0aWNfY2FzdDxpbnQxNl90PihpblJMPj4xNik7CisgICAgcmV0dXJuIGEgKyBzdGF0aWNfY2FzdDxpbnQzMl90Pigoc3RhdGljX2Nhc3Q8aW50NjRfdD4odikgKiBzKSA+PiAxNik7CisjZW5kaWYKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX09QU19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM4MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBkZXBlbmRzIG9uIEF1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKKworLyogdmFyaWFudCBmb3IgaW5wdXQgdHlwZSBUSSA9IGludDE2X3QgaW5wdXQgc2FtcGxlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhpbnQzMl90JiBsLCBpbnQzMl90JiByLCBUQyBjb2VmLCBjb25zdCBpbnQxNl90KiBzYW1wbGVzKQoreworICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihzYW1wbGVzKTsKKyAgICBsID0gbXVsQWRkUkwoMSwgcmwsIGNvZWYsIGwpOworICAgIHIgPSBtdWxBZGRSTCgwLCBybCwgY29lZiwgcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDPgorc3RhdGljIGlubGluZQordm9pZCBtYWMoaW50MzJfdCYgbCwgVEMgY29lZiwgY29uc3QgaW50MTZfdCogc2FtcGxlcykKK3sKKyAgICBsID0gbXVsQWRkKHNhbXBsZXNbMF0sIGNvZWYsIGwpOworfQorCisvKiB2YXJpYW50IGZvciBpbnB1dCB0eXBlIFRJID0gZmxvYXQgaW5wdXQgc2FtcGxlcyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhmbG9hdCYgbCwgZmxvYXQmIHIsIFRDIGNvZWYsICBjb25zdCBmbG9hdCogc2FtcGxlcykKK3sKKyAgICBsICs9ICpzYW1wbGVzKysgKiBjb2VmOworICAgIHIgKz0gKnNhbXBsZXMgKiBjb2VmOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGZsb2F0JiBsLCBUQyBjb2VmLCAgY29uc3QgZmxvYXQqIHNhbXBsZXMpCit7CisgICAgbCArPSAqc2FtcGxlcyAqIGNvZWY7Cit9CisKKy8qIHZhcmlhbnQgZm9yIG91dHB1dCB0eXBlIFRPID0gaW50MzJfdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQoraW50MzJfdCB2b2x1bWVBZGp1c3QoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIDIgKiBtdWxSTCgwLCB2YWx1ZSwgdm9sdW1lKTsgIC8vIE5vdGU6IG9ubHkgdXNlIHRvcCAxNmIKK30KKworLyogdmFyaWFudCBmb3Igb3V0cHV0IHR5cGUgVE8gPSBmbG9hdCBvdXRwdXQgc2FtcGxlcyAqLworc3RhdGljIGlubGluZQorZmxvYXQgdm9sdW1lQWRqdXN0KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpCit7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCisvKgorICogSGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9ucyBmb3IgbG9vcCB1bnJvbGxpbmcgYWNjdW11bGF0b3Igb3BlcmF0aW9ucy4KKyAqCisgKiBVbnJvbGxpbmcgdGhlIGxvb3BzIGFjaGlldmVzIGFib3V0IDJ4IGdhaW4uCisgKiBVc2luZyBhIHJlY3Vyc2l2ZSB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBUT1tdIGZvciB0aGUgYWNjdW11bGF0b3IKKyAqIHZhbHVlcyBpcyBhbiBhZGRpdGlvbmFsIDEwLTIwJSBnYWluLgorICovCisKK3RlbXBsYXRlPGludCBDSEFOTkVMUywgdHlwZW5hbWUgVE8+CitjbGFzcyBBY2N1bXVsYXRvciA6IHB1YmxpYyBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz4gLy8gcmVjdXJzaXZlCit7CitwdWJsaWM6CisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+OjpjbGVhcigpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEk+CisgICAgaW5saW5lIHZvaWQgYWNjKFRDIGNvZWYsIGNvbnN0IFRJKiYgZGF0YSkgeworICAgICAgICBtYWModmFsdWUsIGNvZWYsIGRhdGErKyk7CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKKyAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+Ojp2b2x1bWUob3V0LCBnYWluKTsKKyAgICB9CisKKyAgICBUTyB2YWx1ZTsgLy8gb25lIHBlciByZWN1cnNpdmUgaW5oZXJpdGVkIGJhc2UgY2xhc3MKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRPPgorY2xhc3MgQWNjdW11bGF0b3I8MCwgVE8+IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJPgorICAgIGlubGluZSB2b2lkIGFjYyhUQyBjb2VmIF9fdW51c2VkLCBjb25zdCBUSSomIGRhdGEgX191bnVzZWQpIHsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0IF9fdW51c2VkLCBUTyBnYWluIF9fdW51c2VkKSB7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CitpbmxpbmUKK1RDIGludGVycG9sYXRlKFRDIGNvZWZfMCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnApCit7CisgICAgcmV0dXJuIGxlcnAgKiAoY29lZl8xIC0gY29lZl8wKSArIGNvZWZfMDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lCitpbnQxNl90IGludGVycG9sYXRlPGludDE2X3QsIHVpbnQzMl90PihpbnQxNl90IGNvZWZfMCwgaW50MTZfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7ICAgLy8gaW4gc29tZSBDUFUgYXJjaGl0ZWN0dXJlcyAxNmIgeCAxNmIgbXVsdGlwbGllcyBhcmUgZmFzdGVyLgorICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8aW50MTZfdD4obGVycCkgKiBzdGF0aWNfY2FzdDxpbnQxNl90Pihjb2VmXzEgLSBjb2VmXzApID4+IDE1KSArIGNvZWZfMDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lCitpbnQzMl90IGludGVycG9sYXRlPGludDMyX3QsIHVpbnQzMl90PihpbnQzMl90IGNvZWZfMCwgaW50MzJfdCBjb2VmXzEsIHVpbnQzMl90IGxlcnApCit7CisgICAgcmV0dXJuIChsZXJwICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oY29lZl8xIC0gY29lZl8wKSA+PiAzMSkgKyBjb2VmXzA7Cit9CisKKy8qIGNsYXNzIHNjb3BlIGZvciBwYXNzaW5nIGluIGZ1bmN0aW9ucyBpbnRvIHRlbXBsYXRlcyAqLworc3RydWN0IEludGVycENvbXB1dGUgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZXAoVEMgY29lZl8wLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCkgeworICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoY29lZl8wLCBjb2VmXzEsIGxlcnApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgorICAgIHN0YXRpYyBpbmxpbmUKKyAgICBUQyBpbnRlcnBvbGF0ZW4oVEMgY29lZl8wLCBUQyBjb2VmXzEsIFRJTlRFUlAgbGVycCkgeworICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUoY29lZl8wLCBjb2VmXzEsIGxlcnApOworICAgIH0KK307CisKK3N0cnVjdCBJbnRlcnBOdWxsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVwKFRDIGNvZWZfMCwgVEMgY29lZl8xIF9fdW51c2VkLCBUSU5URVJQIGxlcnAgX191bnVzZWQpIHsKKyAgICAgICAgcmV0dXJuIGNvZWZfMDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVuKFRDIGNvZWZfMCBfX3VudXNlZCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnAgX191bnVzZWQpIHsKKyAgICAgICAgcmV0dXJuIGNvZWZfMTsKKyAgICB9Cit9OworCisvKgorICogQ2FsY3VsYXRlcyBhIHNpbmdsZSBvdXRwdXQgZnJhbWUgKHR3byBzYW1wbGVzKS4KKyAqCisgKiBUaGUgUHJvY2VzcyooKSBmdW5jdGlvbnMgY29tcHV0ZSBib3RoIHRoZSBwb3NpdGl2ZSBoYWxmIEZJUiBkb3QgcHJvZHVjdCBhbmQKKyAqIHRoZSBuZWdhdGl2ZSBoYWxmIEZJUiBkb3QgcHJvZHVjdCwgYWNjdW11bGF0ZXMsIGFuZCB0aGVuIGFwcGxpZXMgdGhlIHZvbHVtZS4KKyAqCisgKiBVc2UgZmlyKCkgdG8gY29tcHV0ZSB0aGUgcHJvcGVyIGNvZWZmaWNpZW50IHBvaW50ZXJzIGZvciBhIHBvbHlwaGFzZQorICogZmlsdGVyIGJhbmsuCisgKgorICogUHJvY2Vzc0Jhc2UoKSBpcyB0aGUgZnVuZGFtZW50YWwgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBQcm9jZXNzTCgpIGNhbGxzIFByb2Nlc3NCYXNlKCkgd2l0aCBURlVOQyA9IEludGVycE51bGwsIGZvciBmaXhlZC9sb2NrZWQgcGhhc2UuCisgKiBQcm9jZXNzKCkgY2FsbHMgUHJvY2Vzc0Jhc2UoKSB3aXRoIFRGVU5DID0gSW50ZXJwQ29tcHV0ZSwgZm9yIGludGVycG9sYXRlZCBwaGFzZS4KKyAqLworCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBURlVOQywgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVElOVEVSUD4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgUHJvY2Vzc0Jhc2UoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgc2l6ZV90IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgVElOVEVSUCBsZXJwUCwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPiAwKQorCisgICAgaWYgKENIQU5ORUxTID4gMikgeworICAgICAgICAvLyBUTyBhY2N1bVtDSEFOTkVMU107CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLCBUTz4gYWNjdW07CisKKyAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBhY2N1bVtqXSA9IDA7CisgICAgICAgIGFjY3VtLmNsZWFyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgVEMgYyA9IFRGVU5DOjppbnRlcnBvbGF0ZXAoY29lZnNQWzBdLCBjb2Vmc1BbY291bnRdLCBsZXJwUCk7CisKKyAgICAgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgbWFjKGFjY3VtW2pdLCBjLCBzUCArIGopOworICAgICAgICAgICAgY29uc3QgVEkgKnRtcF9kYXRhID0gc1A7IC8vIHRtcF9wdHIgc2VlbXMgdG8gd29yayBiZXR0ZXIKKyAgICAgICAgICAgIGFjY3VtLmFjYyhjLCB0bXBfZGF0YSk7CisKKyAgICAgICAgICAgIGNvZWZzUCsrOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBjID0gVEZVTkM6OmludGVycG9sYXRlbihjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKTsKKworICAgICAgICAgICAgLy8gZm9yIChpbnQgaiA9IDA7IGogPCBDSEFOTkVMUzsgKytqKSBtYWMoYWNjdW1bal0sIGMsIHNOICsgaik7CisgICAgICAgICAgICB0bXBfZGF0YSA9IHNOOyAvLyB0bXBfcHRyIHNlZW1zIGZhc3RlciB0aGFuIGRpcmVjdGx5IHVzaW5nIHNOCisgICAgICAgICAgICBhY2N1bS5hY2MoYywgdG1wX2RhdGEpOworCisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgb3V0W2pdICs9IHZvbHVtZUFkanVzdChhY2N1bVtqXSwgdm9sdW1lTFJbMF0pOworICAgICAgICBUTyAqdG1wX291dCA9IG91dDsgLy8gbWF5IHJlbW92ZSBpZiBjb25zdCBvdXQgZGVmaW5pdGlvbiBjaGFuZ2VzLgorICAgICAgICBhY2N1bS52b2x1bWUodG1wX291dCwgdm9sdW1lTFJbMF0pOworICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgVE8gciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbWFjKGwsIHIsIFRGVU5DOjppbnRlcnBvbGF0ZXAoY29lZnNQWzBdLCBjb2Vmc1BbY291bnRdLCBsZXJwUCksIHNQKTsKKyAgICAgICAgICAgIGNvZWZzUCsrOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBtYWMobCwgciwgVEZVTkM6OmludGVycG9sYXRlbihjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKSwgc04pOworICAgICAgICAgICAgY29lZnNOKys7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChyLCB2b2x1bWVMUlsxXSk7CisgICAgfSBlbHNlIHsgLyogQ0hBTk5FTFMgPT0gMSAqLworICAgICAgICBUTyBsID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBtYWMobCwgVEZVTkM6OmludGVycG9sYXRlcChjb2Vmc1BbMF0sIGNvZWZzUFtjb3VudF0sIGxlcnBQKSwgc1ApOworICAgICAgICAgICAgY29lZnNQKys7CisgICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKKyAgICAgICAgICAgIG1hYyhsLCBURlVOQzo6aW50ZXJwb2xhdGVuKGNvZWZzTltjb3VudF0sIGNvZWZzTlswXSwgbGVycFApLCBzTik7CisgICAgICAgICAgICBjb2Vmc04rKzsKKyAgICAgICAgICAgIHNOICs9IENIQU5ORUxTOworICAgICAgICB9CisgICAgICAgIG91dFswXSArPSB2b2x1bWVBZGp1c3QobCwgdm9sdW1lTFJbMF0pOworICAgICAgICBvdXRbMV0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzFdKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitzdGF0aWMgaW5saW5lCit2b2lkIFByb2Nlc3NMKFRPKiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgVEkqIHNQLAorICAgICAgICBjb25zdCBUSSogc04sCisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBOdWxsPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCAwLCB2b2x1bWVMUik7Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJTlRFUlA+CitzdGF0aWMgaW5saW5lCit2b2lkIFByb2Nlc3MoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBUQyogY29lZnNQLAorICAgICAgICBjb25zdCBUQyogY29lZnNOLAorICAgICAgICBjb25zdCBUQyogY29lZnNQMSBfX3VudXNlZCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTjEgX191bnVzZWQsCisgICAgICAgIGNvbnN0IFRJKiBzUCwKKyAgICAgICAgY29uc3QgVEkqIHNOLAorICAgICAgICBUSU5URVJQIGxlcnBQLAorICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwQ29tcHV0ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKK30KKworLyoKKyAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lICh0d28gc2FtcGxlcykgZnJvbSBpbnB1dCBzYW1wbGUgcG9pbnRlci4KKyAqCisgKiBUaGlzIHNldHMgdXAgdGhlIHBhcmFtcyBmb3IgdGhlIGFjY2VsZXJhdGVkIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKQorICogZnVuY3Rpb25zIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBkb3QgcHJvZHVjdHMuCisgKgorICogQHBhcmFtIG91dCBzaG91bGQgcG9pbnQgdG8gdGhlIG91dHB1dCBidWZmZXIgd2l0aCBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIG91dHB1dCBmcmFtZS4KKyAqCisgKiBAcGFyYW0gcGhhc2UgaXMgdGhlIGZyYWN0aW9uYWwgZGlzdGFuY2UgYmV0d2VlbiBpbnB1dCBmcmFtZXMgZm9yIGludGVycG9sYXRpb246CisgKiBwaGFzZSA+PSAwICAmJiBwaGFzZSA8IHBoYXNlV3JhcExpbWl0LiAgSXQgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSByYXRpb25hbCBmcmFjdGlvbgorICogb2YgcGhhc2UvcGhhc2VXcmFwTGltaXQuCisgKgorICogQHBhcmFtIHBoYXNlV3JhcExpbWl0IGlzICNwb2x5cGhhc2VzPDxjb2VmU2hpZnQsIHdoZXJlICNwb2x5cGhhc2VzIGlzIHRoZSBudW1iZXIgb2YgcG9seXBoYXNlcworICogaW4gdGhlIHBvbHlwaGFzZSBmaWx0ZXIuIExpa2V3aXNlLCAjcG9seXBoYXNlcyBjYW4gYmUgb2J0YWluZWQgYXMgKHBoYXNlV3JhcExpbWl0Pj5jb2VmU2hpZnQpLgorICoKKyAqIEBwYXJhbSBjb2VmU2hpZnQgZ2l2ZXMgdGhlIGJpdCBhbGlnbm1lbnQgb2YgdGhlIHBvbHlwaGFzZSBpbmRleCBpbiB0aGUgcGhhc2UgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZnMgaXMgdGhlIGhhbGYgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgcGVyIHBvbHlwaGFzZSBmaWx0ZXIuIFNpbmNlIHRoZQorICogb3ZlcmFsbCBmaWx0ZXJiYW5rIGlzIG9kZC1sZW5ndGggc3ltbWV0cmljLCBvbmx5IGhhbGZOdW1Db2VmcyBuZWVkIGJlIHN0b3JlZC4KKyAqCisgKiBAcGFyYW0gY29lZnMgaXMgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgYmFuaywgc3RhcnRpbmcgYXQgZnJvbSBwb2x5cGhhc2UgaW5kZXggMCwgYW5kIHJhbmdpbmcgdG8KKyAqIGFuZCBpbmNsdWRpbmcgdGhlICNwb2x5cGhhc2VzLiAgRWFjaCBwb2x5cGhhc2Ugb2YgdGhlIGZpbHRlciBoYXMgaGFsZi1sZW5ndGggaGFsZk51bUNvZWZzCisgKiAoZHVlIHRvIHN5bW1ldHJ5KS4gIFRoZSB0b3RhbCBzaXplIG9mIHRoZSBmaWx0ZXIgYmFuayBpbiBjb2VmZmljaWVudHMgaXMKKyAqICgjcG9seXBoYXNlcysxKSpoYWxmTnVtQ29lZnMuCisgKgorICogVGhlIGZpbHRlciBiYW5rIGNvZWZzIHNob3VsZCBiZSBhbGlnbmVkIHRvIGEgbWluaW11bSBvZiAxNiBieXRlcyAocHJlZmVycmFibHkgdG8gY2FjaGUgbGluZSkuCisgKgorICogVGhlIGNvZWZzIHNob3VsZCBiZSBhdHRlbnVhdGVkICh0byBjb21wZW5zYXRlIGZvciBwYXNzYmFuZCByaXBwbGUpCisgKiBpZiBzdG9yaW5nIGJhY2sgaW50byB0aGUgbmF0aXZlIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gc2FtcGxlcyBhcmUgdW5hbGlnbmVkIGlucHV0IHNhbXBsZXMuICBUaGUgcG9zaXRpb24gaXMgaW4gdGhlICJtaWRkbGUiIG9mIHRoZQorICogc2FtcGxlIGFycmF5IHdpdGggcmVzcGVjdCB0byB0aGUgRklSIGZpbHRlcjoKKyAqIHRoZSBuZWdhdGl2ZSBoYWxmIG9mIHRoZSBmaWx0ZXIgaXMgZG90IHByb2R1Y3QgZnJvbSBzYW1wbGVzKzEgdG8gc2FtcGxlcytoYWxmTnVtQ29lZnM7CisgKiB0aGUgcG9zaXRpdmUgaGFsZiBvZiB0aGUgZmlsdGVyIGlzIGRvdCBwcm9kdWN0IGZyb20gc2FtcGxlcyB0byBzYW1wbGVzLWhhbGZOdW1Db2VmcysxLgorICoKKyAqIEBwYXJhbSB2b2x1bWVMUiBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdHdvIDMyIGJpdCB2b2x1bWUgdmFsdWVzLCBvbmUgcGVyIHN0ZXJlbyBjaGFubmVsLAorICogZXhwcmVzc2VkIGFzIGEgUzMyIGludGVnZXIuICBBIG5lZ2F0aXZlIHZhbHVlIGludmVydHMgdGhlIGNoYW5uZWwgMTgwIGRlZ3JlZXMuCisgKiBUaGUgcG9pbnRlciB2b2x1bWVMUiBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG1pbmltdW0gb2YgOCBieXRlcy4KKyAqIEEgdHlwaWNhbCB2YWx1ZSBmb3Igdm9sdW1lIGlzIDB4MTAwMCB0byBhbGlnbiB0byBhIHVuaXR5IGdhaW4gb3V0cHV0IG9mIDIwLjEyLgorICoKKyAqIEluIGJldHdlZW4gY2FsbHMgdG8gZmlsdGVyQ29lZmZpY2llbnQsIHRoZSBwaGFzZSBpcyBpbmNyZW1lbnRlZCBieSBwaGFzZUluY3JlbWVudCwgd2hlcmUKKyAqIHBoYXNlSW5jcmVtZW50IGlzIGNhbGN1bGF0ZWQgYXMgaW5wdXRTYW1wbGluZyAqIHBoYXNlV3JhcExpbWl0IC8gb3V0cHV0U2FtcGxpbmcuCisgKgorICogVGhlIGZpbHRlciBwb2x5cGhhc2UgaW5kZXggaXMgZ2l2ZW4gYnkgaW5kZXhQID0gcGhhc2UgPj4gY29lZlNoaWZ0LiBEdWUgdG8KKyAqIG9kZCBsZW5ndGggc3ltbWV0cmljIGZpbHRlciwgdGhlIHBvbHlwaGFzZSBpbmRleCBvZiB0aGUgbmVnYXRpdmUgaGFsZiBkZXBlbmRzIG9uCisgKiB3aGV0aGVyIGludGVycG9sYXRpb24gaXMgdXNlZC4KKyAqCisgKiBUaGUgZnJhY3Rpb25hbCBzaXRpbmcgYmV0d2VlbiB0aGUgcG9seXBoYXNlIGluZGljZXMgaXMgZ2l2ZW4gYnkgdGhlIGJpdHMgYmVsb3cgY29lZlNoaWZ0OgorICoKKyAqIGxlcnBQID0gcGhhc2UgPDwgMzIgLSBjb2VmU2hpZnQgPj4gMTsgIC8vIGZvciAzMiBiaXQgdW5zaWduZWQgcGhhc2UgbXVsdGlwbHkKKyAqIGxlcnBQID0gcGhhc2UgPDwgMzIgLSBjb2VmU2hpZnQgPj4gMTc7IC8vIGZvciAxNiBiaXQgdW5zaWduZWQgcGhhc2UgbXVsdGlwbHkKKyAqCisgKiBGb3IgaW50ZWdlciB0eXBlcywgdGhpcyBpcyBleHByZXNzZWQgYXM6CisgKgorICogbGVycFAgPSBwaGFzZSA8PCBzaXplb2YocGhhc2UpKjggLSBjb2VmU2hpZnQKKyAqICAgICAgICAgICAgICA+PiAoc2l6ZW9mKHBoYXNlKS1zaXplb2YoKmNvZWZzKSkqOCArIDE7CisgKgorICogRm9yIGZsb2F0aW5nIHBvaW50LCBsZXJwUCBpcyB0aGUgZnJhY3Rpb25hbCBwaGFzZSBzY2FsZWQgdG8gWzAuMCwgMS4wKToKKyAqCisgKiBsZXJwUCA9IChwaGFzZSA8PCAzMiAtIGNvZWZTaGlmdCkgLyAoMSA8PCAzMik7IC8vIGZsb2F0aW5nIHBvaW50IGVxdWl2YWxlbnQKKyAqLworCit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorc3RhdGljIGlubGluZQordm9pZCBmaXIoVE8qIGNvbnN0IG91dCwKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGhhc2UsIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0LAorICAgICAgICBjb25zdCBpbnQgY29lZlNoaWZ0LCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLCBjb25zdCBUQyogY29uc3QgY29lZnMsCisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBzYW1wbGVzLCBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCisgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKKyAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KKyAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisKKyAgICBpZiAoTE9DS0VEKSB7CisgICAgICAgIC8vIGxvY2tlZCBwb2x5cGhhc2UgKG5vIGludGVycG9sYXRpb24pCisgICAgICAgIC8vIENvbXB1dGUgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgaW5kZXggb24gdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWRlLgorICAgICAgICB1aW50MzJfdCBpbmRleFAgPSBwaGFzZSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIHVpbnQzMl90IGluZGV4TiA9IChwaGFzZVdyYXBMaW1pdCAtIHBoYXNlKSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AgPSBjb2VmcyArIGluZGV4UCpoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04gPSBjb2VmcyArIGluZGV4TipoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRJKiBzUCA9IHNhbXBsZXM7CisgICAgICAgIGNvbnN0IFRJKiBzTiA9IHNhbXBsZXMgKyBDSEFOTkVMUzsKKworICAgICAgICAvLyBkb3QgcHJvZHVjdCBmaWx0ZXIuCisgICAgICAgIFByb2Nlc3NMPENIQU5ORUxTLCBTVFJJREU+KG91dCwKKyAgICAgICAgICAgICAgICBoYWxmTnVtQ29lZnMsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBpbnRlcnBvbGF0ZWQgcG9seXBoYXNlCisgICAgICAgIC8vIENvbXB1dGUgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgaW5kZXggb24gdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzaWRlLgorICAgICAgICB1aW50MzJfdCBpbmRleFAgPSBwaGFzZSA+PiBjb2VmU2hpZnQ7CisgICAgICAgIHVpbnQzMl90IGluZGV4TiA9IChwaGFzZVdyYXBMaW1pdCAtIHBoYXNlIC0gMSkgPj4gY29lZlNoaWZ0OyAvLyBvbmUncyBjb21wbGVtZW50LgorICAgICAgICBjb25zdCBUQyogY29lZnNQID0gY29lZnMgKyBpbmRleFAqaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNOID0gY29lZnMgKyBpbmRleE4qaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNQMSA9IGNvZWZzUCArIGhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTjEgPSBjb2Vmc04gKyBoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRJKiBzUCA9IHNhbXBsZXM7CisgICAgICAgIGNvbnN0IFRJKiBzTiA9IHNhbXBsZXMgKyBDSEFOTkVMUzsKKworICAgICAgICAvLyBJbnRlcnBvbGF0aW9uIGZyYWN0aW9uIGxlcnBQIGRlcml2ZWQgYnkgc2hpZnRpbmcgYWxsIHRoZSB3YXkgdXAgYW5kIGRvd24KKyAgICAgICAgLy8gdG8gY2xlYXIgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYW5kIGFsaWduIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbAorICAgICAgICAvLyBmb3IgdGhlIGludGVnZXIgbXVsdGlwbHkuICBUaGUgY29uc3RhbnRzIHNob3VsZCByZXNvbHZlIGluIGNvbXBpbGUgdGltZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGludGVycG9sYXRlZCBmaWx0ZXIgY29lZmZpY2llbnQgaXMgZGVyaXZlZCBhcyBmb2xsb3dzIGZvciB0aGUgcG9zL25lZyBoYWxmOgorICAgICAgICAvLworICAgICAgICAvLyBpbnRlcnBvbGF0ZWRbUF0gPSBpbmRleFtQXSpsZXJwUCArIGluZGV4W1ArMV0qKDEtbGVycFApCisgICAgICAgIC8vIGludGVycG9sYXRlZFtOXSA9IGluZGV4W04rMV0qbGVycFAgKyBpbmRleFtOXSooMS1sZXJwUCkKKworICAgICAgICAvLyBvbi10aGUtZmx5IGludGVycG9sYXRlZCBkb3QgcHJvZHVjdCBmaWx0ZXIKKyAgICAgICAgaWYgKGlzX3NhbWU8VEMsIGZsb2F0Pjo6dmFsdWUgfHwgaXNfc2FtZTxUQywgZG91YmxlPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBUQyBzY2FsZSA9IDEuIC8gKDY1NTM2LiAqIDY1NTM2Lik7IC8vIHNjYWxlIHBoYXNlIGJpdHMgdG8gWzAuMCwgMS4wKQorICAgICAgICAgICAgVEMgbGVycFAgPSBUQyhwaGFzZSA8PCAoc2l6ZW9mKHBoYXNlKSo4IC0gY29lZlNoaWZ0KSkgKiBzY2FsZTsKKworICAgICAgICAgICAgUHJvY2VzczxDSEFOTkVMUywgU1RSSURFPihvdXQsCisgICAgICAgICAgICAgICAgICAgIGhhbGZOdW1Db2VmcywgY29lZnNQLCBjb2Vmc04sIGNvZWZzUDEsIGNvZWZzTjEsIHNQLCBzTiwgbGVycFAsIHZvbHVtZUxSKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxlcnBQID0gcGhhc2UgPDwgKHNpemVvZihwaGFzZSkqOCAtIGNvZWZTaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgPj4gKChzaXplb2YocGhhc2UpLXNpemVvZigqY29lZnMpKSo4ICsgMSk7CisKKyAgICAgICAgICAgIFByb2Nlc3M8Q0hBTk5FTFMsIFNUUklERT4ob3V0LAorICAgICAgICAgICAgICAgICAgICBoYWxmTnVtQ29lZnMsIGNvZWZzUCwgY29lZnNOLCBjb2Vmc1AxLCBjb2Vmc04xLCBzUCwgc04sIGxlcnBQLCB2b2x1bWVMUik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxMWNlZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKQEAgLTAsMCArMSwxMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ORU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gZGVwZW5kcyBvbiBBdWRpb1Jlc2FtcGxlckZpck9wcy5oLCBBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorCisjaWYgVVNFX05FT04KKy8vCisvLyBORU9OIHNwZWNpYWxpemF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCisvLworLy8gVE9ETzogU3RyaWRlIDE2IGFuZCBTdHJpZGUgOCBjYW4gYmUgY29tYmluZWQgd2l0aCBvbmUgcGFzcyBzdHJpZGUgOCAoaWYgbmVjZXNzYXJ5KQorLy8gYW5kIGxvb3Bpbmcgc3RyaWRlIDE2IChvciB2aWNlIHZlcnNhKS4gVGhpcyBoYXMgc29tZSBwb2x5cGhhc2UgY29lZiBkYXRhIGFsaWdubWVudAorLy8gaXNzdWVzIHdpdGggUzE2IGNvZWZzLiBDb25zaWRlciB0aGlzIGxhdGVyLgorCisvLyBNYWNyb3MgdG8gc2F2ZSBhIG1vbm8vc3RlcmVvIGFjY3VtdWxhdG9yIHNhbXBsZSBpbiBxMCAoYW5kIHE0KSBhcyBzdGVyZW8gb3V0LgorI2RlZmluZSBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8gXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXTo2NF0gICAgICAgIFxuIi8qICgxKSBsb2FkIHZvbHVtZXMgKi9cCisgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIpIHVuYWxpZ25lZCBsb2FkIHRoZSBvdXRwdXQgKi9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iLyogKDEpIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgKi9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFuZCByZXBsaWNhdGUgTC9SICovXAorICAgICAgICAidnFyZG11bGguczMyICAgZDAsIGQwLCBkMiAgICAgICAgICAgICAgIFxuIi8qICgyKzNkKSBhcHBseSB2b2x1bWUgKi9cCisgICAgICAgICJ2cWFkZC5zMzIgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFjY3VtdWxhdGUgcmVzdWx0IChzYXR1cmF0aW5nKSAqL1wKKyAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMisyZCkgc3RvcmUgcmVzdWx0ICovCisKKyNkZWZpbmUgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8gXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXTo2NF0gICAgICAgIFxuIi8qICgxKSBsb2FkIHZvbHVtZXMqL1wKKyAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMikgdW5hbGlnbmVkIGxvYWQgdGhlIG91dHB1dCovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIi8qICgxKSBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTAqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDkgICAgICAgICAgICAgICBcbiIvKiAoMSkgYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHE0Ki9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQ4ICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGNvbWJpbmUgaW50byBML1IqL1wKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIGQwLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIvKiAoMiszZCkgYXBwbHkgdm9sdW1lKi9cCisgICAgICAgICJ2cWFkZC5zMzIgICAgICBkMywgZDMsIGQwICAgICAgICAgICAgICAgXG4iLyogKDErNGQpIGFjY3VtdWxhdGUgcmVzdWx0IChzYXR1cmF0aW5nKSovXAorICAgICAgICAidnN0MS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKzJkKXN0b3JlIHJlc3VsdCovCisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSAocmV2ZXJzZWQpc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZClzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNywgZDIxICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSByZXZlcnNlIHJpZ2h0IHBvc2l0aXZlCisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQxMCwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTEsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEyLCBkMjAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkMTMsIGQyMSAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gYmVmb3JlIG5lb24gc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInExMCIKKyAgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlIFMzMiBRMTUKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczE2ICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gKDErMmQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDcsIGQyMSAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxOX0sIFslW2NvZWZzUDFdOjEyOF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgcTksIHE5LCBxOCAgICAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcmlnaHQgcG9zaXRpdmUKKworICAgICAgICAidmFkZC5zMTYgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczE2ICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ2LCBkMTcgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTAsIGQyMCAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDExLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQxMiwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEzLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTJ9LCBbJVtzUF1dICAgICAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTAsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTEsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEyLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDEzLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMn0sIFslW3NQXV0gICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3EzfSwgWyVbc05dXSEgICAgICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMiwgcTEzfSwgWyVbY29lZnNQMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTE0LCBxMTV9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTMsIHExMywgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MiwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTgsIHE5fSwgWyVbY29lZnNQMF06MTI4XSEgICBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMiwgcTEzfSwgWyVbY29lZnNQMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTE0LCBxMTV9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTMsIHExMywgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBkMlswXSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAidmFkZC5zMzIgICAgICAgcTExLCBxMTEsIHExNSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEwLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDExLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMiwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMywgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZWQgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKXNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTEwIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgyKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UgUzMyIFExNQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTd9LCBbJVtjb2Vmc1AxXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04xXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjF9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDE3LCBkMTcsIGQxNiAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIGQyMSwgZDIxLCBkMjAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQxNywgZDE3LCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMjEsIGQyMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgInZhZGQuczE2ICAgICAgIGQxNiwgZDE2LCBkMTcgICAgICAgICAgICBcbiIvLyAoMSsyZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAorCisgICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDErMGQpIG11bHRpcGx5IChyZXZlcnNlZClieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxN30sIFslW2NvZWZzUDFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMX0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBkMTcsIGQxNywgZDE2ICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDIxLCBkMjEsIGQyMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKworICAgICAgICAidnFyZG11bGguczE2ICAgZDE3LCBkMTcsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQyMSwgZDIxLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgZDIwLCBkMjAsIGQyMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExNCIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTE0IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUKK3ZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAocmV2ZXJzZWQpIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKKyNlbmRpZiAvL1VTRV9ORU9OCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IGU1MGIxOTIuLmQwM2U1NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luYy5oIgogCkBAIC00NTIsOSArNDUzLDkgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYyhpbnQgYml0RGVwdGgsCitBdWRpb1Jlc2FtcGxlclNpbmM6OkF1ZGlvUmVzYW1wbGVyU2luYygKICAgICAgICAgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpCi0gICAgOiBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAorICAgIDogQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAogICAgIG1TdGF0ZSgwKSwgbUltcHVsc2UoMCksIG1SaW5nRnVsbCgwKSwgbUZpckNvZWZzKDApCiB7CiAgICAgLyoKQEAgLTUwMCwxMCArNTAxLDEyIEBACiAgICAgbVJpbmdGdWxsID0gbUltcHVsc2UgKyAobnVtQ29lZnMrMSkqbUNoYW5uZWxDb3VudDsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnNldFZvbHVtZShpbnQxNl90IGxlZnQsIGludDE2X3QgcmlnaHQpIHsKK3ZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKICAgICBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICBtVm9sdW1lU0lNRFswXSA9IGludDMyX3QobGVmdCk8PDE2OwotICAgIG1Wb2x1bWVTSU1EWzFdID0gaW50MzJfdChyaWdodCk8PDE2OworICAgIC8vIGNvbnZlcnQgdG8gVTRfMjggKHJvdW5kaW5nIGRvd24pLgorICAgIC8vIGludGVnZXIgdm9sdW1lIHZhbHVlcyBhcmUgY2xhbXBlZCB0byAwIHRvIFVOSVRZX0dBSU4uCisgICAgbVZvbHVtZVNJTURbMF0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgIG1Wb2x1bWVTSU1EWzFdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKHJpZ2h0KSk7CiB9CiAKIHZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LApAQCAtNTQzLDcgKzU0Niw3IEBACiAgICAgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CiAgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKICAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogMjsKLSAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKG91dEZyYW1lQ291bnQqbUluU2FtcGxlUmF0ZSkvbVNhbXBsZVJhdGU7CisgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IGdldEluRnJhbWVDb3VudFJlcXVpcmVkKG91dEZyYW1lQ291bnQpOwogCiAgICAgd2hpbGUgKG91dHB1dEluZGV4IDwgb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgLy8gYnVmZmVyIGlzIGVtcHR5LCBmZXRjaCBhIG5ldyBvbmUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaAppbmRleCAxZWE0NDc0Li40NjkxZDBhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCkBAIC0zNCw3ICszNCw3IEBACiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyU2luYyA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CiBwdWJsaWM6Ci0gICAgQXVkaW9SZXNhbXBsZXJTaW5jKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgQXVkaW9SZXNhbXBsZXJTaW5jKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgc3JjX3F1YWxpdHkgcXVhbGl0eSA9IEhJR0hfUVVBTElUWSk7CiAKICAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlclNpbmMoKTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGludDE2X3QgbGVmdCwgaW50MTZfdCByaWdodCk7CisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CiAgICAgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKaW5kZXggMDc1NGQ5ZC4uNmE4YWViMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCkBAIC0zMSw2ICszMSw3IEBACiAKIC8vIHVuY29tbWVudCB0byBlbmFibGUgZmFzdCBtaXhlciB0byB0YWtlIHBlcmZvcm1hbmNlIHNhbXBsZXMgZm9yIGxhdGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzCiAjZGVmaW5lIEZBU1RfTUlYRVJfU1RBVElTVElDUworLy8gRklYTUUgcmVuYW1lIHRvIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKIAogLy8gdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgdGltaW5nIHByb2JsZW1zIHJlbGF0ZWQgdG8gU3RhdGVRdWV1ZTo6cHVzaCgpCiAvLyNkZWZpbmUgU1RBVEVfUVVFVUVfRFVNUApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IDAxMGUyMzMuLmJjYWY4YWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTQ0LDYgKzQ0LDggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjYsNyArNjgsOCBAQAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAogICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KICAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgotICAgICAgbVN1c3BlbmRlZChmYWxzZSkKKyAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRmxpbmdlcih0aHJlYWQtPm1BdWRpb0ZsaW5nZXIpCiB7CiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CiAgICAgaW50IGxTdGF0dXM7CkBAIC0xMTYsOCArMTE5LDkgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIGZpcnN0IG5vbiBkZXN0cm95ZWQgaGFuZGxlIGlzIGNvbnNpZGVyZWQgaW4gY29udHJvbAotICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKQorICAgICAgICBpZiAoY29udHJvbEhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250cm9sSGFuZGxlID0gaDsKKyAgICAgICAgfQogICAgICAgICBpZiAoaC0+cHJpb3JpdHkoKSA8PSBwcmlvcml0eSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE5NCw5ICsxOTgsMTkgQEAKICAgICAvLyBkZXN0cnVjdG9yIGJlZm9yZSB3ZSBleGl0CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBrZWVwKHRoaXMpOwogICAgIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0KGtlZXAsIGhhbmRsZSwgdW5waW5JZkxhc3QpOworICAgICAgICBpZiAocmVtb3ZlSGFuZGxlKGhhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFpc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT5yZW1vdmVFZmZlY3RfbCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChhZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFmLT51cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnModGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG1IYW5kbGVzLnNpemUoKTsKQEAgLTQyNiw2ICs0NDAsMjAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjphZGRFZmZlY3RUb0hhbF9sKCkKK3sKKyAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CisgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0gPSB0aHJlYWQtPnN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5hZGRfYXVkaW9fZWZmZWN0KHN0cmVhbSwgbUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdGFydCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ1MSwxNSArNDc5LDExIEBACiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyA9PSAwICYmCi0gICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8Ci0gICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykpIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSA9IHRocmVhZC0+c3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPmFkZF9hdWRpb19lZmZlY3Qoc3RyZWFtLCBtRWZmZWN0SW50ZXJmYWNlKTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgY2hhaW4tPmZvcmNlVm9sdW1lKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTgwNCw3ICs4MjgsMTEyIEBACiAgICAgcmV0dXJuIG1PZmZsb2FkZWQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorU3RyaW5nOCBlZmZlY3RGbGFnc1RvU3RyaW5nKHVpbnQzMl90IGZsYWdzKSB7CisgICAgU3RyaW5nOCBzOworCisgICAgcy5hcHBlbmQoImNvbm4uIG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUOiBzLmFwcGVuZCgiaW5zZXJ0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlk6IHMuYXBwZW5kKCJhdXhpbGlhcnkiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0U6IHMuYXBwZW5kKCJyZXBsYWNlIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzogcy5hcHBlbmQoInByZXByb2MiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQzogcy5hcHBlbmQoInBvc3Rwcm9jIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJpbnNlcnQgcHJlZjogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZOiBzLmFwcGVuZCgiYW55Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUOiBzLmFwcGVuZCgiZmlyc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVDogcy5hcHBlbmQoImxhc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFOiBzLmFwcGVuZCgiZXhjbHVzaXZlIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJ2b2x1bWUgbWdtdDogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHVpbnQzMl90IGRldmluZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0s7CisgICAgaWYgKGRldmluZCkgeworICAgICAgICBzLmFwcGVuZCgiZGV2aWNlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGRldmluZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyB1cGRhdGVzIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBzLmFwcGVuZCgiaW5wdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOUFVUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9CT1RIOiBzLmFwcGVuZCgiZGlyZWN0K3Byb3ZpZGVyIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJub3Qgc2V0Iik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJvdXRwdXQgbW9kZTogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfRElSRUNUOiBzLmFwcGVuZCgiZGlyZWN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX1BST1ZJREVSOiBzLmFwcGVuZCgicHJvdmlkZXIiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICB1aW50MzJfdCBhY2NlbCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0s7CisgICAgaWYgKGFjY2VsKSB7CisgICAgICAgIHMuYXBwZW5kKCJoYXJkd2FyZSBhY2NlbGVyYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKGFjY2VsKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1NJTVBMRTogcy5hcHBlbmQoIm5vbi10dW5uZWxlZCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMOiBzLmFwcGVuZCgidHVubmVsZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHVpbnQzMl90IG1vZGVpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSzsKKyAgICBpZiAobW9kZWluZCkgeworICAgICAgICBzLmFwcGVuZCgibW9kZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChtb2RlaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgdWludDMyX3Qgc3JjaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfTUFTSzsKKyAgICBpZiAoc3JjaW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJzb3VyY2UgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoc3JjaW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX0lORDogcy5hcHBlbmQoInJlcXVpcmVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX01BU0spIHsKKyAgICAgICAgcy5hcHBlbmQoIm9mZmxvYWRhYmxlLCAiKTsKKyAgICB9CisKKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTgzOCw5ICs5NjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5ub2RlWzJdLAogICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVszXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNF0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzVdKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA4WFxuXHRcdC0gZmxhZ3M6ICUwOFggKCVzKVxuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmFwaVZlcnNpb24sCi0gICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncyk7CisgICAgICAgICAgICBtRGVzY3JpcHRvci5mbGFncywKKyAgICAgICAgICAgIGVmZmVjdEZsYWdzVG9TdHJpbmcobURlc2NyaXB0b3IuZmxhZ3MpLnN0cmluZygpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gbmFtZTogJXNcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5uYW1lKTsKQEAgLTg1MSwzNyArOTgxLDM3IEBACiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0LSBJbnB1dCBjb25maWd1cmF0aW9uOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0RnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXQgQnVmZmVyXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQlMDV6dSAgICUwNWQgICAgJTA4eCAlNmQgJXBcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0JTA1enUgICAlMDVkICAgICUwOHggJTZkICglcykgJXBcbiIsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQsCisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQpLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0LSBPdXRwdXQgY29uZmlndXJhdGlvbjpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICVkXG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICVkICglcylcbiIsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKLSAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQsCisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCV6dSBDbGllbnRzOlxuIiwgbUhhbmRsZXMuc2l6ZSgpKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0UGlkICAgUHJpb3JpdHkgQ3RybCBMb2NrZWQgY2xpZW50IHNlcnZlclxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0ICBQaWQgUHJpb3JpdHkgQ3RybCBMb2NrZWQgY2xpZW50IHNlcnZlclxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7ICsraSkgewogICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOwogICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGVzdHJveWVkX2woKSkgewotICAgICAgICAgICAgaGFuZGxlLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgICAgICBoYW5kbGUtPmR1bXBUb0J1ZmZlcihidWZmZXIsIFNJWkUpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CiAKICAgICBpZiAobG9ja2VkKSB7CkBAIC05MTEsMTggKzEwNDEsMTUgQEAKICAgICB9CiAgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CiAgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsgYnVmT2Zmc2V0KTsKLSAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgewotICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7Ci0KLSAgICAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5ldyhtQ2JsaykgZWZmZWN0X3BhcmFtX2NibGtfdCgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIGlmIChtQ2Jsa01lbW9yeSA9PSAwIHx8CisgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgRWZmZWN0IHNpemU9JXUiLCBFRkZFQ1RfUEFSQU1fQlVGRkVSX1NJWkUgKwogICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSk7CisgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbmV3KG1DYmxrKSBlZmZlY3RfcGFyYW1fY2Jsa190KCk7CisgICAgbUJ1ZmZlciA9ICh1aW50OF90ICopbUNibGsgKyBidWZPZmZzZXQ7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjp+RWZmZWN0SGFuZGxlKCkKQEAgLTkzOSw2ICsxMDY2LDExIEBACiAgICAgZGlzY29ubmVjdChmYWxzZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiBtQ2xpZW50ID09IDAgfHwgbUNibGtNZW1vcnkgIT0gMCA/IE9LIDogTk9fTUVNT1JZOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKIHsKICAgICBBTE9HVigiZW5hYmxlICVwIiwgdGhpcyk7CkBAIC0xMDUzLDggKzExODUsOCBAQAogICAgICAgICAgICAgbUNibGstPn5lZmZlY3RfcGFyYW1fY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KICAgICAgICAgfQogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOyAgICAvLyBmcmVlIHRoZSBzaGFyZWQgbWVtb3J5IGJlZm9yZSByZWxlYXNpbmcgdGhlIGhlYXAgaXQgYmVsb25ncyB0bwotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBtdXRleCBsb2NrZWQKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIGNsaWVudCBtdXRleCBsb2NrZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tQ2xpZW50TG9jayk7CiAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKICAgICB9CiB9CkBAIC0xMTc5LDE1ICsxMzExLDE1IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTA1ZCAlMDVkICAgICUwMXUgICAgJTAxdSAgICAgICUwNXUgICUwNXVcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKLSAgICAgICAgICAgIG1IYXNDb250cm9sLAotICAgICAgICAgICAgIWxvY2tlZCwKKyAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAorICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbUNibGsgPyBtQ2Jsay0+Y2xpZW50SW5kZXggOiAwLAogICAgICAgICAgICAgbUNibGsgPyBtQ2Jsay0+c2VydmVySW5kZXggOiAwCiAgICAgICAgICAgICApOwpAQCAtMTIwNCw3ICsxMzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQogICAgIDogbVRocmVhZCh0aHJlYWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1BY3RpdmVUcmFja0NudCgwKSwgbVRyYWNrQ250KDApLCBtVGFpbEJ1ZmZlckNvdW50KDApLAogICAgICAgbU93bkluQnVmZmVyKGZhbHNlKSwgbVZvbHVtZUN0cmxJZHgoLTEpLCBtTGVmdFZvbHVtZShVSU5UX01BWCksIG1SaWdodFZvbHVtZShVSU5UX01BWCksCi0gICAgICBtTmV3TGVmdFZvbHVtZShVSU5UX01BWCksIG1OZXdSaWdodFZvbHVtZShVSU5UX01BWCkKKyAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwgbUZvcmNlVm9sdW1lKGZhbHNlKQogewogICAgIG1TdHJhdGVneSA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOwogICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewpAQCAtMTI3OCw3ICsxNDEwLDEzIEBACiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Y2xlYXJJbnB1dEJ1ZmZlcl9sKHNwPFRocmVhZEJhc2U+IHRocmVhZCkKIHsKLSAgICBtZW1zZXQobUluQnVmZmVyLCAwLCB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIHRocmVhZC0+ZnJhbWVTaXplKCkpOworICAgIC8vIFRPRE86IFRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAorICAgIC8vIGFuZCBzYW1wbGUgZm9ybWF0IGNoYW5nZXMgZm9yIGVmZmVjdHMuCisgICAgLy8gQ3VycmVudGx5IGVmZmVjdHMgcHJvY2Vzc2luZyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RlcmVvLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgIC8vICg0IGJ5dGVzIGZyYW1lIHNpemUpCisgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9CisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSAqIG1pbihGQ0NfMiwgdGhyZWFkLT5jaGFubmVsQ291bnQoKSk7CisgICAgbWVtc2V0KG1JbkJ1ZmZlciwgMCwgdGhyZWFkLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUpOwogfQogCiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKQEAgLTE1MjEsNyArMTY1OSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY3RybElkeCA9PSBtVm9sdW1lQ3RybElkeCAmJiAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CisgICAgaWYgKCFpc1ZvbHVtZUZvcmNlZCgpICYmIGN0cmxJZHggPT0gbVZvbHVtZUN0cmxJZHggJiYKKyAgICAgICAgICAgICpsZWZ0ID09IG1MZWZ0Vm9sdW1lICYmICpyaWdodCA9PSBtUmlnaHRWb2x1bWUpIHsKICAgICAgICAgaWYgKGhhc0NvbnRyb2wpIHsKICAgICAgICAgICAgICpsZWZ0ID0gbU5ld0xlZnRWb2x1bWU7CiAgICAgICAgICAgICAqcmlnaHQgPSBtTmV3UmlnaHRWb2x1bWU7CkBAIC0xNTYyLDM5ICsxNzAxLDUyIEBACiAgICAgcmV0dXJuIGhhc0NvbnRyb2w7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c3luY0hhbEVmZmVjdHNTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRWZmZWN0c1tpXS0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAorICAgICAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5hZGRFZmZlY3RUb0hhbF9sKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJFZmZlY3RzIGZvciBzZXNzaW9uICVkOlxuIiwgbVNlc3Npb25JZCk7CisgICAgc2l6ZV90IG51bUVmZmVjdHMgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICVkIGVmZmVjdHMgZm9yIHNlc3Npb24gJWRcbiIsIG51bUVmZmVjdHMsIG1TZXNzaW9uSWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7Ci0gICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0Q291bGQgbm90IGxvY2sgbXV0ZXg6XG4iKTsKLSAgICB9Ci0KLSAgICByZXN1bHQuYXBwZW5kKCJcdE51bSBmeCBJbiBidWZmZXIgICBPdXQgYnVmZmVyICAgQWN0aXZlIHRyYWNrczpcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JTAyenUgICAgICVwICAlcCAgICVkXG4iLAotICAgICAgICAgICAgbUVmZmVjdHMuc2l6ZSgpLAotICAgICAgICAgICAgbUluQnVmZmVyLAotICAgICAgICAgICAgbU91dEJ1ZmZlciwKLSAgICAgICAgICAgIG1BY3RpdmVUcmFja0NudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3RzW2ldOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgIGVmZmVjdC0+ZHVtcChmZCwgYXJncyk7CisgICAgaWYgKG51bUVmZmVjdHMpIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAorICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRDb3VsZCBub3QgbG9jayBtdXRleDpcbiIpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRJbiBidWZmZXIgICBPdXQgYnVmZmVyICAgQWN0aXZlIHRyYWNrczpcbiIpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCVwICAlcCAgICVkXG4iLAorICAgICAgICAgICAgICAgIG1JbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja0NudCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdHNbaV07CisgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tlZCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE3OTIsNCArMTk0NCwxMyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0VGhyZWFkKHRocmVhZCk7CisgICAgfQorfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggYjcxNzg1Ny4uNmY5M2Y4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xMTksNiArMTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSAhPSAwOyB9CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKICAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CiAKICAgICB2b2lkICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTUzLDYgKzE1NCw3IEBACiAgICAgdWludDMyX3QgbURpc2FibGVXYWl0Q250OyAgICAgICAvLyBjdXJyZW50IHByb2Nlc3MoKSBjYWxscyBjb3VudCBkdXJpbmcgZGlzYWJsZSBwZXJpb2QuCiAgICAgYm9vbCAgICAgbVN1c3BlbmRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgc3VzcGVuZGVkOiB0ZW1wb3JhcmlseSBkaXNhYmxlZCBieSBmcmFtZXdvcmsKICAgICBib29sICAgICBtT2ZmbG9hZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBjdXJyZW50bHkgb2ZmbG9hZGVkIHRvIHRoZSBhdWRpbyBEU1AKKyAgICB3cDxBdWRpb0ZsaW5nZXI+ICAgIG1BdWRpb0ZsaW5nZXI7CiB9OwogCiAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKQEAgLTE2OSw2ICsxNzEsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkpOwogICAgIHZpcnR1YWwgfkVmZmVjdEhhbmRsZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKICAgICAvLyBJRWZmZWN0CiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGUoKTsKQEAgLTIwOCw3ICsyMTEsNyBAQAogICAgIC8vIGRlc3Ryb3llZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgYXNzb2NpYXRlZCBFZmZlY3RNb2R1bGUgbUxvY2sgaGVsZAogICAgIGJvb2wgZGVzdHJveWVkX2woKSBjb25zdCB7IHJldHVybiBtRGVzdHJveWVkOyB9CiAKLSAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBkdW1wVG9CdWZmZXIoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgICAgICAvLyBmb3IgbUVmZmVjdCwgbUhhc0NvbnRyb2wsIG1FbmFibGVkCkBAIC0yNjksNiArMjcyLDcgQEAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tSWRfbChpbnQgaWQpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbVR5cGVfbChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlKTsKKyAgICAvLyBGSVhNRSB1c2UgZmxvYXQgdG8gaW1wcm92ZSB0aGUgZHluYW1pYyByYW5nZQogICAgIGJvb2wgc2V0Vm9sdW1lX2wodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCk7CiAgICAgdm9pZCBzZXREZXZpY2VfbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKICAgICB2b2lkIHNldE1vZGVfbChhdWRpb19tb2RlX3QgbW9kZSk7CkBAIC0zMTUsNiArMzE5LDE0IEBACiAgICAgLy8gQXQgbGVhc3Qgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaW4gdGhlIGNoYWluIGlzIGVuYWJsZWQKICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFbmFibGVkKCk7CiAKKyAgICAvLyB1c2UgcmVsZWFzZV9jYXMgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBvYnNlcnZlZCB2YWx1ZSwganVzdCB3YW50IHRvIG1ha2Ugc3VyZSB0aGUKKyAgICAvLyBuZXcgdmFsdWUgaXMgb2JzZXJ2YWJsZS4KKyAgICB2b2lkIGZvcmNlVm9sdW1lKCkgeyBhbmRyb2lkX2F0b21pY19yZWxlYXNlX2NhcyhmYWxzZSwgdHJ1ZSwgJm1Gb3JjZVZvbHVtZSk7IH0KKyAgICAvLyB1c2UgYWNxdWlyZV9jYXMgYmVjYXVzZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgb2JzZXJ2ZWQgdmFsdWUgYW5kCisgICAgLy8gd2UgYXJlIHRoZSBvbmx5IG9ic2VydmVycy4KKyAgICBib29sIGlzVm9sdW1lRm9yY2VkKCkgeyByZXR1cm4gKGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfY2FzKHRydWUsIGZhbHNlLCAmbUZvcmNlVm9sdW1lKSA9PSAwKTsgfQorCisgICAgdm9pZCBzeW5jSGFsRWZmZWN0c1N0YXRlKCk7CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMzQ1LDYgKzM1Nyw4IEBACiAKICAgICB2b2lkIGNsZWFySW5wdXRCdWZmZXJfbChzcDxUaHJlYWRCYXNlPiB0aHJlYWQpOwogCisgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCk7CisKICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAogICAgIE11dGV4IG1Mb2NrOyAgICAgICAgICAgICAgICAvLyBtdXRleCBwcm90ZWN0aW5nIGVmZmVjdCBsaXN0CiAgICAgVmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gbUVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0IG1vZHVsZXMKQEAgLTM3MCw0ICszODQsNSBAQAogICAgIC8vIHRpbWVMb3cgZmllbGRzIGFtb25nIGVmZmVjdCB0eXBlIFVVSURzLgogICAgIC8vIFVwZGF0ZWQgYnkgdXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIG9ubHkuCiAgICAgS2V5ZWRWZWN0b3I8IGludCwgc3A8U3VzcGVuZGVkRWZmZWN0RGVzYz4gPiBtU3VzcGVuZGVkRWZmZWN0czsKKyAgICB2b2xhdGlsZSBpbnQzMl90IG1Gb3JjZVZvbHVtZTsgLy8gZm9yY2UgbmV4dCB2b2x1bWUgY29tbWFuZCBiZWNhdXNlIGEgbmV3IGVmZmVjdCB3YXMgZW5hYmxlZAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOWI5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYXN0Q2FwdHVyZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKnN0YXRpYyovIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgRmFzdENhcHR1cmU6OmluaXRpYWw7CisKK0Zhc3RDYXB0dXJlOjpGYXN0Q2FwdHVyZSgpIDogRmFzdFRocmVhZCgpLAorICAgIGlucHV0U291cmNlKE5VTEwpLCBpbnB1dFNvdXJjZUdlbigwKSwgcGlwZVNpbmsoTlVMTCksIHBpcGVTaW5rR2VuKDApLAorICAgIHJlYWRCdWZmZXIoTlVMTCksIHJlYWRCdWZmZXJTdGF0ZSgtMSksIGZvcm1hdChGb3JtYXRfSW52YWxpZCksIHNhbXBsZVJhdGUoMCksCisgICAgLy8gZHVtbXlEdW1wU3RhdGUKKyAgICB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQoMCkKK3sKKyAgICBwcmV2aW91cyA9ICZpbml0aWFsOworICAgIGN1cnJlbnQgPSAmaW5pdGlhbDsKKworICAgIG1EdW1teUR1bXBTdGF0ZSA9ICZkdW1teUR1bXBTdGF0ZTsKK30KKworRmFzdENhcHR1cmU6On5GYXN0Q2FwdHVyZSgpCit7Cit9CisKK0Zhc3RDYXB0dXJlU3RhdGVRdWV1ZSogRmFzdENhcHR1cmU6OnNxKCkKK3sKKyAgICByZXR1cm4gJm1TUTsKK30KKworY29uc3QgRmFzdFRocmVhZFN0YXRlICpGYXN0Q2FwdHVyZTo6cG9sbCgpCit7CisgICAgcmV0dXJuIG1TUS5wb2xsKCk7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6OnNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIgX191bnVzZWQpCit7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uSWRsZSgpCit7CisgICAgcHJlSWRsZSA9ICooY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKWN1cnJlbnQ7CisgICAgY3VycmVudCA9ICZwcmVJZGxlOworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvbkV4aXQoKQoreworICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7Cit9CisKK2Jvb2wgRmFzdENhcHR1cmU6OmlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQoreworICAgIHN3aXRjaCAoKEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQpIGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQ6CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURToKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQURfV1JJVEU6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uU3RhdGVDaGFuZ2UoKQoreworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIGJvb2wgZWl0aGVyQ2hhbmdlZCA9IGZhbHNlOworCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBpbnB1dCBIQUwgY29uZmlndXJhdGlvbgorICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoY3VycmVudC0+bUlucHV0U291cmNlR2VuICE9IGlucHV0U291cmNlR2VuKSB7CisgICAgICAgIGlucHV0U291cmNlID0gY3VycmVudC0+bUlucHV0U291cmNlOworICAgICAgICBpbnB1dFNvdXJjZUdlbiA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbjsKKyAgICAgICAgaWYgKGlucHV0U291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXQgPSBpbnB1dFNvdXJjZS0+Zm9ybWF0KCk7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgICAgICAgfQorICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgICAgZWl0aGVyQ2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBwaXBlCisgICAgaWYgKGN1cnJlbnQtPm1QaXBlU2lua0dlbiAhPSBwaXBlU2lua0dlbikgeworICAgICAgICBwaXBlU2luayA9IGN1cnJlbnQtPm1QaXBlU2luazsKKyAgICAgICAgcGlwZVNpbmtHZW4gPSBjdXJyZW50LT5tUGlwZVNpbmtHZW47CisgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIGlucHV0IHNvdXJjZSBhbmQgcGlwZSBzaW5rIG11c3QgYmUgY29tcGF0aWJsZQorICAgIGlmIChlaXRoZXJDaGFuZ2VkICYmIGlucHV0U291cmNlICE9IE5VTEwgJiYgcGlwZVNpbmsgIT0gTlVMTCkgeworICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHBpcGVTaW5rLT5mb3JtYXQoKSkpOworICAgIH0KKworICAgIGlmICgoIUZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgcHJldmlvdXNGb3JtYXQpKSB8fCAoZnJhbWVDb3VudCAhPSBwcmV2aW91cy0+bUZyYW1lQ291bnQpKSB7CisgICAgICAgIC8vIEZJWE1FIHRvIGF2b2lkIHByaW9yaXR5IGludmVyc2lvbiwgZG9uJ3QgZGVsZXRlIGhlcmUKKyAgICAgICAgZGVsZXRlW10gcmVhZEJ1ZmZlcjsKKyAgICAgICAgcmVhZEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBzYW1wbGVSYXRlID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKKyAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgY2FwdHVyZSB0aHJlYWQgYWxsb2NhdGUgZm9yCisgICAgICAgICAgICAvLyAgICAgICB1cyB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgorICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCisgICAgICAgICAgICByZWFkQnVmZmVyID0gbmV3IHNob3J0W2ZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAorICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1CisgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOworICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIGZvcmNlTnMgPSAwOworICAgICAgICAgICAgd2FybXVwTnMgPSAwOworICAgICAgICB9CisgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IC0xOworICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICB9CisKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IHRoaXMtPmNvbW1hbmQ7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIGlmICgoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQpIC8qJiYgaXNXYXJtKi8pIHsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5wdXRTb3VyY2UgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHJlYWRCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOworICAgICAgICBBVFJBQ0VfQkVHSU4oInJlYWQiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkID0gaW5wdXRTb3VyY2UtPnJlYWQocmVhZEJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNSZWFkID49IDApIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemVfdCkgZnJhbWVzUmVhZCA+IGZyYW1lQ291bnQpOworICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gdG90YWxOYXRpdmVGcmFtZXNSZWFkOworICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRFcnJvcnMrKzsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgcmVuYW1lIHRvIGF0dGVtcHRlZElPCisgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHBpcGVTaW5rICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOworICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlIDwgMCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCisgICAgICAgICAgICBtZW1zZXQocmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlID4gMCkgeworICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gcGlwZVNpbmstPndyaXRlKHJlYWRCdWZmZXIsIHJlYWRCdWZmZXJTdGF0ZSk7CisgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKKyAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KKyAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOworICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKKyAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZVVEVYX1dBS0UsICZjYmxrLT5tRnV0ZXgpOworICAgICAgICAgICAgICAgIGlmICghKG9sZCAmIENCTEtfRlVURVhfV0FLRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzIG5ldmVyIGluIHNlcnZlciBwcm9jZXNzLCBzbyBkb24ndCB1c2UgRlVURVhfV0FLRV9QUklWQVRFCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIEZVVEVYX1dBS0UsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworRmFzdENhcHR1cmVEdW1wU3RhdGU6OkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVJlYWRTZXF1ZW5jZSgwKSwgbUZyYW1lc1JlYWQoMCksIG1SZWFkRXJyb3JzKDApLCBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCkKK3sKK30KKworRmFzdENhcHR1cmVEdW1wU3RhdGU6On5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpCit7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM1YjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9ICisKKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCisjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIFN0YXRlUXVldWU8RmFzdENhcHR1cmVTdGF0ZT4gRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOworCitzdHJ1Y3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpOworCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgbWFueSBvZiB0aGVzZSB0byBGYXN0VGhyZWFkRHVtcFN0YXRlCisgICAgdWludDMyX3QgbVJlYWRTZXF1ZW5jZTsgICAgIC8vIGluY3JlbWVudGVkIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCByZWFkKCkKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVhZDsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyByZWFkIHN1Y2Nlc3NmdWxseQorICAgIHVpbnQzMl90IG1SZWFkRXJyb3JzOyAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgcmVhZCgpIGVycm9ycworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OworfTsKKworY2xhc3MgRmFzdENhcHR1cmUgOiBwdWJsaWMgRmFzdFRocmVhZCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlKCk7CisgICAgdmlydHVhbCB+RmFzdENhcHR1cmUoKTsKKworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlKiAgc3EoKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAgIG1TUTsKKworICAgIC8vIGNhbGxvdXRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcik7CisgICAgdmlydHVhbCB2b2lkIG9uSWRsZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbkV4aXQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpOworICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uV29yaygpOworCisgICAgc3RhdGljIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgaW5pdGlhbDsKKyAgICBGYXN0Q2FwdHVyZVN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgbWFueSBvZiB0aGVzZSB0byBGYXN0VGhyZWFkCisgICAgTkJBSU9fU291cmNlICppbnB1dFNvdXJjZTsKKyAgICBpbnQgaW5wdXRTb3VyY2VHZW47CisgICAgTkJBSU9fU2luayAqcGlwZVNpbms7CisgICAgaW50IHBpcGVTaW5rR2VuOworICAgIHNob3J0ICpyZWFkQnVmZmVyOworICAgIHNzaXplX3QgcmVhZEJ1ZmZlclN0YXRlOyAgICAvLyBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgZnJhbWVzIGluIHJlYWRCdWZmZXIsIG9yIC0xIHRvIGNsZWFyCisgICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlIGR1bW15RHVtcFN0YXRlOworICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQKKworfTsgIC8vIGNsYXNzIEZhc3RDYXB0dXJlCisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKaW5kZXggMTNjYWM2ZC4uMWQwMjliNwotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK0Zhc3RDYXB0dXJlU3RhdGU6OkZhc3RDYXB0dXJlU3RhdGUoKSA6IEZhc3RUaHJlYWRTdGF0ZSgpLAorICAgIG1JbnB1dFNvdXJjZShOVUxMKSwgbUlucHV0U291cmNlR2VuKDApLCBtUGlwZVNpbmsoTlVMTCksIG1QaXBlU2lua0dlbigwKSwgbUZyYW1lQ291bnQoMCkKK3sKK30KIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLworRmFzdENhcHR1cmVTdGF0ZTo6fkZhc3RDYXB0dXJlU3RhdGUoKQoreworfQogCit9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljODY1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICisKKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFJlcHJlc2VudCBhIHNpbmdsZSBzdGF0ZSBvZiB0aGUgZmFzdCBjYXB0dXJlCitzdHJ1Y3QgRmFzdENhcHR1cmVTdGF0ZSA6IEZhc3RUaHJlYWRTdGF0ZSB7CisgICAgICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0Q2FwdHVyZVN0YXRlKCk7CisKKyAgICAvLyBhbGwgcG9pbnRlciBmaWVsZHMgdXNlIHJhdyBwb2ludGVyczsgb2JqZWN0cyBhcmUgb3duZWQgYW5kIHJlZi1jb3VudGVkIGJ5IFJlY29yZFRocmVhZAorICAgIE5CQUlPX1NvdXJjZSAgICAqbUlucHV0U291cmNlOyAgICAgIC8vIEhBTCBpbnB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCisgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgdGhlc2UgZmllbGRzIHRvIEZhc3RUaHJlYWRTdGF0ZQorICAgIGludCAgICAgICAgICAgICBtSW5wdXRTb3VyY2VHZW47ICAgIC8vIGluY3JlbWVudCB3aGVuIG1JbnB1dFNvdXJjZSBpcyBhc3NpZ25lZAorICAgIE5CQUlPX1NpbmsgICAgICAqbVBpcGVTaW5rOyAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgZnJvbSBpbnB1dCBzb3VyY2UsIHdyaXRlIHRvIHRoaXMgcGlwZSBzaW5rCisgICAgaW50ICAgICAgICAgICAgIG1QaXBlU2lua0dlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gbVBpcGVTaW5rIGlzIGFzc2lnbmVkCisgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCAgKm1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKKworICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKKyAgICAgICAgUkVBRCA9IDB4OCwgICAgICAgICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZQorICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBwaXBlIHNpbmsKKyAgICAgICAgUkVBRF9XUklURSA9IDB4MTg7ICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZSBhbmQgd3JpdGUgdG8gcGlwZSBzaW5rCisKK307ICAvLyBzdHJ1Y3QgRmFzdENhcHR1cmVTdGF0ZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDZkODc4MzguLjI2NzhjYmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0zNiw2MjAgKzM2LDQzNiBAQAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKIAotI2RlZmluZSBGQVNUX0hPVF9JRExFX05TICAgICAxMDAwMDAwTCAgIC8vIDEgbXM6IHRpbWUgdG8gc2xlZXAgd2hpbGUgaG90IGlkbGluZwotI2RlZmluZSBGQVNUX0RFRkFVTFRfTlMgICAgOTk5OTk5OTk5TCAgIC8vIH4xIHNlYzogZGVmYXVsdCB0aW1lIHRvIHNsZWVwCi0jZGVmaW5lIE1JTl9XQVJNVVBfQ1lDTEVTICAgICAgICAgIDIgICAgLy8gbWluaW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCi0jZGVmaW5lIE1BWF9XQVJNVVBfQ1lDTEVTICAgICAgICAgMTAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgbG9vcCBjeWNsZXMgdG8gd2FpdCBmb3Igd2FybXVwCi0KICNkZWZpbmUgRkNDXzIgICAgICAgICAgICAgICAgICAgICAgIDIgICAvLyBmaXhlZCBjaGFubmVsIGNvdW50IGFzc3VtcHRpb24KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBGYXN0IG1peGVyIHRocmVhZAotYm9vbCBGYXN0TWl4ZXI6OnRocmVhZExvb3AoKQorLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OmluaXRpYWw7CisKK0Zhc3RNaXhlcjo6RmFzdE1peGVyKCkgOiBGYXN0VGhyZWFkKCksCisgICAgc2xvcE5zKDApLAorICAgIC8vIGZhc3RUcmFja05hbWVzCisgICAgLy8gZ2VuZXJhdGlvbnMKKyAgICBvdXRwdXRTaW5rKE5VTEwpLAorICAgIG91dHB1dFNpbmtHZW4oMCksCisgICAgbWl4ZXIoTlVMTCksCisgICAgbVNpbmtCdWZmZXIoTlVMTCksCisgICAgbVNpbmtCdWZmZXJTaXplKDApLAorICAgIG1TaW5rQ2hhbm5lbENvdW50KEZDQ18yKSwKKyAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCisgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKKyAgICBtTWl4ZXJCdWZmZXJGb3JtYXQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIG1NaXhlckJ1ZmZlclN0YXRlKFVOREVGSU5FRCksCisgICAgZm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKKyAgICBzYW1wbGVSYXRlKDApLAorICAgIGZhc3RUcmFja3NHZW4oMCksCisgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKDApLAorICAgIC8vIHRpbWVzdGFtcAorICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCkgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCiB7Ci0gICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7Ci0gICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKnByZXZpb3VzID0gJmluaXRpYWwsICpjdXJyZW50ID0gJmluaXRpYWw7Ci0gICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkVHMgPSB7MCwgMH07Ci0gICAgYm9vbCBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0gICAgbG9uZyBzbG9wTnMgPSAwOyAgICAvLyBhY2N1bXVsYXRlZCB0aW1lIHdlJ3ZlIHdva2VuIHVwIHRvbyBlYXJseSAoPiAwKSBvciB0b28gbGF0ZSAoPCAwKQotICAgIGxvbmcgc2xlZXBOcyA9IC0xOyAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCi0gICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKLSAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIC8vIEZJWE1FIHBhc3MgaW5pdGlhbCBhcyBwYXJhbWV0ZXIgdG8gYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciwgYW5kIG1ha2UgaXQgc3RhdGljIGxvY2FsCisgICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKKyAgICBjdXJyZW50ID0gJmluaXRpYWw7CisKKyAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7CisgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQuCisgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCisgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisKICAgICB1bnNpZ25lZCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewogICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IDA7CiAgICAgfQotICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbmsgPSBOVUxMOwotICAgIGludCBvdXRwdXRTaW5rR2VuID0gMDsKLSAgICBBdWRpb01peGVyKiBtaXhlciA9IE5VTEw7Ci0gICAgc2hvcnQgKm1peEJ1ZmZlciA9IE5VTEw7Ci0gICAgZW51bSB7VU5ERUZJTkVELCBNSVhFRCwgWkVST0VEfSBtaXhCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKLSAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgdW5zaWduZWQgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgaW50IGZhc3RUcmFja3NHZW4gPSAwOwotICAgIGxvbmcgcGVyaW9kTnMgPSAwOyAgICAgIC8vIGV4cGVjdGVkIHBlcmlvZDsgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVuZGVyIG9uZSBtaXggYnVmZmVyCi0gICAgbG9uZyB1bmRlcnJ1bk5zID0gMDsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKLSAgICBsb25nIG92ZXJydW5OcyA9IDA7ICAgICAvLyBvdmVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCi0gICAgbG9uZyBmb3JjZU5zID0gMDsgICAgICAgLy8gaWYgb3ZlcnJ1biBkZXRlY3RlZCwgZm9yY2UgdGhlIHdyaXRlIGN5Y2xlIHRvIHRha2UgdGhpcyBtdWNoIHRpbWUKLSAgICBsb25nIHdhcm11cE5zID0gMDsgICAgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdG8gdGhpcyB2YWx1ZQotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZSwgKmR1bXBTdGF0ZSA9ICZkdW1teUR1bXBTdGF0ZTsKLSAgICBib29sIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsgIC8vIHVzZWQgdG8gaWdub3JlIGluaXRpYWwgb3ZlcnJ1biBhbmQgZmlyc3QgYWZ0ZXIgYW4gdW5kZXJydW4KICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkTG9hZCA9IHswLCAwfTsgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKLSAgICBib29sIG9sZExvYWRWYWxpZCA9IGZhbHNlOyAgLy8gd2hldGhlciBvbGRMb2FkIGlzIHZhbGlkCi0gICAgdWludDMyX3QgYm91bmRzID0gMDsKLSAgICBib29sIGZ1bGwgPSBmYWxzZTsgICAgICAvLyB3aGV0aGVyIHdlIGhhdmUgY29sbGVjdGVkIGF0IGxlYXN0IG1TYW1wbGluZ04gc2FtcGxlcwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIFRocmVhZENwdVVzYWdlIHRjdTsgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisgICAgb2xkTG9hZC50dl9zZWMgPSAwOworICAgIG9sZExvYWQudHZfbnNlYyA9IDA7CiAjZW5kaWYKLSNlbmRpZgotICAgIHVuc2lnbmVkIGNvbGRHZW4gPSAwOyAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KLSAgICBib29sIGlzV2FybSA9IGZhbHNlOyAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwgZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbWVhc3VyZWRXYXJtdXBUcyA9IHswLCAwfTsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCB3YXJtdXBDeWNsZXMgPSAwOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0gICAgTkJBSU9fU2luayogdGVlU2luayA9IE5VTEw7IC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICBOQkxvZzo6V3JpdGVyIGR1bW15TG9nV3JpdGVyLCAqbG9nV3JpdGVyID0gJmR1bW15TG9nV3JpdGVyOwotICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiA9IDA7ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorfQogCi0gICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgotICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKLSAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0gMDsgICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgotICAgIHN0YXR1c190IHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworRmFzdE1peGVyOjp+RmFzdE1peGVyKCkKK3sKK30KIAotICAgIGZvciAoOzspIHsKK0Zhc3RNaXhlclN0YXRlUXVldWUqIEZhc3RNaXhlcjo6c3EoKQoreworICAgIHJldHVybiAmbVNROworfQogCi0gICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKLSAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgewotICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307Ci0gICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOworY29uc3QgRmFzdFRocmVhZFN0YXRlICpGYXN0TWl4ZXI6OnBvbGwoKQoreworICAgIHJldHVybiBtU1EucG9sbCgpOworfQorCit2b2lkIEZhc3RNaXhlcjo6c2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcikKK3sKKyAgICBpZiAobWl4ZXIgIT0gTlVMTCkgeworICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25JZGxlKCkKK3sKKyAgICBwcmVJZGxlID0gKihjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKWN1cnJlbnQ7CisgICAgY3VycmVudCA9ICZwcmVJZGxlOworfQorCit2b2lkIEZhc3RNaXhlcjo6b25FeGl0KCkKK3sKKyAgICBkZWxldGUgbWl4ZXI7CisgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgIGZyZWUobVNpbmtCdWZmZXIpOworfQorCitib29sIEZhc3RNaXhlcjo6aXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpCit7CisgICAgc3dpdGNoICgoRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQpIGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpNSVg6CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEU6CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCit7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgLy8gaGFuZGxlIHN0YXRlIGNoYW5nZSBoZXJlLCBidXQgc2luY2Ugd2Ugd2FudCB0byBkaWZmIHRoZSBzdGF0ZSwKKyAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJmluaXRpYWwgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAorICAgIHVuc2lnbmVkIHByZXZpb3VzVHJhY2tNYXNrOworCisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBvdXRwdXQgSEFMIGNvbmZpZ3VyYXRpb24KKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG91dHB1dFNpbmtHZW4pIHsKKyAgICAgICAgb3V0cHV0U2luayA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rOworICAgICAgICBvdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47CisgICAgICAgIGlmIChvdXRwdXRTaW5rID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IDA7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKKyAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOworCisgICAgICAgICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdAorICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgbWFzayBtdXN0IGJlIGEgdmFsaWQgcG9zaXRpb25hbCBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHByZXZpb3VzRm9ybWF0KSkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgeworICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCisgICAgICAgIGRlbGV0ZSBtaXhlcjsKKyAgICAgICAgbWl4ZXIgPSBOVUxMOworICAgICAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgICAgICBtU2lua0J1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCAmJiBzYW1wbGVSYXRlID4gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKKyAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCisgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgorICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbWl4ZXJGcmFtZVNpemUgKiBmcmFtZUNvdW50OworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpOworICAgICAgICAgICAgaWYgKHNpbmtGcmFtZVNpemUgPiBtaXhlckZyYW1lU2l6ZSkgeyAvLyBuZWVkIGEgc2luayBidWZmZXIKKyAgICAgICAgICAgICAgICBtU2lua0J1ZmZlclNpemUgPSBzaW5rRnJhbWVTaXplICogZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAorICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1CisgICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOworICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIGZvcmNlTnMgPSAwOworICAgICAgICAgICAgd2FybXVwTnMgPSAwOwogICAgICAgICB9Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQotICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOwotCi0gICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQotICAgICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqbmV4dCA9IG1TUS5wb2xsKCk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnJlbnQgPT0gJmluaXRpYWwgJiYgcHJldmlvdXMgPT0gJmluaXRpYWwpOwotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOworI2lmICFMT0dfTkRFQlVHCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgeworICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgYWxsIGFjdGl2ZSB0cmFja3MKKyAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSAwOworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOworICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOworICAgIH0KIAotICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gbmV4dC0+bUNvbW1hbmQ7Ci0gICAgICAgIGlmIChuZXh0ICE9IGN1cnJlbnQpIHsKKyAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKKyAgICBjb25zdCB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKKyAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOworICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBmYXN0VHJhY2tzR2VuKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1NaXhlckJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaW50IG5hbWU7CiAKLSAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAotICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6ICZkdW1teUR1bXBTdGF0ZTsKLSAgICAgICAgICAgIHRlZVNpbmsgPSBuZXh0LT5tVGVlU2luazsKLSAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOworICAgICAgICAvLyBwcm9jZXNzIHJlbW92ZWQgdHJhY2tzIGZpcnN0IHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHRyYWNrIG5hbWVzCisgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOworICAgICAgICB3aGlsZSAocmVtb3ZlZFRyYWNrcyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7CisgICAgICAgICAgICByZW1vdmVkVHJhY2tzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KLSAgICAgICAgICAgIC8vIFNvIHdoZW4gdGhlcmUgaXMgYSB0cmFuc2l0aW9uIGZyb20gYSBub24taWRsZSBzdGF0ZSBpbnRvIGFuIGlkbGUgc3RhdGUsIHdlIG1ha2UgYQotICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgbGFzdCBrbm93biBub24taWRsZSBzdGF0ZSBzbyBpdCBpcyBzdGlsbCBhdmFpbGFibGUgb24gcmV0dXJuIGZyb20gaWRsZS4KLSAgICAgICAgICAgIC8vIFRoZSBwb3NzaWJsZSB0cmFuc2l0aW9ucyBhcmU6Ci0gICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gbm9uLWlkbGUgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY3VycmVudCBpbi1wbGFjZQotICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IGlkbGUgICAgICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGNvcHkgb2YgY3VycmVudAotICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IGlkbGUgICAgICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwotICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IG5vbi1pZGxlICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwotICAgICAgICAgICAgaWYgKCEoY3VycmVudC0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZUlkbGUgPSAqY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9ICZwcmVJZGxlOwotICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7Ci0gICAgICAgIH0KLSNpZiAhTE9HX05ERUJVRwotICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KLSNlbmRpZgotCi0gICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOwotCi0gICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpJTklUSUFMOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRToKLSAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRToKLSAgICAgICAgICAgIC8vIG9ubHkgcGVyZm9ybSBhIGNvbGQgaWRsZSBjb21tYW5kIG9uY2UKLSAgICAgICAgICAgIC8vIEZJWE1FIGNvbnNpZGVyIGNoZWNraW5nIHByZXZpb3VzIHN0YXRlIGFuZCBvbmx5IHBlcmZvcm0gaWYgcHJldmlvdXMgIT0gQ09MRF9JRExFCi0gICAgICAgICAgICBpZiAoY3VycmVudC0+bUNvbGRHZW4gIT0gY29sZEdlbikgewotICAgICAgICAgICAgICAgIGludDMyX3QgKmNvbGRGdXRleEFkZHIgPSBjdXJyZW50LT5tQ29sZEZ1dGV4QWRkcjsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChjb2xkRnV0ZXhBZGRyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfZGVjKGNvbGRGdXRleEFkZHIpOwotICAgICAgICAgICAgICAgIGlmIChvbGQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCBjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOwotICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKLSAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCi0gICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Ci0gICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7Ci0gICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6RVhJVDoKLSAgICAgICAgICAgIGRlbGV0ZSBtaXhlcjsKLSAgICAgICAgICAgIGRlbGV0ZVtdIG1peEJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBjb21tYW5kICVkIiwgY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/Ci0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCi0gICAgICAgICAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJmluaXRpYWwgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAotICAgICAgICAgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgewotICAgICAgICAgICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKLSAgICAgICAgICAgICAgICBvdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgPT0gRkNDXzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChmb3JtYXQgIT0gcHJldmlvdXNGb3JtYXQpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICAgICAgICAgIG1peGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBtaXhCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBtaXhCdWZmZXIgPSBuZXcgc2hvcnRbZnJhbWVDb3VudCAqIEZDQ18yXTsKLSAgICAgICAgICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCi0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgLy8gMS43NQotICAgICAgICAgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1Ci0gICAgICAgICAgICAgICAgICAgIHdhcm11cE5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgLy8gMC41MAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICB3YXJtdXBOcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcwotICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBmYXN0VHJhY2tzR2VuKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobWl4QnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGludCBuYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgYWRkZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgfnByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGFkZGVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIGdldFRyYWNrTmFtZSB3aXRoIGRlZmF1bHQgY2hhbm5lbCBtYXNrIGFuZCBhIHJhbmRvbSBpbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHNlc3Npb25JZCAobm8gZWZmZWN0cyBoZXJlKQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCAtNTU1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIG1peEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdAotICAgICAgICAgICAgICAgIC8vIGJ1dCBtYXkgaGF2ZSBhIGRpZmZlcmVudCBidWZmZXIgcHJvdmlkZXIgb3Igdm9sdW1lIHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbW9kaWZpZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgcHJldmlvdXNUcmFja01hc2s7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uc1tpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMHgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFTU9WRSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KSBmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47Ci0KLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKLSAgICAgICAgICAgIH0KLQotI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCi0gICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKLSAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKLSAgICAgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgewotICAgICAgICAgICAgQUxPR19BU1NFUlQobWl4QnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2ssIHVwZGF0ZSB2b2x1bWUgYW5kIGNoZWNrIGZvciB1bmRlcnJ1bgotICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7Ci0gICAgICAgICAgICB3aGlsZSAoY3VycmVudFRyYWNrTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHooY3VycmVudFRyYWNrTWFzayk7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRyYWNrTWFzayAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBwZXItdHJhY2sgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlbGVhc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgLy8gb3IgZHVyaW5nIHRoZSBicmllZiAzMi1iaXQgd3JhcGFyb3VuZCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrRnJhbWVzV3JpdHRlbiA+PSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuIC0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlci0+b25UaW1lc3RhbXAocGVyVHJhY2tUaW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KSh2bHIgJiAweEZGRkYpKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KSh2bHIgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKLSAgICAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawotICAgICAgICAgICAgICAgIC8vIHVwIHRvIDEgbXMuICBJZiBlbm91Z2ggYWN0aXZlIHRyYWNrcyBhbGwgYmxvY2tlZCBpbiBzZXF1ZW5jZSwgdGhpcyB3b3VsZCByZXN1bHQKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgotICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWFkeSgpOwotICAgICAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgImZSZHkiKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZkdW1wU3RhdGUtPm1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5zIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCisgICAgICAgIHVuc2lnbmVkIGFkZGVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIH5wcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CisgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMICYmIGZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKKyAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQorICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdAorICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgorICAgICAgICB1bnNpZ25lZCBtb2RpZmllZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiBwcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CisgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47CisKKyAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KKyAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgICAgIHdoaWxlIChjdXJyZW50VHJhY2tNYXNrICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihjdXJyZW50VHJhY2tNYXNrKTsKKyAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisKKyAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKKyAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdworICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tUG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKKyAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCisgICAgICAgICAgICAvLyB1cCB0byAxIG1zLiAgSWYgZW5vdWdoIGFjdGl2ZSB0cmFja3MgYWxsIGJsb2NrZWQgaW4gc2VxdWVuY2UsIHRoaXMgd291bGQgcmVzdWx0CisgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgorICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlYWR5KCk7CisgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgeworICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCisgICAgICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOworICAgICAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJmUmR5Iik7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJmR1bXBTdGF0ZS0+bVRyYWNrc1tpXTsKKyAgICAgICAgICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5Kys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kaXNhYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgbWl4aW5nIHBhcnRpYWwgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnREdW1wLT5tVW5kZXJydW5zID0gdW5kZXJydW5zOwotICAgICAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgcHRzOwotICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkKLSAgICAgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcygpIGlzIENQVS1ib3VuZAotICAgICAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gTUlYRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobWl4QnVmZmVyU3RhdGUgPT0gTUlYRUQpIHsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKLSAgICAgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcwotICAgICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEUpICYmIChvdXRwdXRTaW5rICE9IE5VTEwpICYmIChtaXhCdWZmZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgIGlmIChtaXhCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICBtZW1zZXQobWl4QnVmZmVyLCAwLCBmcmFtZUNvdW50ICogRkNDXzIgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ZWVTaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAodm9pZCkgdGVlU2luay0+d3JpdGUobWl4QnVmZmVyLCBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKLSAgICAgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKLSAgICAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKLSAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG91dHB1dFNpbmstPndyaXRlKG1peEJ1ZmZlciwgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICBBVFJBQ0VfRU5EKCk7Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA8PSBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgIC8vaWYgKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPT0gZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CisgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwrKzsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CisgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAotCi0gICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IHRpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKKyAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUbyBiZSBleGFjdGx5IHBlcmlvZGljLCBjb21wdXRlIHRoZSBuZXh0IHNsZWVwIHRpbWUgYmFzZWQgb24gY3VycmVudCB0aW1lLgotICAgICAgICAvLyBUaGlzIGNvZGUgZG9lc24ndCBoYXZlIGxvbmctdGVybSBzdGFiaWxpdHkgd2hlbiB0aGUgc2luayBpcyBub24tYmxvY2tpbmcuCi0gICAgICAgIC8vIEZJWE1FIFRvIGF2b2lkIGRyaWZ0LCB1c2UgdGhlIGxvY2FsIGF1ZGlvIGNsb2NrIG9yIHdhdGNoIHRoZSBzaW5rJ3MgZmlsbCBzdGF0dXMuCi0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdUczsKLSAgICAgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZuZXdUcyk7Ci0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAvL2xvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKLSAgICAgICAgICAgIGlmIChvbGRUc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgdGltZV90IHNlYyA9IG5ld1RzLnR2X3NlYyAtIG9sZFRzLnR2X3NlYzsKLSAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gb2xkVHMudHZfbnNlYzsKLSAgICAgICAgICAgICAgICBBTE9HRV9JRihzZWMgPCAwIHx8IChzZWMgPT0gMCAmJiBuc2VjIDwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGZhaWxlZDogd2FzICVsZC4lMDlsZCBidXQgbm93ICVsZC4lMDlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbGRUcy50dl9zZWMsIG9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tc2VjOwotICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCi0gICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6Ci0gICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCi0gICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3dhcm11cEN5Y2xlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuc2VjID4gd2FybXVwTnMgJiYgd2FybXVwQ3ljbGVzID49IE1JTl9XQVJNVVBfQ1lDTEVTKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1lYXN1cmVkV2FybXVwVHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSB3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IHVuZGVycnVuTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgb3ZlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlTmV4dE92ZXJydW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHdvcmtzIHdpdGggYSB2YXJpYWJsZSBidWZmZXIgZGVwdGggYXVkaW8gSEFMIHRoYXQgbmV2ZXIgcHVsbHMgYXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gb3ZlcnJ1bk5zIHBlciBidWZmZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSByZWNvdmVycyBmcm9tIG92ZXJydW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdW5kZXJydW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGEgbm9uLWJsb2NraW5nIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBmb3JjZU5zIC0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSBGSUZPIHF1ZXVlIGJvdW5kcwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzID0gKGJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChib3VuZHMgKyAxKSAmIDB4RkZGRik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMgKz0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbm90b25pY05zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSByYXcgQ1BVIGxvYWQgPSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2FkTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3TG9hZDsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmbmV3TG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTG9hZFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBvbGRMb2FkLnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gb2xkTG9hZC50dl9uc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZCA9IG5ld0xvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegotICAgICAgICAgICAgICAgICAgICBpbnQgY3B1TnVtID0gc2NoZWRfZ2V0Y3B1KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IHRjdS5nZXRDcHVrSHooY3B1TnVtKTsKLSAgICAgICAgICAgICAgICAgICAga0h6ID0gKGtIeiA8PCA0KSB8IChjcHVOdW0gJiAweEYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGluIEZJRk8gcXVldWVzIGZvciBkdW1wc3lzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzdG9yZSAjNCBpcyBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBzdG9yZXMgIzEsICMyLCAjMyBhYm92ZSwgYnV0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXdlc3Qgb3BlbiAmIG9sZGVzdCBjbG9zZWQgaGFsdmVzIGFyZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQm91bmRzID0gYm91bmRzOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOwotICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMIHx8IChPSyAhPSBvdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKSB7CisgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKKyAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKKyAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBNSVhFRDsKKyAgICB9IGVsc2UgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IE1JWEVEKSB7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOworICAgIH0KKyAgICAvL2Jvb2wgZGlkRnVsbFdyaXRlID0gZmFsc2U7ICAgIC8vIGR1bXBzeXMgY291bGQgZGlzcGxheSBhIGNvdW50IG9mIHBhcnRpYWwgd3JpdGVzCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobU1peGVyQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBaRVJPRUQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOworICAgICAgICBpZiAoZm9ybWF0Lm1Gb3JtYXQgIT0gbU1peGVyQnVmZmVyRm9ybWF0KSB7IC8vIHNpbmsgZm9ybWF0IG5vdCB0aGUgc2FtZSBhcyBtaXhlciBmb3JtYXQKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKKyAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKKyAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKKyAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7CisgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CisgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotCi0gICAgfSAgIC8vIGZvciAoOzspCi0KLSAgICAvLyBuZXZlciByZXR1cm4gJ3RydWUnOyBUaHJlYWQ6Ol90aHJlYWRMb29wKCkgbG9ja3MgbXV0ZXggd2hpY2ggY2FuIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gdGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KICNlbmRpZgotICAgICAgICApIDoKLSAgICBtQ29tbWFuZChGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCksIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovIG1XYXJtdXBDeWNsZXMoMCksCisgICAgICAgICkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAorICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwKKyAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksCiAgICAgbVRyYWNrTWFzaygwKQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICwgbVNhbXBsaW5nTigwKSwgbUJvdW5kcygwKQotI2VuZGlmCiB7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKICAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwogI2VuZGlmCkBAIC02OTQsNyArNTEwLDcgQEAKIHZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKIHsKICAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZHByaW50ZihmZCwgIkZhc3RNaXhlciBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNkZWZpbmUgQ09NTUFORF9NQVggMzIKQEAgLTcyOCwxMCArNTQ0LDEwIEBACiAgICAgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMTAwMC4wKSArCiAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAvIDEwMDAwMDAuMCk7CiAgICAgZG91YmxlIG1peFBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gKGRvdWJsZSkgbVNhbXBsZVJhdGU7Ci0gICAgZHByaW50ZihmZCwgIkZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG51bVRyYWNrcz0ldSB3cml0ZUVycm9ycz0ldSB1bmRlcnJ1bnM9JXUgb3ZlcnJ1bnM9JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAogICAgICAgICAgICAgICAgICBzdHJpbmcsIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgbU51bVRyYWNrcywgbVdyaXRlRXJyb3JzLCBtVW5kZXJydW5zLCBtT3ZlcnJ1bnMsCiAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbWVhc3VyZWRXYXJtdXBNcywgbVdhcm11cEN5Y2xlcywKQEAgLTc4MiwxNCArNTk4LDIwIEBACiAgICAgICAgIHByZXZpb3VzQ3B1a0h6ID0gc2FtcGxlQ3B1a0h6OwogI2VuZGlmCiAgICAgfQotICAgIGRwcmludGYoZmQsICJTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKLSAgICBkcHJpbnRmKGZkLCAiICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LCB3YWxsLnN0ZGRldigpKjFlLTYpOwotICAgIGRwcmludGYoZmQsICIgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgIGxvYWROcy5tZWFuKCkqMWUtMywgbG9hZE5zLm1pbmltdW0oKSoxZS0zLCBsb2FkTnMubWF4aW11bSgpKjFlLTMsCi0gICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIGlmIChuKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAorICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7CisgICAgfQogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgIGRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgogICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLApAQCAtODA3LDkgKzYyOSw5IEBACiAgICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKICAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KLSAgICAgICAgZHByaW50ZihmZCwgIkRpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgotICAgICAgICAgICAgICAgICAgICAiICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAiICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgIGRwcmludGYoZmQsICIgIERpc3RyaWJ1dGlvbiBvZiBtaXggY3ljbGUgdGltZXMgaW4gbXMgZm9yIHRoZSB0YWlscyAoPiB+MyBzdGRkZXYgb3V0bGllcnMpOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIGxlZnQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICBsZWZ0Lm1lYW4oKSoxZS02LCBsZWZ0Lm1pbmltdW0oKSoxZS02LCBsZWZ0Lm1heGltdW0oKSoxZS02LCBsZWZ0LnN0ZGRldigpKjFlLTYsCiAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Lm1lYW4oKSoxZS02LCByaWdodC5taW5pbXVtKCkqMWUtNiwgcmlnaHQubWF4aW11bSgpKjFlLTYsCiAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOwpAQCAtODIyLDkgKzY0NCw5IEBACiAgICAgLy8gSW5zdGVhZCB3ZSBhbHdheXMgZGlzcGxheSBhbGwgdHJhY2tzLCB3aXRoIGFuIGluZGljYXRpb24KICAgICAvLyBvZiB3aGV0aGVyIHdlIHRoaW5rIHRoZSB0cmFjayBpcyBhY3RpdmUuCiAgICAgdWludDMyX3QgdHJhY2tNYXNrID0gbVRyYWNrTWFzazsKLSAgICBkcHJpbnRmKGZkLCAiRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAorICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2tzOiBrTWF4RmFzdFRyYWNrcz0ldSBhY3RpdmVNYXNrPSUjeFxuIiwKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcywgdHJhY2tNYXNrKTsKLSAgICBkcHJpbnRmKGZkLCAiSW5kZXggQWN0aXZlIEZ1bGwgUGFydGlhbCBFbXB0eSAgUmVjZW50IFJlYWR5XG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOwogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSwgdHJhY2tNYXNrID4+PSAxKSB7CiAgICAgICAgIGJvb2wgaXNBY3RpdmUgPSB0cmFja01hc2sgJiAxOwogICAgICAgICBjb25zdCBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmbVRyYWNrc1tpXTsKQEAgLTg0NCw3ICs2NjYsNyBAQAogICAgICAgICAgICAgbW9zdFJlY2VudCA9ICI/IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGRwcmludGYoZmQsICIlNXUgJTZzICU0dSAlN3UgJTV1ICU3cyAlNXp1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IGMzNTZkMzEuLmZkZThjMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTIwLDEyMCArMjAsNzEgQEAKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCiAjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgQXVkaW9NaXhlcjsKKwogdHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOwogCi1jbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgVGhyZWFkIHsKK2NsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSB7IH0KLSAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKSB7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCi0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpIHsgcmV0dXJuICZtU1E7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgIHRocmVhZExvb3AoKTsKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgbVNROwogCisgICAgLy8gY2FsbG91dHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCk7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CisKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSAibSIgcHJlZml4CisgICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7CisgICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nIHNsb3BOczsgICAgICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUgd2UndmUgd29rZW4gdXAgdG9vIGVhcmx5ICg+IDApIG9yIHRvbyBsYXRlICg8IDApCisgICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbms7CisgICAgaW50IG91dHB1dFNpbmtHZW47CisgICAgQXVkaW9NaXhlciogbWl4ZXI7CisKKyAgICAvLyBtU2lua0J1ZmZlciBhdWRpbyBmb3JtYXQgaXMgc3RvcmVkIGluIGZvcm1hdC5tRm9ybWF0LgorICAgIHZvaWQqIG1TaW5rQnVmZmVyOyAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzaW5rIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiBtaXhlciBvdXRwdXQuCisgICAgc2l6ZV90IG1TaW5rQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtU2lua0NoYW5uZWxDb3VudDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOworICAgIHZvaWQqIG1NaXhlckJ1ZmZlcjsgICAgICAgICAgICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCisgICAgc2l6ZV90IG1NaXhlckJ1ZmZlclNpemU7CisgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyQnVmZmVyRm9ybWF0OyAgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKworICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbU1peGVyQnVmZmVyU3RhdGU7CisgICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlOworICAgIGludCBmYXN0VHJhY2tzR2VuOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorCisgICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgorICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKKyAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKLS8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAotZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7Ci0gICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCi0gICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KLSAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KLX07Ci0KLS8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCi0vLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KLXVuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKLSAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQotICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQotICAgIHN0cnVjdCB7Ci0jZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKLSNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQotICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybwotICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCi0gICAgfSAgICAgICAgbUJpdEZpZWxkczsKLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUF0b21pYzsKLX07Ci0KLS8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCi1zdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7Ci0gICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQotICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7Ci0gICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKLX07Ci0KLS8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KLS8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQotLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KLS8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgotLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgotLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KLXN0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgewotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSgKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTiA9IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UKLSNlbmRpZgotICAgICAgICAgICAgKTsKLSAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyRHVtcFN0YXRlKCk7Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKLQotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAotICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQotICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Ci0gICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKLSAgICB1aW50MzJfdCBtV3JpdGVFcnJvcnM7ICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHdyaXRlKCkgZXJyb3JzCi0gICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKLSAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCi0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKLSAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKLSAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOwotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgotICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgotICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAotICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKLSAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOwotICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdOOwotICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6Ci0gICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgotICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KLSAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegotICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KLSAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKLSAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCi0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCi0jZW5kaWYKLSAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCi0gICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOwotI2VuZGlmCi19OwotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWU0NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAorZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7CisgICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCisgICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KKyAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KK307CisKKy8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCisvLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KK3VuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7CisgICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKKyAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQorICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQorICAgIHN0cnVjdCB7CisjZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKKyNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQorICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybworICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCisgICAgfSAgICAgICAgbUJpdEZpZWxkczsKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUF0b21pYzsKK307CisKKy8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCitzdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7CisgICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQorICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7CisgICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKK307CisKKy8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KKy8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQorLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KKy8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgorLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgorLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KK3N0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCisjZW5kaWYKKyAgICAgICAgICAgICk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCisKKyAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKKyAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQorICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCisgICAgdWludDMyX3QgbVdyaXRlRXJyb3JzOyAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB3cml0ZSgpIGVycm9ycworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OworICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKKyAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOworCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKKyAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCisgICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOworI2VuZGlmCit9OworCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCmluZGV4IDQzZmYyMzMuLjNhYThkYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcApAQCAtMTQsMTQgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRmFzdFRyYWNrOjpGYXN0VHJhY2soKSA6CiAgICAgbUJ1ZmZlclByb3ZpZGVyKE5VTEwpLCBtVm9sdW1lUHJvdmlkZXIoTlVMTCksCi0gICAgbUNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksIG1HZW5lcmF0aW9uKDApCisgICAgbUNoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksIG1Gb3JtYXQoQVVESU9fRk9STUFUX0lOVkFMSUQpLCBtR2VuZXJhdGlvbigwKQogewogfQogCkBAIC0yOSwxMCArMjgsMTAgQEAKIHsKIH0KIAotRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOgorRmFzdE1peGVyU3RhdGU6OkZhc3RNaXhlclN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKKyAgICAvLyBtRmFzdFRyYWNrcwogICAgIG1GYXN0VHJhY2tzR2VuKDApLCBtVHJhY2tNYXNrKDApLCBtT3V0cHV0U2luayhOVUxMKSwgbU91dHB1dFNpbmtHZW4oMCksCi0gICAgbUZyYW1lQ291bnQoMCksIG1Db21tYW5kKElOSVRJQUwpLCBtQ29sZEZ1dGV4QWRkcihOVUxMKSwgbUNvbGRHZW4oMCksCi0gICAgbUR1bXBTdGF0ZShOVUxMKSwgbVRlZVNpbmsoTlVMTCksIG1OQkxvZ1dyaXRlcihOVUxMKQorICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQogewogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDk3MzlmZTkuLjY2MWM5Y2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0xNywxMCArMTcsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX1NUQVRFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX1NUQVRFX0gKIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCw5ICszMCw4IEBACiAKIGNsYXNzIFZvbHVtZVByb3ZpZGVyIHsKIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHRyYWNrIHZvbHVtZSBpbiBVNF8xMiBmb3JtYXQ6IGxlZnQgaW4gbG93ZXIgaGFsZiwgcmlnaHQgaW4gdXBwZXIgaGFsZi4gVGhlCi0gICAgLy8gcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHZhbGlkYXRpbmcgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIHJhbmdlLgotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Vm9sdW1lTFIoKSA9IDA7CisgICAgLy8gVGhlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiByYW5nZS4KKyAgICB2aXJ0dWFsIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IGdldFZvbHVtZUxSKCkgPSAwOwogcHJvdGVjdGVkOgogICAgIFZvbHVtZVByb3ZpZGVyKCkgeyB9CiAgICAgdmlydHVhbCB+Vm9sdW1lUHJvdmlkZXIoKSB7IH0KQEAgLTQ0LDExICs0NSwxMiBAQAogICAgIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciogbUJ1ZmZlclByb3ZpZGVyOyAvLyBtdXN0IGJlIE5VTEwgaWYgaW5hY3RpdmUsIG9yIG5vbi1OVUxMIGlmIGFjdGl2ZQogICAgIFZvbHVtZVByb3ZpZGVyKiAgICAgICAgIG1Wb2x1bWVQcm92aWRlcjsgLy8gb3B0aW9uYWw7IGlmIE5VTEwgdGhlbiBmdWxsLXNjYWxlCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOyAgICAvLyBBVURJT19DSEFOTkVMX09VVF9NT05PIG9yIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKIH07CiAKIC8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgbWl4ZXIKLXN0cnVjdCBGYXN0TWl4ZXJTdGF0ZSB7CitzdHJ1Y3QgRmFzdE1peGVyU3RhdGUgOiBGYXN0VGhyZWFkU3RhdGUgewogICAgICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlKCk7CiAgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlclN0YXRlKCk7CiAKQEAgLTYxLDIzICs2MywxNiBAQAogICAgIE5CQUlPX1NpbmsqIG1PdXRwdXRTaW5rOyAgICAvLyBIQUwgb3V0cHV0IGRldmljZSwgbXVzdCBhbHJlYWR5IGJlIG5lZ290aWF0ZWQKICAgICBpbnQgICAgICAgICBtT3V0cHV0U2lua0dlbjsgLy8gaW5jcmVtZW50IHdoZW4gbU91dHB1dFNpbmsgaXMgYXNzaWduZWQKICAgICBzaXplX3QgICAgICBtRnJhbWVDb3VudDsgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBtaXggYnVmZmVyCi0gICAgZW51bSBDb21tYW5kIHsKLSAgICAgICAgSU5JVElBTCA9IDAsICAgICAgICAgICAgLy8gdXNlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQotICAgICAgICBIT1RfSURMRSA9IDEsICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgIENPTERfSURMRSA9IDIsICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBmdXRleAotICAgICAgICBJRExFID0gMywgICAgICAgICAgICAgICAvLyBlaXRoZXIgSE9UX0lETEUgb3IgQ09MRF9JRExFCi0gICAgICAgIEVYSVQgPSA0LCAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aHJlYWQKKworICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKICAgICAgICAgTUlYID0gMHg4LCAgICAgICAgICAgICAgLy8gbWl4IHRyYWNrcwogICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBvdXRwdXQgc2luawotICAgICAgICBNSVhfV1JJVEUgPSAweDE4LCAgICAgICAvLyBtaXggdHJhY2tzIGFuZCB3cml0ZSB0byBvdXRwdXQgc2luawotICAgIH0gbUNvbW1hbmQ7Ci0gICAgaW50MzJfdCogICAgbUNvbGRGdXRleEFkZHI7IC8vIGZvciBDT0xEX0lETEUgb25seSwgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBmdXRleAotICAgIHVuc2lnbmVkICAgIG1Db2xkR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBDT0xEX0lETEUgaXMgcmVxdWVzdGVkIHNvIGl0J3Mgb25seSBwZXJmb3JtZWQgb25jZQorICAgICAgICBNSVhfV1JJVEUgPSAweDE4OyAgICAgICAvLyBtaXggdHJhY2tzIGFuZCB3cml0ZSB0byBvdXRwdXQgc2luaworCiAgICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCi0gICAgRmFzdE1peGVyRHVtcFN0YXRlKiBtRHVtcFN0YXRlOyAvLyBpZiBub24tTlVMTCwgdGhlbiB1cGRhdGUgZHVtcCBzdGF0ZSBwZXJpb2RpY2FsbHkKICAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICBOQkxvZzo6V3JpdGVyKiBtTkJMb2dXcml0ZXI7IC8vIG5vbi1ibG9ja2luZyBsb2dnZXIKIH07ICAvLyBzdHJ1Y3QgRmFzdE1peGVyU3RhdGUKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2ZGFjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRmFzdFRocmVhZCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCisKKyNkZWZpbmUgRkFTVF9ERUZBVUxUX05TICAgIDk5OTk5OTk5OUwgICAvLyB+MSBzZWM6IGRlZmF1bHQgdGltZSB0byBzbGVlcAorI2RlZmluZSBGQVNUX0hPVF9JRExFX05TICAgICAxMDAwMDAwTCAgIC8vIDEgbXM6IHRpbWUgdG8gc2xlZXAgd2hpbGUgaG90IGlkbGluZworI2RlZmluZSBNSU5fV0FSTVVQX0NZQ0xFUyAgICAgICAgICAyICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAorI2RlZmluZSBNQVhfV0FSTVVQX0NZQ0xFUyAgICAgICAgIDEwICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RUaHJlYWQ6OkZhc3RUaHJlYWQoKSA6IFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAorICAgIC8vIHJlLWluaXRpYWxpemVkIHRvICZpbml0aWFsIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgIHByZXZpb3VzKE5VTEwpLCBjdXJyZW50KE5VTEwpLAorICAgIC8qIG9sZFRzKHswLCAwfSksICovCisgICAgb2xkVHNWYWxpZChmYWxzZSksCisgICAgc2xlZXBOcygtMSksCisgICAgcGVyaW9kTnMoMCksCisgICAgdW5kZXJydW5OcygwKSwKKyAgICBvdmVycnVuTnMoMCksCisgICAgZm9yY2VOcygwKSwKKyAgICB3YXJtdXBOcygwKSwKKyAgICAvLyByZS1pbml0aWFsaXplZCB0byAmZHVtbXlEdW1wU3RhdGUgYnkgc3ViY2xhc3MgY29uc3RydWN0b3IKKyAgICBtRHVtbXlEdW1wU3RhdGUoTlVMTCksCisgICAgZHVtcFN0YXRlKE5VTEwpLAorICAgIGlnbm9yZU5leHRPdmVycnVuKHRydWUpLAorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIG9sZExvYWQKKyAgICBvbGRMb2FkVmFsaWQoZmFsc2UpLAorICAgIGJvdW5kcygwKSwKKyAgICBmdWxsKGZhbHNlKSwKKyAgICAvLyB0Y3UKKyNlbmRpZgorICAgIGNvbGRHZW4oMCksCisgICAgaXNXYXJtKGZhbHNlKSwKKyAgICAvKiBtZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCisgICAgd2FybXVwQ3ljbGVzKDApLAorICAgIC8vIGR1bW15TG9nV3JpdGVyCisgICAgbG9nV3JpdGVyKCZkdW1teUxvZ1dyaXRlciksCisgICAgdGltZXN0YW1wU3RhdHVzKElOVkFMSURfT1BFUkFUSU9OKSwKKworICAgIGNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwKKyNpZiAwCisgICAgZnJhbWVDb3VudCgwKSwKKyNlbmRpZgorICAgIGF0dGVtcHRlZFdyaXRlKGZhbHNlKQoreworICAgIG9sZFRzLnR2X3NlYyA9IDA7CisgICAgb2xkVHMudHZfbnNlYyA9IDA7CisgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Cit9CisKK0Zhc3RUaHJlYWQ6On5GYXN0VGhyZWFkKCkKK3sKK30KKworYm9vbCBGYXN0VGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBmb3IgKDs7KSB7CisKKyAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdAorICAgICAgICBpZiAoc2xlZXBOcyA+PSAwKSB7CisgICAgICAgICAgICBpZiAoc2xlZXBOcyA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChzbGVlcE5zIDwgMTAwMDAwMDAwMCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjIHJlcSA9IHswLCBzbGVlcE5zfTsKKyAgICAgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcSwgTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZGVmYXVsdCB0byBsb25nIHNsZWVwIGZvciBuZXh0IGN5Y2xlCisgICAgICAgIHNsZWVwTnMgPSBGQVNUX0RFRkFVTFRfTlM7CisKKyAgICAgICAgLy8gcG9sbCBmb3Igc3RhdGUgY2hhbmdlCisgICAgICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqbmV4dCA9IHBvbGwoKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY29udGludWUgdG8gdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgc3RhdGUgdW50aWwgYSByZWFsIHN0YXRlIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gRklYTUUgJmluaXRpYWwgbm90IGF2YWlsYWJsZSwgc2hvdWxkIHNhdmUgYWRkcmVzcyBlYXJsaWVyCisgICAgICAgICAgICAvL0FMT0dfQVNTRVJUKGN1cnJlbnQgPT0gJmluaXRpYWwgJiYgcHJldmlvdXMgPT0gJmluaXRpYWwpOworICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBjb21tYW5kID0gbmV4dC0+bUNvbW1hbmQ7CisgICAgICAgIGlmIChuZXh0ICE9IGN1cnJlbnQpIHsKKworICAgICAgICAgICAgLy8gQXMgc29vbiBhcyBwb3NzaWJsZSBvZiBsZWFybmluZyBvZiBhIG5ldyBkdW1wIGFyZWEsIHN0YXJ0IHVzaW5nIGl0CisgICAgICAgICAgICBkdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogbUR1bW15RHVtcFN0YXRlOworICAgICAgICAgICAgbG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmZHVtbXlMb2dXcml0ZXI7CisgICAgICAgICAgICBzZXRMb2cobG9nV3JpdGVyKTsKKworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KKyAgICAgICAgICAgIC8vIFNvIHdoZW4gdGhlcmUgaXMgYSB0cmFuc2l0aW9uIGZyb20gYSBub24taWRsZSBzdGF0ZSBpbnRvIGFuIGlkbGUgc3RhdGUsIHdlIG1ha2UgYQorICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgbGFzdCBrbm93biBub24taWRsZSBzdGF0ZSBzbyBpdCBpcyBzdGlsbCBhdmFpbGFibGUgb24gcmV0dXJuIGZyb20gaWRsZS4KKyAgICAgICAgICAgIC8vIFRoZSBwb3NzaWJsZSB0cmFuc2l0aW9ucyBhcmU6CisgICAgICAgICAgICAvLyAgbm9uLWlkbGUgLT4gbm9uLWlkbGUgICAgdXBkYXRlIHByZXZpb3VzIGZyb20gY3VycmVudCBpbi1wbGFjZQorICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IGlkbGUgICAgICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGNvcHkgb2YgY3VycmVudAorICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IGlkbGUgICAgICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cworICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IG5vbi1pZGxlICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cworICAgICAgICAgICAgaWYgKCEoY3VycmVudC0+bUNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpIHsKKyAgICAgICAgICAgICAgICAgICAgb25JZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gZmFsc2U7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgfQorI2lmICFMT0dfTkRFQlVHCisgICAgICAgIG5leHQgPSBOVUxMOyAgICAvLyBub3QgcmVmZXJlbmNlZCBhZ2FpbgorI2VuZGlmCisKKyAgICAgICAgZHVtcFN0YXRlLT5tQ29tbWFuZCA9IGNvbW1hbmQ7CisKKyAgICAgICAgLy8gPDwgY3VycmVudCwgcHJldmlvdXMsIGNvbW1hbmQsIGR1bXBTdGF0ZSA+PgorCisgICAgICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTDoKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkhPVF9JRExFOgorICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkNPTERfSURMRToKKyAgICAgICAgICAgIC8vIG9ubHkgcGVyZm9ybSBhIGNvbGQgaWRsZSBjb21tYW5kIG9uY2UKKyAgICAgICAgICAgIC8vIEZJWE1FIGNvbnNpZGVyIGNoZWNraW5nIHByZXZpb3VzIHN0YXRlIGFuZCBvbmx5IHBlcmZvcm0gaWYgcHJldmlvdXMgIT0gQ09MRF9JRExFCisgICAgICAgICAgICBpZiAoY3VycmVudC0+bUNvbGRHZW4gIT0gY29sZEdlbikgeworICAgICAgICAgICAgICAgIGludDMyX3QgKmNvbGRGdXRleEFkZHIgPSBjdXJyZW50LT5tQ29sZEZ1dGV4QWRkcjsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChjb2xkRnV0ZXhBZGRyICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfZGVjKGNvbGRGdXRleEFkZHIpOworICAgICAgICAgICAgICAgIGlmIChvbGQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBzeXNjYWxsKF9fTlJfZnV0ZXgsIGNvbGRGdXRleEFkZHIsIEZVVEVYX1dBSVRfUFJJVkFURSwgb2xkIC0gMSwgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBwb2xpY3kgPSBzY2hlZF9nZXRzY2hlZHVsZXIoMCk7CisgICAgICAgICAgICAgICAgaWYgKCEocG9saWN5ID09IFNDSEVEX0ZJRk8gfHwgcG9saWN5ID09IFNDSEVEX1JSKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIG92ZXJseSBjb25zZXJ2YXRpdmU7IHRoZXJlIGNvdWxkIGJlIHRpbWVzIHRoYXQgdGhlIG5vcm1hbCBtaXhlcgorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RzIHN1Y2ggYSBicmllZiBjb2xkIGlkbGUgdGhhdCBpdCBkb2Vzbid0IHJlcXVpcmUgcmVzZXR0aW5nIHRoaXMgZmxhZy4KKyAgICAgICAgICAgICAgICBpc1dhcm0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKKyAgICAgICAgICAgICAgICB3YXJtdXBDeWNsZXMgPSAwOworICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBjb2xkR2VuID0gY3VycmVudC0+bUNvbGRHZW47CisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgYm91bmRzID0gMDsKKyAgICAgICAgICAgICAgICBmdWxsID0gZmFsc2U7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gIWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmb2xkVHMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6RVhJVDoKKyAgICAgICAgICAgIG9uRXhpdCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighaXNTdWJDbGFzc0NvbW1hbmQoY29tbWFuZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/CisgICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7CisgICAgICAgICAgICBvblN0YXRlQ2hhbmdlKCk7CisjaWYgMSAgIC8vIEZJWE1FIHNob3VsZG4ndCBuZWVkIHRoaXMKKyAgICAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyBzdGF0ZSBjaGFuZ2Ugb25jZQorICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICAvLyBkbyB3b3JrIHVzaW5nIGN1cnJlbnQgc3RhdGUgaGVyZQorICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IGZhbHNlOworICAgICAgICBvbldvcmsoKTsKKworICAgICAgICAvLyBUbyBiZSBleGFjdGx5IHBlcmlvZGljLCBjb21wdXRlIHRoZSBuZXh0IHNsZWVwIHRpbWUgYmFzZWQgb24gY3VycmVudCB0aW1lLgorICAgICAgICAvLyBUaGlzIGNvZGUgZG9lc24ndCBoYXZlIGxvbmctdGVybSBzdGFiaWxpdHkgd2hlbiB0aGUgc2luayBpcyBub24tYmxvY2tpbmcuCisgICAgICAgIC8vIEZJWE1FIFRvIGF2b2lkIGRyaWZ0LCB1c2UgdGhlIGxvY2FsIGF1ZGlvIGNsb2NrIG9yIHdhdGNoIHRoZSBzaW5rJ3MgZmlsbCBzdGF0dXMuCisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdUczsKKyAgICAgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZuZXdUcyk7CisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAvL2xvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKKyAgICAgICAgICAgIGlmIChvbGRUc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgdGltZV90IHNlYyA9IG5ld1RzLnR2X3NlYyAtIG9sZFRzLnR2X3NlYzsKKyAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gb2xkVHMudHZfbnNlYzsKKyAgICAgICAgICAgICAgICBBTE9HRV9JRihzZWMgPCAwIHx8IChzZWMgPT0gMCAmJiBuc2VjIDwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGZhaWxlZDogd2FzICVsZC4lMDlsZCBidXQgbm93ICVsZC4lMDlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvbGRUcy50dl9zZWMsIG9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7CisgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIC0tc2VjOworICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAorICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCisgICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6CisgICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCisgICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KKyAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7CisgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOworICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3dhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChuc2VjID4gd2FybXVwTnMgJiYgd2FybXVwQ3ljbGVzID49IE1JTl9XQVJNVVBfQ1lDTEVTKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1lYXN1cmVkV2FybXVwVHM7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSB3YXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOworICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IHVuZGVycnVuTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgb3ZlcnJ1bk5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlTmV4dE92ZXJydW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHdvcmtzIHdpdGggYSB2YXJpYWJsZSBidWZmZXIgZGVwdGggYXVkaW8gSEFMIHRoYXQgbmV2ZXIgcHVsbHMgYXQgYQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gb3ZlcnJ1bk5zIHBlciBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSByZWNvdmVycyBmcm9tIG92ZXJydW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdW5kZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGEgbm9uLWJsb2NraW5nIGF1ZGlvIEhBTC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBmb3JjZU5zIC0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSBGSUZPIHF1ZXVlIGJvdW5kcworICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYm91bmRzID0gKGJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChib3VuZHMgKyAxKSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMgKz0gMHgxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vbm90b25pY05zICs9IHNlYyAqIDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSByYXcgQ1BVIGxvYWQgPSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2FkTnMgPSAwOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3TG9hZDsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmbmV3TG9hZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTG9hZFZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBvbGRMb2FkLnR2X3NlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gb2xkTG9hZC50dl9uc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgPSBuc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zICs9IHNlYyAqIDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZCA9IG5ld0xvYWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorICAgICAgICAgICAgICAgICAgICBpbnQgY3B1TnVtID0gc2NoZWRfZ2V0Y3B1KCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IHRjdS5nZXRDcHVrSHooY3B1TnVtKTsKKyAgICAgICAgICAgICAgICAgICAga0h6ID0gKGtIeiA8PCA0KSB8IChjcHVOdW0gJiAweEYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGluIEZJRk8gcXVldWVzIGZvciBkdW1wc3lzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAorICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzdG9yZSAjNCBpcyBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBzdG9yZXMgIzEsICMyLCAjMyBhYm92ZSwgYnV0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXdlc3Qgb3BlbiAmIG9sZGVzdCBjbG9zZWQgaGFsdmVzIGFyZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQm91bmRzID0gYm91bmRzOworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBtb25vdG9uaWMgY2xvY2sgaXMgYnJva2VuCisgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBzbGVlcE5zID0gcGVyaW9kTnM7CisgICAgICAgIH0KKworICAgIH0gICAvLyBmb3IgKDs7KQorCisgICAgLy8gbmV2ZXIgcmV0dXJuICd0cnVlJzsgVGhyZWFkOjpfdGhyZWFkTG9vcCgpIGxvY2tzIG11dGV4IHdoaWNoIGNhbiByZXN1bHQgaW4gcHJpb3JpdHkgaW52ZXJzaW9uCit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBGYXN0VGhyZWFkIGlzIHRoZSBjb21tb24gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBGYXN0TWl4ZXIgYW5kIEZhc3RDYXB0dXJlCitjbGFzcyBGYXN0VGhyZWFkIDogcHVibGljIFRocmVhZCB7CisKK3B1YmxpYzoKKyAgICAgICAgICAgIEZhc3RUaHJlYWQoKTsKKyAgICB2aXJ0dWFsIH5GYXN0VGhyZWFkKCk7CisKK3ByaXZhdGU6CisgICAgLy8gaW1wbGVtZW50IFRocmVhZDo6dGhyZWFkTG9vcCgpCisgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKworcHJvdGVjdGVkOgorICAgIC8vIGNhbGxvdXRzIHRvIHN1YmNsYXNzIGluIHNhbWUgbGV4aWNhbCBvcmRlciBhcyB0aGV5IHdlcmUgaW4gb3JpZ2luYWwgRmFzdE1peGVyLmNwcAorICAgIC8vIEZJWE1FIG5lZWQgY29tbWVudHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0TG9nKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlciBfX3VudXNlZCkgeyB9CisgICAgdmlydHVhbCB2b2lkIG9uSWRsZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25FeGl0KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKSA9IDA7CisKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSBhbiAibSIgcHJlZml4CisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwcmV2aW91czsKKyAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKmN1cnJlbnQ7CisgICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzOworICAgIGJvb2wgb2xkVHNWYWxpZDsKKyAgICBsb25nIHNsZWVwTnM7ICAgLy8gLTE6IGJ1c3kgd2FpdCwgMDogc2NoZWRfeWllbGQsID4gMDogbmFub3NsZWVwCisgICAgbG9uZyBwZXJpb2ROczsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgorICAgIGxvbmcgdW5kZXJydW5OczsgICAgLy8gdW5kZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nIG92ZXJydW5OczsgICAgIC8vIG92ZXJydW4gbGlrZWx5IHdoZW4gd3JpdGUgY3ljbGUgaXMgbGVzcyB0aGFuIHRoaXMgdmFsdWUKKyAgICBsb25nIGZvcmNlTnM7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCisgICAgbG9uZyB3YXJtdXBOczsgICAgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdG8gdGhpcyB2YWx1ZQorICAgIEZhc3RUaHJlYWREdW1wU3RhdGUgKm1EdW1teUR1bXBTdGF0ZTsKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICpkdW1wU3RhdGU7CisgICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1bjsgIC8vIHVzZWQgdG8gaWdub3JlIGluaXRpYWwgb3ZlcnJ1biBhbmQgZmlyc3QgYWZ0ZXIgYW4gdW5kZXJydW4KKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkTG9hZDsgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKKyAgICBib29sIG9sZExvYWRWYWxpZDsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAorICAgIHVpbnQzMl90IGJvdW5kczsKKyAgICBib29sIGZ1bGw7ICAgICAgICAgIC8vIHdoZXRoZXIgd2UgaGF2ZSBjb2xsZWN0ZWQgYXQgbGVhc3QgbVNhbXBsaW5nTiBzYW1wbGVzCisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgVGhyZWFkQ3B1VXNhZ2UgdGN1OyAgICAgLy8gZm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyNlbmRpZgorI2VuZGlmCisgICAgdW5zaWduZWQgY29sZEdlbjsgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCisgICAgYm9vbCBpc1dhcm07ICAgICAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwgZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCB3YXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKKyAgICBOQkxvZzo6V3JpdGVyIGR1bW15TG9nV3JpdGVyOworICAgIE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcjsKKyAgICBzdGF0dXNfdCB0aW1lc3RhbXBTdGF0dXM7CisKKyAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZDsKKyNpZiAwCisgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisjZW5kaWYKKyAgICBib29sIGF0dGVtcHRlZFdyaXRlOworCit9OyAgLy8gY2xhc3MgRmFzdFRocmVhZAorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTk0ODcyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmFzdFRocmVhZFN0YXRlOjpGYXN0VGhyZWFkU3RhdGUoKSA6CisgICAgbUNvbW1hbmQoSU5JVElBTCksIG1Db2xkRnV0ZXhBZGRyKE5VTEwpLCBtQ29sZEdlbigwKSwgbUR1bXBTdGF0ZShOVUxMKSwgbU5CTG9nV3JpdGVyKE5VTEwpCisKK3sKK30KKworRmFzdFRocmVhZFN0YXRlOjp+RmFzdFRocmVhZFN0YXRlKCkKK3sKK30KKworCitGYXN0VGhyZWFkRHVtcFN0YXRlOjpGYXN0VGhyZWFkRHVtcFN0YXRlKCkgOgorICAgIG1Db21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKKyAgICAvKiBtTWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIG1XYXJtdXBDeWNsZXMoMCkKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAsIG1TYW1wbGluZ04oMSksIG1Cb3VuZHMoMCkKKyNlbmRpZgoreworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Cit9CisKK0Zhc3RUaHJlYWREdW1wU3RhdGU6On5GYXN0VGhyZWFkRHVtcFN0YXRlKCkKK3sKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiOGEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZTsKKworLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBzdGF0ZSBvZiBhIEZhc3RUaHJlYWQKK3N0cnVjdCBGYXN0VGhyZWFkU3RhdGUgeworICAgICAgICAgICAgICAgIEZhc3RUaHJlYWRTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkU3RhdGUoKTsKKworICAgIHR5cGVkZWYgdWludDMyX3QgQ29tbWFuZDsKKyAgICBzdGF0aWMgY29uc3QgQ29tbWFuZAorICAgICAgICBJTklUSUFMID0gMCwgICAgICAgICAgICAvLyB1c2VkIG9ubHkgZm9yIHRoZSBpbml0aWFsIHN0YXRlCisgICAgICAgIEhPVF9JRExFID0gMSwgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgQ09MRF9JRExFID0gMiwgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIGZ1dGV4CisgICAgICAgIElETEUgPSAzLCAgICAgICAgICAgICAgIC8vIGVpdGhlciBIT1RfSURMRSBvciBDT0xEX0lETEUKKyAgICAgICAgRVhJVCA9IDQ7ICAgICAgICAgICAgICAgLy8gZXhpdCBmcm9tIHRocmVhZAorICAgICAgICAvLyBhZGRpdGlvbmFsIHZhbHVlcyBkZWZpbmVkIHBlciBzdWJjbGFzcworICAgIENvbW1hbmQgICAgIG1Db21tYW5kOyAgICAgICAvLyBjdXJyZW50IGNvbW1hbmQKKyAgICBpbnQzMl90KiAgICBtQ29sZEZ1dGV4QWRkcjsgLy8gZm9yIENPTERfSURMRSBvbmx5LCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIGZ1dGV4CisgICAgdW5zaWduZWQgICAgbUNvbGRHZW47ICAgICAgIC8vIGluY3JlbWVudCB3aGVuIENPTERfSURMRSBpcyByZXF1ZXN0ZWQgc28gaXQncyBvbmx5IHBlcmZvcm1lZCBvbmNlCisKKyAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKiBtRHVtcFN0YXRlOyAvLyBpZiBub24tTlVMTCwgdGhlbiB1cGRhdGUgZHVtcCBzdGF0ZSBwZXJpb2RpY2FsbHkKKyAgICBOQkxvZzo6V3JpdGVyKiBtTkJMb2dXcml0ZXI7IC8vIG5vbi1ibG9ja2luZyBsb2dnZXIKKworfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkU3RhdGUKKworCisvLyBGSVhNRSBleHRyYWN0IGNvbW1vbiBwYXJ0IG9mIGNvbW1lbnQgYXQgRmFzdE1peGVyRHVtcFN0YXRlCitzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSgpOworICAgIC8qdmlydHVhbCovIH5GYXN0VGhyZWFkRHVtcFN0YXRlKCk7CisKKyAgICBGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgbUNvbW1hbmQ7ICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKKyAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCisgICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKKyAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAorCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgorICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgorICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAorICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKKyAgICAvLyBDb3JyZXNwb25kaW5nIHJ1bnRpbWUgbWF4aW11bSBzaXplIG9mIHNhbXBsZSBhcnJheXMsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgdWludDMyX3QgbVNhbXBsaW5nTjsKKyAgICAvLyBUaGUgYm91bmRzIGRlZmluZSB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcywgYW5kIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOgorICAgIC8vICAgICAgbmV3ZXN0IG9wZW4gKGV4Y2x1ZGVkKSBlbmRwb2ludCAgID0gbG93ZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gICAgICBvbGRlc3QgY2xvc2VkIChpbmNsdWRlZCkgZW5kcG9pbnQgPSB1cHBlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KKyAgICAvLyBOdW1iZXIgb2YgdmFsaWQgc2FtcGxlcyBpcyBuZXdlc3QgLSBvbGRlc3QuCisgICAgdWludDMyX3QgbUJvdW5kczsgICAgICAgICAgICAgICAgICAgLy8gYm91bmRzIGZvciBtTW9ub3RvbmljTnMsIG1UaHJlYWRDcHVOcywgYW5kIG1DcHVrSHoKKyAgICAvLyBUaGUgZWxlbWVudHMgaW4gdGhlICpOcyBhcnJheXMgYXJlIGluIHVuaXRzIG9mIG5hbm9zZWNvbmRzIDw9IDM5OTk5OTk5OTkuCisgICAgdWludDMyX3QgbU1vbm90b25pY05zW2tTYW1wbGluZ05dOyAgLy8gZGVsdGEgbW9ub3RvbmljICh3YWxsIGNsb2NrKSB0aW1lCisgICAgdWludDMyX3QgbUxvYWROc1trU2FtcGxpbmdOXTsgICAgICAgLy8gZGVsdGEgQ1BVIGxvYWQgaW4gdGltZQorI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIHVpbnQzMl90IG1DcHVrSHpba1NhbXBsaW5nTl07ICAgICAgIC8vIGFic29sdXRlIENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6LCBiaXRzIDAtMyBhcmUgQ1BVIworI2VuZGlmCisjZW5kaWYKKworfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlCisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0NDA1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMCwwICsxLDY5NSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisKKyNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOb3RlOiB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIHVzZWQgZm9yIGV4dHJlbWVseSB2ZXJib3NlIGxvZ2dpbmcgbWVzc2FnZS4gIEluCisvLyBvcmRlciB0byBydW4gd2l0aCBBTE9HX0FTU0VSVCB0dXJuZWQgb24sIHdlIG5lZWQgdG8gaGF2ZSBMT0dfTkRFQlVHIHNldCB0bworLy8gMDsgYnV0IG9uZSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRvIHR1cm4gYWxsIExPR1YncyBhcyB3ZWxsLiAgU29tZSBtZXNzYWdlcworLy8gYXJlIHNvIHZlcmJvc2UgdGhhdCB3ZSB3YW50IHRvIHN1cHByZXNzIHRoZW0gZXZlbiB3aGVuIHdlIGhhdmUgQUxPR19BU1NFUlQKKy8vIHR1cm5lZCBvbi4gIERvIG5vdCB1bmNvbW1lbnQgdGhlICNkZWYgYmVsb3cgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdQorLy8gYXJlIGRvaW5nIGFuZCB3YW50IHRvIHNlZSBhbGwgb2YgdGhlIGV4dHJlbWVseSB2ZXJib3NlIG1lc3NhZ2VzLgorLy8jZGVmaW5lIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmdldEF1ZGlvUG9ydChwb3J0KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKworLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworLyogRGlzY29ubmVjdCBhIHBhdGNoICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKworLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKy8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKworQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlcikKK3sKK30KKworQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjp+UGF0Y2hQYW5lbCgpCit7Cit9CisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgX191bnVzZWQpCit7CisgICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzIik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCit7CisgICAgQUxPR1YoImdldEF1ZGlvUG9ydCIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKKyAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKKyAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIGxpbWl0IG51bWJlciBvZiBzb3VyY2VzIHRvIDEgZm9yIG5vdyBvciAyIHNvdXJjZXMgZm9yIHNwZWNpYWwgY3Jvc3MgaHcgbW9kdWxlIGNhc2UuCisgICAgLy8gb25seSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIHJlcXVlc3QgYSBwYXRjaCBjcmVhdGlvbiB3aXRoIDIgc291cmNlcy4KKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKCpoYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyAqaGFuZGxlICE9IDAgJiYgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmICgqaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgKmhhbmRsZSk7CisgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gbVBhdGNoZXNbaW5kZXhdLT5tSGFsSGFuZGxlOworICAgICAgICAgICAgICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFBhdGNoICpuZXdQYXRjaCA9IG5ldyBQYXRjaChwYXRjaCk7CisKKyAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBpZiBjb25uZWN0aW9uIHRvIGEgbWl4IG9yIGFjcm9zcyBIVyBtb2R1bGVzCisgICAgICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmVqZWN0IGNvbm5lY3Rpb24gdG8gZGlmZmVyZW50IHNpbmsgdHlwZXMKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gcGF0Y2gtPnNpbmtzWzBdLnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgaW5wdXQgc3RyZWFtcyBmb3IgSEFMIGJlZm9yZSAzLjAKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlID09IHNyY01vZHVsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgZGV2aWNlIHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgeworICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGRldmljZSB0byBkZXZpY2UgY29ubmVjdGlvbiBpZiBub3Qgb24gc2FtZSBodyBtb2R1bGUKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlIGZvciBjcm9zcyBodyBtb2R1bGUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG51bSBzb3VyY2VzID09IDIgLT0+IHJldXNlIGFuIGV4aXRpbmcgb3V0cHV0IG1peCB0byBjb25uZWN0IHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHNpbmsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5od19tb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgpIHJldHVybmVkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gaW5DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woc3JjTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksIGluQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IChjaGFyICopY2FsbG9jKDEsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSU5QVVRfU09VUkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgQVVESU9fUE9SVF9UWVBFX0RFVklDRSBzZXRQYXJhbWV0ZXJzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBkZXZpY2VzIGFuZCBvdXRwdXQgc3RyZWFtcworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBzaW5rcyBhbmQgc291cmNlcyBvbiBzYW1lIEhXIG1vZHVsZQorICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvL0ZJWE1FOiB3ZSBvbmx5IHN1cHBvcnQgYWRkcmVzcyBvbiBmaXJzdCBzaW5rIHdpdGggSEFMIHZlcnNpb24gPCAzLjAKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgICAgICAgICBmcmVlKGFkZHJlc3MpOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIChpbnQpdHlwZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorZXhpdDoKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqaGFuZGxlID0gYXVkaW9mbGluZ2VyLT5uZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgbmV3UGF0Y2gtPm1IYW5kbGUgPSAqaGFuZGxlOworICAgICAgICBuZXdQYXRjaC0+bUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKKyAgICAgICAgbVBhdGNoZXMuYWRkKG5ld1BhdGNoKTsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsICpoYW5kbGUsIGhhbEhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoKTsKKyAgICAgICAgZGVsZXRlIG5ld1BhdGNoOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCkKK3sKKyAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggc3ViUGF0Y2g7CisgICAgc3ViUGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHN1YlBhdGNoLnNvdXJjZXNbMF0gPSBhdWRpb1BhdGNoLT5zb3VyY2VzWzBdOworICAgIHN1YlBhdGNoLm51bV9zaW5rcyA9IDE7CisKKyAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zaW5rc1swXSk7CisgICAgc3ViUGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKKyAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNvdXJjZXNbMF0pOworICAgIHN1YlBhdGNoLnNpbmtzWzBdID0gYXVkaW9QYXRjaC0+c2lua3NbMF07CisgICAgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gdXNlIGEgcHNldWRvIExDTSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVjb3VudAorICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgaW50IHBsYXliYWNrU2hpZnQgPSBfX2J1aWx0aW5fY3R6KHBsYXliYWNrRnJhbWVDb3VudCk7CisgICAgc2l6ZV90IHJlY29yZEZyYW1lY291bnQgPSBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVjb3VudCk7CisgICAgaWYgKHBsYXliYWNrU2hpZnQgPCBzaGlmdCkgeworICAgICAgICBzaGlmdCA9IHBsYXliYWNrU2hpZnQ7CisgICAgfQorICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKHBsYXliYWNrRnJhbWVDb3VudCAqIHJlY29yZEZyYW1lY291bnQpID4+IHNoaWZ0OworICAgIEFMT0dWKCJjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgcGxheWZyYW1lQ291bnQgJWQgcmVjb3JkRnJhbWVjb3VudCAlZCBmcmFtZUNvdW50ICVkICIsCisgICAgICAgICAgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZWNvdW50LCBmcmFtZUNvdW50KTsKKworICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcmVjb3JkIHRyYWNrIHRvIGNhcHR1cmUgZnJvbSByZWNvcmQgdGhyZWFkCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsTWFzaygpOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisKKyAgICBwYXRjaC0+bVBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUKTsKKyAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmFkZFBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworCisgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgorICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKKyAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQpOworICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoVHJhY2stPmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOworCisgICAgLy8gdGllIHBsYXliYWNrIGFuZCByZWNvcmQgdHJhY2tzIHRvZ2V0aGVyCisgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hUcmFjay5nZXQoKSk7CisgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFJlY29yZC5nZXQoKSk7CisKKyAgICAvLyBzdGFydCBjYXB0dXJlIGFuZCBwbGF5YmFjaworICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIDApOworICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RhcnQoKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKQoreworICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAlZCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisKKyAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CisgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7CisgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RvcCgpOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7CisgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZUlucHV0SW50ZXJuYWxfbChwYXRjaC0+bVJlY29yZFRocmVhZCk7CisgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVBsYXliYWNrVGhyZWFkICE9IDApIHsKKyAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7CisgICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKHBhdGNoLT5tUGF0Y2hUcmFjayk7CisgICAgICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2suY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKKyAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7CisgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgfQorICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7CisgICAgfQorfQorCisvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIHNpemVfdCBpbmRleDsKKworICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAoaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4ID09IG1QYXRjaGVzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOworICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaDsKKworICAgIHN3aXRjaCAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSkgeworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgeworICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCByZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0Ugc2V0UGFyYW1ldGVycyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgMCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCkKK3sKKyAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcyIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgQUxPR1YoInNldEF1ZGlvUG9ydENvbmZpZyIpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic2V0QXVkaW9Qb3J0Q29uZmlnKCkgYmFkIGh3IG1vZHVsZSAlZCIsIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICByZXR1cm4gaHdEZXZpY2UtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhod0RldmljZSwgY29uZmlnKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMTc5YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAorICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKKyNlbmRpZgorCitjbGFzcyBQYXRjaFBhbmVsIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorCisgICAgY2xhc3MgUGF0Y2g7CisKKyAgICBQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcik7CisgICAgdmlydHVhbCB+UGF0Y2hQYW5lbCgpOworCisgICAgLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyk7CisKKyAgICAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KKyAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gZGV2aWNlcyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOworCisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICBzdGF0dXNfdCBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCk7CisgICAgdm9pZCBjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKTsKKworICAgIGNsYXNzIFBhdGNoIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpIDoKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoKCpwYXRjaCksIG1IYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAorICAgICAgICAgICAgbUhhbEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1SZWNvcmRQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCisgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkge30KKyAgICAgICAgflBhdGNoKCkge30KKworICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICAgICAgICAgIG1BdWRpb1BhdGNoOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYW5kbGU7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbEhhbmRsZTsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWQ7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiAgbVBhdGNoVHJhY2s7CisgICAgICAgIHNwPFJlY29yZFRocmVhZD4gICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZDsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gICBtUGF0Y2hSZWNvcmQ7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVJlY29yZFBhdGNoSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlOworCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI+ICAgICAgbUF1ZGlvRmxpbmdlcjsKKyAgICBTb3J0ZWRWZWN0b3IgPFBhdGNoICo+ICAgICAgbVBhdGNoZXM7Cit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCA0M2I3N2YzLi5lZTQ4Mjc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMjksMTQgKzI5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24gPSAwKTsKQEAgLTUzLDYgKzU2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19ESVJFQ1QpICE9IDA7IH0KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF1eEJ1ZmZlcihpbnQgRWZmZWN0SWQsIGludDMyX3QgKmJ1ZmZlcik7CkBAIC02NCw3ICs2OCw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBzaWduYWwoKTsKIAogLy8gaW1wbGVtZW50IEZhc3RNaXhlclN0YXRlOjpWb2x1bWVQcm92aWRlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFZvbHVtZUxSKCk7CisgICAgdmlydHVhbCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBnZXRWb2x1bWVMUigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCkBAIC05MywxMCArOTcsMTAgQEAKICAgICBib29sIGlzUmVhZHkoKSBjb25zdDsKICAgICB2b2lkIHNldFBhdXNlZCgpIHsgbVN0YXRlID0gUEFVU0VEOyB9CiAgICAgdm9pZCByZXNldCgpOwotCi0gICAgYm9vbCBpc091dHB1dFRyYWNrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9DTlQpOwotICAgIH0KKyAgICBib29sIGlzRmx1c2hQZW5kaW5nKCkgY29uc3QgeyByZXR1cm4gbUZsdXNoSHdQZW5kaW5nOyB9CisgICAgdm9pZCBmbHVzaEFjaygpOworICAgIGJvb2wgaXNSZXN1bWVQZW5kaW5nKCk7CisgICAgdm9pZCByZXN1bWVBY2soKTsKIAogICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1TaGFyZWRCdWZmZXI7IH0KIApAQCAtMTA5LDggKzExMyw2IEBACiAgICAgdm9pZCB0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSk7CiAgICAgdm9pZCBpbnZhbGlkYXRlKCk7CiAgICAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBtSXNJbnZhbGlkOyB9Ci0gICAgdmlydHVhbCBib29sIGlzVGltZWRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgYm9vbCBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSAhPSAwOyB9CiAgICAgaW50IGZhc3RJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0SW5kZXg7IH0KIAogcHJvdGVjdGVkOgpAQCAtMTM3LDggKzEzOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIQUwgd2hlbiB0aGlzIHRyYWNrIHdpbGwgYmUgZnVsbHkgcmVuZGVyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gbWVhbnMgbm90IG1vbml0b3JpbmcKIHByaXZhdGU6Ci0gICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBtRmxhZ3M7Ci0KICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIG1GYXN0SW5kZXggPT0gLTEgaWYgbm90IGlzRmFzdFRyYWNrKCkKQEAgLTE1NCw2ICsxNTQsMTIgQEAKICAgICBib29sICAgICAgICAgICAgICAgIG1Jc0ludmFsaWQ7IC8vIG5vbi1yZXNldHRhYmxlIGxhdGNoLCBzZXQgYnkgaW52YWxpZGF0ZSgpCiAgICAgQXVkaW9UcmFja1NlcnZlclByb3h5KiAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nOyAvLyB0cmFjayB3YXMgcGF1c2VkIGluIHN0b3BwaW5nIHN0YXRlLgorICAgIGJvb2wgICAgICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nOyAvLyB0cmFjayByZXF1ZXN0cyBmb3IgdGhyZWFkIGZsdXNoCisKKyAgICAvLyBmb3IgbGFzdCBjYWxsIHRvIGdldFRpbWVzdGFtcAorICAgIGJvb2wgICAgICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuOworICAgIEF1ZGlvVGltZXN0YW1wICAgICAgbVByZXZpb3VzVGltZXN0YW1wOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiBjbGFzcyBUaW1lZFRyYWNrIDogcHVibGljIFRyYWNrIHsKQEAgLTE4NSw3ICsxOTEsNiBAQAogICAgIH07CiAKICAgICAvLyBNaXhlciBmYWNpbmcgbWV0aG9kcy4KLSAgICB2aXJ0dWFsIGJvb2wgaXNUaW1lZFRyYWNrKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lc1JlYWR5KCkgY29uc3Q7CiAKICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtMjg2LDMgKzI5MSwzNCBAQAogICAgIER1cGxpY2F0aW5nVGhyZWFkKiBjb25zdCBtU291cmNlVGhyZWFkOyAvLyBmb3Igd2FpdFRpbWVNcygpIGluIHdyaXRlKCkKICAgICBBdWRpb1RyYWNrQ2xpZW50UHJveHkqICAgICAgbUNsaWVudFByb3h5OwogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjaworCisvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCitjbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKworICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKKworICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOworCisgICAgLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgICAgICAgICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KKworcHJpdmF0ZToKKyAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OworICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7Cit9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCA1N2RlNTY4Li4yMDRhOWQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0yOCw4ICsyOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SZWNvcmRUcmFjaygpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBpbnQgdHJpZ2dlclNlc3Npb24pOwpAQCAtNDUsNyArNDgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bXA7IH0KIAogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBhY3RpdmUpOworCisgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtU3RhdGUKQEAgLTU5LDUgKzY1LDY0IEBACiAgICAgLy8gcmVsZWFzZUJ1ZmZlcigpIG5vdCBvdmVycmlkZGVuCiAKICAgICBib29sICAgICAgICAgICAgICAgIG1PdmVyZmxvdzsgIC8vIG92ZXJmbG93IG9uIG1vc3QgcmVjZW50IGF0dGVtcHQgdG8gZmlsbCBjbGllbnQgYnVmZmVyCi0gICAgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSogbUF1ZGlvUmVjb3JkU2VydmVyUHJveHk7CisKKyAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCisgICAgICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICAgICAgICAgICAgICAgICAqbVJlc2FtcGxlcjsKKworICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgc3RlcmVvIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3CisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbVJzbXBPdXRCdWZmZXI7CisgICAgICAgICAgICAvLyBjdXJyZW50IGFsbG9jYXRlZCBmcmFtZSBjb3VudCBmb3IgdGhlIGFib3ZlLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gbmVlZGVkCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcE91dEZyYW1lQ291bnQ7CisKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGdldE5leHRCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWcgb25seQorCisgICAgICAgICAgICAvLyByb2xsaW5nIGNvdW50ZXIgdGhhdCBpcyBuZXZlciBjbGVhcmVkCisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJvbnQ7ICAgLy8gbmV4dCBhdmFpbGFibGUgZnJhbWUKKworICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1TaW5rOyAgLy8gcmVmZXJlbmNlcyBjbGllbnQncyBidWZmZXIgc2luayBpbiBzaGFyZWQgbWVtb3J5CisKKyAgICAgICAgICAgIC8vIHN5bmMgZXZlbnQgdHJpZ2dlcmluZyBhY3R1YWwgYXVkaW8gY2FwdHVyZS4gRnJhbWVzIHJlYWQgYmVmb3JlIHRoaXMgZXZlbnQgd2lsbAorICAgICAgICAgICAgLy8gYmUgZHJvcHBlZCBhbmQgdGhlcmVmb3JlIG5vdCByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIHNwPFN5bmNFdmVudD4gICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RhcnRFdmVudDsKKworICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNhcHR1cmVkIGZyYW1lcyB0byBkcm9wIGFmdGVyIHRoZSBzdGFydCBzeW5jIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLgorICAgICAgICAgICAgLy8gd2hlbiA8IDAsIG1heGltdW0gZnJhbWVzIHRvIGRyb3AgYmVmb3JlIHN0YXJ0aW5nIGNhcHR1cmUgZXZlbiBpZiBzeW5jIGV2ZW50IGlzCisgICAgICAgICAgICAvLyBub3QgcmVjZWl2ZWQKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNUb0Ryb3A7CisKKyAgICAgICAgICAgIC8vIHVzZWQgYnkgcmVzYW1wbGVyIHRvIGZpbmQgc291cmNlIGZyYW1lcworICAgICAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgKm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH07CisKKy8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKK2NsYXNzIFBhdGNoUmVjb3JkIDogdmlydHVhbCBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorCisgICAgUGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoUmVjb3JkKCk7CisKKyAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQorCitwcml2YXRlOgorICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7CisgICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKK307ICAvLyBlbmQgb2YgUGF0Y2hSZWNvcmQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAppbmRleCAxNTI0NTVkLi44MjQ2ZmVmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC01OSw2ICs1OSwxMyBAQAogICAgIHJldHVybiBvazsKIH0KIAorYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKIGJvb2wgZHVtcEFsbG93ZWQoKSB7CiAgICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAppbmRleCA1MzFiYzU2Li5kZjZmNmY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTI0LDYgKzI0LDcgQEAKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoKTsKIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKIGJvb2wgZHVtcEFsbG93ZWQoKTsKIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCmluZGV4IDdlMDFjOWYuLjQwZDdiY2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKQEAgLTQxLDEzICs0MSwxNCBAQAogLy8gQ29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gU3RhdGVRdWV1ZTxUPjo6U3RhdGVRdWV1ZSgpIDoKLSAgICBtTmV4dChOVUxMKSwgbUFjayhOVUxMKSwgbUN1cnJlbnQoTlVMTCksCisgICAgbUFjayhOVUxMKSwgbUN1cnJlbnQoTlVMTCksCiAgICAgbU11dGF0aW5nKCZtU3RhdGVzWzBdKSwgbUV4cGVjdGluZyhOVUxMKSwKICAgICBtSW5NdXRhdGlvbihmYWxzZSksIG1Jc0RpcnR5KGZhbHNlKSwgbUlzSW5pdGlhbGl6ZWQoZmFsc2UpCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICwgbU9ic2VydmVyRHVtcCgmbU9ic2VydmVyRHVtbXlEdW1wKSwgbU11dGF0b3JEdW1wKCZtTXV0YXRvckR1bW15RHVtcCkKICNlbmRpZgogeworICAgIGF0b21pY19pbml0KCZtTmV4dCwgMCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFN0YXRlUXVldWU8VD46On5TdGF0ZVF1ZXVlKCkKQEAgLTU4LDExICs1OSw4IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIFN0YXRlUXVldWU8VD46OnBvbGwoKQogewotI2lmZGVmIF9fTFA2NF9fCi0gICAgY29uc3QgVCAqbmV4dCA9IChjb25zdCBUICopIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZDY0KCh2b2xhdGlsZSBpbnQ2NF90ICopICZtTmV4dCk7Ci0jZWxzZQotICAgIGNvbnN0IFQgKm5leHQgPSAoY29uc3QgVCAqKSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoKHZvbGF0aWxlIGludDMyX3QgKikgJm1OZXh0KTsKLSNlbmRpZgorICAgIGNvbnN0IFQgKm5leHQgPSAoY29uc3QgVCAqKSBhdG9taWNfbG9hZF9leHBsaWNpdCgmbU5leHQsIG1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKwogICAgIGlmIChuZXh0ICE9IG1DdXJyZW50KSB7CiAgICAgICAgIG1BY2sgPSBuZXh0OyAgICAvLyBubyBhZGRpdGlvbmFsIGJhcnJpZXIgbmVlZGVkCiAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKQEAgLTE0NCwxMSArMTQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHB1Ymxpc2gKLSNpZmRlZiBfX0xQNjRfXwotICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlNjQoKGludDY0X3QpIG1NdXRhdGluZywgKHZvbGF0aWxlIGludDY0X3QgKikgJm1OZXh0KTsKLSNlbHNlCi0gICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoKGludDMyX3QpIG1NdXRhdGluZywgKHZvbGF0aWxlIGludDMyX3QgKikgJm1OZXh0KTsKLSNlbmRpZgorICAgICAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoJm1OZXh0LCAodWludHB0cl90KW1NdXRhdGluZywgbWVtb3J5X29yZGVyX3JlbGVhc2UpOwogICAgICAgICBtRXhwZWN0aW5nID0gbU11dGF0aW5nOwogCiAgICAgICAgIC8vIGNvcHkgd2l0aCBjaXJjdWxhciB3cmFwYXJvdW5kCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaAppbmRleCA5Y2RlNjQyLi4yN2Y2YTI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19TVEFURV9RVUVVRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fU1RBVEVfUVVFVUVfSAogCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisKIC8vIFRoZSBzdGF0ZSBxdWV1ZSB0ZW1wbGF0ZSBjbGFzcyB3YXMgb3JpZ2luYWxseSBkcml2ZW4gYnkgdGhpcyB1c2UgY2FzZSAvIHJlcXVpcmVtZW50czoKIC8vICBUaGVyZSBhcmUgdHdvIHRocmVhZHM6IGEgZmFzdCBtaXhlciwgYW5kIGEgbm9ybWFsIG1peGVyLCBhbmQgdGhleSBzaGFyZSBzdGF0ZS4KIC8vICBUaGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgc2hhcmVkIHN0YXRlIGlzIGEgc2V0IG9mIGFjdGl2ZSBmYXN0IHRyYWNrcywKQEAgLTg5LDYgKzkxLDggQEAKIC8vICBhcml0aG1ldGljIG9uIHRoZSBzdGF0ZSBwb2ludGVycy4gIEhvd2V2ZXIgdG8gdGhlIG11dGF0b3IsIHRoZSBzdGF0ZSBwb2ludGVycwogLy8gIGFyZSBpbiBhIGRlZmluaXRlIGNpcmN1bGFyIG9yZGVyLgogCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCkBAIC0xODQsNyArMTg4LDcgQEAKICAgICBUICAgICAgICAgICAgICAgICBtU3RhdGVzW2tOXTsgICAgICAvLyB3cml0dGVuIGJ5IG11dGF0b3IsIHJlYWQgYnkgb2JzZXJ2ZXIKIAogICAgIC8vICJ2b2xhdGlsZSIgaXMgbWVhbmluZ2xlc3Mgd2l0aCBTTVAsIGJ1dCBoZXJlIGl0IGluZGljYXRlcyB0aGF0IHdlJ3JlIHVzaW5nIGF0b21pYyBvcHMKLSAgICB2b2xhdGlsZSBjb25zdCBUKiBtTmV4dDsgLy8gd3JpdHRlbiBieSBtdXRhdG9yIHRvIGFkdmFuY2UgbmV4dCwgcmVhZCBieSBvYnNlcnZlcgorICAgIGF0b21pY191aW50cHRyX3QgIG1OZXh0OyAvLyB3cml0dGVuIGJ5IG11dGF0b3IgdG8gYWR2YW5jZSBuZXh0LCByZWFkIGJ5IG9ic2VydmVyCiAgICAgdm9sYXRpbGUgY29uc3QgVCogbUFjazsgIC8vIHdyaXR0ZW4gYnkgb2JzZXJ2ZXIgdG8gYWNrbm93bGVkZ2UgYWR2YW5jZSBvZiBuZXh0LCByZWFkIGJ5IG11dGF0b3IKIAogICAgIC8vIG9ubHkgdXNlZCBieSBvYnNlcnZlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcAppbmRleCAwZDVjZDBjLi42ZjQ1MDVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcApAQCAtMTYsMTIgKzE2LDE0IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogCiAvLyBGSVhNRSBoYWNrIGZvciBnY2MKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi10ZW1wbGF0ZSBjbGFzcyBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPjsgIC8vIHR5cGVkZWYgRmFzdE1peGVyU3RhdGVRdWV1ZQordGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0TWl4ZXJTdGF0ZT47ICAgICAgLy8gdHlwZWRlZiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlCit0ZW1wbGF0ZSBjbGFzcyBTdGF0ZVF1ZXVlPEZhc3RDYXB0dXJlU3RhdGU+OyAgICAvLyB0eXBlZGVmIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggMjNhMjE3NC4uZTQ0MzQ3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtMzQsOCArMzUsMTEgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gTkJBSU8gaW1wbGVtZW50YXRpb25zCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL01vbm9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaD4KQEAgLTUxLDYgKzU1LDcgQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKIApAQCAtNzksNiArODQsOCBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAorI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyByZXRyeSBjb3VudHMgZm9yIGJ1ZmZlciBmaWxsIHRpbWVvdXQKQEAgLTk2LDE4ICsxMDMsMTggQEAKIC8vIFJlY29yZFRocmVhZCBsb29wIHNsZWVwIHRpbWUgdXBvbiBhcHBsaWNhdGlvbiBvdmVycnVuIG9yIGF1ZGlvIEhBTCByZWFkIGVycm9yCiBzdGF0aWMgY29uc3QgaW50IGtSZWNvcmRUaHJlYWRTbGVlcFVzID0gNTAwMDsKIAotLy8gbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHNldFBhcmFtZXRlcnMgdG8gY29tcGxldGUKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtTZXRQYXJhbWV0ZXJzVGltZW91dE5zID0gc2Vjb25kcygyKTsKKy8vIG1heGltdW0gdGltZSB0byB3YWl0IGluIHNlbmRDb25maWdFdmVudF9sKCkgZm9yIGEgc3RhdHVzIHRvIGJlIHJlY2VpdmVkCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrQ29uZmlnRXZlbnRUaW1lb3V0TnMgPSBzZWNvbmRzKDIpOwogCiAvLyBtaW5pbXVtIHNsZWVwIHRpbWUgZm9yIHRoZSBtaXhlciB0aHJlYWQgbG9vcCB3aGVuIHRyYWNrcyBhcmUgYWN0aXZlIGJ1dCBpbiB1bmRlcnJ1bgogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5UaHJlYWRTbGVlcFRpbWVVcyA9IDUwMDA7CiAvLyBtYXhpbXVtIGRpdmlkZXIgYXBwbGllZCB0byB0aGUgYWN0aXZlIHNsZWVwIHRpbWUgaW4gdGhlIG1peGVyIHRocmVhZCBsb29wCiBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFRocmVhZFNsZWVwVGltZVNoaWZ0ID0gMjsKIAotLy8gbWluaW11bSBub3JtYWwgbWl4IGJ1ZmZlciBzaXplLCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZyYW1lcwotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5Ob3JtYWxNaXhCdWZmZXJTaXplTXMgPSAyMDsKLS8vIG1heGltdW0gbm9ybWFsIG1peCBidWZmZXIgc2l6ZQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhOb3JtYWxNaXhCdWZmZXJTaXplTXMgPSAyNDsKKy8vIG1pbmltdW0gbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMgcmF0aGVyIHRoYW4gZnJhbWVzCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbFNpbmtCdWZmZXJTaXplTXMgPSAyMDsKKy8vIG1heGltdW0gbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Tm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDI0OwogCiAvLyBPZmZsb2FkZWQgb3V0cHV0IHRocmVhZCBzdGFuZGJ5IGRlbGF5OiBhbGxvd3MgdHJhY2sgdHJhbnNpdGlvbiB3aXRob3V0IGdvaW5nIHRvIHN0YW5kYnkKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtPZmZsb2FkU3RhbmRieURlbGF5TnMgPSBzZWNvbmRzKDEpOwpAQCAtMTI5LDkgKzEzNiwxNyBAQAogICAgIC8vICB1cCBsYXJnZSB3cml0ZXMgaW50byBzbWFsbGVyIG9uZXMsIGFuZCB0aGUgd3JhcHBlciB3b3VsZCBuZWVkIHRvIGRlYWwgd2l0aCBzY2hlZHVsZXIuCiB9IGtVc2VGYXN0TWl4ZXIgPSBGYXN0TWl4ZXJfU3RhdGljOwogCisvLyBXaGV0aGVyIHRvIHVzZSBmYXN0IGNhcHR1cmUKK3N0YXRpYyBjb25zdCBlbnVtIHsKKyAgICBGYXN0Q2FwdHVyZV9OZXZlciwgIC8vIG5ldmVyIGluaXRpYWxpemUgb3IgdXNlOiBmb3IgZGVidWdnaW5nIG9ubHkKKyAgICBGYXN0Q2FwdHVyZV9BbHdheXMsIC8vIGFsd2F5cyBpbml0aWFsaXplIGFuZCB1c2UsIGV2ZW4gaWYgbm90IG5lZWRlZDogZm9yIGRlYnVnZ2luZyBvbmx5CisgICAgRmFzdENhcHR1cmVfU3RhdGljLCAvLyBpbml0aWFsaXplIGlmIG5lZWRlZCwgdGhlbiB1c2UgYWxsIHRoZSB0aW1lIGlmIGluaXRpYWxpemVkCit9IGtVc2VGYXN0Q2FwdHVyZSA9IEZhc3RDYXB0dXJlX1N0YXRpYzsKKwogLy8gUHJpb3JpdGllcyBmb3IgcmVxdWVzdFByaW9yaXR5CiBzdGF0aWMgY29uc3QgaW50IGtQcmlvcml0eUF1ZGlvQXBwID0gMjsKIHN0YXRpYyBjb25zdCBpbnQga1ByaW9yaXR5RmFzdE1peGVyID0gMzsKK3N0YXRpYyBjb25zdCBpbnQga1ByaW9yaXR5RmFzdENhcHR1cmUgPSAzOwogCiAvLyBJQXVkaW9GbGluZ2VyOjpjcmVhdGVUcmFjaygpIHJlcG9ydHMgYmFjayB0byBjbGllbnQgdGhlIHRvdGFsIHNpemUgb2Ygc2hhcmVkIG1lbW9yeSBhcmVhCiAvLyBmb3IgdGhlIHRyYWNrLiAgVGhlIGNsaWVudCB0aGVuIHN1Yi1kaXZpZGVzIHRoaXMgaW50byBzbWFsbGVyIGJ1ZmZlcnMgZm9yIGl0cyB1c2UuCkBAIC0xNDAsOCArMTU1LDM5IEBACiAvLyBGSVhNRSBJdCB3b3VsZCBiZSBiZXR0ZXIgZm9yIGNsaWVudCB0byB0ZWxsIEF1ZGlvRmxpbmdlciB0aGUgdmFsdWUgb2YgTiwKIC8vIHNvIEF1ZGlvRmxpbmdlciBjb3VsZCBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIG1lbW9yeS4KIC8vIFNlZSB0aGUgY2xpZW50J3MgbWluQnVmQ291bnQgYW5kIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgY2FsY3VsYXRpb25zIGZvciBkZXRhaWxzLgorCisvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiBub3Qgc3BlY2lmaWVkIGJ5IHByb3BlcnR5Lgogc3RhdGljIGNvbnN0IGludCBrRmFzdFRyYWNrTXVsdGlwbGllciA9IDI7CiAKKy8vIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFsbG93ZWQgdmFsdWVzCitzdGF0aWMgY29uc3QgaW50IGtGYXN0VHJhY2tNdWx0aXBsaWVyTWluID0gMTsKK3N0YXRpYyBjb25zdCBpbnQga0Zhc3RUcmFja011bHRpcGxpZXJNYXggPSAyOworCisvLyBUaGUgYWN0dWFsIHZhbHVlIHRvIHVzZSwgd2hpY2ggY2FuIGJlIHNwZWNpZmllZCBwZXItZGV2aWNlIHZpYSBwcm9wZXJ0eSBhZi5mYXN0X3RyYWNrX211bHRpcGxpZXIuCitzdGF0aWMgaW50IHNGYXN0VHJhY2tNdWx0aXBsaWVyID0ga0Zhc3RUcmFja011bHRpcGxpZXI7CisKKy8vIFNlZSBUaHJlYWQ6OnJlYWRPbmx5SGVhcCgpLgorLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCisvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKKy8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgorc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4MjAwMDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgcHRocmVhZF9vbmNlX3Qgc0Zhc3RUcmFja011bHRpcGxpZXJPbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKK3N0YXRpYyB2b2lkIHNGYXN0VHJhY2tNdWx0aXBsaWVySW5pdCgpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoImFmLmZhc3RfdHJhY2tfbXVsdGlwbGllciIsIHZhbHVlLCBOVUxMKSA+IDApIHsKKyAgICAgICAgY2hhciAqZW5kcHRyOworICAgICAgICB1bnNpZ25lZCBsb25nIHVsID0gc3RydG91bCh2YWx1ZSwgJmVuZHB0ciwgMCk7CisgICAgICAgIGlmICgqZW5kcHRyID09ICdcMCcgJiYga0Zhc3RUcmFja011bHRpcGxpZXJNaW4gPD0gdWwgJiYgdWwgPD0ga0Zhc3RUcmFja011bHRpcGxpZXJNYXgpIHsKKyAgICAgICAgICAgIHNGYXN0VHJhY2tNdWx0aXBsaWVyID0gKGludCkgdWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKQEAgLTE4NSw3ICsyMzEsMTEgQEAKIHsKIH0KIAotdm9pZCBDcHVTdGF0czo6c2FtcGxlKGNvbnN0IFN0cmluZzggJnRpdGxlKSB7Cit2b2lkIENwdVN0YXRzOjpzYW1wbGUoY29uc3QgU3RyaW5nOCAmdGl0bGUKKyNpZm5kZWYgREVCVUdfQ1BVX1VTQUdFCisgICAgICAgICAgICAgICAgX191bnVzZWQKKyNlbmRpZgorICAgICAgICApIHsKICNpZmRlZiBERUJVR19DUFVfVVNBR0UKICAgICAvLyBnZXQgY3VycmVudCB0aHJlYWQncyBkZWx0YSBDUFUgdGltZSBpbiB3YWxsIGNsb2NrIG5zCiAgICAgZG91YmxlIHdjTnM7CkBAIC0yNjksOSArMzE5LDkgQEAKICAgICA6ICAgVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLyksCiAgICAgICAgIG1UeXBlKHR5cGUpLAogICAgICAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksCi0gICAgICAgIC8vIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50LCBtRnJhbWVTaXplLCBhbmQgbUZvcm1hdCBhcmUKLSAgICAgICAgLy8gc2V0IGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpIG9yIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgICAgIG1QYXJhbVN0YXR1cyhOT19FUlJPUiksCisgICAgICAgIC8vIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50LCBtRnJhbWVTaXplLCBtRm9ybWF0LCBtQnVmZmVyU2l6ZQorICAgICAgICAvLyBhcmUgc2V0IGJ5IFBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgb3IKKyAgICAgICAgLy8gUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgICAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgdHJ1ZSBoZXJlLiBJcyB0aGlzIHNvbWUga2luZCBvZiBoYWNrPwogICAgICAgICBtU3RhbmRieShmYWxzZSksIG1PdXREZXZpY2Uob3V0RGV2aWNlKSwgbUluRGV2aWNlKGluRGV2aWNlKSwKICAgICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbUlkKGlkKSwKQEAgLTI4MywxMiArMzMzLDggQEAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6flRocmVhZEJhc2UoKQogewogICAgIC8vIG1Db25maWdFdmVudHMgc2hvdWxkIGJlIGVtcHR5LCBidXQganVzdCBpbiBjYXNlIGl0IGlzbid0LCBmcmVlIHRoZSBtZW1vcnkgaXQgb3ducwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBkZWxldGUgbUNvbmZpZ0V2ZW50c1tpXTsKLSAgICB9CiAgICAgbUNvbmZpZ0V2ZW50cy5jbGVhcigpOwogCi0gICAgbVBhcmFtQ29uZC5icm9hZGNhc3QoKTsKICAgICAvLyBkbyBub3QgbG9jayB0aGUgbXV0ZXggaW4gZGVzdHJ1Y3RvcgogICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewpAQCAtMjk3LDYgKzM0MywxNyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWFkeVRvUnVuKCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dJKCJBdWRpb0ZsaW5nZXIncyB0aHJlYWQgJXAgcmVhZHkgdG8gcnVuIiwgdGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk5vIHdvcmtpbmcgYXVkaW8gZHJpdmVyIGZvdW5kLiIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZXhpdCgpCiB7CiAgICAgQUxPR1YoIlRocmVhZEJhc2U6OmV4aXQiKTsKQEAgLTMyOCwxNiArMzg1LDMwIEBACiAgICAgQUxPR1YoIlRocmVhZEJhc2U6OnNldFBhcmFtZXRlcnMoKSAlcyIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBtTmV3UGFyYW1ldGVycy5hZGQoa2V5VmFsdWVQYWlycyk7CisgICAgcmV0dXJuIHNlbmRTZXRQYXJhbWV0ZXJDb25maWdFdmVudF9sKGtleVZhbHVlUGFpcnMpOworfQorCisvLyBzZW5kQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tIHByb2Nlc3NDb25maWdFdmVudHNfbCgpLgorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kQ29uZmlnRXZlbnRfbChzcDxDb25maWdFdmVudD4mIGV2ZW50KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgbUNvbmZpZ0V2ZW50cy5hZGQoZXZlbnQpOworICAgIEFMT0dWKCJzZW5kQ29uZmlnRXZlbnRfbCgpIG51bSBldmVudHMgJWQgZXZlbnQgJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSwgZXZlbnQtPm1UeXBlKTsKICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICAvLyB3YWl0IGNvbmRpdGlvbiB3aXRoIHRpbWVvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGxvb3AgaGFzIGV4aXRlZAotICAgIC8vIGJlZm9yZSB0aGUgcmVxdWVzdCBjb3VsZCBiZSBwcm9jZXNzZWQKLSAgICBpZiAobVBhcmFtQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtTZXRQYXJhbWV0ZXJzVGltZW91dE5zKSA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSBtUGFyYW1TdGF0dXM7Ci0gICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChldmVudC0+bUxvY2spOworICAgICAgICB3aGlsZSAoZXZlbnQtPm1XYWl0U3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoZXZlbnQtPm1Db25kLndhaXRSZWxhdGl2ZShldmVudC0+bUxvY2ssIGtDb25maWdFdmVudFRpbWVvdXROcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICBldmVudC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBldmVudC0+bVN0YXR1czsKICAgICB9CisgICAgbUxvY2subG9jaygpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM1MCw2MiArNDIxLDE1NSBAQAogLy8gc2VuZElvQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0pCiB7Ci0gICAgSW9Db25maWdFdmVudCAqaW9FdmVudCA9IG5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwYXJhbSk7Ci0gICAgbUNvbmZpZ0V2ZW50cy5hZGQoc3RhdGljX2Nhc3Q8Q29uZmlnRXZlbnQgKj4oaW9FdmVudCkpOwotICAgIEFMT0dWKCJzZW5kSW9Db25maWdFdmVudCgpIG51bSBldmVudHMgJWQgZXZlbnQgJWQsIHBhcmFtICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCksIGV2ZW50LAotICAgICAgICAgICAgcGFyYW0pOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwYXJhbSk7CisgICAgc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwogfQogCiAvLyBzZW5kUHJpb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykKIHsKLSAgICBQcmlvQ29uZmlnRXZlbnQgKnByaW9FdmVudCA9IG5ldyBQcmlvQ29uZmlnRXZlbnQocGlkLCB0aWQsIHByaW8pOwotICAgIG1Db25maWdFdmVudHMuYWRkKHN0YXRpY19jYXN0PENvbmZpZ0V2ZW50ICo+KHByaW9FdmVudCkpOwotICAgIEFMT0dWKCJzZW5kUHJpb0NvbmZpZ0V2ZW50X2woKSBudW0gZXZlbnRzICVkIHBpZCAlZCwgdGlkICVkIHByaW8gJWQiLAotICAgICAgICAgIG1Db25maWdFdmVudHMuc2l6ZSgpLCBwaWQsIHRpZCwgcHJpbyk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IFByaW9Db25maWdFdmVudChwaWQsIHRpZCwgcHJpbyk7CisgICAgc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50cygpCisvLyBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpCiB7Ci0gICAgbUxvY2subG9jaygpOwotICAgIHdoaWxlICghbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoInByb2Nlc3NDb25maWdFdmVudHMoKSByZW1haW5pbmcgZXZlbnRzICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCkpOwotICAgICAgICBDb25maWdFdmVudCAqZXZlbnQgPSBtQ29uZmlnRXZlbnRzWzBdOwotICAgICAgICBtQ29uZmlnRXZlbnRzLnJlbW92ZUF0KDApOwotICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSBsb2NraW5nIEF1ZGlvRmxpbmdlciBtTG9jazogbG9jayBvcmRlciBpcyBhbHdheXMKLSAgICAgICAgLy8gQXVkaW9GbGluZ2VyIHRoZW4gVGhyZWFkQmFzZSB0byBhdm9pZCBjcm9zcyBkZWFkbG9jawotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgc3dpdGNoKGV2ZW50LT50eXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1BSSU86IHsKLSAgICAgICAgICAgICAgICBQcmlvQ29uZmlnRXZlbnQgKnByaW9FdmVudCA9IHN0YXRpY19jYXN0PFByaW9Db25maWdFdmVudCAqPihldmVudCk7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgTmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGhhcyBiZSBkb25lIGFzeW5jaHJvbm91c2x5Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShwcmlvRXZlbnQtPnBpZCgpLCBwcmlvRXZlbnQtPnRpZCgpLCBwcmlvRXZlbnQtPnByaW8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvRXZlbnQtPnByaW8oKSwgcHJpb0V2ZW50LT5waWQoKSwgcHJpb0V2ZW50LT50aWQoKSwgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDRkdfRVZFTlRfSU86IHsKLSAgICAgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50ICppb0V2ZW50ID0gc3RhdGljX2Nhc3Q8SW9Db25maWdFdmVudCAqPihldmVudCk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGlvRXZlbnQtPmV2ZW50KCksIGlvRXZlbnQtPnBhcmFtKCkpOwotICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQUxPR0UoInByb2Nlc3NDb25maWdFdmVudHMoKSB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+dHlwZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgZXZlbnQ7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50KGtleVZhbHVlUGFpcik7CisgICAgcmV0dXJuIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoKnBhdGNoLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqKWNvbmZpZ0V2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgKmhhbmRsZSA9IGRhdGEtPm1IYW5kbGU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoaGFuZGxlKTsKKyAgICByZXR1cm4gc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOworfQorCisKKy8vIHBvc3QgY29uZGl0aW9uOiBtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHNfbCgpCit7CisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIW1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSByZW1haW5pbmcgZXZlbnRzICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCkpOworICAgICAgICBzcDxDb25maWdFdmVudD4gZXZlbnQgPSBtQ29uZmlnRXZlbnRzWzBdOworICAgICAgICBtQ29uZmlnRXZlbnRzLnJlbW92ZUF0KDApOworICAgICAgICBzd2l0Y2ggKGV2ZW50LT5tVHlwZSkgeworICAgICAgICBjYXNlIENGR19FVkVOVF9QUklPOiB7CisgICAgICAgICAgICBQcmlvQ29uZmlnRXZlbnREYXRhICpkYXRhID0gKFByaW9Db25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICAvLyBGSVhNRSBOZWVkIHRvIHVuZGVyc3RhbmQgd2h5IHRoaXMgaGFzIHRvIGJlIGRvbmUgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoZGF0YS0+bVBpZCwgZGF0YS0+bVRpZCwgZGF0YS0+bVByaW8sCisgICAgICAgICAgICAgICAgICAgIHRydWUgLyphc3luY2hyb25vdXMqLyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUHJpbywgZGF0YS0+bVBpZCwgZGF0YS0+bVRpZCwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfSU86IHsKKyAgICAgICAgICAgIElvQ29uZmlnRXZlbnREYXRhICpkYXRhID0gKElvQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGRhdGEtPm1FdmVudCwgZGF0YS0+bVBhcmFtKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfU0VUX1BBUkFNRVRFUjogeworICAgICAgICAgICAgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICpkYXRhID0gKFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGRhdGEtPm1LZXlWYWx1ZVBhaXJzLCBldmVudC0+bVN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaF9sKGRhdGEtPm1IYW5kbGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGV2ZW50LT5tTG9jayk7CisgICAgICAgICAgICBpZiAoZXZlbnQtPm1XYWl0U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1Db25kLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWX0lGKG1Db25maWdFdmVudHMuaXNFbXB0eSgpLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgRE9ORSB0aHJlYWQgJXAiLCB0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoY29uZmlnQ2hhbmdlZCkgeworICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOworICAgIH0KK30KKworU3RyaW5nOCBjaGFubmVsTWFza1RvU3RyaW5nKGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2ssIGJvb2wgb3V0cHV0KSB7CisgICAgU3RyaW5nOCBzOworICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtbGVmdC1vZi1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LXJpZ2h0LW9mLWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJiYWNrLWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUKSBzLmFwcGVuZCgic2lkZS1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKSBzLmFwcGVuZCgic2lkZS1yaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUikgcy5hcHBlbmQoInRvcC1jZW50ZXIgLCIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgidG9wLWZyb250LWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7CisgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFQpIHMuYXBwZW5kKCJyaWdodCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVCkgcy5hcHBlbmQoImZyb250LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0spIHMuYXBwZW5kKCJiYWNrLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgibGVmdC1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUklHSFRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgicmlnaHQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCkgcy5hcHBlbmQoImZyb250LXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1BST0NFU1NFRCkgcy5hcHBlbmQoImJhY2stcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1BSRVNTVVJFKSBzLmFwcGVuZCgicHJlc3N1cmUsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CisgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOworICAgIH0KKyAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICBpZiAocy5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgY2hhciAqc3RyID0gcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTQxMyw0OCArNTc3LDMyIEBACiAKICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwogICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgZHByaW50ZihmZCwgInRocmVhZCAlcCBtYXliZSBkZWFkIGxvY2tlZFxuIiwgdGhpcyk7CiAgICAgfQogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiaW8gaGFuZGxlOiAlZFxuIiwgbUlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVElEOiAlZFxuIiwgZ2V0VGlkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdGFuZGJ5OiAlZFxuIiwgbVN0YW5kYnkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTYW1wbGUgcmF0ZTogJXVcbiIsIG1TYW1wbGVSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSEFMIGZyYW1lIGNvdW50OiAlenVcbiIsIG1GcmFtZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIE1hc2s6IDB4JTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZyYW1lIHNpemU6ICV6dVxuIiwgbUZyYW1lU2l6ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5QZW5kaW5nIHNldFBhcmFtZXRlcnMgY29tbWFuZHM6IFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiBJbmRleCBDb21tYW5kIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV3UGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiAlMDJ6dSAgICAiLCBpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG1OZXdQYXJhbWV0ZXJzW2ldKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJL08gaGFuZGxlOiAlZFxuIiwgbUlkKTsKKyAgICBkcHJpbnRmKGZkLCAiICBUSUQ6ICVkXG4iLCBnZXRUaWQoKSk7CisgICAgZHByaW50ZihmZCwgIiAgU3RhbmRieTogJXNcbiIsIG1TdGFuZGJ5ID8gInllcyIgOiAibm8iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTYW1wbGUgcmF0ZTogJXVcbiIsIG1TYW1wbGVSYXRlKTsKKyAgICBkcHJpbnRmKGZkLCAiICBIQUwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbUZyYW1lQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIEhBTCBidWZmZXIgc2l6ZTogJXUgYnl0ZXNcbiIsIG1CdWZmZXJTaXplKTsKKyAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIENvdW50OiAldVxuIiwgbUNoYW5uZWxDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBNYXNrOiAweCUwOHggKCVzKVxuIiwgbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtQ2hhbm5lbE1hc2ssIG1UeXBlICE9IFJFQ09SRCkuc3RyaW5nKCkpOworICAgIGRwcmludGYoZmQsICIgIEZvcm1hdDogMHgleCAoJXMpXG4iLCBtSEFMRm9ybWF0LCBmb3JtYXRUb1N0cmluZyhtSEFMRm9ybWF0KSk7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWUgc2l6ZTogJXp1XG4iLCBtRnJhbWVTaXplKTsKKyAgICBkcHJpbnRmKGZkLCAiICBQZW5kaW5nIGNvbmZpZyBldmVudHM6Iik7CisgICAgc2l6ZV90IG51bUNvbmZpZyA9IG1Db25maWdFdmVudHMuc2l6ZSgpOworICAgIGlmIChudW1Db25maWcpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db25maWc7IGkrKykgeworICAgICAgICAgICAgbUNvbmZpZ0V2ZW50c1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuICAgICVzIiwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBkcHJpbnRmKGZkLCAiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuXG5QZW5kaW5nIGNvbmZpZyBldmVudHM6IFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbmZpZ0V2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBtQ29uZmlnRXZlbnRzW2ldLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICB9CkBAIC00NjYsMTAgKzYxNCwxMSBAQAogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4tICV6dSBFZmZlY3QgQ2hhaW5zOlxuIiwgbUVmZmVjdENoYWlucy5zaXplKCkpOworICAgIHNpemVfdCBudW1FZmZlY3RDaGFpbnMgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICV6dSBFZmZlY3QgQ2hhaW5zXG4iLCBudW1FZmZlY3RDaGFpbnMpOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWZmZWN0Q2hhaW5zOyArK2kpIHsKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUVmZmVjdENoYWluc1tpXTsKICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgIGNoYWluLT5kdW1wKGZkLCBhcmdzKTsKQEAgLTUxMywxMiArNjYyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKICAgICAgICAgICAgICAgICAgICAgZ2V0V2FrZUxvY2tUYWcoKSwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIiksCi0gICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICBnZXRXYWtlTG9ja1RhZygpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CkBAIC01MzgsNyArNjg5LDggQEAKICAgICBpZiAobVdha2VMb2NrVG9rZW4gIT0gMCkgewogICAgICAgICBBTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1OYW1lKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQpAQCAtNTc0LDcgKzcyNiw4IEBACiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSk7CisgICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtTmFtZSwgc3RhdHVzKTsKICAgICB9CiB9CkBAIC01ODYsNyArNzM5LDcgQEAKICAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtNzM5LDggKzg5Miw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cwotICAgICAgICApCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CkBAIC03NTYsNiArOTA4LDI0IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBEaXJlY3Qgb3V0cHV0IHRocmVhZHMgZm9yIG5vdywgc2luY2UgdGhlIGZvcm1hdCBvZgorICAgIC8vIG1TaW5rQnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlZmZlY3QgcHJvY2Vzc2luZyAoUENNIDE2IHN0ZXJlbykuCisgICAgaWYgKG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGVmZmVjdCAlcyBvbiBEaXJlY3Qgb3V0cHV0IHR5cGUgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtTmFtZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBvciBkdXBsaWNhdGluZyBtdWx0aWNoYW5uZWwgc2lua3MuCisgICAgLy8gVE9ETzogZml4IGJvdGggZm9ybWF0IGFuZCBtdWx0aWNoYW5uZWwgaXNzdWVzIHdpdGggZWZmZWN0cy4KKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpICVzIHRocmVhZHMiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UeXBlID09IE1JWEVSID8gIk1JWEVSIiA6ICJEVVBMSUNBVElORyIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgLy8gQWxsb3cgZ2xvYmFsIGVmZmVjdHMgb25seSBvbiBvZmZsb2FkZWQgYW5kIG1peGVyIHRocmVhZHMKICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICBzd2l0Y2ggKG1UeXBlKSB7CkBAIC04MjksNyArOTk5LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBoYW5kbGUgYW5kIGNvbm5lY3QgaXQgdG8gZWZmZWN0IG1vZHVsZQogICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5KTsKLSAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgKmVuYWJsZWQgPSAoaW50KWVmZmVjdC0+aXNFbmFibGVkKCk7CiAgICAgICAgIH0KQEAgLTg1MCw5ICsxMDIzLDcgQEAKICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCi0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC05NzYsMjEgKzExNDcsMTggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkaXNjb25uZWN0RWZmZWN0KGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVucGluSWZMYXN0KSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJkaXNjb25uZWN0RWZmZWN0KCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKLSAgICAvLyBkZWxldGUgdGhlIGVmZmVjdCBtb2R1bGUgaWYgcmVtb3ZpbmcgbGFzdCBoYW5kbGUgb24gaXQKLSAgICBpZiAoZWZmZWN0LT5yZW1vdmVIYW5kbGUoaGFuZGxlKSA9PSAwKSB7Ci0gICAgICAgIGlmICghZWZmZWN0LT5pc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7Ci0gICAgICAgICAgICByZW1vdmVFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOworICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBjb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgY29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwMSw4ICsxMTY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUpCiAgICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgZGV2aWNlLCBBVURJT19ERVZJQ0VfTk9ORSwgdHlwZSksCi0gICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtTWl4QnVmZmVyKE5VTEwpLAotICAgICAgICBtQWxsb2NNaXhCdWZmZXIoTlVMTCksIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCisgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtU2lua0J1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQoZmFsc2UpLAorICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1FZmZlY3RCdWZmZXIoTlVMTCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplKDApLAorICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkKGZhbHNlKSwKKyAgICAgICAgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbU91dHB1dChvdXRwdXQpLApAQCAtMTA0NCwxMSArMTIyMiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICAvLyBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVF0gaXMgaW5pdGlhbGl6ZWQgYnkgc3RyZWFtX3R5cGVfdCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgLy8gVGhlcmUgaXMgbm8gQVVESU9fU1RSRUFNX01JTiwgYW5kICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKLSAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbVZvbHVtZV9sKHN0cmVhbSk7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1NdXRlX2woc3RyZWFtKTsKQEAgLTEwNjAsNyArMTIzOCw5IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp+UGxheWJhY2tUaHJlYWQoKQogewogICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKLSAgICBkZWxldGUgW10gbUFsbG9jTWl4QnVmZmVyOworICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtMTA3MCwxMyArMTI1MCwxMyBAQAogICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk91dHB1dCB0aHJlYWQgJXAgc3RyZWFtIHZvbHVtZXMgaW4gZEI6XG4gICAgIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyArK2kpIHsKICAgICAgICAgY29uc3Qgc3RyZWFtX3R5cGVfdCAqc3QgPSAmbVN0cmVhbVR5cGVzW2ldOwogICAgICAgICBpZiAoaSA+IDApIHsKQEAgLTEwOTEsNzUgKzEyNzEsNjggQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogICAgIHJlc3VsdC5jbGVhcigpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIC8vIFRoZXNlIHZhbHVlcyBhcmUgInJhdyI7IHRoZXkgd2lsbCB3cmFwIGFyb3VuZC4gIFNlZSBwcmVwYXJlVHJhY2tzX2woKSBmb3IgYSBiZXR0ZXIgd2F5LgogICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoMCk7Ci0gICAgZHByaW50ZihmZCwgIk5vcm1hbCBtaXhlciByYXcgdW5kZXJydW4gY291bnRlcnM6IHBhcnRpYWw9JXUgZW1wdHk9JXVcbiIsCisgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIG1peGVyIHJhdyB1bmRlcnJ1biBjb3VudGVyczogcGFydGlhbD0ldSBlbXB0eT0ldVxuIiwKICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsLCB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkpOworCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBudW1hY3RpdmUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICBkcHJpbnRmKGZkLCAiICAlZCBUcmFja3MiLCBudW10cmFja3MpOworICAgIHNpemVfdCBudW1hY3RpdmVzZWVuID0gMDsKKyAgICBpZiAobnVtdHJhY2tzKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJWQgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKKyAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUgPSBtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spID49IDA7CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBudW1hY3RpdmVzZWVuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgYWN0aXZlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgLy8gc29tZSB0cmFja3MgaW4gdGhlIGFjdGl2ZSBsaXN0IHdlcmUgbm90IGluIHRoZSB0cmFja3MgbGlzdAorICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgorICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICh0cmFjayAhPSAwICYmIG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0IHRocmVhZCAlcCBpbnRlcm5hbHNcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJsYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCi0gICAgICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJ0b3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiZGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImJsb2NrZWQgaW4gd3JpdGU6ICVkXG4iLCBtSW5Xcml0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInN1c3BlbmQgY291bnQ6ICVkXG4iLCBtU3VzcGVuZGVkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibWl4IGJ1ZmZlciA6ICVwXG4iLCBtTWl4QnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZHByaW50ZihmZCwgIkZhc3QgdHJhY2sgYXZhaWxNYXNrPSUjeFxuIiwgbUZhc3RUcmFja0F2YWlsTWFzayk7CisgICAgZHByaW50ZihmZCwgIlxuT3V0cHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOworICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBmcmFtZSBjb3VudDogJXp1XG4iLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgTGFzdCB3cml0ZSBvY2N1cnJlZCAobXNlY3MpOiAlbGx1XG4iLCBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOworICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOworICAgIGRwcmludGYoZmQsICIgIERlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOworICAgIGRwcmludGYoZmQsICIgIEJsb2NrZWQgaW4gd3JpdGU6ICVzXG4iLCBtSW5Xcml0ZSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgU3VzcGVuZCBjb3VudDogJWRcbiIsIG1TdXNwZW5kZWQpOworICAgIGRwcmludGYoZmQsICIgIFNpbmsgYnVmZmVyIDogJXBcbiIsIG1TaW5rQnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBNaXhlciBidWZmZXI6ICVwXG4iLCBtTWl4ZXJCdWZmZXIpOworICAgIGRwcmludGYoZmQsICIgIEVmZmVjdCBidWZmZXI6ICVwXG4iLCBtRWZmZWN0QnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrIGF2YWlsTWFzaz0lI3hcbiIsIG1GYXN0VHJhY2tBdmFpbE1hc2spOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCiAvLyBUaHJlYWQgdmlydHVhbHMKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWR5VG9SdW4oKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0koIkF1ZGlvRmxpbmdlcidzIHRocmVhZCAlcCByZWFkeSB0byBydW4iLCB0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiTm8gd29ya2luZyBhdWRpbyBkcml2ZXIgZm91bmQuIik7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25GaXJzdFJlZigpCiB7CkBAIC0xMTgyLDcgKzEzNTUsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCkBAIC0xMTkwLDYgKzEzNjMsNyBAQAogICAgICAgICBpbnQgdWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogeworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OwogICAgIHNwPFRyYWNrPiB0cmFjazsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogCkBAIC0xMjE1LDkgKzEzODksMTAgQEAKICAgICAgICAgICAgICkgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKLSAgICAgICAgICAgIC8vIG1vbm8gb3Igc3RlcmVvCi0gICAgICAgICAgICAoIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB8fAotICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSApICYmCisgICAgICAgICAgICAvLyBpZGVudGljYWwgY2hhbm5lbCBtYXNrIHRvIHNpbmssIG9yIG1vbm8gaW4gYW5kIHN0ZXJlbyBzaW5rCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCiAgICAgICAgICAgICAvLyBub3JtYWwgbWl4ZXIgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBtaXhlcgpAQCAtMTIyOSwxNSArMTQwNCwyMSBAQAogICAgICAgICApIHsKICAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzIHRvIGZhc3QgbWl4ZXIgKEhBTCkgZnJhbWUgY291bnQKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICoga0Zhc3RUcmFja011bHRpcGxpZXI7CisgICAgICAgICAgICAvLyByZWFkIHRoZSBmYXN0IHRyYWNrIG11bHRpcGxpZXIgcHJvcGVydHkgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkCisgICAgICAgICAgICBpbnQgb2sgPSBwdGhyZWFkX29uY2UoJnNGYXN0VHJhY2tNdWx0aXBsaWVyT25jZSwgc0Zhc3RUcmFja011bHRpcGxpZXJJbml0KTsKKyAgICAgICAgICAgIGlmIChvayAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHB0aHJlYWRfb25jZSBmYWlsZWQ6ICVkIiwgX19mdW5jX18sIG9rKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIHNGYXN0VHJhY2tNdWx0aXBsaWVyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSVkIG1GcmFtZUNvdW50PSVkIiwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGlzVGltZWQ9JWQgc2hhcmVkQnVmZmVyPSVwIGZyYW1lQ291bnQ9JWQgIgotICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JWQgaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgorICAgICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lZCBmb3JtYXQ9JSN4IG1Gb3JtYXQ9JSN4IGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCAiCisgICAgICAgICAgICAgICAgInNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgogICAgICAgICAgICAgICAgICJoYXNGYXN0TWl4ZXI9JWQgdGlkPSVkIGZhc3RUcmFja0F2YWlsTWFzaz0lI3giLAotICAgICAgICAgICAgICAgIGlzVGltZWQsIHNoYXJlZEJ1ZmZlci5nZXQoKSwgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBpc1RpbWVkLCBzaGFyZWRCdWZmZXIuZ2V0KCksIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBmb3JtYXQsIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLAogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFzRmFzdE1peGVyKCksIHRpZCwgbUZhc3RUcmFja0F2YWlsTWFzayk7CiAgICAgICAgICpmbGFncyAmPSB+SUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKQEAgLTEyNTYsNDQgKzE0MzcsNTIgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogCi0gICAgaWYgKG1UeXBlID09IERJUkVDVCkgewotICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pIHsKKyAgICBzd2l0Y2ggKG1UeXBlKSB7CisKKyAgICBjYXNlIERJUkVDVDoKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICV1IGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJXUgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglMDh4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT0ZGTE9BRDoKICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbE1hc2sgIT0gbUNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJWQgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAweCUwOHggXCIiCi0gICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCUwOHggXCIiCisgICAgICAgICAgICAgICAgICAgICJmb3Igb3V0cHV0ICVwIHdpdGggZm9ybWF0ICUjeCIsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgIT0gQVVESU9fRk9STUFUX1BDTSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogZm9ybWF0ICVkIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJSN4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiBtU2FtcGxlUmF0ZSoyKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID4gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKICAgICAgICAgICAgIEFMT0dFKCJTYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2U6ICV1IG1TYW1wbGVSYXRlICV1Iiwgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQorICAgICAgICBicmVhazsKKwogICAgIH0KIAogICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW8gZHJpdmVyIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKQEAgLTEzMDYsNyArMTQ5NSw3IEBACiAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbVR5cGUpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbVRyYWNrc1tpXTsKLSAgICAgICAgICAgIGlmICh0ICE9IDAgJiYgIXQtPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiB0LT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdHVhbCA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSh0LT5zdHJlYW1UeXBlKCkpOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdC0+c2Vzc2lvbklkKCkgJiYgc3RyYXRlZ3kgIT0gYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgbWlzbWF0Y2hlZCBzdHJhdGVneTsgZXhwZWN0ZWQgJXUgYnV0IGZvdW5kICV1IiwKQEAgLTEzMTksMTggKzE1MDgsMjEgQEAKIAogICAgICAgICBpZiAoIWlzVGltZWQpIHsKICAgICAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBOVUxMLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFjayA9IFRpbWVkVHJhY2s6OmNyZWF0ZSh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHRyYWNrID09IDAgfHwgdHJhY2stPmdldENibGsoKSA9PSBOVUxMIHx8IHRyYWNrLT5uYW1lKCkgPCAwKSB7Ci0gICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAvLyBuZXcgVHJhY2sgYWx3YXlzIHJldHVybnMgbm9uLU5VTEwsCisgICAgICAgIC8vIGJ1dCBUaW1lZFRyYWNrOjpjcmVhdGUoKSBpcyBhIGZhY3RvcnkgdGhhdCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBOVUxMCisgICAgICAgIGxTdGF0dXMgPSB0cmFjayAhPSAwID8gdHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CisgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIGluaXRDaGVjayBmYWlsZWQgJWQ7IG5vIGNvbnRyb2wgYmxvY2s/IiwgbFN0YXR1cyk7CiAgICAgICAgICAgICAvLyB0cmFjayBtdXN0IGJlIGNsZWFyZWQgZnJvbSB0aGUgY2FsbGVyIGFzIHRoZSBjYWxsZXIgaGFzIHRoZSBBRiBsb2NrCiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KLQogICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7CiAKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOwpAQCAtMTM1Miw5ICsxNTQ0LDcgQEAKICAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrOwogfQogCkBAIC0xNDMyLDcgKzE2MjIsNyBAQAogICAgICAgICAvLyB0aGUgdHJhY2sgaXMgbmV3bHkgYWRkZWQsIG1ha2Ugc3VyZSBpdCBmaWxscyB1cCBhbGwgaXRzCiAgICAgICAgIC8vIGJ1ZmZlcnMgYmVmb3JlIHBsYXlpbmcuIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBjbGllbnQgd2lsbAogICAgICAgICAvLyBlZmZlY3RpdmVseSBnZXQgdGhlIGxhdGVuY3kgaXQgcmVxdWVzdGVkLgotICAgICAgICBpZiAoIXRyYWNrLT5pc091dHB1dFRyYWNrKCkpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBzdGF0ZSA9IHRyYWNrLT5tU3RhdGU7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CkBAIC0xNDczLDkgKzE2NjMsNyBAQAogICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9CiAKLSAgICBBTE9HVigic2lnbmFsIHBsYXliYWNrIHRocmVhZCIpOwotICAgIGJyb2FkY2FzdF9sKCk7Ci0KKyAgICBvbkFkZE5ld1RyYWNrX2woKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNDg3LDcgKzE2NzUsNyBAQAogICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgaWYgKCF0cmFja0FjdGl2ZSkgewogICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpIHx8IHRyYWNrLT5pc09mZmxvYWRlZCgpKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSB8fCB0cmFjay0+aXNPZmZsb2FkZWQoKSB8fCB0cmFjay0+aXNEaXJlY3QoKSkgewogICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwogICAgIH0KIApAQCAtMTUzOCwxMiArMTcyNiwxMSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLS8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtKSB7CiAgICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKICAgICB2b2lkICpwYXJhbTIgPSBOVUxMOwogCi0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbCwgdGhyZWFkICVwLCBldmVudCAlZCwgcGFyYW0gJWQiLCB0aGlzLCBldmVudCwKKyAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCwgcGFyYW0gJWQiLCB0aGlzLCBldmVudCwKICAgICAgICAgICAgIHBhcmFtKTsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKQEAgLTE1NTQsNyArMTc0MSw3IEBACiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQ7IC8vIEZJWE1FIHNlZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90KQotICAgICAgICBkZXNjLmxhdGVuY3kgPSBsYXRlbmN5KCk7CisgICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwogICAgICAgICBwYXJhbTIgPSAmZGVzYzsKICAgICAgICAgYnJlYWs7CiAKQEAgLTE1NjQsNyArMTc1MSw3IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d3JpdGVDYWxsYmFjaygpCkBAIC0xNjAxLDcgKzE3ODgsNyBAQAogCiAvLyBzdGF0aWMKIGludCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKIHsKICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICptZSA9IChBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICopY29va2llOwpAQCAtMTYyMCwyOSArMTgwNywzMyBAQAogICAgIHJldHVybiAwOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiB7Ci0gICAgLy8gdW5mb3J0dW5hdGVseSB3ZSBoYXZlIG5vIHdheSBvZiByZWNvdmVyaW5nIGZyb20gZXJyb3JzIGhlcmUsIGhlbmNlIHRoZSBMT0dfRkFUQUwKKyAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19BTFdBWVNfRkFUQUwKICAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwobUNoYW5uZWxNYXNrKSkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOwogICAgIH0KLSAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyAiCi0gICAgICAgICAgICAgICAgIm11c3QgYmUgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKQorICAgICAgICAgICAgJiYgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQiLAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQotICAgIG1DaGFubmVsQ291bnQgPSBwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwotICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOworICAgIG1IQUxGb3JtYXQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQobUZvcm1hdCkpIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICVkIG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgZm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsCisgICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykKKyAgICAgICAgICAgICYmICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChtRm9ybWF0KSkgeworICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCiAgICAgICAgICAgICAgICAgbUZvcm1hdCk7CiAgICAgfQotICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fZnJhbWVfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1GcmFtZUNvdW50ID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbikgLyBtRnJhbWVTaXplOworICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKKyAgICBtQnVmZmVyU2l6ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZUNvdW50ID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChtRnJhbWVDb3VudCAmIDE1KSB7CiAgICAgICAgIEFMT0dXKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplIGlzICV1IGZyYW1lcyBidXQgQXVkaW9NaXhlciByZXF1aXJlcyBtdWx0aXBsZXMgb2YgMTYgZnJhbWVzIiwKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CkBAIC0xNjU3LDEyICsxODQ4LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDYWxjdWxhdGUgc2l6ZSBvZiBub3JtYWwgbWl4IGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQorICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBzaW5rIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQogICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gMS4wOwogICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAoa1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfU3RhdGljIHx8CiAgICAgICAgICAgICBrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9EeW5hbWljKSkgewotICAgICAgICBzaXplX3QgbWluTm9ybWFsRnJhbWVDb3VudCA9IChrTWluTm9ybWFsTWl4QnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKLSAgICAgICAgc2l6ZV90IG1heE5vcm1hbEZyYW1lQ291bnQgPSAoa01heE5vcm1hbE1peEJ1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgIHNpemVfdCBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKGtNaW5Ob3JtYWxTaW5rQnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgc2l6ZV90IG1heE5vcm1hbEZyYW1lQ291bnQgPSAoa01heE5vcm1hbFNpbmtCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOwogICAgICAgICAvLyByb3VuZCB1cCBtaW5pbXVtIGFuZCByb3VuZCBkb3duIG1heGltdW0gdG8gbmVhcmVzdCAxNiBmcmFtZXMgdG8gc2F0aXNmeSBBdWRpb01peGVyCiAgICAgICAgIG1pbk5vcm1hbEZyYW1lQ291bnQgPSAobWluTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKICAgICAgICAgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IG1heE5vcm1hbEZyYW1lQ291bnQgJiB+MTU7CkBAIC0xNjgwLDcgKzE4NzEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gcHJlZmVyIGFuIGV2ZW4gbXVsdGlwbGllciwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBkb3VibGluZyBvZiBmYXN0IHRyYWNrcyBkdWUgdG8gSEFMCi0gICAgICAgICAgICAvLyBTUkMgKGl0IHdvdWxkIGJlIHVudXN1YWwgZm9yIHRoZSBub3JtYWwgbWl4IGJ1ZmZlciBzaXplIHRvIG5vdCBiZSBhIG11bHRpcGxlIG9mIGZhc3QKKyAgICAgICAgICAgIC8vIFNSQyAoaXQgd291bGQgYmUgdW51c3VhbCBmb3IgdGhlIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplIHRvIG5vdCBiZSBhIG11bHRpcGxlIG9mIGZhc3QKICAgICAgICAgICAgIC8vIHRyYWNrLCBidXQgd2Ugc29tZXRpbWVzIGhhdmUgdG8gZG8gdGhpcyB0byBzYXRpc2Z5IHRoZSBtYXhpbXVtIGZyYW1lIGNvdW50CiAgICAgICAgICAgICAvLyBjb25zdHJhaW50KQogICAgICAgICAgICAgLy8gRklYTUUgdGhpcyByb3VuZGluZyB1cCBzaG91bGQgbm90IGJlIGRvbmUgaWYgbm8gSEFMIFNSQwpAQCAtMTY5NSwxOSArMTg4Niw0MyBAQAogICAgIH0KICAgICBtTm9ybWFsRnJhbWVDb3VudCA9IG11bHRpcGxpZXIgKiBtRnJhbWVDb3VudDsKICAgICAvLyByb3VuZCB1cCB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKLSAgICBtTm9ybWFsRnJhbWVDb3VudCA9IChtTm9ybWFsRnJhbWVDb3VudCArIDE1KSAmIH4xNTsKLSAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAldSBmcmFtZXMsIG5vcm1hbCBtaXggYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCisgICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSB7CisgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gKG1Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OworICAgIH0KKyAgICBBTE9HSSgiSEFMIG91dHB1dCBidWZmZXIgc2l6ZSAldSBmcmFtZXMsIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplICV1IGZyYW1lcyIsIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQpOwogCi0gICAgZGVsZXRlW10gbUFsbG9jTWl4QnVmZmVyOwotICAgIHNpemVfdCBhbGlnbiA9IChtRnJhbWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSA/IHNpemVvZihpbnQxNl90KSA6IG1GcmFtZVNpemU7Ci0gICAgbUFsbG9jTWl4QnVmZmVyID0gbmV3IGludDhfdFttTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemUgKyBhbGlnbiAtIDFdOwotICAgIG1NaXhCdWZmZXIgPSAoaW50MTZfdCAqKSAoKCgoc2l6ZV90KW1BbGxvY01peEJ1ZmZlciArIGFsaWduIC0gMSkgLyBhbGlnbikgKiBhbGlnbik7Ci0gICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgLy8gbVNpbmtCdWZmZXIgaXMgdGhlIHNpbmsgYnVmZmVyLiAgU2l6ZSBpcyBhbHdheXMgbXVsdGlwbGUtb2YtMTYgZnJhbWVzLgorICAgIC8vIE9yaWdpbmFsbHkgdGhpcyB3YXMgaW50MTZfdFtdIGFycmF5LCBuZWVkIHRvIHJlbW92ZSBsZWdhY3kgaW1wbGljYXRpb25zLgorICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKKyAgICAvLyBGb3Igc2luayBidWZmZXIgc2l6ZSwgd2UgdXNlIHRoZSBmcmFtZSBzaXplIGZyb20gdGhlIGRvd25zdHJlYW0gc2luayB0byBhdm9pZCBwcm9ibGVtcworICAgIC8vIHdpdGggbm9uIFBDTSBmb3JtYXRzIGZvciBjb21wcmVzc2VkIG11c2ljLCBlLmcuIEFBQywgYW5kIE9mZmxvYWQgdGhyZWFkcy4KKyAgICBjb25zdCBzaXplX3Qgc2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOworCisgICAgLy8gV2UgcmVzaXplIHRoZSBtTWl4ZXJCdWZmZXIgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHNpbmsgYnVmZmVyIHdoaWNoCisgICAgLy8gZHJpdmVzIHRoZSBvdXRwdXQuCisgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gYWxzbyB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOworICAgIH0KKyAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOworICAgIG1FZmZlY3RCdWZmZXIgPSBOVUxMOworICAgIGlmIChtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIE5vdGU6IEVmZmVjdHMgc3VwcG9ydCAxNmIgb25seQorICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRWZmZWN0QnVmZmVyRm9ybWF0KTsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CisgICAgfQogCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKLSAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVycygpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgorICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKICAgICAvLyBidXQgaW4gdGhpcyBjYXNlIG5vdGhpbmcgaXMgZG9uZSBiZWxvdyBhcyBubyBhdWRpbyBzZXNzaW9ucyBoYXZlIGVmZmVjdCB5ZXQgc28gaXQgZG9lc24ndAogICAgIC8vIG1hdHRlci4KICAgICAvLyBjcmVhdGUgYSBjb3B5IG9mIG1FZmZlY3RDaGFpbnMgYXMgY2FsbGluZyBtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbiByZW9yZGVyIHNvbWUgZWZmZWN0IGNoYWlucwpAQCAtMTg0MSwxMCArMjA1NiwxMCBAQAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKICAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewogICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICghdHJhY2stPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCiAgICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKQEAgLTE4ODIsMTIgKzIwOTcsMTMgQEAKICAgICBtTGFzdFdyaXRlVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBtSW5Xcml0ZSA9IHRydWU7CiAgICAgc3NpemVfdCBieXRlc1dyaXR0ZW47CisgICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmc7CiAKICAgICAvLyBJZiBhbiBOQkFJTyBzaW5rIGlzIHByZXNlbnQsIHVzZSBpdCB0byB3cml0ZSB0aGUgbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSNkZWZpbmUgbUJpdFNoaWZ0IDIgLy8gRklYTUUKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gbUJ5dGVzUmVtYWluaW5nID4+IG1CaXRTaGlmdDsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IChtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nKSA+PiAxOworCisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IG1CeXRlc1JlbWFpbmluZyAvIG1GcmFtZVNpemU7CisKICAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOwogICAgICAgICAvLyB1cGRhdGUgdGhlIHNldHBvaW50IHdoZW4gQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGUgY2hhbmdlcwogICAgICAgICB1aW50MzJfdCBzY3JlZW5TdGF0ZSA9IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwpAQCAtMTg5OSwxMCArMjExNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKHBpcGUtPm1heEZyYW1lcygpICogNykgLyA4IDogbU5vcm1hbEZyYW1lQ291bnQgKiAyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+d3JpdGUobU1peEJ1ZmZlciArIG9mZnNldCwgY291bnQpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+d3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgY291bnQpOwogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewotICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiA8PCBtQml0U2hpZnQ7CisgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTE5MTEsMTMgKzIxMjcsMTQgQEAKICAgICAgICAgICAgIHNpemVfdCB0b3RhbEZyYW1lc1dyaXR0ZW4gPSBtTm9ybWFsU2luay0+ZnJhbWVzV3JpdHRlbigpOwogICAgICAgICAgICAgaWYgKHRvdGFsRnJhbWVzV3JpdHRlbiA+PSBtTGF0Y2hELm1UaW1lc3RhbXAubVBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgbUxhdGNoRC5tVW5wcmVzZW50ZWRGcmFtZXMgPSB0b3RhbEZyYW1lc1dyaXR0ZW4gLSBtTGF0Y2hELm1UaW1lc3RhbXAubVBvc2l0aW9uOworICAgICAgICAgICAgICAgIC8vIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkIGlzIHNldCBpbW1lZGlhdGVseSBiZWZvcmUgRCBpcyBjbG9ja2VkIGludG8gUQogICAgICAgICAgICAgICAgIG1MYXRjaERWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSBIQUwgLyBBdWRpb1N0cmVhbU91dCBkaXJlY3RseQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERpcmVjdCBvdXRwdXQgYW5kIG9mZmxvYWQgdGhyZWFkcwotICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKG1DdXJyZW50V3JpdGVMZW5ndGggLSBtQnl0ZXNSZW1haW5pbmcpOworCiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAgICAgQUxPR1dfSUYobVdyaXRlQWNrU2VxdWVuY2UgJiAxLCAidGhyZWFkTG9vcF93cml0ZSgpOiBvdXQgb2Ygc2VxdWVuY2Ugd3JpdGUgcmVxdWVzdCIpOwogICAgICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgKz0gMjsKQEAgLTE5MjgsNyArMjE0NSw3IEBACiAgICAgICAgIC8vIEZJWE1FIFdlIHNob3VsZCBoYXZlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGRpcmVjdCBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gVGhleSBhcmUgdXNlZCBlLmcgZm9yIG11bHRpY2hhbm5lbCBQQ00gcGxheWJhY2sgb3ZlciBIRE1JLgogICAgICAgICBieXRlc1dyaXR0ZW4gPSBtT3V0cHV0LT5zdHJlYW0tPndyaXRlKG1PdXRwdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbU1peEJ1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIGFzeW5jIGNhbGxiYWNrIGluIGNhc2Ugb2YgZXJyb3Igb2YgZnVsbCB3cml0ZQpAQCAtMTk2Nyw3ICsyMTg0LDcgQEAKIAogLyoKIFRoZSBkZXJpdmVkIHZhbHVlcyB0aGF0IGFyZSBjYWNoZWQ6Ci0gLSBtaXhCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCisgLSBtU2lua0J1ZmZlclNpemUgZnJvbSBmcmFtZSBjb3VudCAqIGZyYW1lIHNpemUKICAtIGFjdGl2ZVNsZWVwVGltZSBmcm9tIGFjdGl2ZVNsZWVwVGltZVVzKCkKICAtIGlkbGVTbGVlcFRpbWUgZnJvbSBpZGxlU2xlZXBUaW1lVXMoKQogIC0gc3RhbmRieURlbGF5IGZyb20gbUFjdGl2ZVNsZWVwVGltZVVzIChESVJFQ1Qgb25seSkKQEAgLTE5ODYsNyArMjIwMyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2FjaGVQYXJhbWV0ZXJzX2woKQogewotICAgIG1peEJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CisgICAgbVNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgIGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogfQpAQCAtMjAwOSwxMyArMjIyNiwxNCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQogewogICAgIGludCBzZXNzaW9uID0gY2hhaW4tPnNlc3Npb25JZCgpOwotICAgIGludDE2X3QgKmJ1ZmZlciA9IG1NaXhCdWZmZXI7CisgICAgaW50MTZfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obUVmZmVjdEJ1ZmZlckVuYWJsZWQKKyAgICAgICAgICAgID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyKTsKICAgICBib29sIG93bnNCdWZmZXIgPSBmYWxzZTsKIAogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOwogICAgIGlmIChzZXNzaW9uID4gMCkgewogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKLSAgICAgICAgLy8gdGhlIG1peCBidWZmZXIgYXMgaW5wdXQKKyAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKICAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OwogICAgICAgICAgICAgYnVmZmVyID0gbmV3IGludDE2X3RbbnVtU2FtcGxlc107CkBAIC0yMDQ3LDkgKzIyNjUsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIGNoYWluLT5zZXRUaHJlYWQodGhpcyk7CiAgICAgY2hhaW4tPnNldEluQnVmZmVyKGJ1ZmZlciwgb3duc0J1ZmZlcik7Ci0gICAgY2hhaW4tPnNldE91dEJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1FZmZlY3RCdWZmZXJFbmFibGVkCisgICAgICAgICAgICA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlcikpOwogICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CiAgICAgLy8gY2hhaW5zIGxpc3QgaW4gb3JkZXIgdG8gYmUgcHJvY2Vzc2VkIGxhc3QgYXMgaXQgY29udGFpbnMgb3V0cHV0IHN0YWdlIGVmZmVjdHMKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQpAQCAtMjA5OSw3ICsyMzE4LDcgQEAKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKG1NaXhCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtU2lua0J1ZmZlcikpOwogICAgICAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMTg5LDI4ICsyNDA4LDM2IEBACiAKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKLSAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwotCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKKyAgICAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOworCiAgICAgICAgICAgICBpZiAobG9nU3RyaW5nICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTkJMb2dXcml0ZXItPmxvZ1RpbWVzdGFtcCgpOwogICAgICAgICAgICAgICAgIG1OQkxvZ1dyaXRlci0+bG9nKGxvZ1N0cmluZyk7CiAgICAgICAgICAgICAgICAgbG9nU3RyaW5nID0gTlVMTDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCisgICAgICAgICAgICAvLyBhbmQgbGF0Y2ggdGhlbSBhdG9taWNhbGx5IHdpdGggdGhlIHRpbWVzdGFtcC4KKyAgICAgICAgICAgIC8vIEZJWE1FIFdlJ3JlIHVzaW5nIHJhdyBwb2ludGVycyBhcyBpbmRpY2VzLiBBIHVuaXF1ZSB0cmFjayBJRCB3b3VsZCBiZSBhIGJldHRlciBpbmRleC4KKyAgICAgICAgICAgIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkLmNsZWFyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoRC5tRnJhbWVzUmVsZWFzZWQuYWRkKHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1MYXRjaERWYWxpZCkgewogICAgICAgICAgICAgICAgIG1MYXRjaFEgPSBtTGF0Y2hEOwogICAgICAgICAgICAgICAgIG1MYXRjaERWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG1MYXRjaFFWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgc2F2ZU91dHB1dFRyYWNrcygpOwogICAgICAgICAgICAgaWYgKG1TaWduYWxQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gQSBzaWduYWwgd2FzIHJhaXNlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkCkBAIC0yMzAyLDE0ICsyNTI5LDMyIEBACiAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB3cml0dGVuIHRvIEhBTAogICAgICAgICAgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtaXhCdWZmZXJTaXplOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVpdGhlciB0aHJlYWRMb29wX21peCgpIG9yIHRocmVhZExvb3Bfc2xlZXBUaW1lKCkgc2hvdWxkIGhhdmUgc2V0CisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXIgd2l0aCBkYXRhIGlmIG1NaXhlckJ1ZmZlclZhbGlkIGlzIHRydWUgYW5kIHNsZWVwVGltZSA9PSAwLgorICAgICAgICAgICAgLy8gTWVyZ2UgbU1peGVyQnVmZmVyIGRhdGEgaW50byBtRWZmZWN0QnVmZmVyIChpZiBhbnkgZWZmZWN0cyBhcmUgdmFsaWQpCisgICAgICAgICAgICAvLyBvciBtU2lua0J1ZmZlciAoaWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBwcmUtZWZmZWN0cyBjb21wdXRhdGlvbjsgaWYgZWZmZWN0cyBjaGFuZ2UgdG8KKyAgICAgICAgICAgIC8vIHN1cHBvcnQgaGlnaGVyIHByZWNpc2lvbiwgdGhpcyBuZWVkcyB0byBtb3ZlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIG1NaXhlckJ1ZmZlclZhbGlkIGlzIG9ubHkgc2V0IHRydWUgYnkgTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpLgorICAgICAgICAgICAgLy8gVE9ETyB1c2Ugc2xlZXBUaW1lID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCisgICAgICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXI7CisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlckZvcm1hdCA6IG1Gb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1DdXJyZW50V3JpdGVMZW5ndGg7CiAgICAgICAgICAgICBpZiAoaXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIHdyaXRlIHRvIEhBTCB3aGVuIHN1c3BlbmRlZAotICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgfQogCkBAIC0yMzMwLDYgKzI1NzUsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8vIE9ubHkgaWYgdGhlIEVmZmVjdHMgYnVmZmVyIGlzIGVuYWJsZWQgYW5kIHRoZXJlIGlzIGRhdGEgaW4gdGhlCisgICAgICAgIC8vIEVmZmVjdHMgYnVmZmVyIChidWZmZXIgdmFsaWQpLCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGNvcHkgaW50byB0aGUgc2luayBidWZmZXIuCisgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICAvL0FMT0dWKCJ3cml0aW5nIGVmZmVjdCBidWZmZXIgdG8gc2luayBidWZmZXIgZm9ybWF0ICUjeCIsIG1Gb3JtYXQpOworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgbUZvcm1hdCwgbUVmZmVjdEJ1ZmZlciwgbUVmZmVjdEJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKIApAQCAtMjM0OCwyMCArMjYwMywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9BTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZExvb3BfZHJhaW4oKTsKICAgICAgICAgICAgICAgICB9Ci1pZiAobVR5cGUgPT0gTUlYRVIpIHsKLSAgICAgICAgICAgICAgICAvLyB3cml0ZSBibG9ja2VkIGRldGVjdGlvbgotICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBub3cgLSBtTGFzdFdyaXRlVGltZTsKLSAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKKyAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBub3cgLSBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBkZWx0YSA+IG1heFBlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobm93IC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbHUgbXNlY3MsICVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMybXMoZGVsdGEpLCBtTnVtRGVsYXllZFdyaXRlcywgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci19CiAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdXNsZWVwKHNsZWVwVGltZSk7CkBAIC0yMzg5LDEyICsyNjQ0LDkgQEAKIAogICAgIHRocmVhZExvb3BfZXhpdCgpOwogCi0gICAgLy8gZm9yIER1cGxpY2F0aW5nVGhyZWFkLCBzdGFuZGJ5IG1vZGUgaXMgaGFuZGxlZCBieSB0aGUgb3V0cHV0VHJhY2tzLCBvdGhlcndpc2UgLi4uCi0gICAgaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERJUkVDVCB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7Ci0gICAgICAgIC8vIHB1dCBvdXRwdXQgc3RyZWFtIGludG8gc3RhbmRieSBtb2RlCi0gICAgICAgIGlmICghbVN0YW5kYnkpIHsKLSAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgfQorICAgIGlmICghbVN0YW5kYnkpIHsKKyAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CisgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKICAgICB9CiAKICAgICByZWxlYXNlV2FrZUxvY2soKTsKQEAgLTI0MDksNyArMjY2MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbW92ZVRyYWNrc19sKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewogICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQpIHsKKyAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7CiAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CkBAIC0yNDM1LDcgKzI2ODcsNyBAQAogICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAgICAgfQotICAgIGlmIChtVHlwZSA9PSBPRkZMT0FEICYmIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbikgeworICAgIGlmICgobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpICYmIG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbikgewogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpbnQgcmV0ID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLCAmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSk7CkBAIC0yNDQ2LDYgKzI2OTgsNjcgQEAKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgfQorICAgICAgICBtT3V0RGV2aWNlID0gdHlwZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgImNyZWF0ZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVRyYWNrcy5hZGQodHJhY2spOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZGVzdHJveVRyYWNrX2wodHJhY2spOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKKyAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCkBAIC0yNDY1LDE1ICsyNzc4LDEwIEBACiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogCi0gICAgLy8gRklYTUUgLSBDdXJyZW50IG1peGVyIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgc3RlcmVvIG91dHB1dAotICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIGhhcmR3YXJlIGNoYW5uZWwgY291bnQgJWQiLCBtQ2hhbm5lbENvdW50KTsKLSAgICB9Ci0KICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc2luayBmb3IgdGhlIEhBTCBvdXRwdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbU91dHB1dFNpbmsgPSBuZXcgQXVkaW9TdHJlYW1PdXRTaW5rKG91dHB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50KX07CisgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KX07CiAgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTaW5rLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKIApAQCAtMjQ5Miw5ICsyODAwLDI4IEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoaW5pdEZhc3RNaXhlcikgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBmYXN0TWl4ZXJGb3JtYXQ7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkICYmIG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgICAgICBmYXN0TWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFzdE1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gZmFzdE1peGVyRm9ybWF0KSB7CisgICAgICAgICAgICAvLyBjaGFuZ2Ugb3VyIFNpbmsgZm9ybWF0IHRvIGFjY2VwdCBvdXIgaW50ZXJtZWRpYXRlIHByZWNpc2lvbgorICAgICAgICAgICAgbUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKKyAgICAgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpbmtCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgc2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGEgTW9ub1BpcGUgdG8gY29ubmVjdCBvdXIgc3VibWl4IHRvIEZhc3RNaXhlcgogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOworICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCisgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OworICAgICAgICBmb3JtYXQubUZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpICogZm9ybWF0Lm1DaGFubmVsQ291bnQ7CisKICAgICAgICAgLy8gVGhpcyBwaXBlIGRlcHRoIGNvbXBlbnNhdGVzIGZvciBzY2hlZHVsaW5nIGxhdGVuY3kgb2YgdGhlIG5vcm1hbCBtaXhlciB0aHJlYWQuCiAgICAgICAgIC8vIFdoZW4gaXQgd2FrZXMgdXAgYWZ0ZXIgYSBtYXhpbXVtIGxhdGVuY3ksIGl0IHJ1bnMgYSBmZXcgY3ljbGVzIHF1aWNrbHkgYmVmb3JlCiAgICAgICAgIC8vIGZpbmFsbHkgYmxvY2tpbmcuICBOb3RlIHRoZSBwaXBlIGltcGxlbWVudGF0aW9uIHJvdW5kcyB1cCB0aGUgcmVxdWVzdCB0byBhIHBvd2VyIG9mIDIuCkBAIC0yNTEwLDE0ICsyODM3LDE1IEBACiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewogICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgZm9ybWF0KTsKKyAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7CisgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAgICAgICAgICAgICBtVGVlU2luayA9IHRlZVNpbms7CiAgICAgICAgICAgICBQaXBlUmVhZGVyICp0ZWVTb3VyY2UgPSBuZXcgUGlwZVJlYWRlcigqdGVlU2luayk7CiAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKICAgICAgICAgICAgIG1UZWVTb3VyY2UgPSB0ZWVTb3VyY2U7CiAgICAgICAgIH0KQEAgLTI1MzUsNiArMjg2Myw4IEBACiAgICAgICAgIC8vIHdyYXAgdGhlIHNvdXJjZSBzaWRlIG9mIHRoZSBNb25vUGlwZSB0byBtYWtlIGl0IGFuIEF1ZGlvQnVmZmVyUHJvdmlkZXIKICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBuZXcgU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihuZXcgTW9ub1BpcGVSZWFkZXIobW9ub1BpcGUpKTsKICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSBOVUxMOworICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC0yNTc4LDggKzI5MDgsNiBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa1VzZUZhc3RNaXhlcikgewpAQCAtMjU5OCw3ICsyOTI2LDcgQEAKIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6fk1peGVyVGhyZWFkKCkKIHsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEUpIHsKQEAgLTI2MjAsNyArMjk0OCw3IEBACiAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOwogICAgICAgICBkZWxldGUgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7Ci0gICAgICAgIGRlbGV0ZSBtRmFzdE1peGVyOworICAgICAgICBtRmFzdE1peGVyLmNsZWFyKCk7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgaWYgKG1BdWRpb1dhdGNoZG9nICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5yZXF1ZXN0RXhpdCgpOwpAQCAtMjYzNiw3ICsyOTY0LDcgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdAogewotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIE1vbm9QaXBlICpwaXBlID0gKE1vbm9QaXBlICopbVBpcGVTaW5rLmdldCgpOwogICAgICAgICBsYXRlbmN5ICs9IChwaXBlLT5nZXRBdmdGcmFtZXMoKSAqIDEwMDApIC8gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMjY1Myw3ICsyOTgxLDcgQEAKIHsKICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgb25seSBkbyBvbmUgcHVzaCBwZXIgY3ljbGU7IGNvbmZpcm0gdGhpcyBpcyB0cnVlCiAgICAgLy8gU3RhcnQgdGhlIGZhc3QgbWl4ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBydW5uaW5nCi0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCAhPSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFICYmCkBAIC0yNjg3LDcgKzMwMTUsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQogewogICAgIC8vIElkbGUgdGhlIGZhc3QgbWl4ZXIgaWYgaXQncyBjdXJyZW50bHkgcnVubmluZwotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgewpAQCAtMjcxMywxMiArMzA0MSw2IEBACiAgICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpOwogfQogCi0vLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RhbmRhcmQgbWl4ZXIKLS8vIE92ZXJyaWRkZW4gZm9yIG9mZmxvYWRlZCBwbGF5YmFjawotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpmbHVzaE91dHB1dF9sKCkKLXsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp3YWl0aW5nQXN5bmNDYWxsYmFja19sKCkKIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNzUwLDYgKzMwNzIsMTIgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBBTE9HVigic2lnbmFsIHBsYXliYWNrIHRocmVhZCIpOworICAgIGJyb2FkY2FzdF9sKCk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9taXgoKQogewogICAgIC8vIG9idGFpbiB0aGUgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBvZiB0aGUgbmV4dCBvdXRwdXQgYnVmZmVyCkBAIC0yNzY4LDcgKzMwOTYsNyBAQAogCiAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KICAgICBtQXVkaW9NaXhlci0+cHJvY2VzcyhwdHMpOwotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtaXhCdWZmZXJTaXplOworICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CiAgICAgLy8gaW5jcmVhc2Ugc2xlZXAgdGltZSBwcm9ncmVzc2l2ZWx5IHdoZW4gYXBwbGljYXRpb24gdW5kZXJydW4gY29uZGl0aW9uIGNsZWFycy4KICAgICAvLyBPbmx5IGluY3JlYXNlIHNsZWVwIHRpbWUgaWYgdGhlIG1peGVyIGlzIHJlYWR5IGZvciB0d28gY29uc2VjdXRpdmUgdGltZXMgdG8gYXZvaWQKICAgICAvLyB0aGF0IGEgc3RlYWR5IHN0YXRlIG9mIGFsdGVybmF0aW5nIHJlYWR5L25vdCByZWFkeSBjb25kaXRpb25zIGtlZXBzIHRoZSBzbGVlcCB0aW1lCkBAIC0yNzc5LDYgKzMxMDcsNyBAQAogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgLy9UT0RPOiBkZWxheSBzdGFuZGJ5IHdoZW4gZWZmZWN0cyBoYXZlIGEgdGFpbAorCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9zbGVlcFRpbWUoKQpAQCAtMjgwMiw3ICszMTMxLDEzIEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgfHwgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkpIHsKLSAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgLy8gY2xlYXIgb3V0IG1NaXhlckJ1ZmZlciBvciBtU2lua0J1ZmZlciwgdG8gZW5zdXJlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQKKyAgICAgICAgLy8gYmVmb3JlIGVmZmVjdHMgcHJvY2Vzc2luZyBvciBvdXRwdXQuCisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgbWVtc2V0KG1NaXhlckJ1ZmZlciwgMCwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CisgICAgICAgIH0KICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgQUxPR1ZfSUYobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpLAogICAgICAgICAgICAgICAgICJhbnRpY2lwYXRlZCBzdGFydCIpOwpAQCAtMjg0NCwxMSArMzE3OSwxNCBAQAogICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IE5VTEw7CiAgICAgYm9vbCBkaWRNb2RpZnkgPSBmYWxzZTsKICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpibG9ja190IGJsb2NrID0gRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEOwotICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CiAgICAgICAgIHNxID0gbUZhc3RNaXhlci0+c3EoKTsKICAgICAgICAgc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICB9CiAKKyAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KKyAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCisKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0ID09IDApIHsKQEAgLTI5NjcsNyArMzMwNSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HX0ZBVEFMKCJ1bmV4cGVjdGVkIHRyYWNrIHN0YXRlICVkIiwgdHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsKQEAgLTI5NzgsNiArMzMxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gZWFicDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPSB2cDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSB0cmFjay0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSB0cmFjay0+bUZvcm1hdDsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayB8PSAxIDw8IGo7CiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CkBAIC0yOTk4LDcgKzMzMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHdlJ3JlIGFib3V0IHRvIGRlY3JlbWVudCB0aGUgbGFzdCBzcDw+IG9uIHRob3NlIHRyYWNrcy4KICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0dfRkFUQUwoImZhc3QgdHJhY2sgJWQgc2hvdWxkIGhhdmUgYmVlbiBhY3RpdmUiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZSIsIGopOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAvLyBBdm9pZHMgYSBtaXNsZWFkaW5nIGRpc3BsYXkgaW4gZHVtcHN5cwpAQCAtMzAyNywxMiArMzM2NiwxNCBAQAogICAgICAgICAgICAgLy8gKzEgZm9yIHJvdW5kaW5nIGFuZCArMSBmb3IgYWRkaXRpb25hbCBzYW1wbGUgbmVlZGVkIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICBkZXNpcmVkRnJhbWVzID0gKG1Ob3JtYWxGcmFtZUNvdW50ICogc3IpIC8gbVNhbXBsZVJhdGUgKyAxICsgMTsKICAgICAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCi0gICAgICAgICAgICAvLyBiZWNhdXNlIGNibGstPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcworICAgICAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKICAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisjaWYgMAogICAgICAgICAgICAgLy8gdGhlIG1pbmltdW0gdHJhY2sgYnVmZmVyIHNpemUgaXMgbm9ybWFsbHkgdHdpY2UgdGhlIG51bWJlciBvZiBmcmFtZXMgbmVjZXNzYXJ5CiAgICAgICAgICAgICAvLyB0byBmaWxsIG9uZSBidWZmZXIgYW5kIHRoZSByZXNhbXBsZXIgc2hvdWxkIG5vdCBsZWF2ZSBtb3JlIHRoYW4gb25lIGJ1ZmZlciB3b3J0aAogICAgICAgICAgICAgLy8gb2YgdW5yZWxlYXNlZCBmcmFtZXMgYWZ0ZXIgZWFjaCBwYXNzLCBidXQganVzdCBpbiBjYXNlLi4uCiAgICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNpcmVkRnJhbWVzIDw9IGNibGstPmZyYW1lQ291bnRfKTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSAmJgpAQCAtMzA0OCwxMCArMzM4OSwxNCBAQAogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCi0gICAgICAgICAgICAvLyB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIgbWVhbnMgdGhlcmUgaXMgYW4gZWZmZWN0IGNoYWluCi0gICAgICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHRyYWNrCisgICAgICAgICAgICAvLyB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1TaW5rQnVmZmVyIG9yIG1NaXhlckJ1ZmZlciBtZWFucworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZWZmZWN0IGNoYWluIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKICAgICAgICAgICAgIGNoYWluLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtU2lua0J1ZmZlciAmJgorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhlckJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSB0cnVlOyAvLyBMYXRlciBjYW4gc2V0IGRpcmVjdGx5LgorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKICAgICAgICAgICAgICAgICAvLyBEZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgaW4gdHJhY2sgZWZmZWN0IGNoYWluIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC0zMDgxLDkgKzM0MjYsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKLSAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2ciwgdmE7CisgICAgICAgICAgICB1aW50MzJfdCB2bCwgdnI7ICAgICAgIC8vIGluIFU4LjI0IGludGVnZXIgZm9ybWF0CisgICAgICAgICAgICBmbG9hdCB2bGYsIHZyZiwgdmFmOyAgIC8vIGluIFswLjAsIDEuMF0gZmxvYXQgZm9ybWF0CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7Ci0gICAgICAgICAgICAgICAgdmwgPSB2ciA9IHZhID0gMDsKKyAgICAgICAgICAgICAgICB2bCA9IHZyID0gMDsKKyAgICAgICAgICAgICAgICB2bGYgPSB2cmYgPSB2YWYgPSAwLjsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMDkzLDM3ICszNDQwLDQ0IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgdHlwZVZvbHVtZSA9IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7CiAgICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgICAgICAgICAgQXVkaW9UcmFja1NlcnZlclByb3h5ICpwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgICAgICAgICAgICAgIHZsID0gdmxyICYgMHhGRkZGOwotICAgICAgICAgICAgICAgIHZyID0gdmxyID4+IDE2OworICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgICAgIHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgICAgICAgICB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgICAgICAgICAgICAgIC8vIHRyYWNrIHZvbHVtZXMgY29tZSBmcm9tIHNoYXJlZCBtZW1vcnksIHNvIGNhbid0IGJlIHRydXN0ZWQgYW5kIG11c3QgYmUgY2xhbXBlZAotICAgICAgICAgICAgICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgbGVmdCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlMDRYIiwgdmwpOwotICAgICAgICAgICAgICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICBpZiAodmxmID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgbGVmdCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlLjNnIiwgdmxmKTsKKyAgICAgICAgICAgICAgICAgICAgdmxmID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayByaWdodCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlMDRYIiwgdnIpOwotICAgICAgICAgICAgICAgICAgICB2ciA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICBpZiAodnJmID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgcmlnaHQgdm9sdW1lIG91dCBvZiByYW5nZTogJS4zZyIsIHZyZik7CisgICAgICAgICAgICAgICAgICAgIHZyZiA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIG5vdyBhcHBseSB0aGUgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lCi0gICAgICAgICAgICAgICAgdmwgPSAodWludDMyX3QpKHYgKiB2bCkgPDwgMTI7Ci0gICAgICAgICAgICAgICAgdnIgPSAodWludDMyX3QpKHYgKiB2cikgPDwgMTI7CisgICAgICAgICAgICAgICAgdmxmICo9IHY7CisgICAgICAgICAgICAgICAgdnJmICo9IHY7CiAgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lIGVhY2ggZ28gdXAgdG8gMS4wLAotICAgICAgICAgICAgICAgIC8vIHZsIGFuZCB2ciBhcmUgbm93IGluIDguMjQgZm9ybWF0Ci0KKyAgICAgICAgICAgICAgICAvLyB0aGVuIGRlcml2ZSB2bCBhbmQgdnIgYXMgVTguMjQgdmVyc2lvbnMgZm9yIHRoZSBlZmZlY3QgY2hhaW4KKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXRvOF8yNCA9IE1BWF9HQUlOX0lOVCAqIE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICB2bCA9ICh1aW50MzJfdCkgKHNjYWxldG84XzI0ICogdmxmKTsKKyAgICAgICAgICAgICAgICB2ciA9ICh1aW50MzJfdCkgKHNjYWxldG84XzI0ICogdnJmKTsKKyAgICAgICAgICAgICAgICAvLyB2bCBhbmQgdnIgYXJlIG5vdyBpbiBVOC4yNCBmb3JtYXQKICAgICAgICAgICAgICAgICB1aW50MTZfdCBzZW5kTGV2ZWwgPSBwcm94eS0+Z2V0U2VuZExldmVsX1U0XzEyKCk7CiAgICAgICAgICAgICAgICAgLy8gc2VuZCBsZXZlbCBjb21lcyBmcm9tIHNoYXJlZCBtZW1vcnkgYW5kIHNvIG1heSBiZSBjb3JydXB0CiAgICAgICAgICAgICAgICAgaWYgKHNlbmRMZXZlbCA+IE1BWF9HQUlOX0lOVCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgc2VuZCBsZXZlbCBvdXQgb2YgcmFuZ2U6ICUwNFgiLCBzZW5kTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICBzZW5kTGV2ZWwgPSBNQVhfR0FJTl9JTlQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhID0gKHVpbnQzMl90KSh2ICogc2VuZExldmVsKTsKKyAgICAgICAgICAgICAgICAvLyB2YWYgaXMgcmVwcmVzZW50ZWQgYXMgWzAuMCwgMS4wXSBmbG9hdCBieSByZXNjYWxpbmcgc2VuZExldmVsCisgICAgICAgICAgICAgICAgdmFmID0gdiAqIHNlbmRMZXZlbCAqICgxLiAvIE1BWF9HQUlOX0lOVCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCAmJiBjaGFpbi0+c2V0Vm9sdW1lX2woJnZsLCAmdnIpKSB7CiAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJhbXAgdm9sdW1lIGlmIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IGVmZmVjdAogICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSByZW1haW5pbmcgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIGxldmVscworICAgICAgICAgICAgICAgIHZsZiA9IChmbG9hdCl2bCAvICgxIDw8IDI0KTsKKyAgICAgICAgICAgICAgICB2cmYgPSAoZmxvYXQpdnIgLyAoMSA8PCAyNCk7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXNWb2x1bWVDb250cm9sbGVyID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgd2hlbiB2b2x1bWUgY29udHJvbGxlciB3YXMganVzdCBkaXNhYmxlZCBvciByZW1vdmVkCkBAIC0zMTM0LDI4ICszNDg4LDEzIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXNWb2x1bWVDb250cm9sbGVyID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lcyBmcm9tIDguMjQgdG8gNC4xMiBmb3JtYXQKLSAgICAgICAgICAgIC8vIFRoaXMgYWRkaXRpb25hbCBjbGFtcGluZyBpcyBuZWVkZWQgaW4gY2FzZSBjaGFpbi0+c2V0Vm9sdW1lX2woKSBvdmVyc2hvdAotICAgICAgICAgICAgdmwgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOwotICAgICAgICAgICAgaWYgKHZsID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgdmwgPSBNQVhfR0FJTl9JTlQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2ciA9ICh2ciArICgxIDw8IDExKSkgPj4gMTI7Ci0gICAgICAgICAgICBpZiAodnIgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2ciA9IE1BWF9HQUlOX0lOVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgdmEgPSBNQVhfR0FJTl9JTlQ7ICAgLy8gdmEgaXMgdWludDMyX3QsIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIC0KLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIHRyYWNrKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUobmFtZSk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICh2b2lkICopKHVpbnRwdHJfdCl2bCk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAodm9pZCAqKSh1aW50cHRyX3QpdnIpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICh2b2lkICopKHVpbnRwdHJfdCl2YSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtMzE2NCw4ICszNTAzLDEyIEBACiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgotICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogMjsKKyAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWDsKICAgICAgICAgICAgIHVpbnQzMl90IHJlcVNhbXBsZVJhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgICAgICAgICAgaWYgKHJlcVNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcVNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTMxNzcsMTAgKzM1MjAsNDEgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgdHJhY2suCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVHJhY2tzIHdpdGggZWZmZWN0cyBnbyBpbnRvIHRoZWlyIG93biBlZmZlY3RzIGNoYWluIGJ1ZmZlcgorICAgICAgICAgICAgICogYW5kIGZyb20gdGhlcmUgaW50byBlaXRoZXIgbUVmZmVjdEJ1ZmZlciBvciBtU2lua0J1ZmZlci4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBPdGhlciB0cmFja3MgY2FuIHVzZSBtTWl4ZXJCdWZmZXIgZm9yIGhpZ2hlciBwcmVjaXNpb24KKyAgICAgICAgICAgICAqIGNoYW5uZWwgYWNjdW11bGF0aW9uLiAgSWYgdGhpcyBidWZmZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICogKG1NaXhlckJ1ZmZlckVuYWJsZWQgdHJ1ZSksIHRoZW4gc2VsZWN0ZWQgdHJhY2tzIHdpbGwgYWNjdW11bGF0ZQorICAgICAgICAgICAgICogaW50byBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CisgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMjk0LDEzICszNjY4LDM1IEBACiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKLSAgICAvLyBtaXggYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBpZiBhbGwgdHJhY2tzIGFyZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAvLyBlZmZlY3QgY2hhaW4gYXMgaW4gdGhpcyBjYXNlIHRoZSBtaXhlciB3aWxsIG5vdCB3cml0ZSB0bwotICAgIC8vIG1peCBidWZmZXIgYW5kIHRyYWNrIGVmZmVjdHMgd2lsbCBhY2N1bXVsYXRlIGludG8gaXQKKyAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICE9IDApIHsKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CisgICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGVmZmVjdHMgd2Ugc2hvdWxkIGNsZWFyIHRoZSBlZmZlY3RzIGJ1ZmZlciwgdG8gYXZvaWQKKyAgICAgICAgLy8gcGFzc2luZyBhIG5vbi1jbGVhbiBidWZmZXIgdG8gdGhlIGVmZmVjdCBjaGFpbgorICAgICAgICBtZW1zZXQobUVmZmVjdEJ1ZmZlciwgMCwgbUVmZmVjdEJ1ZmZlclNpemUpOworICAgIH0KKyAgICAvLyBzaW5rIG9yIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgorICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvIHRoZSBzaW5rIG9yIG1peCBidWZmZXIKKyAgICAvLyBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAogICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAogICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSkgewogICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCi0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgLy8gVE9ETzogSW4gdGVzdGluZywgbVNpbmtCdWZmZXIgYmVsb3cgbmVlZCBub3QgYmUgY2xlYXJlZCBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGUgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBjb3BpZXMgbU1peGVyQnVmZmVyIGludG8gbVNpbmtCdWZmZXIKKyAgICAgICAgICAgIC8vIGFmdGVyIG1peGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUbyBlbmZvcmNlIHRoaXMgZ3VhcmFudGVlOgorICAgICAgICAgICAgLy8gKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8CisgICAgICAgICAgICAvLyAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpCisgICAgICAgICAgICAvLyBtdXN0IGltcGx5IE1JWEVSX1RSQUNLU19SRUFEWS4KKyAgICAgICAgICAgIC8vIExhdGVyLCB3ZSBtYXkgY2xlYXIgYnVmZmVycyByZWdhcmRsZXNzLCBhbmQgc2tpcCBtdWNoIG9mIHRoaXMgbG9naWMuCisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cworICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgfQogCiAgICAgLy8gaWYgYW55IGZhc3QgdHJhY2tzLCB0aGVuIHN0YXR1cyBpcyByZWFkeQpAQCAtMzMxMiw5ICszNzA4LDEwIEBACiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1pbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQpOwogfQogCiAvLyBkZWxldGVUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZApAQCAtMzMyNCwxMzAgKzM3MjEsMTIyIEBACiAgICAgbUF1ZGlvTWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKIH0KIAotLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWJvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewotICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKICAgICBib29sIHJlY29uZmlnID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIW1OZXdQYXJhbWV0ZXJzLmlzRW1wdHkoKSkgeworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwotICAgICAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOwotICAgICAgICAgICAgfQorICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAorICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXIgPSBtTmV3UGFyYW1ldGVyc1swXTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwotICAgICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CisgICAgaW50IHZhbHVlOworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0Zvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKSkgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzYXZlIHZhbHVlLCBzaW5jZSBpdCdzIGNvbnN0YW50CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNhdmUgdmFsdWUsIHNpbmNlIGl0J3MgY29uc3RhbnQKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCi0gICAgICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCi0gICAgICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKLSAgICAgICAgICAgIC8vIHRoZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHNwZWFrZXIgaXMgb24KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKLSAgICAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQorICAgICAgICAvLyB0aGUgY2hhbmdlCisgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOworICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCisgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKKyAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YU90aGVyQXVkaW9EZXZpY2VPbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKG1UcmFja3NbaV0tPm1DaGFubmVsTWFzaywgbVRyYWNrc1tpXS0+bVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+bU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIG1OZXdQYXJhbWV0ZXJzLnJlbW92ZUF0KDApOwotCi0gICAgICAgIG1QYXJhbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgbVBhcmFtQ29uZC5zaWduYWwoKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgY29uZGl0aW9uIHdpdGggdGltZSBvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGNhbGxpbmcgVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgIC8vIGFscmVhZHkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBzdGF0dXMgYW5kIHdpbGwgbmV2ZXIgc2lnbmFsIHRoZSBjb25kaXRpb24uCi0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CisgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CisgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IG5hbWUgPSBnZXRUcmFja05hbWVfbChtVHJhY2tzW2ldLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tRm9ybWF0LCBtVHJhY2tzW2ldLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIShwcmV2aW91c0NvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSAwKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgQUxPR19BU1NFUlQoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRSk7CkBAIC0zNDY4LDkgKzM4NTcsNyBAQAogCiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9NaXhlciB0cmFja3M6ICUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogMHglMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKIAogICAgIC8vIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBtaXhlciBkdW1wIHN0YXRlIHNvIGl0IHdvbid0IGNoYW5nZSB1bmRlcm5lYXRoIHVzCiAgICAgY29uc3QgRmFzdE1peGVyRHVtcFN0YXRlIGNvcHkobUZhc3RNaXhlckR1bXBTdGF0ZSk7CkBAIC0zNTUxLDEzICszOTM4LDE3IEBACiAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwogICAgICAgICBmbG9hdCB2ID0gbU1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSAqcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgdWludDMyX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgIGZsb2F0IHZfY2xhbXBlZCA9IHYgKiAodmxyICYgMHhGRkZGKTsKLSAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOKSB2X2NsYW1wZWQgPSBNQVhfR0FJTjsKLSAgICAgICAgbGVmdCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKLSAgICAgICAgdl9jbGFtcGVkID0gdiAqICh2bHIgPj4gMTYpOwotICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICByaWdodCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKKyAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgICAgIGxlZnQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCAqPSB2OworICAgICAgICByaWdodCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisgICAgICAgIGlmIChyaWdodCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gR0FJTl9GTE9BVF9VTklUWTsKKyAgICAgICAgfQorICAgICAgICByaWdodCAqPSB2OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTM2MTIsMTQgKzQwMDMsMTQgQEAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0CiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lczsKLSAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpKSB7CisgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGluZ18xKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKLSAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKKyAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCisgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CiAKQEAgLTM2NDYsMTggKzQwMzcsMzAgQEAKICAgICAgICAgICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkgJiYgbGFzdCkgewogICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbMF0tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKLSAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAotICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwaW5nXzIoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRyYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYmVoYXZpb3IgZm9yIGNvbXByZXNzZWQgYXVkaW8KLSAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeV9sKCkgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb0hBTEZyYW1lcyA9IChsYXRlbmN5X2woKSAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9IQUxGcmFtZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpGTFVTSEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hId19sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTM2ODgsNyArNDA5MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp0aHJlYWRMb29wX21peCgpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICBpbnQ4X3QgKmN1ckJ1ZiA9IChpbnQ4X3QgKiltTWl4QnVmZmVyOworICAgIGludDhfdCAqY3VyQnVmID0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CkBAIC0zNzAzLDcgKzQxMDYsNyBAQAogICAgICAgICBjdXJCdWYgKz0gYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbU1peEJ1ZmZlcjsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzE4LDY4ICs0MTIxLDY5IEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgIH0KIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIF9fdW51c2VkLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgX191bnVzZWQsIGludCBzZXNzaW9uSWQgX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lIF9fdW51c2VkKQogewogfQogCi0vLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGdhcmFudGllZAotICAgICAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgotICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBnYXJhbnRpZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgeworICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZWNvbmZpZzsKIH0KIApAQCAtMzgyOSw2ICs0MjMzLDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKQoreworICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPmZsdXNoICE9IE5VTEwpCisgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2gobU91dHB1dC0+c3RyZWFtKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkFzeW5jQ2FsbGJhY2tUaHJlYWQ6OkFzeW5jQ2FsbGJhY2tUaHJlYWQoCkBAIC0zOTg3LDYgKzQzOTcsMTcgQEAKICAgICAgICAgc3A8VHJhY2s+IGwgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOwogICAgICAgICBib29sIGxhc3QgPSBsLmdldCgpID09IHRyYWNrOwogCisgICAgICAgIGlmICh0cmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbiBpbnZhbGlkYXRlZCB0cmFjayBzaG91bGRuJ3QgYmUgaW4gYWN0aXZlIGxpc3QiKTsKKyAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OklETEUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBbiBpZGxlIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNDAwNSwzMiArNDQyNiwzOSBAQAogICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7ICAgIC8vIHN0b3Agd3JpdGluZwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CisgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKKyAgICAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzUmVzdW1lUGVuZGluZygpKXsKKyAgICAgICAgICAgIHRyYWNrLT5yZXN1bWVBY2soKTsKKyAgICAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1QYXVzZWRCeXRlc1JlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbnRpbnVlIHdyaXRlIHRoYXQgd2FzIGludGVycnVwdGVkCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtUGF1c2VkV3JpdGVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1QYXVzZWRCeXRlc1JlbWFpbmluZzsKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZExvb3BfbWl4KCkgd2lsbCBoYW5kbGUgdGhlIGNhc2UgdGhhdCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBhbiBpbnRlcnJ1cHRlZCB3cml0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBlbmFibGUgd3JpdGUgdG8gYXVkaW8gSEFMCisgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKKworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBoYW5kbGUgbmV3IGRhdGEgaW4gdGhpcyBpdGVyYXRpb24gZXZlbiBpZiB0cmFjay0+ZnJhbWVzUmVhZHkoKQorICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gIGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgcHJvY2Vzc1ZvbHVtZV9sKCkgd2lsbCBhcHBseSBuZXcgdm9sdW1lIGV2ZW4gaWYgMAogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBtUmlnaHRWb2xGbG9hdCA9IC0xLjA7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBhdXNlZEJ5dGVzUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjb250aW51ZSB3cml0ZSB0aGF0IHdhcyBpbnRlcnJ1cHRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtUGF1c2VkV3JpdGVMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbVBhdXNlZEJ5dGVzUmVtYWluaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9taXgoKSB3aWxsIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYW4gaW50ZXJydXB0ZWQgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC00MDU0LDcgKzQ0ODIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlayB3aGVuIHJlc3VtaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IHRyYWNrLT5zZXNzaW9uSWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2stPmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQxMDAsNyArNDUyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1PdXRwdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobU91dHB1dC0+c3RyZWFtKSptU2FtcGxlUmF0ZSkgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtT3V0cHV0LT5zdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CkBAIC00MTMwLDkgKzQ1NTcsNiBAQAogICAgIC8vIGlmIHJlc3VtZSBpcyByZWNlaXZlZCBiZWZvcmUgcGF1c2UgaXMgZXhlY3V0ZWQuCiAgICAgaWYgKCFtU3RhbmRieSAmJiAoZG9Id1BhdXNlIHx8IChtRmx1c2hQZW5kaW5nICYmICFtSHdQYXVzZWQgJiYgKGNvdW50ICE9IDApKSkpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5wYXVzZShtT3V0cHV0LT5zdHJlYW0pOwotICAgICAgICBpZiAoIWRvSHdQYXVzZSkgewotICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7Ci0gICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1GbHVzaFBlbmRpbmcpIHsKICAgICAgICAgZmx1c2hId19sKCk7CkBAIC00MTQ4LDExICs0NTcyLDYgQEAKICAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpmbHVzaE91dHB1dF9sKCkKLXsKLSAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKLX0KLQogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbXV0ZXggbG9ja2VkCiBib29sIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CkBAIC00MTY3LDE1ICs0NTg2LDE1IEBACiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBtdXRleCBsb2NrZWQKIGJvb2wgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjpzaG91bGRTdGFuZGJ5X2woKQogewotICAgIGJvb2wgVHJhY2tQYXVzZWQgPSBmYWxzZTsKKyAgICBib29sIHRyYWNrUGF1c2VkID0gZmFsc2U7CiAKICAgICAvLyBkbyBub3QgcHV0IHRoZSBIQUwgaW4gc3RhbmRieSB3aGVuIHBhdXNlZC4gQXdlc29tZVBsYXllciBjbGVhciB0aGUgb2ZmbG9hZGVkIEF1ZGlvVHJhY2sKICAgICAvLyBhZnRlciBhIHRpbWVvdXQgYW5kIHdlIHdpbGwgZW50ZXIgc3RhbmRieSB0aGVuLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgVHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CisgICAgICAgIHRyYWNrUGF1c2VkID0gbVRyYWNrc1ttVHJhY2tzLnNpemUoKSAtIDFdLT5pc1BhdXNlZCgpOwogICAgIH0KIAotICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIVRyYWNrUGF1c2VkOworICAgIHJldHVybiAhbVN0YW5kYnkgJiYgIXRyYWNrUGF1c2VkOwogfQogCiAKQEAgLTQxODcsMTIgKzQ2MDYsMTQgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OmZsdXNoSHdfbCgpCiB7Ci0gICAgbU91dHB1dC0+c3RyZWFtLT5mbHVzaChtT3V0cHV0LT5zdHJlYW0pOworICAgIERpcmVjdE91dHB1dFRocmVhZDo6Zmx1c2hId19sKCk7CiAgICAgLy8gRmx1c2ggYW55dGhpbmcgc3RpbGwgd2FpdGluZyBpbiB0aGUgbWl4YnVmZmVyCiAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IDA7CiAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICBtUGF1c2VkV3JpdGVMZW5ndGggPSAwOwogICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZyA9IDA7CisgICAgbUh3UGF1c2VkID0gZmFsc2U7CisKICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgLy8gZGlzY2FyZCBhbnkgcGVuZGluZyBkcmFpbiBvciB3cml0ZSBhY2sgYnkgaW5jcmVtZW50aW5nIHNlcXVlbmNlCiAgICAgICAgIG1Xcml0ZUFja1NlcXVlbmNlID0gKG1Xcml0ZUFja1NlcXVlbmNlICsgMikgJiB+MTsKQEAgLTQyMDMsNiArNDYyNCwxOCBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgc3A8VHJhY2s+IHByZXZpb3VzVHJhY2sgPSBtUHJldmlvdXNUcmFjay5wcm9tb3RlKCk7CisgICAgc3A8VHJhY2s+IGxhdGVzdFRyYWNrID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKKworICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDAgJiYgbGF0ZXN0VHJhY2sgIT0gMCAmJgorICAgICAgICAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gbGF0ZXN0VHJhY2stPnNlc3Npb25JZCgpKSkgeworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OkR1cGxpY2F0aW5nVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKQEAgLTQyMjcsMTEgKzQ2NjAsMTEgQEAKICAgICBpZiAob3V0cHV0c1JlYWR5KG91dHB1dFRyYWNrcykpIHsKICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgIH0KICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1peEJ1ZmZlclNpemU7CisgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKIH0KIApAQCAtNDI0Niw3ICs0Njc5LDcgQEAKICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IG1Ob3JtYWxGcmFtZUNvdW50OwotICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZmx1c2ggcmVtYWluaW5nIG92ZXJmbG93IGJ1ZmZlcnMgaW4gb3V0cHV0IHRyYWNrcwogICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOwpAQCAtNDI1OCwxMCArNDY5MSwxOCBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1NaXhCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgLy8gV2UgY29udmVydCB0aGUgZHVwbGljYXRpbmcgdGhyZWFkIGZvcm1hdCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAvLyBmb3IgZGVsaXZlcnkgZG93bnN0cmVhbSBhcyBuZWVkZWQuIFRoaXMgaW4tcGxhY2UgY29udmVyc2lvbiBpcyBzYWZlIGFzCisgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGlzIHNtYWxsZXIgdGhhbiBhbnkgb3RoZXIgc3VwcG9ydGVkIGZvcm1hdAorICAgICAgICAvLyAoQVVESU9fRk9STUFUX1BDTV84X0JJVCBpcyBub3QgYWxsb3dlZCBoZXJlKS4KKyAgICAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlciwgbUZvcm1hdCwgd3JpdGVGcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1TaW5rQnVmZmVyKSwgd3JpdGVGcmFtZXMpOwogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwotICAgIHJldHVybiAoc3NpemVfdCltaXhCdWZmZXJTaXplOworICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKQEAgLTQyODcsMTAgKzQ3MjgsMTYgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIEZJWE1FIGV4cGxhaW4gdGhpcyBmb3JtdWxhCiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoMyAqIG1Ob3JtYWxGcmFtZUNvdW50ICogbVNhbXBsZVJhdGUpIC8gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgLy8gT3V0cHV0VHJhY2sgaXMgZm9yY2VkIHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHJlZ2FyZGxlc3Mgb2YgbUZvcm1hdAorICAgIC8vIGR1ZSB0byBjdXJyZW50IHVzYWdlIGNhc2UgYW5kIHJlc3RyaWN0aW9ucyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlci4KKyAgICAvLyBBY3R1YWwgYnVmZmVyIGNvbnZlcnNpb24gaXMgZG9uZSBpbiB0aHJlYWRMb29wX3dyaXRlKCkuCisgICAgLy8KKyAgICAvLyBUT0RPOiBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgZGVwZW5kaW5nIG9uIG11bHRpY2hhbm5lbAorICAgIC8vIChhbmQgbm9uIGludDE2X3QqKSBzdXBwb3J0IG9uIEFGOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2sKICAgICBPdXRwdXRUcmFjayAqb3V0cHV0VHJhY2sgPSBuZXcgT3V0cHV0VHJhY2sodGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTQzNzIsOCArNDgxOSw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UKQEAgLTQzODIsMjcgKzQ4MjcsMTYyIEBACiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6CiAgICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQpLAotICAgIG1JbnB1dChpbnB1dCksIG1SZXNhbXBsZXIoTlVMTCksIG1Sc21wT3V0QnVmZmVyKE5VTEwpLCBtUnNtcEluQnVmZmVyKE5VTEwpLAotICAgIC8vIG1Sc21wSW5JbmRleCBhbmQgbUJ1ZmZlclNpemUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgIG1SZXFDaGFubmVsQ291bnQocG9wY291bnQoY2hhbm5lbE1hc2spKSwKLSAgICBtUmVxU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQotICAgIC8vIG1CeXRlc1JlYWQgaXMgb25seSBtZWFuaW5nZnVsIHdoaWxlIGFjdGl2ZSwgYW5kIHNvIGlzIGNsZWFyZWQgaW4gc3RhcnQoKQotICAgIC8vIChidXQgbWlnaHQgYmUgYmV0dGVyIHRvIGFsc28gY2xlYXIgaGVyZSBmb3IgZHVtcD8pCisgICAgbUlucHV0KGlucHV0KSwgbUFjdGl2ZVRyYWNrc0dlbigwKSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKKyAgICAvLyBtUnNtcEluRnJhbWVzIGFuZCBtUnNtcEluRnJhbWVzUDIgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQorICAgIG1Sc21wSW5SZWFyKDApCiAjaWZkZWYgVEVFX1NJTksKICAgICAsIG1UZWVTaW5rKHRlZVNpbmspCiAjZW5kaWYKKyAgICAsIG1SZWFkT25seUhlYXAobmV3IE1lbW9yeURlYWxlcihrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSwKKyAgICAgICAgICAgICJSZWNvcmRUaHJlYWRSTyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpKQorICAgIC8vIG1GYXN0Q2FwdHVyZSBiZWxvdworICAgICwgbUZhc3RDYXB0dXJlRnV0ZXgoMCkKKyAgICAvLyBtSW5wdXRTb3VyY2UKKyAgICAvLyBtUGlwZVNpbmsKKyAgICAvLyBtUGlwZVNvdXJjZQorICAgICwgbVBpcGVGcmFtZXNQMigwKQorICAgIC8vIG1QaXBlTWVtb3J5CisgICAgLy8gbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIKKyAgICAsIG1GYXN0VHJhY2tBdmFpbChmYWxzZSkKIHsKICAgICBzbnByaW50ZihtTmFtZSwga05hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOworICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1OYW1lKTsKIAotICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKKyAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKKworICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzb3VyY2UgZm9yIHRoZSBIQUwgaW5wdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCisgICAgbUlucHV0U291cmNlID0gbmV3IEF1ZGlvU3RyZWFtSW5Tb3VyY2UoaW5wdXQtPnN0cmVhbSk7CisgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOworCisgICAgLy8gaW5pdGlhbGl6ZSBmYXN0IGNhcHR1cmUgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24KKyAgICBib29sIGluaXRGYXN0Q2FwdHVyZTsKKyAgICBzd2l0Y2ggKGtVc2VGYXN0Q2FwdHVyZSkgeworICAgIGNhc2UgRmFzdENhcHR1cmVfTmV2ZXI6CisgICAgICAgIGluaXRGYXN0Q2FwdHVyZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZhc3RDYXB0dXJlX0Fsd2F5czoKKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGYXN0Q2FwdHVyZV9TdGF0aWM6CisgICAgICAgIHVpbnQzMl90IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2woYXVkaW9GbGluZ2VyLT5tSGFyZHdhcmVMb2NrKTsKKyAgICAgICAgICAgIHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gYXVkaW9GbGluZ2VyLT5tUHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7CisgICAgICAgIH0KKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0KKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyBzYW1lIGFzIChhIHJlYXNvbmFibGUpIHByaW1hcnkgb3V0cHV0IHNhbXBsZSByYXRlCisgICAgICAgICAgICAgICAgKCgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDQxMDAgfHwgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gNDgwMDApICYmCisgICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSkpIHx8CisgICAgICAgICAgICAgICAgLy8gb3IgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUgaXMgdW5rbm93biwgYW5kIGNhcHR1cmUgc2FtcGxlIHJhdGUgaXMgcmVhc29uYWJsZQorICAgICAgICAgICAgICAgICgocHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChtU2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBtU2FtcGxlUmF0ZSA9PSA0ODAwMCkpKSkgJiYKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGJ1ZmZlciBzaXplIGlzIDwgMTIgbXMKKyAgICAgICAgICAgICAgICAobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlIDwgMTI7CisgICAgICAgIGJyZWFrOworICAgIC8vIGNhc2UgRmFzdENhcHR1cmVfRHluYW1pYzoKKyAgICB9CisKKyAgICBpZiAoaW5pdEZhc3RDYXB0dXJlKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgZm9yIEZhc3RNaXhlciB0byB3cml0ZSB0bywgYW5kIGZvciB1cyBhbmQgZmFzdCB0cmFja3MgdG8gcmVhZCBmcm9tCisgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtSW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICBzaXplX3QgcGlwZUZyYW1lc1AyID0gcm91bmR1cChtU2FtcGxlUmF0ZSAvIDI1KTsgICAgLy8gZG91YmxlLWJ1ZmZlcmluZyBvZiAyMCBtcyBlYWNoCisgICAgICAgIHNpemVfdCBwaXBlU2l6ZSA9IHBpcGVGcmFtZXNQMiAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKKyAgICAgICAgdm9pZCAqcGlwZUJ1ZmZlcjsKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiByb0hlYXAocmVhZE9ubHlIZWFwKCkpOworICAgICAgICBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5OworICAgICAgICBpZiAoKHJvSGVhcCA9PSAwKSB8fAorICAgICAgICAgICAgICAgIChwaXBlTWVtb3J5ID0gcm9IZWFwLT5hbGxvY2F0ZShwaXBlU2l6ZSkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAocGlwZUJ1ZmZlciA9IHBpcGVNZW1vcnktPnBvaW50ZXIoKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBwaXBlIGJ1ZmZlciBzaXplPSV6dSIsIHBpcGVTaXplKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIC8vIHBpcGUgd2lsbCBiZSBzaGFyZWQgZGlyZWN0bHkgd2l0aCBmYXN0IGNsaWVudHMsIHNvIGNsZWFyIHRvIGF2b2lkIGxlYWtpbmcgb2xkIGluZm9ybWF0aW9uCisgICAgICAgIG1lbXNldChwaXBlQnVmZmVyLCAwLCBwaXBlU2l6ZSk7CisgICAgICAgIFBpcGUgKnBpcGUgPSBuZXcgUGlwZShwaXBlRnJhbWVzUDIsIGZvcm1hdCwgcGlwZUJ1ZmZlcik7CisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKKyAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOworICAgICAgICBtUGlwZVNpbmsgPSBwaXBlOworICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOworICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisgICAgICAgIG1QaXBlU291cmNlID0gcGlwZVJlYWRlcjsKKyAgICAgICAgbVBpcGVGcmFtZXNQMiA9IHBpcGVGcmFtZXNQMjsKKyAgICAgICAgbVBpcGVNZW1vcnkgPSBwaXBlTWVtb3J5OworCisgICAgICAgIC8vIGNyZWF0ZSBmYXN0IGNhcHR1cmUKKyAgICAgICAgbUZhc3RDYXB0dXJlID0gbmV3IEZhc3RDYXB0dXJlKCk7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAorICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIHN0YXRlLT5tQ2JsayA9IE5VTEw7CisgICAgICAgIHN0YXRlLT5tSW5wdXRTb3VyY2UgPSBtSW5wdXRTb3VyY2UuZ2V0KCk7CisgICAgICAgIHN0YXRlLT5tSW5wdXRTb3VyY2VHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1QaXBlU2luayA9IHBpcGU7CisgICAgICAgIHN0YXRlLT5tUGlwZVNpbmtHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRTsKKyAgICAgICAgLy8gYWxyZWFkeSBkb25lIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QKKyAgICAgICAgLy9tRmFzdENhcHR1cmVGdXRleCA9IDA7CisgICAgICAgIHN0YXRlLT5tQ29sZEZ1dGV4QWRkciA9ICZtRmFzdENhcHR1cmVGdXRleDsKKyAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CisgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0Q2FwdHVyZUR1bXBTdGF0ZTsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdENhcHR1cmVMb2dTaXplLCAiRmFzdENhcHR1cmUiKTsKKyAgICAgICAgc3RhdGUtPm1OQkxvZ1dyaXRlciA9IG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyLmdldCgpOworICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgIHNxLT5wdXNoKEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKworICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCisgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKKyAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CisgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7CisgICAgICAgIH0KKworI2lmZGVmIEFVRElPX1dBVENIRE9HCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKworICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOworICAgIH0KK2ZhaWxlZDogOworCisgICAgLy8gRklYTUUgbU5vcm1hbFNvdXJjZQogfQogCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp+UmVjb3JkVGhyZWFkKCkKIHsKKyAgICBpZiAobUZhc3RDYXB0dXJlICE9IDApIHsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdENhcHR1cmVGdXRleCk7CisgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0Q2FwdHVyZUZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RDYXB0dXJlU3RhdGU6OkVYSVQ7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOworICAgICAgICBtRmFzdENhcHR1cmUtPmpvaW4oKTsKKyAgICAgICAgbUZhc3RDYXB0dXJlLmNsZWFyKCk7CisgICAgfQorICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIpOworICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKICAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwotICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTQ0MTAsMjMwICs0OTkwLDQ4MiBAQAogICAgIHJ1bihtTmFtZSwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWR5VG9SdW4oKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRDaGVjaygpOwotICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwiUmVjb3JkVGhyZWFkICVwIGNvdWxkIG5vdCBpbml0aWFsaXplIiwgdGhpcyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dGhyZWFkTG9vcCgpCiB7Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKLSAgICBzcDxSZWNvcmRUcmFjaz4gYWN0aXZlVHJhY2s7Ci0gICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7Ci0KICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKIAogICAgIGlucHV0U3RhbmRCeSgpOworCityZWFjcXVpcmVfd2FrZWxvY2s6CisgICAgc3A8UmVjb3JkVHJhY2s+IGFjdGl2ZVRyYWNrOworICAgIGludCBhY3RpdmVUcmFja3NHZW47CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFjazsKLSAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woYWN0aXZlVHJhY2sgIT0gMCA/IGFjdGl2ZVRyYWNrLT51aWQoKSA6IC0xKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgYWN0aXZlVHJhY2tzR2VuID0gbUFjdGl2ZVRyYWNrc0dlbjsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBhbiBhcmJpdHJhcnkgY2hvaWNlCisgICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFja3NbMF07CisgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChhY3RpdmVUcmFjay0+dWlkKCkpOworICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrc1tpXS0+dWlkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woLTEpOworICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gdXNlZCB0byB2ZXJpZnkgd2UndmUgcmVhZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBldmFsdWF0aW5nIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZAotICAgIGJvb2wgcmVhZE9uY2UgPSBmYWxzZTsKKyAgICAvLyB1c2VkIHRvIHJlcXVlc3QgYSBkZWZlcnJlZCBzbGVlcCwgdG8gYmUgZXhlY3V0ZWQgbGF0ZXIgd2hpbGUgbXV0ZXggaXMgdW5sb2NrZWQKKyAgICB1aW50MzJfdCBzbGVlcFVzID0gMDsKIAotICAgIC8vIHN0YXJ0IHJlY29yZGluZwotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgeworICAgIC8vIGxvb3Agd2hpbGUgdGhlcmUgaXMgd29yayB0byBkbworICAgIGZvciAoOzspIHsKKyAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKLSAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOworICAgICAgICAvLyBzbGVlcCB3aXRoIG11dGV4IHVubG9ja2VkCisgICAgICAgIGlmIChzbGVlcFVzID4gMCkgeworICAgICAgICAgICAgdXNsZWVwKHNsZWVwVXMpOworICAgICAgICAgICAgc2xlZXBVcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBhY3RpdmVUcmFja3MgYWNjdW11bGF0ZXMgYSBjb3B5IG9mIGEgc3Vic2V0IG9mIG1BY3RpdmVUcmFja3MKKyAgICAgICAgVmVjdG9yPCBzcDxSZWNvcmRUcmFjaz4gPiBhY3RpdmVUcmFja3M7CisKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSAoZmlyc3QgYW5kIG9ubHkpIGFjdGl2ZSBmYXN0IHRyYWNrCisgICAgICAgIHNwPFJlY29yZFRyYWNrPiBmYXN0VHJhY2s7CisKKyAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgZmFzdCB0cmFjayB3aGljaCBpcyBhYm91dCB0byBiZSByZW1vdmVkCisgICAgICAgIHNwPFJlY29yZFRyYWNrPiBmYXN0VHJhY2tUb1JlbW92ZTsKIAogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDAgJiYgYWN0aXZlVHJhY2sgIT0gbUFjdGl2ZVRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOwotICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrLT51aWQoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlV2FrZUxvY2tVaWRzX2wodG1wKTsKKworICAgICAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGV4aXRQZW5kaW5nIGhlcmUgYmVjYXVzZSBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIGFuZAorICAgICAgICAgICAgLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBjYW4gdGVtcG9yYXJpbHkgcmVsZWFzZSBtTG9jaworICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrOwotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayA9PSAwICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhbmRieSgpOwogCi0gICAgICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAvLyBpZiBubyBhY3RpdmUgdHJhY2socyksIHRoZW4gc3RhbmRieSBhbmQgcmVsZWFzZSB3YWtlbG9jaworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CisgICAgICAgICAgICAgICAgLy8gZXhpdFBlbmRpbmcoKSBjYW4ndCBiZWNvbWUgdHJ1ZSBoZXJlCiAgICAgICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKICAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOiBsb29wIHN0b3BwaW5nIik7CiAgICAgICAgICAgICAgICAgLy8gZ28gdG8gc2xlZXAKICAgICAgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKICAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOiBsb29wIHN0YXJ0aW5nIik7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2wobUFjdGl2ZVRyYWNrICE9IDAgPyBtQWN0aXZlVHJhY2stPnVpZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGdvdG8gcmVhY3F1aXJlX3dha2Vsb2NrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbChtQWN0aXZlVHJhY2spOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewotICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXFDaGFubmVsQ291bnQgIT0gbUFjdGl2ZVRyYWNrLT5jaGFubmVsQ291bnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFkT25jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHN0YXJ0IHN1Y2NlZWRzIG9ubHkgaWYgZmlyc3QgcmVhZCBmcm9tIGF1ZGlvIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZWVkcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlYWQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7CisKKyAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzR2VuICE9IGFjdGl2ZVRyYWNrc0dlbikgeworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrc0dlbiA9IG1BY3RpdmVUcmFja3NHZW47CisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gdG1wOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcC5hZGQobUFjdGl2ZVRyYWNrc1tpXS0+dWlkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIGRvQnJvYWRjYXN0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICkgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2tUb1JlbW92ZSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja1RvUmVtb3ZlID0gYWN0aXZlVHJhY2s7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbChhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgYWN0aXZlVHJhY2tTdGF0ZSA9IGFjdGl2ZVRyYWNrLT5tU3RhdGU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhY3RpdmVUcmFja1N0YXRlKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0lORzoKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVEFSVElOR18xOgorICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0gMTAwMDA7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RBUlRJTkdfMjoKKyAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OkFDVElWRToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCghbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrID09IDApOworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2sgPSBhY3RpdmVUcmFjazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG9Ccm9hZGNhc3QpIHsKKyAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwVXMgPSAwOwogCiAgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6QUNUSVZFICYmCi0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwotICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CisgICAgICAgIC8vIHRocmVhZCBtdXRleCBpcyBub3cgdW5sb2NrZWQsIG1BY3RpdmVUcmFja3MgdW5rbm93biwgYWN0aXZlVHJhY2tzLnNpemUoKSA+IDAKKworICAgICAgICBzaXplX3Qgc2l6ZSA9IGVmZmVjdENoYWlucy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAvLyB0aHJlYWQgbXV0ZXggaXMgbm90IGxvY2tlZCwgYnV0IGVmZmVjdCBjaGFpbiBpcyBsb2NrZWQKKyAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQdXNoIGEgbmV3IGZhc3QgY2FwdHVyZSBzdGF0ZSBpZiBmYXN0IGNhcHR1cmUgaXMgbm90IGFscmVhZHkgcnVubmluZywgb3IgY2JsayBjaGFuZ2UKKyAgICAgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgICAgIGJvb2wgZGlkTW9kaWZ5ID0gZmFsc2U7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OmJsb2NrX3QgYmxvY2sgPSBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgIT0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURSAvKiBGSVhNRSAmJgorICAgICAgICAgICAgICAgICAgICAoa1VzZUZhc3RNaXhlciAhPSBGYXN0TWl4ZXJfRHluYW1pYyB8fCBzdGF0ZS0+bVRyYWNrTWFzayA+IDEpKi8pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRSkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RDYXB0dXJlRnV0ZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RDYXB0dXJlRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURTsKKyNpZiAwICAgLy8gRklYTUUKKyAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGUuaW5jcmVhc2VTYW1wbGluZ04obUF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZTo6a1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA6IEZhc3RNaXhlckR1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190ICpjYmxrT2xkID0gc3RhdGUtPm1DYmxrOworICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190ICpjYmxrTmV3ID0gZmFzdFRyYWNrICE9IDAgPyBmYXN0VHJhY2stPmNibGsoKSA6IE5VTEw7CisgICAgICAgICAgICBpZiAoY2Jsa05ldyAhPSBjYmxrT2xkKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1DYmxrID0gY2Jsa05ldzsKKyAgICAgICAgICAgICAgICAvLyBibG9jayB1bnRpbCBhY2tlZCBpZiByZW1vdmluZyBhIGZhc3QgdHJhY2sKKyAgICAgICAgICAgICAgICBpZiAoY2Jsa09sZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNxLT5lbmQoZGlkTW9kaWZ5KTsKKyAgICAgICAgICAgIGlmIChkaWRNb2RpZnkpIHsKKyAgICAgICAgICAgICAgICBzcS0+cHVzaChibG9jayk7CisjaWYgMAorICAgICAgICAgICAgICAgIGlmIChrVXNlRmFzdENhcHR1cmUgPT0gRmFzdENhcHR1cmVfRHluYW1pYykgeworICAgICAgICAgICAgICAgICAgICBtTm9ybWFsU291cmNlID0gbVBpcGVTb3VyY2U7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgcnVuIHRoZSBmYXN0IHRyYWNrIGRlc3RydWN0b3Igd2l0aCB0aHJlYWQgbXV0ZXggdW5sb2NrZWQKKyAgICAgICAgZmFzdFRyYWNrVG9SZW1vdmUuY2xlYXIoKTsKKworICAgICAgICAvLyBSZWFkIGZyb20gSEFMIHRvIGtlZXAgdXAgd2l0aCBmYXN0ZXN0IGNsaWVudCBpZiBtdWx0aXBsZSBhY3RpdmUgdHJhY2tzLCBub3Qgc2xvd2VzdCBvbmUuCisgICAgICAgIC8vIE9ubHkgdGhlIGNsaWVudChzKSB0aGF0IGFyZSB0b28gc2xvdyB3aWxsIG92ZXJydW4uIEJ1dCBpZiBldmVuIHRoZSBmYXN0ZXN0IGNsaWVudCBpcyB0b28KKyAgICAgICAgLy8gc2xvdywgdGhlbiB0aGlzIFJlY29yZFRocmVhZCB3aWxsIG92ZXJydW4gYnkgbm90IGNhbGxpbmcgSEFMIHJlYWQgb2Z0ZW4gZW5vdWdoLgorICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgZmlyc3QgcmVhZCBwYXN0IHRoZSBub21pbmFsIGVuZCBvZiBidWZmZXIsIHRoZW4KKyAgICAgICAgLy8gY29weSB0byB0aGUgcmlnaHQgcGxhY2UuICBQZXJtaXR0ZWQgYmVjYXVzZSBtUnNtcEluQnVmZmVyIHdhcyBvdmVyLWFsbG9jYXRlZC4KKworICAgICAgICBpbnQzMl90IHJlYXIgPSBtUnNtcEluUmVhciAmIChtUnNtcEluRnJhbWVzUDIgLSAxKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkOworCisgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCisgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9SZWFkLCBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgcGlwZSBpcyBub24tYmxvY2tpbmcsIHNpbXVsYXRlIGJsb2NraW5nIGlucHV0CisgICAgICAgICAgICAgICAgc2xlZXBVcyA9IChmcmFtZXNUb1JlYWQgKiAxMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIEhBTCAvIEF1ZGlvU3RyZWFtSW4gZGlyZWN0bHkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgbUJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkIC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZXNSZWFkIDwgMCB8fCAoZnJhbWVzUmVhZCA9PSAwICYmIG1QaXBlU291cmNlID09IDApKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCBmYWlsZWQ6IGZyYW1lc1JlYWQ9JWQiLCBmcmFtZXNSZWFkKTsKKyAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvIHJlY292ZXIgYXQgbmV4dCByZWFkIGF0dGVtcHQKKyAgICAgICAgICAgIGlucHV0U3RhbmRCeSgpOworICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGdvdG8gdW5sb2NrOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKKworICAgICAgICBpZiAobVRlZVNpbmsgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgmbVJzbXBJbkJ1ZmZlcltyZWFyICogbUNoYW5uZWxDb3VudF0sIGZyYW1lc1JlYWQpOworICAgICAgICB9CisgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CisgICAgICAgICAgICBpZiAoKHNpemVfdCkgZnJhbWVzUmVhZCA+IHBhcnQxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1Sc21wSW5CdWZmZXIsICZtUnNtcEluQnVmZmVyW21Sc21wSW5GcmFtZXNQMiAqIG1DaGFubmVsQ291bnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lc1JlYWQgLSBwYXJ0MSkgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWFyID0gbVJzbXBJblJlYXIgKz0gZnJhbWVzUmVhZDsKKworICAgICAgICBzaXplID0gYWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgLy8gbG9vcCBvdmVyIGVhY2ggYWN0aXZlIHRyYWNrCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBhY3RpdmVUcmFjayA9IGFjdGl2ZVRyYWNrc1tpXTsKKworICAgICAgICAgICAgLy8gc2tpcCBmYXN0IHRyYWNrcywgYXMgdGhvc2UgYXJlIGhhbmRsZWQgZGlyZWN0bHkgYnkgRmFzdENhcHR1cmUKKyAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNGYXN0VHJhY2soKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYnVmZmVyLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZWFkT25jZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIE9WRVJSVU5fVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBPVkVSUlVOX1RSVUUsCisgICAgICAgICAgICAgICAgT1ZFUlJVTl9GQUxTRQorICAgICAgICAgICAgfSBvdmVycnVuID0gT1ZFUlJVTl9VTktOT1dOOworCisgICAgICAgICAgICAvLyBsb29wIG92ZXIgZ2V0TmV4dEJ1ZmZlciB0byBoYW5kbGUgY2lyY3VsYXIgc2luaworICAgICAgICAgICAgZm9yICg7OykgeworCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSB+MDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYWN0aXZlVHJhY2stPm1TaW5rKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc3RhdHVzID09IE9LKSAhPSAoZnJhbWVzT3V0ID4gMCkpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgICAgICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luOworCisgICAgICAgICAgICAgICAgaWYgKGZpbGxlZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCB0cmVhdCBsaWtlIGEgbWFzc2l2ZSBvdmVycnVuIGFuZCByZS1zeW5jCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IHJlYXI7CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KSBmaWxsZWQgPD0gbVJzbXBJbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IChzaXplX3QpIGZpbGxlZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXMgbm90IGtlZXBpbmcgdXAgd2l0aCBzZXJ2ZXIsIGJ1dCBnaXZlIGl0IGxhdGVzdCBkYXRhCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gbVJzbXBJbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCA9IGZyb250ID0gcmVhciAtIGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCB8fCBmcmFtZXNJbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJlc2FtcGxlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc2FtcGxpbmcKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc091dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luID0gbUZyYW1lQ291bnQgLSBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgbVJzbXBJbkluZGV4ICogbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGJ1ZmZlci5pOCArIChidWZmZXIuZnJhbWVDb3VudCAtIGZyYW1lc091dCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ICs9IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCAtPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgZnJhbWVzSW4gKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG1peF90b19zdGVyZW9faTE2X2Zyb21fbW9ub19pMTYoKGludDE2X3QgKilkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopc3JjLCBmcmFtZXNJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNigoaW50MTZfdCAqKWRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilzcmMsIGZyYW1lc0luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgJiYgbUZyYW1lQ291bnQgPT0gbVJzbXBJbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVhZEludG87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSBtRnJhbWVDb3VudCAmJiBtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludG8gPSBidWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnRvID0gbVJzbXBJbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA9IG1JbnB1dC0+c3RyZWFtLT5yZWFkKG1JbnB1dC0+c3RyZWFtLCByZWFkSW50bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVhZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobUJ5dGVzUmVhZCA8IDApICYmIChtQWN0aXZlVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OkFDVElWRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbnB1dCBpbnRvIHN0YW5kYnkgc28gdGhhdCBpdCB0cmllcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXAoa1JlY29yZFRocmVhZFNsZWVwVXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKHJlYWRJbnRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQgPj4gRm9ybWF0X2ZyYW1lQml0U2hpZnQobVRlZVNpbmstPmZvcm1hdCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA+IGZyYW1lc091dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBmcmFtZXNJbjsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKmRzdCA9IGFjdGl2ZVRyYWNrLT5tU2luay5pODsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lc0luID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgJj0gbVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQxID4gZnJhbWVzSW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSA9IGZyYW1lc0luOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICpzcmMgPSAoaW50OF90ICopbVJzbXBJbkJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gYWN0aXZlVHJhY2stPm1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHBhcnQxICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19pMTZfZnJvbV9tb25vX2kxNigoaW50MTZfdCAqKWRzdCwgKGNvbnN0IGludDE2X3QgKilzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBwYXJ0MSAqIGFjdGl2ZVRyYWNrLT5tRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnQgKz0gcGFydDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiAtPSBwYXJ0MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IGZyYW1lc091dDsKKwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVzSW5OZWVkZWQgc2hvdWxkIHJlYWxseSBiZSBwYXJ0IG9mIHJlc2FtcGxlciBBUEksIGFuZCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgZGVwZW5kIG9uIHRoZSBTUkMgcmF0aW8KKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8ga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwgc28gcmVzYW1wbGVyIGFsd2F5cyBoYXMgc3VmZmljaWVudCBpbnB1dAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW5OZWVkZWQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgcmUtY2FsY3VsYXRlIHdoZW4gaXQgY2hhbmdlcywgYW5kIG9wdGltaXplIGZvciBjb21tb24gcmF0aW9zCisgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwcmVjb21wdXRlIGluL291dCBiZWNhdXNlIGZsb2F0aW5nIHBvaW50IGlzIG5vdCBhc3NvY2lhdGl2ZQorICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIGEqYi9jICE9IGEqKGIvYykuCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBpbihtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBvdXQoYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQgPSBjZWlsKGZyYW1lc091dCAqIGluIC8gb3V0KSArIDE7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggd2UgdGhlb3JldGljYWxseSBoYXZlIGZyYW1lc0luIGluIGNpcmN1bGFyIGJ1ZmZlciwgc29tZSBvZiB0aG9zZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5yZWxlYXNlZCBmcmFtZXMsIGFuZCB0aHVzIG11c3QgYmUgZGlzY291bnRlZCBmb3IgcHVycG9zZSBvZiBidWRnZXRpbmcuCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCB1bnJlbGVhc2VkID0gYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbDsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNJbiA+IHVucmVsZWFzZWQgPyBmcmFtZXNJbiAtIHVucmVsZWFzZWQgOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdCBlbm91Z2ggdG8gcmVzYW1wbGU6IGhhdmUgJXUgZnJhbWVzIGluIGJ1dCBuZWVkICV1IGluIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXdGcmFtZXNPdXQgPSBmcmFtZXNJbiA+IDAgPyBmbG9vcigoZnJhbWVzSW4gLSAxKSAqIG91dCAvIGluKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5ld0ZyYW1lc091dCA+PSBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZyYW1lc091dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwobmV3RnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3cgbmVlZCAldSBmcmFtZXMgaW4gdG8gcHJvZHVjZSAldSBvdXQgZ2l2ZW4gb3V0L2luIHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCwgbmV3RnJhbWVzT3V0LCBvdXQgLyBpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZyYW1lc0luIDwgZnJhbWVzSW5OZWVkZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3MgMjogaGF2ZSAldSBmcmFtZXMgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgbmV3RnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBuZXdGcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAxOiBoYXZlICV1IGluIGFuZCBuZWVkICV1IGluIHRvIHByb2R1Y2UgJXUgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIG1Sc21wT3V0QnVmZmVyIGFzIG5lZWRlZDsgd2Ugd2lsbCBncm93IGJ1dCBuZXZlciBzaHJpbmsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEZyYW1lQ291bnQgPCBmcmFtZXNPdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHdoeSBkb2VzIGVhY2ggdHJhY2sgbmVlZCBpdCdzIG93biBtUnNtcE91dEJ1ZmZlcj8gY2FuJ3QgdGhleSBzaGFyZT8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciA9IG5ldyBpbnQzMl90W2ZyYW1lc091dCAqIEZDQ18yXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsZXIgYWNjdW11bGF0ZXMsIGJ1dCB3ZSBvbmx5IGhhdmUgb25lIHNvdXJjZSB0cmFjawotICAgICAgICAgICAgICAgICAgICBtZW1zZXQobVJzbXBPdXRCdWZmZXIsIDAsIGZyYW1lc091dCAqIEZDQ18yICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXIgb3V0cHV0IGZyYW1lIGNvdW50IGFzIGlmIHdlIHdlcmUgZXhwZWN0aW5nIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPj49IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUobVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIC8qIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICovKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgMCwgZnJhbWVzT3V0ICogRkNDXzIgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlci0+cmVzYW1wbGUoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgaG93IGFib3V0IGhhdmluZyBhY3RpdmVUcmFjayBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaXRzZWxmPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoaXMqLyAvKiBBdWRpb0J1ZmZlclByb3ZpZGVyKiAqLyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRpdGhlckFuZENsYW1wKCkgd29ya3MgYXMgbG9uZyBhcyBhbGwgYnVmZmVycyByZXR1cm5lZCBieQotICAgICAgICAgICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoKSBhcmUgMzIgYml0IGFsaWduZWQgd2hpY2ggc2hvdWxkIGJlIGFsd2F5cyB0cnVlLgotICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAyICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgdHlwZSBwdW4gbVJzbXBPdXRCdWZmZXIgZnJvbSBRMTkuMTIgdG8gaW50MTZfdAotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAobVJzbXBPdXRCdWZmZXIsIG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigpIGFyZSAzMiBiaXQgYWxpZ25lZCB3aGljaCBzaG91bGQgYmUgYWx3YXlzIHRydWUuCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSB0eXBlIHB1biBtUnNtcE91dEJ1ZmZlciBmcm9tIFE0LjI3IHRvIGludDE2X3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8gc2FtcGxlczoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHBvc3Qgc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoYnVmZmVyLmkxNiwgKGludDE2X3QgKiltUnNtcE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KGFjdGl2ZVRyYWNrLT5tU2luay5pMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilidWZmZXIucmF3LCBtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90ICopYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBkb25lIHdpdGggbVJzbXBPdXRCdWZmZXIKIAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmFjdGl2ZVRyYWNrLT5tU2luayk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3AgLT0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc3RvRHJvcCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBjb3VsZCBkbyBhIHBhcnRpYWwgZHJvcCBvZiBmcmFtZXNPdXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgLT0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCArPSBidWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID49IDAgfHwgbVN5bmNTdGFydEV2ZW50ID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCArPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPj0gMCB8fCBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJTeW5jZWQgcmVjb3JkICVzLCBzZXNzaW9uICVkLCB0cmlnZ2VyIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRnJhbWVzdG9Ecm9wID49IDApID8gInRpbWVkIG91dCIgOiAiY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPnNlc3Npb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgPyBtU3luY1N0YXJ0RXZlbnQtPnRyaWdnZXJTZXNzaW9uKCkgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wID49IDApID8gInRpbWVkIG91dCIgOiAiY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+c2Vzc2lvbklkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgIT0gMCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+dHJpZ2dlclNlc3Npb24oKSA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5jbGVhck92ZXJmbG93KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xpZW50IGlzbid0IHJldHJpZXZpbmcgYnVmZmVycyBmYXN0IGVub3VnaAotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2stPnNldE92ZXJmbG93KCkpIHsKKworICAgICAgICAgICAgc3dpdGNoIChvdmVycnVuKSB7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fVFJVRToKKyAgICAgICAgICAgICAgICAvLyBjbGllbnQgaXNuJ3QgcmV0cmlldmluZyBidWZmZXJzIGZhc3QgZW5vdWdoCisgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkgewogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIGxhc3RXYXJuaW5nIHBlciB0cmFjaz8KICAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNvcmRUaHJlYWQ6IGJ1ZmZlciBvdmVyZmxvdyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZvciBhIHdoaWxlIGJlZm9yZSBhc2tpbmcgZm9yIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ2l2ZSB0aGUgYXBwbGljYXRpb24gbW9yZSBjaGFuY2UgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIgYW5kCi0gICAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJmbG93LgotICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9WRVJSVU5fRkFMU0U6CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyT3ZlcmZsb3coKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorCiAgICAgICAgIH0KKwordW5sb2NrOgogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7Ci0gICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOworICAgICAgICAvLyBlZmZlY3RDaGFpbnMgZG9lc24ndCBuZWVkIHRvIGJlIGNsZWFyZWQsIHNpbmNlIGl0IGlzIGNsZWFyZWQgYnkgZGVzdHJ1Y3RvciBhdCBzY29wZSBlbmQKICAgICB9CiAKLSAgICBzdGFuZGJ5KCk7CisgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNDY0MSw3ICs1NDczLDggQEAKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOwogICAgICAgICB9Ci0gICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOworICAgICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKICAgICAgICAgbVN0YXJ0U3RvcENvbmQuYnJvYWRjYXN0KCk7CiAgICAgfQogCkBAIC00NjUxLDcgKzU0ODQsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RhbmRieSgpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCkKIHsKICAgICBpZiAoIW1TdGFuZGJ5KSB7CiAgICAgICAgIGlucHV0U3RhbmRCeSgpOwpAQCAtNDY2MSw5MSArNTQ5NCwxMzAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW5wdXRTdGFuZEJ5KCkKIHsKKyAgICAvLyBJZGxlIHRoZSBmYXN0IGNhcHR1cmUgaWYgaXQncyBjdXJyZW50bHkgcnVubmluZworICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgeworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFOworICAgICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0Q2FwdHVyZUZ1dGV4OworICAgICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CisgICAgICAgICAgICBtRmFzdENhcHR1cmVGdXRleCA9IDA7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICAvLyBCTE9DS19VTlRJTF9QVVNIRUQgd291bGQgYmUgaW5zdWZmaWNpZW50LCBhcyB3ZSBuZWVkIGl0IHRvIHN0b3AgZG9pbmcgSS9PIG5vdworICAgICAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisjaWYgMAorICAgICAgICAgICAgaWYgKGtVc2VGYXN0Q2FwdHVyZSA9PSBGYXN0Q2FwdHVyZV9EeW5hbWljKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUKKyAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIEFVRElPX1dBVENIRE9HCisgICAgICAgICAgICAvLyBGSVhNRQorI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOworICAgICAgICB9CisgICAgfQogICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiB9CiAKLXNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKAorLy8gUmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CiAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAKKyAgICAvLyBjbGllbnQgZXhwcmVzc2VzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVCwgYnV0IHdlIGdldCB0aGUgZmluYWwgc2F5CisgICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgIGlmICgKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayBoYW5kbGVyCisgICAgICAgICAgICAodGlkICE9IC0xKSAmJgorICAgICAgICAgICAgLy8gZnJhbWUgY291bnQgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAorICAgICAgICAgICAgKChmcmFtZUNvdW50ID09IDApIHx8IChmcmFtZUNvdW50ID09IG1QaXBlRnJhbWVzUDIpKSAmJgorICAgICAgICAgICAgLy8gUENNIGRhdGEKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGZvcm1hdAorICAgICAgICAgICAgKGZvcm1hdCA9PSBtRm9ybWF0KSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGNoYW5uZWwgbWFzaworICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgIC8vIG5hdGl2ZSBoYXJkd2FyZSBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCisgICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgY2FwdHVyZQorICAgICAgICAgICAgaGFzRmFzdENhcHR1cmUoKSAmJgorICAgICAgICAgICAgLy8gdGhlcmUgYXJlIHN1ZmZpY2llbnQgZmFzdCB0cmFjayBzbG90cyBhdmFpbGFibGUKKyAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbAorICAgICAgICApIHsKKyAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBhY2NlcHRlZDogZnJhbWVDb3VudD0ldSBtRnJhbWVDb3VudD0ldSIsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQ6IGZyYW1lQ291bnQ9JXUgbUZyYW1lQ291bnQ9JXUgbVBpcGVGcmFtZXNQMj0ldSAiCisgICAgICAgICAgICAgICAgImZvcm1hdD0lI3ggaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4IHNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgorICAgICAgICAgICAgICAgICJoYXNGYXN0Q2FwdHVyZT0lZCB0aWQ9JWQgbUZhc3RUcmFja0F2YWlsPSVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgbVBpcGVGcmFtZXNQMiwKKyAgICAgICAgICAgICAgICBmb3JtYXQsIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCksIHRpZCwgbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbXB1dGUgdHJhY2sgYnVmZmVyIHNpemUgaW4gZnJhbWVzLCBhbmQgc3VnZ2VzdCB0aGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50CisgICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgLy8gZmFzdCB0cmFjazogZnJhbWUgY291bnQgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAorICAgICAgICBmcmFtZUNvdW50ID0gbVBpcGVGcmFtZXNQMjsKKyAgICAgICAgLy8gaWdub3JlIHJlcXVlc3RlZCBub3RpZmljYXRpb25GcmFtZXMsIGFuZCBhbHdheXMgbm90aWZ5IGV4YWN0bHkgb25jZSBldmVyeSBIQUwgYnVmZmVyCisgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBub3QgZmFzdCB0cmFjazogbWF4IG5vdGlmaWNhdGlvbiBwZXJpb2QgaXMgcmVzYW1wbGVkIGVxdWl2YWxlbnQgb2Ygb25lIEhBTCBidWZmZXIgdGltZQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgb3IgMjAgbXMgaWYgdGhlcmUgaXMgYSBmYXN0IGNhcHR1cmUKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZSwgYW5kIGNvbnN0CisgICAgICAgIHNpemVfdCBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSAoKGludDY0X3QpIChoYXNGYXN0Q2FwdHVyZSgpID8gbVNhbXBsZVJhdGUvNTAgOiBtRnJhbWVDb3VudCkKKyAgICAgICAgICAgICAgICAqIHNhbXBsZVJhdGUgKyBtU2FtcGxlUmF0ZSAtIDEpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIG5vdGlmaWNhdGlvbiBwZXJpb2RzIGlzIGF0IGxlYXN0IGtNaW5Ob3RpZmljYXRpb25zLAorICAgICAgICAvLyBhbmQgYXQgbGVhc3Qga01pbk1zIHJvdW5kZWQgdXAgdG8gYSB3aG9sZSBub3RpZmljYXRpb24gcGVyaW9kIChtaW5Ob3RpZmljYXRpb25zQnlNcykKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluTm90aWZpY2F0aW9ucyA9IDM7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTXMgPSAzMDsKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZQorICAgICAgICBjb25zdCBzaXplX3QgbWluRnJhbWVzQnlNcyA9IChzYW1wbGVSYXRlICoga01pbk1zICsgMTAwMCAtIDEpIC8gMTAwMDsKKyAgICAgICAgLy8gVE9ETyBUaGlzIGNvdWxkIGJlIGEgcm91bmR1cFJhdGlvIGlubGluZQorICAgICAgICBjb25zdCBzaXplX3QgbWluTm90aWZpY2F0aW9uc0J5TXMgPSAobWluRnJhbWVzQnlNcyArIG1heE5vdGlmaWNhdGlvbkZyYW1lcyAtIDEpIC8KKyAgICAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzICoKKyAgICAgICAgICAgICAgICBtYXgoa01pbk5vdGlmaWNhdGlvbnMsIG1pbk5vdGlmaWNhdGlvbnNCeU1zKTsKKyAgICAgICAgZnJhbWVDb3VudCA9IG1heChmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKKyAgICAgICAgaWYgKCpub3RpZmljYXRpb25GcmFtZXMgPT0gMCB8fCAqbm90aWZpY2F0aW9uRnJhbWVzID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7CisgICAgICAgICAgICAqbm90aWZpY2F0aW9uRnJhbWVzID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICB9CisgICAgfQorICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisKICAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9Ci0gICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QsIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQotICAgIGlmICgqZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICBpZiAoCi0gICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgaGFuZGxlciBhbmQgZnJhbWUgY291bnQgaXMgZGVmYXVsdCBvciBhdCBsZWFzdCBhcyBsYXJnZSBhcyBIQUwKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAodGlkICE9IC0xKSAmJgotICAgICAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fAotICAgICAgICAgICAgICAgIChmcmFtZUNvdW50ID49IG1GcmFtZUNvdW50KSkKLSAgICAgICAgICAgICkgJiYKLSAgICAgICAgICAgIC8vIEZJWE1FIHdoZW4gcmVjb3JkIHN1cHBvcnRzIG5vbi1QQ00gZGF0YSwgYWxzbyBjaGVjayBmb3IgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCi0gICAgICAgICAgICAvLyBtb25vIG9yIHN0ZXJlbwotICAgICAgICAgICAgKCAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKLSAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgKSAmJgotICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKLSAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgotICAgICAgICAgICAgLy8gcmVjb3JkIHRocmVhZCBoYXMgYW4gYXNzb2NpYXRlZCBmYXN0IHJlY29yZGVyCi0gICAgICAgICAgICBoYXNGYXN0UmVjb3JkZXIoKQotICAgICAgICAgICAgLy8gRklYTUUgdGVzdCB0aGF0IFJlY29yZFRocmVhZCBmb3IgdGhpcyBmYXN0IHRyYWNrIGhhcyBhIGNhcGFibGUgb3V0cHV0IEhBTAotICAgICAgICAgICAgLy8gRklYTUUgYWRkIGEgcGVybWlzc2lvbiB0ZXN0IGFsc28/Ci0gICAgICAgICkgewotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gZmFzdCByZWNvcmRlciAoSEFMKSBmcmFtZSBjb3VudAotICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQgKiBrRmFzdFRyYWNrTXVsdGlwbGllcjsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSVkIG1GcmFtZUNvdW50PSVkIiwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZDogZnJhbWVDb3VudD0lZCAiCi0gICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lZCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCi0gICAgICAgICAgICAgICAgImhhc0Zhc3RSZWNvcmRlcj0lZCB0aWQ9JWQiLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFzRmFzdFJlY29yZGVyKCksIHRpZCk7Ci0gICAgICAgICpmbGFncyAmPSB+SUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKLSAgICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBdWRpb1JlY29yZCBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAotICAgICAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIHJlY29yZCB0aHJlYWQgZnJhbWUgY291bnQgYW5kIGNvdmVyIGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kuCi0gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCi0gICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgotICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSA1MDsgLy8gRklYTUUgbUlucHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1JbnB1dC0+c3RyZWFtKTsKLSAgICAgICAgc2l6ZV90IG1Ob3JtYWxGcmFtZUNvdW50ID0gMjA0ODsgLy8gRklYTUUKLSAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBsYXRlbmN5TXMgLyAoKDEwMDAgKiBtTm9ybWFsRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKLSAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbWluQnVmQ291bnQ7Ci0gICAgICAgIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGSVhNRSB1c2UgZmxhZ3MgYW5kIHRpZCBzaW1pbGFyIHRvIGNyZWF0ZVRyYWNrX2woKQogCiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2Vzc2lvbklkLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQpOwogCi0gICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgbm8gY29udHJvbCBibG9jayIpOwotICAgICAgICAgICAgbFN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmRUcmFja19sKCkgaW5pdENoZWNrIGZhaWxlZCAlZDsgbm8gY29udHJvbCBibG9jaz8iLCBsU3RhdHVzKTsKICAgICAgICAgICAgIC8vIHRyYWNrIG11c3QgYmUgY2xlYXJlZCBmcm9tIHRoZSBjYWxsZXIgYXMgdGhlIGNhbGxlciBoYXMgdGhlIEFGIGxvY2sKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtNDc2NCwxMiArNTYzNiwxMSBAQAogICAgICAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKGNhbGxpbmdQaWQsIHRpZCwga1ByaW9yaXR5QXVkaW9BcHApOwogICAgICAgICB9CiAgICAgfQorCiAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwogCiBFeGl0OgotICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgfQorICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFjazsKIH0KIApAQCAtNDc4Miw4MiArNTY1Myw4NiBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUpIHsKLSAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQgIT0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCisgICAgICAgIHJlY29yZFRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgPSBtQXVkaW9GbGluZ2VyLT5jcmVhdGVTeW5jRXZlbnQoZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTdGFydEV2ZW50Q2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrKTsKICAgICAgICAgLy8gU3luYyBldmVudCBjYW4gYmUgY2FuY2VsbGVkIGJ5IHRoZSB0cmlnZ2VyIHNlc3Npb24gaWYgdGhlIHRyYWNrIGlzIG5vdCBpbiBhCiAgICAgICAgIC8vIGNvbXBhdGlibGUgc3RhdGUgaW4gd2hpY2ggY2FzZSB3ZSBzdGFydCByZWNvcmQgaW1tZWRpYXRlbHkKLSAgICAgICAgaWYgKG1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TeW5jU3RhcnRFdmVudC0+aXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciB0aGUgZXZlbnQgZm9yIG1vcmUgdGhhbiBBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcwotICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCA9IC0gKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIG1SZXFTYW1wbGVSYXRlKSAvIDEwMDApOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1GcmFtZXNUb0Ryb3AgPSAtCisgICAgICAgICAgICAgICAgICAgICgoQXVkaW9TeXN0ZW06OmtTeW5jUmVjb3JkU3RhcnRUaW1lT3V0TXMgKiByZWNvcmRUcmFjay0+bVNhbXBsZVJhdGUpIC8gMTAwMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICB7CisgICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBhIHJlbmRlenZvdXMgYmV0d2VlbiBiaW5kZXIgdGhyZWFkIGV4ZWN1dGluZyBzdGFydCgpIGFuZCBSZWNvcmRUaHJlYWQKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUJVU1k7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewotICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBzdGF0ZSAlZCIsIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OklETEU7Ci0gICAgICAgIG1BY3RpdmVUcmFjayA9IHJlY29yZFRyYWNrOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIC8vIFRPRE8gY29uc2lkZXIgb3RoZXIgd2F5cyBvZiBoYW5kbGluZyB0aGlzLCBzdWNoIGFzIGNoYW5naW5nIHRoZSBzdGF0ZSB0byA6U1RBUlRJTkcgYW5kCisgICAgICAgIC8vICAgICAgYWRkaW5nIHRoZSB0cmFjayB0byBtQWN0aXZlVHJhY2tzIGFmdGVyIHJldHVybmluZyBmcm9tIEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KCksCisgICAgICAgIC8vICAgICAgb3IgdXNpbmcgYSBzZXBhcmF0ZSBjb21tYW5kIHRocmVhZAorICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18xOworICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZChyZWNvcmRUcmFjayk7CisgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkLCAoYXVkaW9fc2Vzc2lvbl90KXJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdGFydCBlcnJvciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKLSAgICAgICAgbUJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZXNhbXBsZXItPnJlc2V0KCk7CisgICAgICAgIC8vIENhdGNoIHVwIHdpdGggY3VycmVudCBidWZmZXIgaW5kaWNlcyBpZiB0aHJlYWQgaXMgYWxyZWFkeSBydW5uaW5nLgorICAgICAgICAvLyBUaGlzIGlzIHdoYXQgbWFrZXMgYSBuZXcgY2xpZW50IGRpc2NhcmQgYWxsIGJ1ZmZlcmVkIGRhdGEuICBJZiB0aGUgdHJhY2sncyBtUnNtcEluRnJvbnQKKyAgICAgICAgLy8gd2FzIGluaXRpYWxpemVkIHRvIHNvbWUgdmFsdWUgY2xvc2VyIHRvIHRoZSB0aHJlYWQncyBtUnNtcEluRnJvbnQsIHRoZW4gdGhlIHRyYWNrIGNvdWxkCisgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KKworICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJbkZyb250ID0gbVJzbXBJblJlYXI7CisgICAgICAgIHJlY29yZFRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICAvLyBGSVhNRSB3aHkgcmVzZXQ/CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlci0+cmVzZXQoKTsKICAgICAgICAgfQotICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UkVTVU1JTkc7CisgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKLSAgICAgICAgQUxPR1YoIlNpZ25hbCByZWNvcmQgdGhyZWFkIik7CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKLSAgICAgICAgfQotICAgICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayA9PSAwKSB7CisgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgewogICAgICAgICAgICAgQUxPR1YoIlJlY29yZCBmYWlsZWQgdG8gc3RhcnQiKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiUmVjb3JkIHN0YXJ0ZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKIHN0YXJ0RXJyb3I6Ci0gICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQpOwotICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpjbGVhclN5bmNTdGFydEV2ZW50KCkKLXsKLSAgICBpZiAobVN5bmNTdGFydEV2ZW50ICE9IDApIHsKLSAgICAgICAgbVN5bmNTdGFydEV2ZW50LT5jYW5jZWwoKTsKKyAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobUlkLCAoYXVkaW9fc2Vzc2lvbl90KXJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgfQotICAgIG1TeW5jU3RhcnRFdmVudC5jbGVhcigpOwotICAgIG1GcmFtZXN0b0Ryb3AgPSAwOworICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNDg2NSw0NiArNTc0MCw0MiBAQAogICAgIHNwPFN5bmNFdmVudD4gc3Ryb25nRXZlbnQgPSBldmVudC5wcm9tb3RlKCk7CiAKICAgICBpZiAoc3Ryb25nRXZlbnQgIT0gMCkgewotICAgICAgICBSZWNvcmRUaHJlYWQgKm1lID0gKFJlY29yZFRocmVhZCAqKXN0cm9uZ0V2ZW50LT5jb29raWUoKTsKLSAgICAgICAgbWUtPmhhbmRsZVN5bmNTdGFydEV2ZW50KHN0cm9uZ0V2ZW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQotewotICAgIGlmIChldmVudCA9PSBtU3luY1N0YXJ0RXZlbnQpIHsKLSAgICAgICAgLy8gVE9ETzogdXNlIGFjdHVhbCBidWZmZXIgZmlsbGluZyBzdGF0dXMgaW5zdGVhZCBvZiAyIGJ1ZmZlcnMgd2hlbiBpbmZvIGlzIGF2YWlsYWJsZQotICAgICAgICAvLyBmcm9tIGF1ZGlvIEhBTAotICAgICAgICBtRnJhbWVzdG9Ecm9wID0gbUZyYW1lQ291bnQgKiAyOworICAgICAgICBzcDxSZWZCYXNlPiBwdHIgPSBzdHJvbmdFdmVudC0+Y29va2llKCkucHJvbW90ZSgpOworICAgICAgICBpZiAocHRyICE9IDApIHsKKyAgICAgICAgICAgIFJlY29yZFRyYWNrICpyZWNvcmRUcmFjayA9IChSZWNvcmRUcmFjayAqKXB0ci5nZXQoKTsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5oYW5kbGVTeW5jU3RhcnRFdmVudChzdHJvbmdFdmVudCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0b3AoUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpzdG9wIik7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBpZiAocmVjb3JkVHJhY2sgIT0gbUFjdGl2ZVRyYWNrLmdldCgpIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgIT0gMCB8fCByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIC8vIG5vdGUgdGhhdCB0aHJlYWRMb29wIG1heSBzdGlsbCBiZSBwcm9jZXNzaW5nIHRoZSB0cmFjayBhdCB0aGlzIHBvaW50IFt3aXRob3V0IGxvY2tdCiAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0lORzsKICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgbVN0YXJ0U3RvcENvbmQgaWYgZXhpdGluZwogICAgIGlmIChleGl0UGVuZGluZygpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKICAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayA9PSBtQWN0aXZlVHJhY2suZ2V0KCkgaGVyZQotICAgIGlmIChleGl0UGVuZGluZygpIHx8IHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSkgeworICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrIGlzIGluIG1BY3RpdmVUcmFja3MgaGVyZQorICAgIGlmIChleGl0UGVuZGluZygpIHx8IG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgIT0gMCkgewogICAgICAgICBBTE9HVigiUmVjb3JkIHN0b3BwZWQgT0siKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3QKK2Jvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQgX191bnVzZWQpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkKIHsKICNpZiAwICAgLy8gVGhpcyBicmFuY2ggaXMgY3VycmVudGx5IGRlYWQgY29kZSwgYnV0IGlzIHByZXNlcnZlZCBpbiBjYXNlIGl0IHdpbGwgYmUgbmVlZGVkIGluIGZ1dHVyZQogICAgIGlmICghaXNWYWxpZFN5bmNFdmVudChldmVudCkpIHsKQEAgLTQ5MzUsNyArNTgwNiw3IEBACiAgICAgdHJhY2stPnRlcm1pbmF0ZSgpOwogICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CiAgICAgLy8gYWN0aXZlIHRyYWNrcyBhcmUgcmVtb3ZlZCBieSB0aHJlYWRMb29wKCkKLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IHRyYWNrKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CiAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwogICAgIH0KIH0KQEAgLTQ5NDQsNiArNTgxNSwxMCBAQAogewogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAvLyBuZWVkIGFueXRoaW5nIHJlbGF0ZWQgdG8gZWZmZWN0cyBoZXJlPworICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICBBTE9HX0FTU0VSVCghbUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtNDk1NSwyMTcgKzU4MzAsMjM2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIGRwcmludGYoZmQsICJcbklucHV0IHRocmVhZCAlcDpcbiIsIHRoaXMpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW4gaW5kZXg6ICV6dVxuIiwgbVJzbXBJbkluZGV4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJCdWZmZXIgc2l6ZTogJXp1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVzYW1wbGluZzogJWRcbiIsIChtUmVzYW1wbGVyICE9IE5VTEwpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXQgY2hhbm5lbCBjb3VudDogJXVcbiIsIG1SZXFDaGFubmVsQ291bnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dCBzYW1wbGUgcmF0ZTogJXVcbiIsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgQnVmZmVyIHNpemU6ICV6dSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk5vIGFjdGl2ZSByZWNvcmQgY2xpZW50XG4iKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW5wdXQgdGhyZWFkICVwIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGRwcmludGYoZmQsICIgICVkIFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICVkIGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSA9IG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPj0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwogICAgIH0KIAotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKLSAgICBzaXplX3QgZnJhbWVzUmVxID0gYnVmZmVyLT5mcmFtZUNvdW50OwotICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50IC0gbVJzbXBJbkluZGV4OwotICAgIGludCBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIG1Sc21wSW5CdWZmZXIsIG1CdWZmZXJTaXplKTsKLSAgICAgICAgaWYgKG1CeXRlc1JlYWQgPD0gMCkgewotICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IDA7Ci0gICAgICAgIGZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQ7CisgICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgeworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQorICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSk7CisgICAgLy8gJ2ZpbGxlZCcgbWF5IGJlIG5vbi1jb250aWd1b3VzLCBzbyByZXR1cm4gb25seSB0aGUgZmlyc3QgY29udGlndW91cyBjaHVuaworICAgIGZyb250ICY9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICBzaXplX3QgcGFydDEgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgIGlmIChwYXJ0MSA+IChzaXplX3QpIGZpbGxlZCkgeworICAgICAgICBwYXJ0MSA9IGZpbGxlZDsKKyAgICB9CisgICAgc2l6ZV90IGFzayA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBBTE9HX0FTU0VSVChhc2sgPiAwKTsKKyAgICBpZiAocGFydDEgPiBhc2spIHsKKyAgICAgICAgcGFydDEgPSBhc2s7CisgICAgfQorICAgIGlmIChwYXJ0MSA9PSAwKSB7CisgICAgICAgIC8vIEhpZ2hlci1sZXZlbCBzaG91bGQga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwsIGFuZCBub3QgY2FsbCByZXNhbXBsZXIgaWYgZW1wdHkKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgc3RhcnZlZCIpOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGlmIChmcmFtZXNSZXEgPiBmcmFtZXNSZWFkeSkgewotICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNSZWFkeTsKLSAgICB9Ci0KLSAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYW5uZWxDb3VudCA9IDI7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmF3ID0gbVJzbXBJbkJ1ZmZlciArIG1Sc21wSW5JbmRleCAqIGNoYW5uZWxDb3VudDsKLSAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgYnVmZmVyLT5yYXcgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUNoYW5uZWxDb3VudDsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwYXJ0MTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gcGFydDE7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBtUnNtcEluSW5kZXggKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChzdGVwQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsKTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOwotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgcmVxQ2hhbm5lbENvdW50ID0gbVJlcUNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlID0gdmFsdWU7CisgICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gbUZvcm1hdDsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG1DaGFubmVsQ291bnQpOworCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICAvLyBUT0RPIEludmVzdGlnYXRlIHdoZW4gdGhpcyBjb2RlIHJ1bnMuIENoZWNrIHdpdGggYXVkaW8gcG9saWN5IHdoZW4gYSBzYW1wbGUgcmF0ZSBhbmQKKyAgICAvLyAgICAgIGNoYW5uZWwgY291bnQgY2hhbmdlIGNhbiBiZSByZXF1ZXN0ZWQuIERvIHdlIG1hbmRhdGUgdGhlIGZpcnN0IGNsaWVudCBkZWZpbmVzIHRoZQorICAgIC8vICAgICAgSEFMIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgY291bnQgb3IgZG8gd2UgYWxsb3cgY2hhbmdlcyBvbiB0aGUgZmx5PworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHZhbHVlOworICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxQ2hhbm5lbENvdW50ID0gcG9wY291bnQodmFsdWUpOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOworICAgICAgICBpZiAobWFzayAhPSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgbWFzayAhPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtYXNrOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKLSAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCisgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gc3RvcmUgaW5wdXQgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlIGJ1dCBkbyBub3QgZm9yd2FyZCBvdXRwdXQgZGV2aWNlIHRvIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBzdGF0dXMgaXMgaWdub3JlZCBieSB0aGUgY2FsbGVyIGZvciBvdXRwdXQgZGV2aWNlCi0gICAgICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZXModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCi0gICAgICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBzdG9yZSBpbnB1dCBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UgYnV0IGRvIG5vdCBmb3J3YXJkIG91dHB1dCBkZXZpY2UgdG8gYXVkaW8gSEFMLgorICAgICAgICAvLyBOb3RlIHRoYXQgc3RhdHVzIGlzIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBmb3Igb3V0cHV0IGRldmljZQorICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgIT0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKChhdWRpb19zb3VyY2VfdCl2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpdmFsdWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSAhPSAoYXVkaW9fc291cmNlX3QpdmFsdWUpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbCgoYXVkaW9fc291cmNlX3QpdmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY29uZmlnKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgorICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pICYmCisgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCisgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pKSA8PSBGQ0NfMiAmJgorICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCi0gICAgICAgICAgICAgICAgICAgIChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHJlcVNhbXBsaW5nUmF0ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBGQ0NfMiAmJgotICAgICAgICAgICAgICAgICAgICAocmVxQ2hhbm5lbENvdW50IDw9IEZDQ18yKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlY29uZmlnOwogfQogCkBAIC01MTgyLDkgKzYwNzYsOSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gX191bnVzZWQpIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwotICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CkBAIC01MjAxLDU2ICs2MDk1LDQ3IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwotICAgIC8vIG1Sc21wSW5CdWZmZXIgaXMgYWx3YXlzIGFzc2lnbmVkIGEgbmV3W10gYmVsb3cKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKLSAgICBtUnNtcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0KICAgICBtU2FtcGxlUmF0ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbE1hc2sgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7Ci0gICAgbUZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUhBTEZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CiAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOworICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOwogICAgIH0KLSAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtSW5wdXQtPnN0cmVhbSk7CiAgICAgbUJ1ZmZlclNpemUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF07CisgICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KKyAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCisgICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgorICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KKyAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKKyAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICBtUnNtcEluRnJhbWVzID0gbUZyYW1lQ291bnQgKiA3OworICAgIG1Sc21wSW5GcmFtZXNQMiA9IHJvdW5kdXAobVJzbXBJbkZyYW1lcyk7CisgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKIAotICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBtUmVxU2FtcGxlUmF0ZSAmJiBtQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmIG1SZXFDaGFubmVsQ291bnQgPD0gRkNDXzIpCi0gICAgewotICAgICAgICBpbnQgY2hhbm5lbENvdW50OwotICAgICAgICAvLyBvcHRpbWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgdXNlIHRoZSByZXNhbXBsZXIgaW4gc3RlcmVvIHRvIHN0ZXJlbyBtb2RlIHRvIGF2b2lkCi0gICAgICAgIC8vIHN0ZXJlbyB0byBtb25vIHBvc3QgcHJvY2VzcyBhcyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlby4KLSAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVsQ291bnQsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOLCBBdWRpb01peGVyOjpVTklUWV9HQUlOKTsKLSAgICAgICAgbVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFttRnJhbWVDb3VudCAqIEZDQ18yXTsKKyAgICAvLyBUT0RPIG9wdGltaXplIGF1ZGlvIGNhcHR1cmUgYnVmZmVyIHNpemVzIC4uLgorICAgIC8vIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIGJ1ZmZlciB1c2VkIGFzIGEgc291cmNlCisgICAgLy8gZm9yIHJlc2FtcGxpbmcuICBtUnNtcEluRnJhbWVzUDIgaXMgY3VycmVudGx5IHJvdW5kdXAobUZyYW1lQ291bnQgKiA3KS4KKyAgICAvLyBGb3IgY3VycmVudCBIQUwgZnJhbWUgY291bnRzLCB0aGlzIGlzIHVzdWFsbHkgMjA0OCA9IDQwIG1zLiAgSXQgd291bGQKKyAgICAvLyBiZSBiZXR0ZXIgdG8gaGF2ZSBpdCBkZXJpdmVkIGZyb20gdGhlIHBpcGUgZGVwdGggaW4gdGhlIGxvbmcgdGVybS4KKyAgICAvLyBUaGUgY3VycmVudCB2YWx1ZSBpcyBoaWdoZXIgdGhhbiBuZWNlc3NhcnkuICBIb3dldmVyIGl0IHNob3VsZCBub3QgYWRkIHRvIGxhdGVuY3kuCiAKLSAgICAgICAgLy8gb3B0bWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgYWx0ZXIgaW5wdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBpbnB1dGluZwotICAgICAgICAvLyBzdGVyZW8gc2FtcGxlcwotICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgbUZyYW1lQ291bnQgPj49IDE7Ci0gICAgICAgIH0KKyAgICAvLyBPdmVyLWFsbG9jYXRlIGJleW9uZCBtUnNtcEluRnJhbWVzUDIgdG8gcGVybWl0IGEgSEFMIHJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90WyhtUnNtcEluRnJhbWVzUDIgKyBtRnJhbWVDb3VudCAtIDEpICogbUNoYW5uZWxDb3VudF07CiAKLSAgICB9Ci0gICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7CisgICAgLy8gQXVkaW9SZWNvcmQgbVNhbXBsZVJhdGUgYW5kIG1DaGFubmVsQ291bnQgYXJlIGNvbnN0YW50IGR1ZSB0byBBdWRpb1JlY29yZCBBUEkgY29uc3RyYWludHMuCisgICAgLy8gQnV0IGlmIHRocmVhZCdzIG1TYW1wbGVSYXRlIG9yIG1DaGFubmVsQ291bnQgY2hhbmdlcywgaG93IHdpbGwgdGhhdCBhZmZlY3QgYWN0aXZlIHRyYWNrcz8KIH0KIAotdW5zaWduZWQgaW50IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKQordWludDMyX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoaW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKQEAgLTUzMTMsMTUgKzYxOTgsMjAgQEAKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCiAgICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7Ci0KKyAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihOVUxMKTsKICAgICBjaGFpbi0+c2V0T3V0QnVmZmVyKE5VTEwpOwogCiAgICAgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKIAorICAgIC8vIG1ha2Ugc3VyZSBlbmFibGVkIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBIQUwgYXMgd2UKKyAgICAvLyBqdXN0IG1vdmVkIHRoZW0gdG8gYSBuZXcgaW5wdXQgc3RyZWFtLgorICAgIGNoYWluLT5zeW5jSGFsRWZmZWN0c1N0YXRlKCk7CisKICAgICBtRWZmZWN0Q2hhaW5zLmFkZChjaGFpbik7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01MzM5LDQgKzYyMjksODAgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncworICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPmJ0TnJlY0lzT2ZmKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9BRUMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3RvcmUgbmV3IHNvdXJjZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpIHsKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSA9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbChtQXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UcmFja3MuYWRkKHJlY29yZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIFRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOworICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGEyZmI4NzQuLmJiOWFhMTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMzYsNiArMzYsOCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRocmVhZEJhc2UoKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOworCiAgICAgdm9pZCBkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEVmZmVjdENoYWlucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC00NCw2MCArNDYsMTY5IEBACiAgICAgLy8gYmFzZSBmb3IgcmVjb3JkIGFuZCBwbGF5YmFjawogICAgIGVudW0gewogICAgICAgICBDRkdfRVZFTlRfSU8sCi0gICAgICAgIENGR19FVkVOVF9QUklPCisgICAgICAgIENGR19FVkVOVF9QUklPLAorICAgICAgICBDRkdfRVZFTlRfU0VUX1BBUkFNRVRFUiwKKyAgICAgICAgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSCwKKyAgICAgICAgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgfTsKIAotICAgIGNsYXNzIENvbmZpZ0V2ZW50IHsKKyAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpIHt9Ci0gICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50KCkge30KLQotICAgICAgICAgICAgICAgICBpbnQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50RGF0YSgpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGNvbnN0IGludCBtVHlwZTsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50RGF0YSgpIHt9CiAgICAgfTsKIAotICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewotICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSwgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKGV2ZW50KSB7fQotICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICAvLyBDb25maWcgZXZlbnQgc2VxdWVuY2UgYnkgY2xpZW50IGlmIHN0YXR1cyBuZWVkZWQgKGUuZyBiaW5kZXIgdGhyZWFkIGNhbGxpbmcgc2V0UGFyYW1ldGVycygpKToKKyAgICAvLyAgMS4gY3JlYXRlIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50LiBUaGlzIHNldHMgbVdhaXRTdGF0dXMgaW4gY29uZmlnIGV2ZW50CisgICAgLy8gIDIuIExvY2sgbUxvY2sKKyAgICAvLyAgMy4gQ2FsbCBzZW5kQ29uZmlnRXZlbnRfbCgpOiBBcHBlbmQgdG8gbUNvbmZpZ0V2ZW50cyBhbmQgbVdhaXRXb3JrQ1Yuc2lnbmFsCisgICAgLy8gIDQuIHNlbmRDb25maWdFdmVudF9sKCkgcmVhZHMgc3RhdHVzIGZyb20gZXZlbnQtPm1TdGF0dXM7CisgICAgLy8gIDUuIHNlbmRDb25maWdFdmVudF9sKCkgcmV0dXJucyBzdGF0dXMKKyAgICAvLyAgNi4gVW5sb2NrCisgICAgLy8KKyAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk6CisgICAgLy8gMS4gTG9jayBtTG9jaworICAgIC8vIDIuIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIG1Db25maWdFdmVudHMgcHJvY2VlZCAuLi4KKyAgICAvLyAzLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1Db25maWdFdmVudHMKKyAgICAvLyA0LiBSZW1vdmUgZmlyc3QgZW50cnkgZnJvbSBtQ29uZmlnRXZlbnRzCisgICAgLy8gNS4gUHJvY2VzcworICAgIC8vIDYuIFNldCBldmVudC0+bVN0YXR1cworICAgIC8vIDcuIGV2ZW50LT5tQ29uZC5zaWduYWwKKyAgICAvLyA4LiBVbmxvY2sKIAotICAgICAgICAgICAgICAgIGludCBldmVudCgpIGNvbnN0IHsgcmV0dXJuIG1FdmVudDsgfQotICAgICAgICAgICAgICAgIGludCBwYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1QYXJhbTsgfQorICAgIGNsYXNzIENvbmZpZ0V2ZW50OiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db25maWdFdmVudCgpIHt9CisKKyAgICAgICAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsgbURhdGEtPmR1bXAoYnVmZmVyLCBzaXplKTsgfQorCisgICAgICAgIGNvbnN0IGludCBtVHlwZTsgLy8gZXZlbnQgdHlwZSBlLmcuIENGR19FVkVOVF9JTworICAgICAgICBNdXRleCBtTG9jazsgICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgd2l0aCBtQ29uZAorICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgorICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBzdGF0dXMgY29tbXVuaWNhdGVkIHRvIHNlbmRlcgorICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIHNlbmRlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgc3A8Q29uZmlnRXZlbnREYXRhPiBtRGF0YTsgICAgIC8vIGV2ZW50IHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlKSA6IG1UeXBlKHR5cGUpLCBtU3RhdHVzKE5PX0VSUk9SKSwgbVdhaXRTdGF0dXMoZmFsc2UpLCBtRGF0YShOVUxMKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QYXJhbShwYXJhbSkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkLCBwYXJhbSAlZFxuIiwgbUV2ZW50LCBtUGFyYW0pOwogICAgICAgICB9CiAKLSAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBpbnQgbUV2ZW50OwogICAgICAgICBjb25zdCBpbnQgbVBhcmFtOwogICAgIH07CiAKLSAgICBjbGFzcyBQcmlvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewogICAgIHB1YmxpYzoKLSAgICAgICAgUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pIDoKLSAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9QUklPKSwgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9Ci0gICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgICAgIElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KKyAgICB9OwogCi0gICAgICAgICAgICAgICAgcGlkX3QgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQotICAgICAgICAgICAgICAgIHBpZF90IHRpZCgpIGNvbnN0IHsgcmV0dXJuIG1UaWQ7IH0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW8oKSBjb25zdCB7IHJldHVybiBtUHJpbzsgfQorICAgIGNsYXNzIFByaW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFByaW9Db25maWdFdmVudERhdGEocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgbVBpZChwaWQpLCBtVGlkKHRpZCksIG1QcmlvKHByaW8pIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlByaW8gZXZlbnQ6IHBpZCAlZCwgdGlkICVkLCBwcmlvICVkXG4iLCBtUGlkLCBtVGlkLCBtUHJpbyk7CiAgICAgICAgIH0KIAotICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHBpZF90IG1QaWQ7CiAgICAgICAgIGNvbnN0IHBpZF90IG1UaWQ7CiAgICAgICAgIGNvbnN0IGludDMyX3QgbVByaW87CiAgICAgfTsKIAorICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFByaW9Db25maWdFdmVudERhdGEocGlkLCB0aWQsIHByaW8pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhKFN0cmluZzgga2V5VmFsdWVQYWlycykgOgorICAgICAgICAgICAgbUtleVZhbHVlUGFpcnMoa2V5VmFsdWVQYWlycykge30KKworICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiS2V5VmFsdWU6ICVzXG4iLCBtS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgIH07CisKKyAgICBjbGFzcyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudChTdHJpbmc4IGtleVZhbHVlUGFpcnMpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9TRVRfUEFSQU1FVEVSKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBtV2FpdFN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+U2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CisKKyAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1QYXRjaChwYXRjaCksIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKHBhdGNoLCBoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfkNyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJQYXRjaCBoYW5kbGU6ICV1XG4iLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgfTsKKworICAgIGNsYXNzIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YShoYW5kbGUpOworICAgICAgICAgICAgbVdhaXRTdGF0dXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CiAKICAgICBjbGFzcyBQTURlYXRoUmVjaXBpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CkBAIC0xMjIsOSArMjMzLDkgQEAKIAogICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgZXh0ZXJuYWxseS12aXNpYmxlCiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1IQUxGb3JtYXQ7IH0KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGJ5IEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGFuZCBlZmZlY3RzLAogICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm5zIHRoZSBbbm9ybWFsIG1peF0gYnVmZmVyJ3MgZnJhbWUgY291bnQuCiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0ID0gMDsKQEAgLTEzMywxNCArMjQ0LDI5IEBACiAgICAgLy8gU2hvdWxkIGJlICJ2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3RFeGl0QW5kV2FpdCgpIiBhbmQgb3ZlcnJpZGUgc2FtZQogICAgIC8vIG1ldGhvZCBpbiBUaHJlYWQsIGJ1dCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB5ZXQgdmlydHVhbC4KICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOworICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCisgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCisgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RhbmRieSgpIGNvbnN0IHsgcmV0dXJuIG1TdGFuZGJ5OyB9CkBAIC0xNTYsMTAgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOwotICAgICAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdEVmZmVjdChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWVzIGZvciBoYXNBdWRpb1Nlc3Npb24gKGJpdCBmaWVsZCkKICAgICAgICAgICAgICAgICBlbnVtIGVmZmVjdF9zdGF0ZSB7CkBAIC0xOTgsMTMgKzMyMSwxMyBAQAogICAgICAgICAgICAgICAgIC8vIGVmZmVjdAogICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgLy8gZGV0YWNoIGFsbCB0cmFja3MgY29ubmVjdGVkIHRvIGFuIGF1eGlsaWFyeSBlZmZlY3QKLSAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCkge30KKyAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGVpdGhlciBFRkZFQ1RfU0VTU0lPTiBpZiBlZmZlY3RzIG9uIHRoaXMgYXVkaW8gc2Vzc2lvbiBleGlzdCBpbiBvbmUKICAgICAgICAgICAgICAgICAvLyBjaGFpbiwgb3IgVFJBQ0tfU0VTU0lPTiBpZiB0cmFja3Mgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0LCBvciBib3RoCiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb24oaW50IHNlc3Npb25JZCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQgYXMgdGhlCiAgICAgICAgICAgICAgICAgLy8gc3RyYXRlZ3kgaXMgb25seSBtZWFuaW5nZnVsIGZvciBQbGF5YmFja1RocmVhZCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkKSB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChpbnQgc2Vzc2lvbklkIF9fdW51c2VkKSB7IHJldHVybiAwOyB9CiAKICAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIG9yIHJlc3RvcmUgZWZmZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBlZmZlY3QgcGFzc2VkLiBhIE5VTEwKICAgICAgICAgICAgICAgICAvLyB0eXBlIHBvaW50ZXIgbWVhbnMgc3VzcGVuZCBhbGwgZWZmZWN0cyBpbiB0aGUgc2Vzc2lvbgpAQCAtMjIzLDYgKzM0NiwxNSBAQAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdCA9IDA7CiAKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gYSBwZXItdGhyZWFkIGhlYXAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWxsb2NhdGUgSU1lbW9yeQorICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3aWxsIGJlIHJlYWQtb25seSB0byBjbGllbnQgcHJvY2Vzc2VzLCByZWFkL3dyaXRlIHRvIG1lZGlhc2VydmVyLAorICAgICAgICAgICAgICAgIC8vIGFuZCBzaGFyZWQgYnkgYWxsIGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIHRocmVhZC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgaGVhcCBpcyBwZXItdGhyZWFkIHJhdGhlciB0aGFuIGNvbW1vbiBhY3Jvc3MgYWxsIHRocmVhZHMsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBjbGllbnRzIGNhbid0IGJlIHRydXN0ZWQgbm90IHRvIG1vZGlmeSB0aGUgb2Zmc2V0IG9mIHRoZSBJTWVtb3J5IHRoZXkgcmVjZWl2ZS4KKyAgICAgICAgICAgICAgICAvLyBJZiBhIHRocmVhZCBkb2VzIG5vdCBoYXZlIHN1Y2ggYSBoZWFwLCB0aGlzIG1ldGhvZCByZXR1cm5zIDAuCisgICAgICAgICAgICAgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+ICAgIHJlYWRPbmx5SGVhcCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KIAogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogCkBAIC0yNjcsNDggKzM5OSwyOSBAQAogCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiAgbUF1ZGlvRmxpbmdlcjsKIAotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgb3IKLSAgICAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKSBvcgorICAgICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgLy8gb3V0cHV0IEhBTCwgZGlyZWN0IG91dHB1dCwgcmVjb3JkCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgICAvLyBTb3VyY2UgZm9ybWF0IGZvciBSZWNvcmRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZm9ybWF0IGZvciBQbGF5YmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhBTCBmb3JtYXQgaWYgRmFzdG1peGVyIGlzIHVzZWQuCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUhBTEZvcm1hdDsKKyAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgICAgLy8gSEFMIGJ1ZmZlciBzaXplIGZvciByZWFkKCkgb3Igd3JpdGUoKQogCi0gICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIHNlcXVlbmNlIGJ5IGNsaWVudDogYmluZGVyIHRocmVhZCBjYWxsaW5nIHNldFBhcmFtZXRlcnMoKToKLSAgICAgICAgICAgICAgICAvLyAgMS4gTG9jayBtTG9jawotICAgICAgICAgICAgICAgIC8vICAyLiBBcHBlbmQgdG8gbU5ld1BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyAgMy4gbVdhaXRXb3JrQ1Yuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gIDQuIG1QYXJhbUNvbmQud2FpdFJlbGF0aXZlIHdpdGggdGltZW91dAotICAgICAgICAgICAgICAgIC8vICA1LiByZWFkIG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vICA2LiBtV2FpdFdvcmtDVi5zaWduYWwKLSAgICAgICAgICAgICAgICAvLyAgNy4gVW5sb2NrCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgc2VydmVyOiB0aHJlYWRMb29wIGNhbGxpbmcgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKToKLSAgICAgICAgICAgICAgICAvLyAxLiBMb2NrIG1Mb2NrCi0gICAgICAgICAgICAgICAgLy8gMi4gSWYgdGhlcmUgaXMgYW4gZW50cnkgaW4gbU5ld1BhcmFtZXRlcnMgcHJvY2VlZCAuLi4KLSAgICAgICAgICAgICAgICAvLyAyLiBSZWFkIGZpcnN0IGVudHJ5IGluIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gMy4gUHJvY2VzcwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSBmaXJzdCBlbnRyeSBmcm9tIG1OZXdQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgLy8gNS4gU2V0IG1QYXJhbVN0YXR1cwotICAgICAgICAgICAgICAgIC8vIDYuIG1QYXJhbUNvbmQuc2lnbmFsCi0gICAgICAgICAgICAgICAgLy8gNy4gbVdhaXRXb3JrQ1Yud2FpdCB3aXRoIHRpbWVvdXQgKHRoaXMgaXMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgbVBhcmFtU3RhdHVzKQotICAgICAgICAgICAgICAgIC8vIDguIFVubG9jawotICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1QYXJhbUNvbmQ7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVBhcmFtU3RhdHVzOwotCi0gICAgICAgICAgICAgICAgLy8gdmVjdG9yIG93bnMgZWFjaCBDb25maWdFdmVudCAqLCBzbyBtdXN0IGRlbGV0ZSBhZnRlciByZW1vdmluZwotICAgICAgICAgICAgICAgIFZlY3RvcjxDb25maWdFdmVudCAqPiAgICAgbUNvbmZpZ0V2ZW50czsKKyAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtQ29uZmlnRXZlbnRzOwogCiAgICAgICAgICAgICAgICAgLy8gVGhlc2UgZmllbGRzIGFyZSB3cml0dGVuIGFuZCByZWFkIGJ5IHRocmVhZCBpdHNlbGYgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpICwgb3V0RGV2aWNlKCkKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCksIG91dERldmljZSgpCiAgICAgICAgICAgICAgICAgLy8gYW5kIGluRGV2aWNlKCkuCiAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgYWJzZW5jZSBvZiBhIGxvY2sgb3IgYmFycmllciwgYW55IG90aGVyIHRocmVhZCB0aGF0IHJlYWRzCiAgICAgICAgICAgICAgICAgLy8gdGhlc2UgZmllbGRzIG11c3QgdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiBpc29sYXRpb24sIG9yIGJlIHByZXBhcmVkIHRvIGRlYWwKICAgICAgICAgICAgICAgICAvLyB3aXRoIHBvc3NpYmlsaXR5IHRoYXQgaXQgbWlnaHQgYmUgaW5jb25zaXN0ZW50IHdpdGggb3RoZXIgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN0YW5kYnk7ICAgICAvLyBXaGV0aGVyIHRocmVhZCBpcyBjdXJyZW50bHkgaW4gc3RhbmRieS4KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtT3V0RGV2aWNlOyAgIC8vIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtSW5EZXZpY2U7ICAgIC8vIGlucHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90ICAgICAgICAgIG1BdWRpb1NvdXJjZTsgLy8gKHNlZSBhdWRpby5oLCBhdWRpb19zb3VyY2VfdCkKQEAgLTM1OCw3ICs0NzEsNiBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAKICAgICAvLyBSZWZCYXNlCkBAIC0zOTEsNyArNTAzLDcgQEAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKLQorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiAgICAgLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHByZUV4aXQoKTsKQEAgLTQxOSwxMyArNTMxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGdldE91dHB1dCgpIGNvbnN0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBjbGVhck91dHB1dCgpOwpAQCAtNDQ1LDkgKzU1NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1TdXNwZW5kZWQpID4gMDsgfQogCiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOwotICAgICAgICAgICAgICAgIGludDE2X3QgICAgICptaXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtTWl4QnVmZmVyOyB9OworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSBtaXhCdWZmZXIoKSB0byBzaW5rQnVmZmVyKCkgYW5kIHJlbW92ZSBpbnQxNl90KiBkZXBlbmRlbmN5LgorICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgYW5kIHBhc3NpbmcgYW4gZXhwbGljaXQgbU1haW5CdWZmZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgdG8gQUY6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soKS4KKyAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG1TaW5rQnVmZmVyKTsgfTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLApAQCAtNDcyLDE0ICs1ODgsNzYgQEAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4ncyB0aGUgSEFMJ3MgZnJhbWUgY291bnQgaS5lLiBmYXN0IG1peGVyIGJ1ZmZlciBzaXplLgogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnRIQUwoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICBnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXBfbChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVycygpCisgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCiAKLSAgICBpbnQxNl90KiAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIG1peCBidWZmZXIKLSAgICBpbnQ4X3QqICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY01peEJ1ZmZlcjsgICAgLy8gbWl4ZXIgYnVmZmVyIGFsbG9jYXRpb24gYWRkcmVzcworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXI7ICAgICAgICAgLy8gZnJhbWUgc2l6ZSBhbGlnbmVkIHNpbmsgYnVmZmVyCisKKyAgICAvLyBUT0RPOgorICAgIC8vIFJlYXJyYW5nZSB0aGUgYnVmZmVyIGluZm8gaW50byBhIHN0cnVjdC9jbGFzcyB3aXRoCisgICAgLy8gY2xlYXIsIGNvcHksIGNvbnN0cnVjdGlvbiwgZGVzdHJ1Y3Rpb24gbWV0aG9kcy4KKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyIGFsc28gaGFzIGFzc29jaWF0ZWQgd2l0aCBpdDoKKyAgICAvLworICAgIC8vIG1TaW5rQnVmZmVyU2l6ZTogU2luayBCdWZmZXIgU2l6ZQorICAgIC8vIG1Gb3JtYXQ6IFNpbmsgQnVmZmVyIEZvcm1hdAorCisgICAgLy8gTWl4ZXIgQnVmZmVyIChtTWl4ZXJCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmcgcG9pbnQgb3IgbXVsdGljaGFubmVsIGRhdGEsIHdoaWNoIGlzIG5vdCBpbiB0aGUKKyAgICAvLyBzaW5rIGZvcm1hdCwgaXQgaXMgcmVxdWlyZWQgdG8gYWNjdW11bGF0ZSBpbiBhIGhpZ2hlciBwcmVjaXNpb24gb3IgZ3JlYXRlciBjaGFubmVsIGNvdW50CisgICAgLy8gYnVmZmVyIGJlZm9yZSBkb3dubWl4aW5nIG9yIGRhdGEgY29udmVyc2lvbiB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgTWl4ZXIgQnVmZmVyIG90aGVyd2lzZSBtaXhlciBvdXRwdXQgZ29lcyB0byBzaW5rIGJ1ZmZlci4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQ7CisKKyAgICAvLyBTdG9yYWdlLCAzMiBieXRlIGFsaWduZWQgKG1heSBtYWtlIHRoaXMgYWxpZ25tZW50IGEgcmVxdWlyZW1lbnQgbGF0ZXIpLgorICAgIC8vIER1ZSB0byBjb25zdHJhaW50cyBvbiBtTm9ybWFsRnJhbWVDb3VudCwgdGhlIGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTYgZnJhbWVzLgorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtTWl4ZXJCdWZmZXIgaW4gYnl0ZXM6IG1Ob3JtYWxGcmFtZUNvdW50ICogI2NoYW5uZWxzICogc2FtcHNpemUuCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtTWl4ZXJCdWZmZXIuIFNldCB0byBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQ7CisKKyAgICAvLyBBbiBpbnRlcm5hbCBmbGFnIHNldCB0byB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKQorICAgIC8vIHdoZW4gbU1peGVyQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQ7CisKKyAgICAvLyBFZmZlY3RzIEJ1ZmZlciAobUVmZmVjdHNCdWZmZXIqKQorICAgIC8vCisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgZWZmZWN0cyBkYXRhLCB3aGljaCBpcyBub3QgaW4gdGhlIHNpbmsgZm9ybWF0LAorICAgIC8vIGl0IGlzIHJlcXVpcmVkIHRvIGFjY3VtdWxhdGUgaW4gYSBkaWZmZXJlbnQgYnVmZmVyIGJlZm9yZSBkYXRhIGNvbnZlcnNpb24KKyAgICAvLyB0byB0aGUgc2luayBidWZmZXIuCisKKyAgICAvLyBTZXQgdG8gInRydWUiIHRvIGVuYWJsZSB0aGUgRWZmZWN0cyBCdWZmZXIgb3RoZXJ3aXNlIGVmZmVjdHMgb3V0cHV0IGdvZXMgdG8gc2luayBidWZmZXIuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZDsKKworICAgIC8vIFN0b3JhZ2UsIDMyIGJ5dGUgYWxpZ25lZCAobWF5IG1ha2UgdGhpcyBhbGlnbm1lbnQgYSByZXF1aXJlbWVudCBsYXRlcikuCisgICAgLy8gRHVlIHRvIGNvbnN0cmFpbnRzIG9uIG1Ob3JtYWxGcmFtZUNvdW50LCB0aGUgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNiBmcmFtZXMuCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyOworCisgICAgLy8gU2l6ZSBvZiBtRWZmZWN0c0J1ZmZlciBpbiBieXRlczogbU5vcm1hbEZyYW1lQ291bnQgKiAjY2hhbm5lbHMgKiBzYW1wc2l6ZS4KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplOworCisgICAgLy8gVGhlIGF1ZGlvIGZvcm1hdCBvZiBtRWZmZWN0c0J1ZmZlci4gU2V0IHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIG9ubHkuCisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0OworCisgICAgLy8gQW4gaW50ZXJuYWwgZmxhZyBzZXQgdG8gdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkKKyAgICAvLyB3aGVuIG1FZmZlY3RzQnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgYWZ0ZXIgbWl4aW5nLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGlzIGlzIHNldCwgYWxsIG1peGVyIGRhdGEgaXMgcm91dGVkIGludG8gdGhlIGVmZmVjdHMgYnVmZmVyCisgICAgLy8gZm9yIGFueSBwcm9jZXNzaW5nIChpbmNsdWRpbmcgb3V0cHV0IHByb2Nlc3NpbmcpLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkOwogCiAgICAgLy8gc3VzcGVuZCBjb3VudCwgPiAwIG1lYW5zIHN1c3BlbmRlZC4gIFdoaWxlIHN1c3BlbmRlZCwgdGhlIHRocmVhZCBjb250aW51ZXMgdG8gcHVsbCBmcm9tCiAgICAgLy8gdHJhY2tzIGFuZCBtaXgsIGJ1dCBkb2Vzbid0IHdyaXRlIHRvIEhBTC4gIEEyRFAgYW5kIFNDTyBIQUwgaW1wbGVtZW50YXRpb25zIGNhbid0IGhhbmRsZQpAQCAtNTA1LDcgKzY4Myw4IEBACiAKICAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBtYXNrLgogICAgIC8vICAgUmV0dXJucyBuYW1lID49IDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24gZmFpbHVyZS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKSA9IDA7CiAKICAgICAvLyBUaW1lIHRvIHNsZWVwIGJldHdlZW4gY3ljbGVzIHdoZW46CkBAIC01MjcsMTEgKzcwNiwxNCBAQAogCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgY29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdDsKIAorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKIHByaXZhdGU6CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBudW1lcm91cwogCi0gICAgUGxheWJhY2tUaHJlYWQoY29uc3QgQ2xpZW50Jik7CiAgICAgUGxheWJhY2tUaHJlYWQmIG9wZXJhdG9yID0gKGNvbnN0IFBsYXliYWNrVGhyZWFkJik7CiAKICAgICBzdGF0dXNfdCAgICBhZGRUcmFja19sKGNvbnN0IHNwPFRyYWNrPiYgdHJhY2spOwpAQCAtNTM5LDcgKzcyMSw3IEBACiAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKICAgICB2b2lkICAgICAgICBicm9hZGNhc3RfbCgpOwogCi0gICAgdm9pZCAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTU1OCw3ICs3NDAsNyBAQAogCiAgICAgLy8gRklYTUUgcmVuYW1lIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgb2YgdGhyZWFkTG9vcCB0byBzdGFuZGFyZCAibSIgbmFtZXMKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4QnVmZmVyU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyU2l6ZTsKIAogICAgIC8vIGNhY2hlZCBjb3BpZXMgb2YgYWN0aXZlU2xlZXBUaW1lVXMoKSBhbmQgaWRsZVNsZWVwVGltZVVzKCkgbWFkZSBieSBjYWNoZVBhcmFtZXRlcnNfbCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7CkBAIC02MjMsMTMgKzgwNSwxMiBAQAogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4KSBjb25zdAorICAgIHZpcnR1YWwgICAgIEZhc3RUcmFja1VuZGVycnVucyBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoc2l6ZV90IGZhc3RJbmRleCBfX3VudXNlZCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBGYXN0VHJhY2tVbmRlcnJ1bnMgZHVtbXk7IHJldHVybiBkdW1teTsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgLy8gYWNjZXNzZWQgYnkgYm90aCBiaW5kZXIgdGhyZWFkcyBhbmQgd2l0aGluIHRocmVhZExvb3AoKSwgbG9jayBvbiBtdXRleCBuZWVkZWQKICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICBtRmFzdFRyYWNrQXZhaWxNYXNrOyAgICAvLyBiaXQgaSBzZXQgaWYgZmFzdCB0cmFjayBbaV0gaXMgYXZhaWxhYmxlCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hPdXRwdXRfbCgpOwogCiBwcml2YXRlOgogICAgIC8vIHRpbWVzdGFtcCBsYXRjaDoKQEAgLTYzOCw4ICs4MTksMTEgQEAKICAgICBzdHJ1Y3QgewogICAgICAgICBBdWRpb1RpbWVzdGFtcCAgbVRpbWVzdGFtcDsKICAgICAgICAgdWludDMyX3QgICAgICAgIG1VbnByZXNlbnRlZEZyYW1lczsKKyAgICAgICAgS2V5ZWRWZWN0b3I8VHJhY2sgKiwgdWludDMyX3Q+IG1GcmFtZXNSZWxlYXNlZDsKICAgICB9IG1MYXRjaEQsIG1MYXRjaFE7Ci0gICAgYm9vbCBtTGF0Y2hEVmFsaWQ7ICAvLyB0cnVlIG1lYW5zIG1MYXRjaEQgaXMgdmFsaWQsIGFuZCBjbG9jayBpdCBpbnRvIGxhdGNoIGF0IG5leHQgb3Bwb3J0dW5pdHkKKyAgICBib29sIG1MYXRjaERWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoRCBpcyB2YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChleGNlcHQgZm9yIG1GcmFtZXNSZWxlYXNlZCB3aGljaCBpcyBmaWxsZWQgaW4gbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFuZCBjbG9jayBpdCBpbnRvIGxhdGNoIGF0IG5leHQgb3Bwb3J0dW5pdHkKICAgICBib29sIG1MYXRjaFFWYWxpZDsgIC8vIHRydWUgbWVhbnMgbUxhdGNoUSBpcyB2YWxpZAogfTsKIApAQCAtNjU0LDEyICs4MzgsMTQgQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpOworICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtNjc2LDcgKzg2Miw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlciogbUF1ZGlvTWl4ZXI7ICAgIC8vIG5vcm1hbCBtaXhlcgogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBGYXN0TWl4ZXIqICBtRmFzdE1peGVyOyAgICAgICAgIC8vIG5vbi1OVUxMIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IG1peGVyCisgICAgICAgICAgICAgICAgc3A8RmFzdE1peGVyPiAgICAgbUZhc3RNaXhlcjsgICAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28gYSBmYXN0IG1peGVyCiAgICAgICAgICAgICAgICAgc3A8QXVkaW9XYXRjaGRvZz4gbUF1ZGlvV2F0Y2hkb2c7IC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHdhdGNoZG9nIHRocmVhZAogCiAgICAgICAgICAgICAgICAgLy8gY29udGVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQsIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC02OTIsMTEgKzg3OCwxMiBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgICAgIG1GYXN0TWl4ZXJGdXRleDsgICAgLy8gZm9yIGNvbGQgaWRsZQogCiBwdWJsaWM6Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gbUZhc3RNaXhlciAhPSBOVUxMOyB9CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gbUZhc3RNaXhlciAhPSAwOyB9CiAgICAgdmlydHVhbCAgICAgRmFzdFRyYWNrVW5kZXJydW5zIGdldEZhc3RUcmFja1VuZGVycnVucyhzaXplX3QgZmFzdEluZGV4KSBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0SW5kZXggPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1GYXN0TWl4ZXJEdW1wU3RhdGUubVRyYWNrc1tmYXN0SW5kZXhdLm1VbmRlcnJ1bnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiB9OwogCiBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtNzA4LDEwICs4OTUsMTMgQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCi0gICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpOworICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CkBAIC03NDMsMTkgKzkzMywxNyBAQAogICAgIE9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk9mZmxvYWRUaHJlYWQoKSB7fTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAogcHJvdGVjdGVkOgogICAgIC8vIHRocmVhZExvb3Agc25pcHBldHMKICAgICB2aXJ0dWFsICAgICBtaXhlcl9zdGF0ZSBwcmVwYXJlVHJhY2tzX2woVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfZXhpdCgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoT3V0cHV0X2woKTsKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpOwotCi1wcml2YXRlOgotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiBwcml2YXRlOgogICAgIGJvb2wgICAgICAgIG1Id1BhdXNlZDsKQEAgLTgzOCwxNyArMTAyNiwyOCBAQAogCiAKIC8vIHJlY29yZCB0aHJlYWQKLWNsYXNzIFJlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCitjbGFzcyBSZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQogewogcHVibGljOgogCisgICAgY2xhc3MgUmVjb3JkVHJhY2s7CisgICAgY2xhc3MgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlcyBmcm9tIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGZvciB1c2UgYnkgcmVzYW1wbGVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSA6IG1SZWNvcmRUcmFjayhyZWNvcmRUcmFjaykgeyB9CisgICAgICAgIHZpcnR1YWwgflJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKCkgeyB9CisgICAgICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOworICAgIHByaXZhdGU6CisgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOworICAgIH07CisKICNpbmNsdWRlICJSZWNvcmRUcmFja3MuaCIKIAogICAgICAgICAgICAgUmVjb3JkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlCkBAIC04NjcsMjMgKzEwNjYsMjggQEAKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwogCiAgICAgLy8gUmVmQmFzZQogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobUlucHV0ID09IE5VTEwpID8gTk9fSU5JVCA6IE5PX0VSUk9SOyB9CisKKyAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gICAgcmVhZE9ubHlIZWFwKCkgY29uc3QgeyByZXR1cm4gbVJlYWRPbmx5SGVhcDsgfQorCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gbVBpcGVNZW1vcnk7IH0KKwogICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgY3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc3RhcnQoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKQEAgLTg5NywxNSArMTEwMSwyMSBAQAogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdCogc3RyZWFtKCkgY29uc3Q7CiAKLSAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CiAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKQEAgLTkyMCw0NSArMTEzMCw3MyBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3Q7CiAKICAgICBzdGF0aWMgdm9pZCBzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KTsKLSAgICAgICAgICAgdm9pZCBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdFJlY29yZGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RDYXB0dXJlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RDYXB0dXJlICE9IDA7IH0KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKIHByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLQogICAgICAgICAgICAgLy8gRW50ZXIgc3RhbmRieSBpZiBub3QgYWxyZWFkeSBpbiBzdGFuZGJ5LCBhbmQgc2V0IG1TdGFuZGJ5IGZsYWcKLSAgICAgICAgICAgIHZvaWQgc3RhbmRieSgpOworICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CiAKICAgICAgICAgICAgIC8vIENhbGwgdGhlIEhBTCBzdGFuZGJ5IG1ldGhvZCB1bmNvbmRpdGlvbmFsbHksIGFuZCBkb24ndCBjaGFuZ2UgbVN0YW5kYnkgZmxhZwotICAgICAgICAgICAgdm9pZCBpbnB1dFN0YW5kQnkoKTsKKyAgICAgICAgICAgIHZvaWQgICAgaW5wdXRTdGFuZEJ5KCk7CiAKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gICAgICAgICAgICAgICAgICAgICAgICptSW5wdXQ7CiAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxSZWNvcmRUcmFjaz4gPiAgICBtVHJhY2tzOwotICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjaywgYW5kCisgICAgICAgICAgICAvLyBtQWN0aXZlVHJhY2tzIGhhcyBkdWFsIHJvbGVzOiAgaXQgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGFjdGl2ZSB0cmFjayhzKSwgYW5kCiAgICAgICAgICAgICAvLyBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggbVN0YXJ0U3RvcENvbmQgdG8gaW5kaWNhdGUgc3RhcnQoKS9zdG9wKCkgcHJvZ3Jlc3MKLSAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjazsKKyAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8UmVjb3JkVHJhY2s+ID4gICAgIG1BY3RpdmVUcmFja3M7CisgICAgICAgICAgICAvLyBnZW5lcmF0aW9uIGNvdW50ZXIgZm9yIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW47CiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZDsKIAotICAgICAgICAgICAgLy8gdXBkYXRlZCBieSBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7Ci0gICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgc2lnbmVkIFExOS4xMgotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wT3V0QnVmZmVyOwotICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdCi0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXg7Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZTsgICAgLy8gc3RyZWFtIGJ1ZmZlciBzaXplIGZvciByZWFkKCkKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1SZXFDaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQ7Ci0gICAgICAgICAgICAvLyBzeW5jIGV2ZW50IHRyaWdnZXJpbmcgYWN0dWFsIGF1ZGlvIGNhcHR1cmUuIEZyYW1lcyByZWFkIGJlZm9yZSB0aGlzIGV2ZW50IHdpbGwKLSAgICAgICAgICAgIC8vIGJlIGRyb3BwZWQgYW5kIHRoZXJlZm9yZSBub3QgcmVhZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICAgICAgICAgICBzcDxTeW5jRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQ7Ci0gICAgICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZWQgZnJhbWVzIHRvIGRyb3AgYWZ0ZXIgdGhlIHN0YXJ0IHN5bmMgZXZlbnQgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICAgICAgICAvLyB3aGVuIDwgMCwgbWF4aW11bSBmcmFtZXMgdG8gZHJvcCBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZSBldmVuIGlmIHN5bmMgZXZlbnQgaXMKLSAgICAgICAgICAgIC8vIG5vdCByZWNlaXZlZAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcDsKKyAgICAgICAgICAgIC8vIHJlc2FtcGxlciBjb252ZXJ0cyBpbnB1dCBhdCBIQUwgSHogdG8gb3V0cHV0IGF0IEF1ZGlvUmVjb3JkIGNsaWVudCBIegorICAgICAgICAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vIHNlZSBuZXdbXSBmb3IgZGV0YWlscyBvbiB0aGUgc2l6ZQorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lczsgIC8vIHNpemUgb2YgcmVzYW1wbGVyIGlucHV0IGluIGZyYW1lcworICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyYW1lc1AyOy8vIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIKKworICAgICAgICAgICAgLy8gcm9sbGluZyBpbmRleCB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5SZWFyOyAgICAvLyBsYXN0IGZpbGxlZCBmcmFtZSArIDEKIAogICAgICAgICAgICAgLy8gRm9yIGR1bXBzeXMKICAgICAgICAgICAgIGNvbnN0IHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgIG1UZWVTaW5rOworCisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICAgICAgICBtUmVhZE9ubHlIZWFwOworCisgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIHNwPEZhc3RDYXB0dXJlPiAgICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZTsgICAvLyBub24tMCBpZiB0aGVyZSBpcyBhbHNvIGEgZmFzdCBjYXB0dXJlCisgICAgICAgICAgICAvLyBGSVhNRSBhdWRpbyB3YXRjaGRvZyB0aHJlYWQKKworICAgICAgICAgICAgLy8gY29udGVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQsIG5vIGxvY2tzIHJlcXVpcmVkCisgICAgICAgICAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVEdW1wU3RhdGU7CisjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAorICAgICAgICAgICAgLy8gRklYTUUgU3RhdGVRdWV1ZSBvYnNlcnZlciBhbmQgbXV0YXRvciBkdW1wIGZpZWxkcworI2VuZGlmCisgICAgICAgICAgICAvLyBGSVhNRSBhdWRpbyB3YXRjaGRvZyBkdW1wCisKKyAgICAgICAgICAgIC8vIGFjY2Vzc2libGUgb25seSB3aXRoaW4gdGhlIHRocmVhZExvb3AoKSwgbm8gbG9ja3MgcmVxdWlyZWQKKyAgICAgICAgICAgIC8vICAgICAgICAgIG1GYXN0Q2FwdHVyZS0+c3EoKSAgICAgIC8vIGZvciBtdXRhdGluZyBhbmQgcHVzaGluZyBzdGF0ZQorICAgICAgICAgICAgaW50MzJfdCAgICAgbUZhc3RDYXB0dXJlRnV0ZXg7ICAgICAgLy8gZm9yIGNvbGQgaWRsZQorCisgICAgICAgICAgICAvLyBUaGUgSEFMIGlucHV0IHNvdXJjZSBpcyB0cmVhdGVkIGFzIG5vbi1ibG9ja2luZywKKyAgICAgICAgICAgIC8vIGJ1dCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGJsb2NraW5nCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7CisgICAgICAgICAgICAvLyBUaGUgc291cmNlIGZvciB0aGUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIHRvIHJlYWQgZnJvbTogbUlucHV0U291cmNlIG9yIG1QaXBlU291cmNlCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtTm9ybWFsU291cmNlOworICAgICAgICAgICAgLy8gSWYgYSBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCwgdGhlIG5vbi1ibG9ja2luZyBwaXBlIHNpbmsgd3JpdHRlbiB0byBieSBmYXN0IGNhcHR1cmUsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgY2xlYXIKKyAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgICAgICAgIG1QaXBlU2luazsKKyAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBub24tYmxvY2tpbmcgcGlwZSBzb3VyY2UgcmVhZCBieSBub3JtYWwgdGhyZWFkLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNsZWFyCisgICAgICAgICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICAgICAgICAgICAgICBtUGlwZVNvdXJjZTsKKyAgICAgICAgICAgIC8vIERlcHRoIG9mIHBpcGUgZnJvbSBmYXN0IGNhcHR1cmUgdG8gbm9ybWFsIHRocmVhZCBhbmQgZmFzdCBjbGllbnRzLCBhbHdheXMgcG93ZXIgb2YgMgorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBpcGVGcmFtZXNQMjsKKyAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBQaXBlIGFzIElNZW1vcnksIG90aGVyd2lzZSBjbGVhcgorICAgICAgICAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgICAgICAgICAgICAgbVBpcGVNZW1vcnk7CisKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgICAgICAgICAgIGtGYXN0Q2FwdHVyZUxvZ1NpemUgPSA0ICogMTAyNDsKKyAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyOworCisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmFzdFRyYWNrQXZhaWw7ICAgIC8vIHRydWUgaWYgZmFzdCB0cmFjayBhdmFpbGFibGUKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2QyMDFkOS4uOThiZjk2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMzQsNyArMzQsMjUgQEAKICAgICAgICAgUkVTVU1JTkcsCiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKLSAgICAgICAgUEFVU0VECisgICAgICAgIFBBVVNFRCwKKyAgICAgICAgU1RBUlRJTkdfMSwgICAgIC8vIGZvciBSZWNvcmRUcmFjayBvbmx5CisgICAgICAgIFNUQVJUSU5HXzIsICAgICAvLyBmb3IgUmVjb3JkVHJhY2sgb25seQorICAgIH07CisKKyAgICAvLyB3aGVyZSB0byBhbGxvY2F0ZSB0aGUgZGF0YSBidWZmZXIKKyAgICBlbnVtIGFsbG9jX3R5cGUgeworICAgICAgICBBTExPQ19DQkxLLCAgICAgLy8gYWxsb2NhdGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY29udHJvbCBibG9jaworICAgICAgICBBTExPQ19SRUFET05MWSwgLy8gYWxsb2NhdGUgZnJvbSBhIHNlcGFyYXRlIHJlYWQtb25seSBoZWFwIHBlciB0aHJlYWQKKyAgICAgICAgQUxMT0NfUElQRSwgICAgIC8vIGRvIG5vdCBhbGxvY2F0ZTsgdXNlIHRoZSBwaXBlIGJ1ZmZlcgorICAgICAgICBBTExPQ19MT0NBTCwgICAgLy8gYWxsb2NhdGUgYSBsb2NhbCBidWZmZXIKKyAgICAgICAgQUxMT0NfTk9ORSwgICAgIC8vIGRvIG5vdCBhbGxvY2F0ZTp1c2UgdGhlIGJ1ZmZlciBwYXNzZWQgdG8gVHJhY2tCYXNlIGNvbnN0cnVjdG9yCisgICAgfTsKKworICAgIGVudW0gdHJhY2tfdHlwZSB7CisgICAgICAgIFRZUEVfREVGQVVMVCwKKyAgICAgICAgVFlQRV9USU1FRCwKKyAgICAgICAgVFlQRV9PVVRQVVQsCisgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKQEAgLTQzLDExICs2MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSBhbGxvYyA9IEFMTE9DX0NCTEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSA9IFRZUEVfREVGQVVMVCk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2tCYXNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uKSA9IDA7CkBAIC01OCw2ICs4MCwxNCBAQAogICAgICAgICAgICAgaW50ICAgICAgICAgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIAorICAgICAgICAgICAgc3A8SU1lbW9yeT4gZ2V0QnVmZmVycygpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJNZW1vcnk7IH0KKyAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZWRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1RJTUVEKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KKwogcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKGNvbnN0IFRyYWNrQmFzZSYpOwogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlJiBvcGVyYXRvciA9IChjb25zdCBUcmFja0Jhc2UmKTsKQEAgLTc4LDE1ICsxMDgsNiBAQAogCiAgICAgdmlydHVhbCB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAotICAgIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgY29udGlndW91cyBzbGljZSBvZiB0aGUgdHJhY2sgYnVmZmVyLgotICAgIC8vIFBhcmFtZXRlciAnb2Zmc2V0JyBpcyB0aGUgcmVxdWVzdGVkIHN0YXJ0IHBvc2l0aW9uLCBleHByZXNzZWQgaW4KLSAgICAvLyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZnJhbWUgdW5pdHMgcmVsYXRpdmUgdG8gdGhlIHRyYWNrIGVwb2NoLgotICAgIC8vIFBhcmFtZXRlciAnZnJhbWVzJyBpcyB0aGUgcmVxdWVzdGVkIGxlbmd0aCwgYWxzbyBpbiBmcmFtZSB1bml0cy4KLSAgICAvLyBBbHdheXMgcmV0dXJucyBub24tTlVMTC4gIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0bwotICAgIC8vIHZlcmlmeSB0aGF0IHRoaXMgd2lsbCBiZSBzdWNjZXNzZnVsOyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcwotICAgIC8vIGZ1bmN0aW9uIHdpdGggaW52YWxpZCAnb2Zmc2V0JyBvciAnZnJhbWVzJyBpcyB1bmRlZmluZWQuCi0gICAgdm9pZCogZ2V0QnVmZmVyKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZnJhbWVzKSBjb25zdDsKLQogICAgIGJvb2wgaXNTdG9wcGVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVE9QUEVEIHx8IG1TdGF0ZSA9PSBGTFVTSEVEKTsKICAgICB9CkBAIC0xMTgsNiArMTM5LDcgQEAKICAgICAvKmNvbnN0Ki8gc3A8Q2xpZW50PiBtQ2xpZW50OyAgIC8vIHNlZSBleHBsYW5hdGlvbiBhdCB+VHJhY2tCYXNlKCkgd2h5IG5vdCBjb25zdAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBtQ2JsazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1CdWZmZXJNZW1vcnk7ICAvLyBjdXJyZW50bHkgbm9uLTAgZm9yIGZhc3QgUmVjb3JkVHJhY2sgb25seQogICAgIHZvaWQqICAgICAgICAgICAgICAgbUJ1ZmZlcjsgICAgLy8gc3RhcnQgb2YgdHJhY2sgYnVmZmVyLCB0eXBpY2FsbHkgaW4gc2hhcmVkIG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0IGZvciBPdXRwdXRUcmFjayB3aGVuIGl0IGlzIGluIGxvY2FsIG1lbW9yeQogICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKQEAgLTEzNiwxMCArMTU4LDI2IEBACiAgICAgY29uc3QgaW50ICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIGludCAgICAgICAgICAgICAgICAgbVVpZDsKICAgICBWZWN0b3IgPCBzcDxTeW5jRXZlbnQ+ID5tU3luY0V2ZW50czsKKyAgICBjb25zdCBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IG1GbGFnczsKICAgICBjb25zdCBib29sICAgICAgICAgIG1Jc091dDsKICAgICBTZXJ2ZXJQcm94eSogICAgICAgIG1TZXJ2ZXJQcm94eTsKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1JZDsKICAgICBzcDxOQkFJT19TaW5rPiAgICAgIG1UZWVTaW5rOwogICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgbVRlZVNvdXJjZTsKICAgICBib29sICAgICAgICAgICAgICAgIG1UZXJtaW5hdGVkOworICAgIHRyYWNrX3R5cGUgICAgICAgICAgbVR5cGU7ICAgICAgLy8gbXVzdCBiZSBvbmUgb2YgVFlQRV9ERUZBVUxULCBUWVBFX09VVFBVVCwgVFlQRV9QQVRDSCAuLi4KKyAgICBhdWRpb19pb19oYW5kbGVfdCAgIG1UaHJlYWRJb0hhbmRsZTsgLy8gSS9PIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0bworfTsKKworLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBQYXRjaFRyYWNrIGFuZCBQYXRjaFJlY29yZC4KKy8vIGl0IHByb3ZpZGVzIGJ1ZmZlciBhY2Nlc3MgbWV0aG9kcyB0aGF0IG1hcCB0aG9zZSBvZiBhIENsaWVudFByb3h5IChzZWUgQXVkaW9UcmFja1NoYXJlZC5oKQorY2xhc3MgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyCit7CitwdWJsaWM6CisKKyAgICB2aXJ0dWFsIH5QYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGNiZjU2YjUuLmI5MzA4ZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTY3LDEwICs2OCwxMyBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGJvb2wgaXNPdXQpCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgYm9vbCBpc091dCwKKyAgICAgICAgICAgIGFsbG9jX3R5cGUgYWxsb2MsCisgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpCiAgICAgOiAgIFJlZkJhc2UoKSwKICAgICAgICAgbVRocmVhZCh0aHJlYWQpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCkBAIC04MCwxNSArODQsMjAgQEAKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgICAgbUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSwKLSAgICAgICAgbUNoYW5uZWxDb3VudChwb3Bjb3VudChjaGFubmVsTWFzaykpLAorICAgICAgICBtQ2hhbm5lbENvdW50KGlzT3V0ID8KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykpLAogICAgICAgICBtRnJhbWVTaXplKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSA/CiAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSA6IHNpemVvZihpbnQ4X3QpKSwKICAgICAgICAgbUZyYW1lQ291bnQoZnJhbWVDb3VudCksCiAgICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKKyAgICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgICAgbUlzT3V0KGlzT3V0KSwKICAgICAgICAgbVNlcnZlclByb3h5KE5VTEwpLAogICAgICAgICBtSWQoYW5kcm9pZF9hdG9taWNfaW5jKCZuZXh0VHJhY2tJZCkpLAotICAgICAgICBtVGVybWluYXRlZChmYWxzZSkKKyAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpLAorICAgICAgICBtVHlwZSh0eXBlKSwKKyAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZC0+aWQoKSkKIHsKICAgICAvLyBpZiB0aGUgY2FsbGVyIGlzIHVzLCB0cnVzdCB0aGUgc3BlY2lmaWVkIHVpZAogICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkX2NhY2hlZCB8fCBjbGllbnRVaWQgPT0gLTEpIHsKQEAgLTEwMiwyNyArMTExLDIwIEBACiAgICAgLy8gYmF0dGVyeSB1c2FnZSBvbiBpdC4KICAgICBtVWlkID0gY2xpZW50VWlkOwogCi0gICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAotICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKLQotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKLQogICAgIC8vIEFMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwotICAgIHNpemVfdCBidWZmZXJTaXplID0gKHNoYXJlZEJ1ZmZlciA9PSAwID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQpICogbUZyYW1lU2l6ZTsKLSAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IChidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50KSAqIG1GcmFtZVNpemU7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMICYmIGFsbG9jID09IEFMTE9DX0NCTEspIHsKICAgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOwogICAgIH0KIAogICAgIGlmIChjbGllbnQgIT0gMCkgewogICAgICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShzaXplKTsKLSAgICAgICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotICAgICAgICAgICAgLy8gY2FuJ3QgYXNzdW1lIG1DYmxrICE9IE5VTEwKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1DYmxrTWVtb3J5ID09IDAgfHwKKyAgICAgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSkpID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV1Iiwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOworICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xMzQsMjIgKzEzNiw1NSBAQAogICAgIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHN0cnVjdHVyZSBpbi1wbGFjZS4KICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBuZXcobUNibGspIGF1ZGlvX3RyYWNrX2NibGtfdCgpOwotICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwotICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudF8gPSBmcmFtZUNvdW50OwotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgc3dpdGNoIChhbGxvYykgeworICAgICAgICBjYXNlIEFMTE9DX1JFQURPTkxZOiB7CisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+IHJvSGVhcCh0aHJlYWQtPnJlYWRPbmx5SGVhcCgpKTsKKyAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGJ1ZmZlclNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlciA9IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19QSVBFOgorICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeSA9IHRocmVhZC0+cGlwZU1lbW9yeSgpOworICAgICAgICAgICAgLy8gbUJ1ZmZlciBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIGFzIHNlZW4gZnJvbSBjdXJyZW50IHByb2Nlc3MgKG1lZGlhc2VydmVyKSwKKyAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgY29taW5nIGZyb20gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpLgorICAgICAgICAgICAgLy8gSG93ZXZlciBpbiB0aGlzIGNhc2UgdGhlIFRyYWNrQmFzZSBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGJ1ZmZlciBkaXJlY3RseS4KKyAgICAgICAgICAgIC8vIEl0IHNob3VsZCByZWZlcmVuY2VzIHRoZSBidWZmZXIgdmlhIHRoZSBwaXBlLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0byBkZXRlY3QgaW5jb3JyZWN0IHVzYWdlIG9mIHRoZSBidWZmZXIsIHdlIHNldCBtQnVmZmVyIHRvIE5VTEwuCisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0NCTEs6CisgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICNpZiAwCi0gICAgICAgICAgICBtQ2Jsay0+bUZsYWdzID0gQ0JMS19GT1JDRVJFQURZOyAgICAvLyBGSVhNRSBoYWNrLCBuZWVkIHRvIGZpeCB0aGUgdHJhY2sgcmVhZHkgbG9naWMKKyAgICAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzID0gQ0JMS19GT1JDRVJFQURZOyAgICAvLyBGSVhNRSBoYWNrLCBuZWVkIHRvIGZpeCB0aGUgdHJhY2sgcmVhZHkgbG9naWMKICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTE9DQUw6CisgICAgICAgICAgICBtQnVmZmVyID0gY2FsbG9jKDEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQpOwotICAgICAgICAgICAgaWYgKHBpcGVGb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7CisgICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwogICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07CkBAIC0xNjgsNiArMjAzLDE3IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6aW5pdENoZWNrKCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UeXBlID09IFRZUEVfT1VUUFVUIHx8IG1UeXBlID09IFRZUEVfUEFUQ0gpIHsKKyAgICAgICAgc3RhdHVzID0gY2JsaygpICE9IE5VTEwgPyBOT19FUlJPUiA6IE5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBnZXRDYmxrKCkgIT0gMCA/IE5PX0VSUk9SIDogTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6flRyYWNrQmFzZSgpCiB7CiAjaWZkZWYgVEVFX1NJTksKQEAgLTE4NCwxMyArMjMwLDE1IEBACiAgICAgfQogICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7ICAgIC8vIGZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmVmb3JlIHJlbGVhc2luZyB0aGUgaGVhcCBpdCBiZWxvbmdzIHRvCiAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBtdXRleCBsb2NrZWQKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIGNsaWVudCBtdXRleCBsb2NrZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tQ2xpZW50TG9jayk7CiAgICAgICAgIC8vIElmIHRoZSBjbGllbnQncyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybywgdGhlIGFzc29jaWF0ZWQgZGVzdHJ1Y3RvcgogICAgICAgICAvLyBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBsb2NrIGhlbGQuIFRodXMgdGhlIGV4cGxpY2l0IGNsZWFyKCkgcmF0aGVyIHRoYW4KICAgICAgICAgLy8gcmVseWluZyBvbiB0aGUgYXV0b21hdGljIGNsZWFyKCkgYXQgZW5kIG9mIHNjb3BlLgogICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CiAgICAgfQorICAgIC8vIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCkBAIC0yNzYsNiArMzI0LDExIEBACiAgICAgaWYgKCFtVHJhY2stPmlzVGltZWRUcmFjaygpKQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAKKyAgICBpZiAoYnVmZmVyID09IDAgfHwgYnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicXVldWVUaW1lZEJ1ZmZlcigpIGJ1ZmZlciBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIFBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrKiB0dCA9CiAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrKj4obVRyYWNrLmdldCgpKTsKICAgICByZXR1cm4gdHQtPnF1ZXVlVGltZWRCdWZmZXIoYnVmZmVyLCBwdHMpOwpAQCAtMzI1LDEyICszNzgsMTcgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCB0cnVlIC8qaXNPdXQqLyksCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmxhZ3MsIHRydWUgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9QQVRDSCkgPyAoIGJ1ZmZlciA9PSBOVUxMID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSA6IEFMTE9DX0NCTEssCisgICAgICAgICAgICAgICAgICB0eXBlKSwKICAgICBtRmlsbGluZ1VwU3RhdHVzKEZTX0lOVkFMSUQpLAogICAgIC8vIG1SZXRyeUNvdW50IGluaXRpYWxpemVkIGxhdGVyIHdoZW4gbmVlZGVkCiAgICAgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLApAQCAtMzQwLDQ2ICszOTgsNTUgQEAKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLAogICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcygwKSwKLSAgICBtRmxhZ3MoZmxhZ3MpLAogICAgIG1GYXN0SW5kZXgoLTEpLAogICAgIG1DYWNoZWRWb2x1bWUoMS4wKSwKICAgICBtSXNJbnZhbGlkKGZhbHNlKSwKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5KE5VTEwpLAotICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKQorICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKSwKKyAgICBtRmx1c2hId1BlbmRpbmcoZmFsc2UpLAorICAgIG1QcmV2aW91c1ZhbGlkKGZhbHNlKSwKKyAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuKDApCisgICAgLy8gbVByZXZpb3VzVGltZXN0YW1wCiB7Ci0gICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgLy8gdG8gYXZvaWQgbGVha2luZyBhIHRyYWNrIG5hbWUsIGRvIG5vdCBhbGxvY2F0ZSBvbmUgdW5sZXNzIHRoZXJlIGlzIGFuIG1DYmxrCi0gICAgICAgIG1OYW1lID0gdGhyZWFkLT5nZXRUcmFja05hbWVfbChjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKG1OYW1lIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2sgbmFtZXMgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKLSAgICAgICAgaWYgKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgIT0gMCk7Ci0gICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpICYmIGkgPCAoaW50KUZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBlYWdlci4gIFdlIGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAvLyAgICAgICBmYXN0IHRyYWNrIGJlY29tZXMgYWN0aXZlLiAgU2luY2UgZmFzdCB0cmFja3MgYXJlIGEgc2NhcmNlIHJlc291cmNlLAotICAgICAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCi0gICAgICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KLSAgICAgICAgICAgIG1GYXN0SW5kZXggPSBpOwotICAgICAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKLSAgICAgICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOwotICAgICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKLSAgICAgICAgfQorICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKKyAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CisKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCisgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobUNibGsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFMT0dWKCJUcmFjayBjb25zdHJ1Y3RvciBuYW1lICVkLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKworICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCksIHNhbXBsZVJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOworICAgIH0KKyAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OworCisgICAgbU5hbWUgPSB0aHJlYWQtPmdldFRyYWNrTmFtZV9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCk7CisgICAgaWYgKG1OYW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQorICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAhPSAwKTsKKyAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayk7CisgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpICYmIGkgPCAoaW50KUZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CisgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIGVhZ2VyLiAgV2UgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGJlZm9yZSB0aGUKKyAgICAgICAgLy8gICAgICAgZmFzdCB0cmFjayBiZWNvbWVzIGFjdGl2ZS4gIFNpbmNlIGZhc3QgdHJhY2tzIGFyZSBhIHNjYXJjZSByZXNvdXJjZSwKKyAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCisgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgorICAgICAgICBtRmFzdEluZGV4ID0gaTsKKyAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKKyAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7CisgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CisgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6flRyYWNrKCkKQEAgLTM5MiwxMSArNDU5LDE4IEBACiAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGF0IGxlYWsuCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIC8vIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lIDwgMCkgeworICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogewogICAgIC8vIE5PVEU6IGRlc3Ryb3lUcmFja19sKCkgY2FuIHJlbW92ZSBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBUcmFjawpAQCAtNDA5LDMxICs0ODMsMzQgQEAKICAgICAvLyB0aGlzIFRyYWNrIHdpdGggaXRzIG1lbWJlciBtVHJhY2suCiAgICAgc3A8VHJhY2s+IGtlZXAodGhpcyk7CiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKKyAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7Ci0gICAgICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodGhyZWFkLT5pZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhc0FjdGl2ZSA9IHBsYXliYWNrVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkgJiYgIXdhc0FjdGl2ZSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lIENsaWVudCBUeXBlICAgICAgRm10IENobiBtYXNrIFNlc3Npb24gZkNvdW50IFMgRiBTUmF0ZSAgIgorICAgIHJlc3VsdC5hcHBlbmQoIiAgICBOYW1lIEFjdGl2ZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKICAgICAgICAgICAgICAgICAgICJMIGRCICBSIGRCICAgIFNlcnZlciBNYWluIGJ1ZiAgQXV4IEJ1ZiBGbGFncyBVbmRGcm1DbnRcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQogewotICAgIHVpbnQzMl90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgIEYgJTJkIiwgbUZhc3RJbmRleCk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIEYgJTJkIiwgbUZhc3RJbmRleCk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBub25lIik7CiAgICAgfQogICAgIHRyYWNrX3N0YXRlIHN0YXRlID0gbVN0YXRlOwogICAgIGNoYXIgc3RhdGVDaGFyOwpAQCAtNDg4LDggKzU2NSw5IEBACiAgICAgICAgIG5vd0luVW5kZXJydW4gPSAnPyc7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzbnByaW50ZigmYnVmZmVyWzddLCBzaXplLTcsICIgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2enUgJTFjICUxZCAlNXUgJTUuMmcgJTUuMmcgICIKKyAgICBzbnByaW50ZigmYnVmZmVyWzhdLCBzaXplLTgsICIgJTZzICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnp1ICUxYyAlMWQgJTV1ICU1LjJnICU1LjJnICAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlcCAlcCAweCUwM1ggJTl1JWNcbiIsCisgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKQEAgLTQ5OSw4ICs1NzcsOCBAQAogICAgICAgICAgICAgc3RhdGVDaGFyLAogICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgIDIwLjAgKiBsb2cxMCgodmxyICYgMHhGRkZGKSAvIDQwOTYuMCksCi0gICAgICAgICAgICAyMC4wICogbG9nMTAoKHZsciA+PiAxNikgLyA0MDk2LjApLAorICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCisgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKICAgICAgICAgICAgIG1NYWluQnVmZmVyLAogICAgICAgICAgICAgbUF1eEJ1ZmZlciwKQEAgLTUxNSw3ICs1OTMsNyBAQAogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoCi0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzIF9fdW51c2VkKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIHNpemVfdCBkZXNpcmVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtNTUyLDcgKzYzMCwxNCBAQAogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aXNSZWFkeSgpIGNvbnN0IHsKLSAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyAhPSBGU19GSUxMSU5HIHx8IGlzU3RvcHBlZCgpIHx8IGlzUGF1c2luZygpIHx8IGlzU3RvcHBpbmcoKSkgeworICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcgfHwgaXNTdG9wcGVkKCkgfHwgaXNQYXVzaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGlzU3RvcHBpbmcoKSkgeworICAgICAgICBpZiAoZnJhbWVzUmVhZHkoKSA+IDApIHsKKyAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMRUQ7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC01NjUsOCArNjUwLDggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBBTE9HVigic3RhcnQoJWQpLCBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKQEAgLTU4OSw3ICs2NzQsMTAgQEAKICAgICAgICAgLy8gaGVyZSB0aGUgdHJhY2sgY291bGQgYmUgZWl0aGVyIG5ldywgb3IgcmVzdGFydGVkCiAgICAgICAgIC8vIGluIGJvdGggY2FzZXMgInVuc3RvcCIgdGhlIHRyYWNrCiAKLSAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCkgeworICAgICAgICAvLyBpbml0aWFsIHN0YXRlLXN0b3BwaW5nLiBuZXh0IHN0YXRlLXBhdXNpbmcuCisgICAgICAgIC8vIFdoYXQgaWYgcmVzdW1lIGlzIGNhbGxlZCA/CisKKyAgICAgICAgaWYgKHN0YXRlID09IFBBVVNFRCB8fCBzdGF0ZSA9PSBQQVVTSU5HKSB7CiAgICAgICAgICAgICBpZiAobVJlc3VtZVRvU3RvcHBpbmcpIHsKICAgICAgICAgICAgICAgICAvLyBoYXBwZW5lZCB3ZSBuZWVkIHRvIHJlc3VtZSB0byBTVE9QUElOR18xCiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18xOwpAQCAtNjQ0LDcgKzczMiw3IEBACiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPm1BY3RpdmVUcmFja3MuaW5kZXhPZih0aGlzKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Zhc3RUcmFjaygpICYmICFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Zhc3RUcmFjaygpICYmICFpc09mZmxvYWRlZCgpICYmICFpc0RpcmVjdCgpKSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHByZXBhcmVUcmFja3NfbCgpIHdpbGwgc2V0IHN0YXRlIHRvIFNUT1BQSU5HXzIKQEAgLTcyMCw2ICs4MDgsNyBAQAogICAgICAgICAgICAgICAgIG1SZXRyeUNvdW50ID0gUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja1JldHJpZXNPZmZsb2FkOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtRmx1c2hId1BlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RPUFBJTkdfMSAmJiBtU3RhdGUgIT0gU1RPUFBJTkdfMiAmJiBtU3RhdGUgIT0gU1RPUFBFRCAmJgpAQCAtNzM1LDE2ICs4MjQsMjggQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGFjdGl2ZSB0cmFjayBsaXN0LCByZXNldCgpLCBhbmQgdHJpZ2dlciBwcmVzZW50YXRpb24gY29tcGxldGUKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+bUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRoaXMpIDwgMCkgewogICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKnQgPSAoRGlyZWN0T3V0cHV0VGhyZWFkICopcGxheWJhY2tUaHJlYWQ7CisgICAgICAgICAgICAgICAgICAgIHQtPmZsdXNoSHdfbCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBQcmV2ZW50IGZsdXNoIGJlaW5nIGxvc3QgaWYgdGhlIHRyYWNrIGlzIGZsdXNoZWQgYW5kIHRoZW4gcmVzdW1lZAogICAgICAgICAvLyBiZWZvcmUgbWl4ZXIgdGhyZWFkIGNhbiBydW4uIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gb2ZmbG9hZGluZwogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwotICAgICAgICBwbGF5YmFja1RocmVhZC0+Zmx1c2hPdXRwdXRfbCgpOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CiB9CiAKKy8vIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2hBY2soKQoreworICAgIGlmICghaXNPZmZsb2FkZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbUZsdXNoSHdQZW5kaW5nID0gZmFsc2U7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlc2V0KCkKIHsKICAgICAvLyBEbyBub3QgcmVzZXQgdHdpY2UgdG8gYXZvaWQgZGlzY2FyZGluZyBkYXRhIHdyaXR0ZW4ganVzdCBhZnRlciBhIGZsdXNoIGFuZCBiZWZvcmUKQEAgLTc3OSwyNyArODgwLDYwIEBACiB7CiAgICAgLy8gQ2xpZW50IHNob3VsZCBpbXBsZW1lbnQgdGhpcyB1c2luZyBTU1E7IHRoZSB1bnByZXNlbnRlZCBmcmFtZSBjb3VudCBpbiBsYXRjaCBpcyBpcnJlbGV2YW50CiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgLy8gRklYTUUgbm8gbG9jayBoZWxkIHRvIHNldCBtUHJldmlvdXNWYWxpZCA9IGZhbHNlCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgaWYgKCFpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKCFpc09mZmxvYWRlZCgpICYmICFpc0RpcmVjdCgpKSB7CiAgICAgICAgIGlmICghcGxheWJhY2tUaHJlYWQtPm1MYXRjaFFWYWxpZCkgeworICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICB1aW50MzJfdCB1bnByZXNlbnRlZEZyYW1lcyA9CiAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVW5wcmVzZW50ZWRGcmFtZXMgKiBtU2FtcGxlUmF0ZSkgLwogICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgZnJhbWVzV3JpdHRlbiA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CisgICAgICAgIC8vIEZJWE1FIFNpbmNlIHdlJ3JlIHVzaW5nIGEgcmF3IHBvaW50ZXIgYXMgdGhlIGtleSwgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZQorICAgICAgICAvLyAgICAgICBmb3IgYSBicmFuZCBuZXcgdHJhY2sgdG8gc2hhcmUgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIHJlY2VudGx5IGRlc3Ryb3llZAorICAgICAgICAvLyAgICAgICB0cmFjaywgYW5kIHRodXMgZm9yIHVzIHRvIGdldCB0aGUgZnJhbWVzIHJlbGVhc2VkIG9mIHRoZSB3cm9uZyB0cmFjay4KKyAgICAgICAgLy8gICAgICAgSXQgaXMgdW5saWtlbHkgdGhhdCB3ZSB3b3VsZCBiZSBhYmxlIHRvIGNhbGwgZ2V0VGltZXN0YW1wKCkgc28gcXVpY2tseQorICAgICAgICAvLyAgICAgICByaWdodCBhZnRlciBjcmVhdGluZyBhIG5ldyB0cmFjay4gIE5ldmVydGhlbGVzcywgdGhlIGluZGV4IGhlcmUgc2hvdWxkCisgICAgICAgIC8vICAgICAgIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIHRoYXQgaXMgdW5pcXVlLiAgT3IgdXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICAgICAgIHNzaXplX3QgaSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1GcmFtZXNSZWxlYXNlZC5pbmRleE9mS2V5KHRoaXMpOworICAgICAgICB1aW50MzJfdCBmcmFtZXNXcml0dGVuID0gaSA+PSAwID8KKyAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tRnJhbWVzUmVsZWFzZWRbaV0gOgorICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCk7CisgICAgICAgIGJvb2wgY2hlY2tQcmV2aW91c1RpbWVzdGFtcCA9IG1QcmV2aW91c1ZhbGlkICYmIGZyYW1lc1dyaXR0ZW4gPj0gbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCB1bnByZXNlbnRlZEZyYW1lcykgeworICAgICAgICAgICAgbVByZXZpb3VzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gZnJhbWVzV3JpdHRlbiAtIHVucHJlc2VudGVkRnJhbWVzOwotICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tVGltZXN0YW1wLm1UaW1lOworICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgdWludDMyX3QgcG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgaWYgKGNoZWNrUHJldmlvdXNUaW1lc3RhbXApIHsKKyAgICAgICAgICAgIGlmICh0aW1lLnR2X3NlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgfHwKKyAgICAgICAgICAgICAgICAgICAgKHRpbWUudHZfc2VjID09IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgdGltZS50dl9uc2VjIDwgbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X25zZWMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlRpbWUgaXMgZ29pbmcgYmFja3dhcmRzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwb3NpdGlvbiBjYW4gYm9iYmxlIHNsaWdodGx5IGFzIGFuIGFydGlmYWN0OyB0aGlzIGhpZGVzIHRoZSBib2JibGUKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBID0gOHU7CisgICAgICAgICAgICBpZiAoKHBvc2l0aW9uIDw9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIHx8CisgICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIDwgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSkgeworICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB0aW1lID0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gdGltZTsKKyAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICBtUHJldmlvdXNWYWxpZCA9IHRydWU7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTg4NSw4ICsxMDE5LDYgQEAKICAgICB9CiAKICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgfHwgaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBzZXNzaW9uICVkIGNvbXBsZXRlOiBmcmFtZXNXcml0dGVuICVkIiwKLSAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIGZyYW1lc1dyaXR0ZW4pOwogICAgICAgICB0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFN0cmVhbUVuZERvbmUoKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC05MDcsMjcgKzEwMzksMjcgQEAKIAogLy8gaW1wbGVtZW50IFZvbHVtZUJ1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0Vm9sdW1lTFIoKQorZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFZvbHVtZUxSKCkKIHsKICAgICAvLyBjYWxsZWQgYnkgRmFzdE1peGVyLCBzbyBub3QgYWxsb3dlZCB0byB0YWtlIGFueSBsb2NrcywgYmxvY2ssIG9yIGRvIEkvTyBpbmNsdWRpbmcgbG9ncwogICAgIEFMT0dfQVNTRVJUKGlzRmFzdFRyYWNrKCkgJiYgKG1DYmxrICE9IE5VTEwpKTsKLSAgICB1aW50MzJfdCB2bHIgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRWb2x1bWVMUigpOwotICAgIHVpbnQzMl90IHZsID0gdmxyICYgMHhGRkZGOwotICAgIHVpbnQzMl90IHZyID0gdmxyID4+IDE2OworICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgZmxvYXQgdmwgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgZmxvYXQgdnIgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgIC8vIHRyYWNrIHZvbHVtZXMgY29tZSBmcm9tIHNoYXJlZCBtZW1vcnksIHNvIGNhbid0IGJlIHRydXN0ZWQgYW5kIG11c3QgYmUgY2xhbXBlZAotICAgIGlmICh2bCA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKKyAgICBpZiAodmwgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgIHZsID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICB9Ci0gICAgaWYgKHZyID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOworICAgIGlmICh2ciA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgdnIgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgIH0KICAgICAvLyBub3cgYXBwbHkgdGhlIGNhY2hlZCBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWU7CiAgICAgLy8gdGhpcyBpcyB0cnVzdGVkIGJ1dCBsYWNrcyBhbnkgc3luY2hyb25pemF0aW9uIG9yIGJhcnJpZXIgc28gbWF5IGJlIHN0YWxlCiAgICAgZmxvYXQgdiA9IG1DYWNoZWRWb2x1bWU7CiAgICAgdmwgKj0gdjsKICAgICB2ciAqPSB2OwotICAgIC8vIHJlLWNvbWJpbmUgaW50byBVNC4xNgotICAgIHZsciA9ICh2ciA8PCAxNikgfCAodmwgJiAweEZGRkYpOworICAgIC8vIHJlLWNvbWJpbmUgaW50byBwYWNrZWQgbWluaWZsb2F0CisgICAgdmxyID0gZ2Fpbl9taW5pZmxvYXRfcGFjayhnYWluX2Zyb21fZmxvYXQodmwpLCBnYWluX2Zyb21fZmxvYXQodnIpKTsKICAgICAvLyBGSVhNRSBsb29rIGF0IG11dGUsIHBhdXNlLCBhbmQgc3RvcCBmbGFncwogICAgIHJldHVybiB2bHI7CiB9CkBAIC05NjcsNiArMTA5OSwzMyBAQAogICAgIH0KIH0KIAorLy9UbyBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCitib29sIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppc1Jlc3VtZVBlbmRpbmcoKSB7CisKKyAgICBpZiAobVN0YXRlID09IFJFU1VNSU5HKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvKiBSZXN1bWUgaXMgcGVuZGluZyBpZiB0cmFjayB3YXMgc3RvcHBpbmcgYmVmb3JlIHBhdXNlIHdhcyBjYWxsZWQgKi8KKyAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgJiYKKyAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnJlc3VtZUFjaygpIHsKKworCisgICAgaWYgKG1TdGF0ZSA9PSBSRVNVTUlORykKKyAgICAgICAgbVN0YXRlID0gQUNUSVZFOworCisgICAgLy8gT3RoZXIgcG9zc2liaWxpdHkgb2YgIHBlbmRpbmcgcmVzdW1lIGlzIHN0b3BwaW5nXzEgc3RhdGUKKyAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdGF0ZSBmcm9tIHN0b3BwaW5nIGFzIHRoaXMgcHJldmVudHMKKyAgICAvLyBkcmFpbiBiZWluZyBjYWxsZWQuCisgICAgaWYgKG1TdGF0ZSA9PSBTVE9QUElOR18xKSB7CisgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gZmFsc2U7CisgICAgfQorfQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrPgpAQCAtOTgwLDcgKzExMzksOCBAQAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgIGludCB1aWQpIHsKKyAgICAgICAgICAgIGludCB1aWQpCit7CiAgICAgaWYgKCFjbGllbnQtPnJlc2VydmVUaW1lZFRyYWNrKCkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0xMDAxLDcgKzExNjEsOCBAQAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiBUcmFjayh0aHJlYWQsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVEKSwKKyAgICAgICAgICAgIGZyYW1lQ291bnQsIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX1RJTUVELCBUWVBFX1RJTUVEKSwKICAgICAgIG1RdWV1ZUhlYWRJbkZsaWdodChmYWxzZSksCiAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZShmYWxzZSksCiAgICAgICBtRnJhbWVzUGVuZGluZ0luUXVldWUoMCksCkBAIC0xMDQ2LDE1ICsxMjA3LDE0IEBACiAKICAgICAgICAgbVRpbWVkTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrVGltZWRCdWZmZXJIZWFwU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW9GbGluZ2VyVGltZWQiKTsKLSAgICAgICAgaWYgKG1UaW1lZE1lbW9yeURlYWxlciA9PSBOVUxMKQorICAgICAgICBpZiAobVRpbWVkTWVtb3J5RGVhbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxJTWVtb3J5PiBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBuZXdCdWZmZXIgPSBtVGltZWRNZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUpOwotICAgICAgICBpZiAobmV3QnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIGlmIChuZXdCdWZmZXIgPT0gMCB8fCBuZXdCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgfQogCiAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKQEAgLTExNTMsNyArMTMxMyw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VGltZWRUcmFjazo6dXBkYXRlRnJhbWVzUGVuZGluZ0FmdGVyVHJpbV9sKAogICAgICAgICBjb25zdCBUaW1lZEJ1ZmZlciYgYnVmLAotICAgICAgICBjb25zdCBjaGFyKiBsb2dUYWcpIHsKKyAgICAgICAgY29uc3QgY2hhciogbG9nVGFnIF9fdW51c2VkKSB7CiAgICAgdWludDMyX3QgYnVmQnl0ZXMgICAgICAgID0gYnVmLmJ1ZmZlcigpLT5zaXplKCk7CiAgICAgdWludDMyX3QgY29uc3VtZWRBbHJlYWR5ID0gYnVmLnBvc2l0aW9uKCk7CiAKQEAgLTE0NjQsNyArMTYyNCw3IEBACiAgICAgICAgICAgICBtVHJpbVF1ZXVlSGVhZE9uUmVsZWFzZSA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lZFRyYWNrOjpyZWxlYXNlQnVmZmVyIG9mIG5vbi1zaWxlbmNlIGJ1ZmZlciB3aXRoIG5vIgogICAgICAgICAgICAgICAgICAgIiBidWZmZXJzIGluIHRoZSB0aW1lZCBidWZmZXIgcXVldWUiKTsKICAgICB9CiAKQEAgLTE0OTcsNyArMTY1Nyw3IEBACiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGludCB1aWQpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIE5VTEwsIDAsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCksCisgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxULCBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKSwgbUNsaWVudFByb3h5KE5VTEwpCiB7CiAKQEAgLTE1MDUsMTcgKzE2NjUsMTYgQEAKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwogICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKLSAgICAgICAgICAgICAgICAibUNibGstPmZyYW1lQ291bnRfICV1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKKyAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAldSwgbUNoYW5uZWxNYXNrIDB4JTA4eCIsCiAgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsCi0gICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnRfLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1DaGFubmVsTWFzayk7CiAgICAgICAgIC8vIHNpbmNlIGNsaWVudCBhbmQgc2VydmVyIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLAogICAgICAgICAvLyB0aGUgYnVmZmVyIGhhcyB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3Mgb24gYm90aCBzaWRlcwotICAgICAgICBtQ2xpZW50UHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBtRnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1DbGllbnRQcm94eS0+c2V0Vm9sdW1lTFIoKHVpbnQzMl90KHVpbnQxNl90KDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KDB4MTAwMCkpOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOwotICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgICAgIG1DbGllbnRQcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgIHRydWUgLypjbGllbnRJblNlcnZlciovKTsKKyAgICAgICAgbUNsaWVudFByb3h5LT5zZXRWb2x1bWVMUihHQUlOX01JTklGTE9BVF9QQUNLRURfVU5JVFkpOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNlbmRMZXZlbCgwLjApOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkVycm9yIGNyZWF0aW5nIG91dHB1dCB0cmFjayBvbiB0aHJlYWQgJXAiLCBwbGF5YmFja1RocmVhZCk7CiAgICAgfQpAQCAtMTcwNiw2ICsxODY1LDc1IEBACiB9CiAKIAorQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCisgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICBidWZmZXIsIDAsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQoreworICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7CisKKyAgICBBTE9HVigiUGF0Y2hUcmFjayAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6On5QYXRjaFRyYWNrKCkKK3sKK30KKworLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3RhdHVzID0gVHJhY2s6OmdldE5leHRCdWZmZXIoYnVmZmVyLCBwdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OworICAgIG1QZWVyUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1Zik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6Om9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0KQoreworICAgIHJldHVybiBtUHJveHktPm9idGFpbkJ1ZmZlcihidWZmZXIsIHRpbWVPdXQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKKyAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GT1JDRVJFQURZLCAmbUNibGstPm1GbGFncyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzIyLDEwICsxOTUwLDYgQEAKICAgICBtUmVjb3JkVHJhY2stPmRlc3Ryb3koKTsKIH0KIAotc3A8SU1lbW9yeT4gQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldENibGsoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwotfQotCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pIHsKICAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CkBAIC0xNzQ5LDcgKzE5NzMsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCwKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKQEAgLTE3NTcsMjggKzE5ODEsNTkgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgaW50IHVpZCkKKyAgICAgICAgICAgIGludCB1aWQsCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAwIC8qc2hhcmVkQnVmZmVyKi8sIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8pLAotICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwKKyAgICAgICAgICAgICAgICAgIGZsYWdzLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpID8gQUxMT0NfUElQRSA6IEFMTE9DX0NCTEspIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChidWZmZXIgPT0gTlVMTCkgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpLAorICAgICAgICAgICAgICAgICAgdHlwZSksCisgICAgICAgIG1PdmVyZmxvdyhmYWxzZSksIG1SZXNhbXBsZXIoTlVMTCksIG1Sc21wT3V0QnVmZmVyKE5VTEwpLCBtUnNtcE91dEZyYW1lQ291bnQoMCksCisgICAgICAgIC8vIFNlZSByZWFsIGluaXRpYWxpemF0aW9uIG9mIG1Sc21wSW5Gcm9udCBhdCBSZWNvcmRUaHJlYWQ6OnN0YXJ0KCkKKyAgICAgICAgbVJzbXBJblVucmVsKDApLCBtUnNtcEluRnJvbnQoMCksIG1GcmFtZXNUb0Ryb3AoMCksIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcihOVUxMKQogewotICAgIEFMT0dWKCJSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciIpOwotICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZFNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1JlY29yZFNlcnZlclByb3h5OworICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCkpOworCisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOworICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCBlaXRoZXIgb2YgdGhlIGNoYW5uZWwgY291bnQgY2hlY2tzCisgICAgaWYgKHRocmVhZC0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSAmJiB0aHJlYWQtPm1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBGQ0NfMikgeworICAgICAgICAvLyBzaW5rIFNSCisgICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIHNvdXJjZSBTUgorICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHRocmVhZC0+bVNhbXBsZVJhdGUpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKKyAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKICAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6flJlY29yZFRyYWNrKCkKIHsKICAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIG1SZXNhbXBsZXI7CisgICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7CisgICAgZGVsZXRlIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcjsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKLSAgICAgICAgaW50NjRfdCBwdHMpCisgICAgICAgIGludDY0X3QgcHRzIF9fdW51c2VkKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKQEAgLTE4MDksOCArMjA2NCw4IEBACiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgaWYgKHJlY29yZFRocmVhZC0+c3RvcCh0aGlzKSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChyZWNvcmRUaHJlYWQtPmlkKCkpOworICAgICAgICBpZiAocmVjb3JkVGhyZWFkLT5zdG9wKHRoaXMpICYmIGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE4MjAsMTIgKzIwNzUsMTQgQEAKICAgICAvLyBzZWUgY29tbWVudHMgYXQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogICAgIHNwPFJlY29yZFRyYWNrPiBrZWVwKHRoaXMpOwogICAgIHsKKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gUkVTVU1JTkcpIHsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1UaHJlYWRJb0hhbmRsZSwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVRocmVhZElvSGFuZGxlLCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgICAgICB9CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodGhyZWFkLT5pZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodGhyZWFkLT5pZCgpKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7CiAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwpAQCAtMTg0NiwxOSArMjEwMywxMTEgQEAKIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIgICAgQWN0aXZlIENsaWVudCBGbXQgQ2huIG1hc2sgU2Vzc2lvbiBTICAgU2VydmVyIGZDb3VudCBTUmF0ZVxuIik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGFjdGl2ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enVcbiIsCisgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgICU2cyAlNnUgJTN1ICUwOFggJTd1ICUxZCAlMDhYICU2enUgJTV1XG4iLAorICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1TdGF0ZSwKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgbUZyYW1lQ291bnQsCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KQoreworICAgIGlmIChldmVudCA9PSBtU3luY1N0YXJ0RXZlbnQpIHsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNUb0Ryb3AgPSAwOworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWRCYXNlICE9IDApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhY3R1YWwgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIGluc3RlYWQgb2YgMiBidWZmZXJzIHdoZW4gaW5mbyBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIC8vIGZyb20gYXVkaW8gSEFMCisgICAgICAgICAgICBmcmFtZXNUb0Ryb3AgPSB0aHJlYWRCYXNlLT5tRnJhbWVDb3VudCAqIDI7CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lc1RvRHJvcCA9IGZyYW1lc1RvRHJvcDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpjbGVhclN5bmNTdGFydEV2ZW50KCkKK3sKKyAgICBpZiAobVN5bmNTdGFydEV2ZW50ICE9IDApIHsKKyAgICAgICAgbVN5bmNTdGFydEV2ZW50LT5jYW5jZWwoKTsKKyAgICAgICAgbVN5bmNTdGFydEV2ZW50LmNsZWFyKCk7CisgICAgfQorICAgIG1GcmFtZXNUb0Ryb3AgPSAwOworfQorCisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6UGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MpCisgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBidWZmZXIsIDAsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpKQoreworICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKKyAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOworCisgICAgQUxPR1YoIlBhdGNoUmVjb3JkICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKK30KKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjp+UGF0Y2hSZWNvcmQoKQoreworfQorCisvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCit7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgUHJveHk6OkJ1ZmZlciBidWY7CisgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OworICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfQorICAgIHN0YXR1cyA9IFJlY29yZFRyYWNrOjpnZXROZXh0QnVmZmVyKGJ1ZmZlciwgcHRzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKKyAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKKyAgICBtUGVlclByb3h5LT5yZWxlYXNlQnVmZmVyKCZidWYpOworICAgIFRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6Om9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQpCit7CisgICAgcmV0dXJuIG1Qcm94eS0+b2J0YWluQnVmZmVyKGJ1ZmZlciwgdGltZU91dCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcAppbmRleCA3YTMxNGNmLi44NGE2NTVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCkBAIC0xNCw4ICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTI0LDgxICsyMiwxMTQgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0cnVjdCBIZWFkZXJXYXYgewotICAgIEhlYWRlcldhdihzaXplX3Qgc2l6ZSwgaW50IG5jLCBpbnQgc3IsIGludCBiaXRzKSB7Ci0gICAgICAgIHN0cm5jcHkoUklGRiwgIlJJRkYiLCA0KTsKLSAgICAgICAgY2h1bmtTaXplID0gc2l6ZSArIHNpemVvZihIZWFkZXJXYXYpOwotICAgICAgICBzdHJuY3B5KFdBVkUsICJXQVZFIiwgNCk7Ci0gICAgICAgIHN0cm5jcHkoZm10LCAgImZtdCAiLCA0KTsKLSAgICAgICAgZm10U2l6ZSA9IDE2OwotICAgICAgICBhdWRpb0Zvcm1hdCA9IDE7Ci0gICAgICAgIG51bUNoYW5uZWxzID0gbmM7Ci0gICAgICAgIHNhbXBsZXNSYXRlID0gc3I7Ci0gICAgICAgIGJ5dGVSYXRlID0gc3IgKiBudW1DaGFubmVscyAqIChiaXRzLzgpOwotICAgICAgICBhbGlnbiA9IG5jKihiaXRzLzgpOwotICAgICAgICBiaXRzUGVyU2FtcGxlID0gYml0czsKLSAgICAgICAgc3RybmNweShkYXRhLCAiZGF0YSIsIDQpOwotICAgICAgICBkYXRhU2l6ZSA9IHNpemU7Ci0gICAgfQotCi0gICAgY2hhciBSSUZGWzRdOyAgICAgICAgICAgLy8gUklGRgotICAgIHVpbnQzMl90IGNodW5rU2l6ZTsgICAgIC8vIEZpbGUgc2l6ZQotICAgIGNoYXIgV0FWRVs0XTsgICAgICAgIC8vIFdBVkUKLSAgICBjaGFyIGZtdFs0XTsgICAgICAgICAgICAvLyBmbXRcMAotICAgIHVpbnQzMl90IGZtdFNpemU7ICAgICAgIC8vIGZtdCBzaXplCi0gICAgdWludDE2X3QgYXVkaW9Gb3JtYXQ7ICAgLy8gMT1QQ00KLSAgICB1aW50MTZfdCBudW1DaGFubmVsczsgICAvLyBudW0gY2hhbm5lbHMKLSAgICB1aW50MzJfdCBzYW1wbGVzUmF0ZTsgICAvLyBzYW1wbGUgcmF0ZSBpbiBoegotICAgIHVpbnQzMl90IGJ5dGVSYXRlOyAgICAgIC8vIEJwcwotICAgIHVpbnQxNl90IGFsaWduOyAgICAgICAgIC8vIDI9MTYtYml0IG1vbm8sIDQ9MTYtYml0IHN0ZXJlbwotICAgIHVpbnQxNl90IGJpdHNQZXJTYW1wbGU7IC8vIGJpdHMgcGVyIHNhbXBsZQotICAgIGNoYXIgZGF0YVs0XTsgICAgICAgICAgIC8vICJkYXRhIgotICAgIHVpbnQzMl90IGRhdGFTaXplOyAgICAgIC8vIHNpemUKLX07CitzdGF0aWMgYm9vbCBnVmVyYm9zZSA9IGZhbHNlOwogCiBzdGF0aWMgaW50IHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiVXNhZ2U6ICVzIFstcF0gWy1oXSBbLXNdIFstcSB7ZHF8bHF8bXF8aHF8dmhxfV0gWy1pIGlucHV0LXNhbXBsZS1yYXRlXSAiCi0gICAgICAgICAgICAgICAgICAgIlstbyBvdXRwdXQtc2FtcGxlLXJhdGVdIFs8aW5wdXQtZmlsZT5dIDxvdXRwdXQtZmlsZT5cbiIsIG5hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCJVc2FnZTogJXMgWy1wXSBbLWZdIFstRl0gWy12XSBbLWMgY2hhbm5lbHNdIgorICAgICAgICAgICAgICAgICAgICIgWy1xIHtkcXxscXxtcXxocXx2aHF8ZGxxfGRtcXxkaHF9XSIKKyAgICAgICAgICAgICAgICAgICAiIFstaSBpbnB1dC1zYW1wbGUtcmF0ZV0gWy1vIG91dHB1dC1zYW1wbGUtcmF0ZV0iCisgICAgICAgICAgICAgICAgICAgIiBbLU8gY3N2XSBbLVAgY3N2XSBbPGlucHV0LWZpbGU+XSIKKyAgICAgICAgICAgICAgICAgICAiIDxvdXRwdXQtZmlsZT5cbiIsIG5hbWUpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXAgICAgZW5hYmxlIHByb2ZpbGluZ1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIiAgICAtaCAgICBjcmVhdGUgd2F2IGZpbGVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCIgICAgLXMgICAgc3RlcmVvXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1mICAgIGVuYWJsZSBmaWx0ZXIgcHJvZmlsaW5nXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1GICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCAtcSB7ZGxxfGRtcXxkaHF9IG9ubHkiKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC12ICAgIHZlcmJvc2UgOiBsb2cgYnVmZmVyIHByb3ZpZGVyIGNhbGxzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1jICAgICMgY2hhbm5lbHMgKDEtMiBmb3IgbHF8bXF8aHE7IDEtOCBmb3IgZGxxfGRtcXxkaHEpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1xICAgIHJlc2FtcGxlciBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBkcSAgOiBkZWZhdWx0IHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGxxICA6IGxvdyBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBtcSAgOiBtZWRpdW0gcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgaHEgIDogaGlnaCBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICB2aHEgOiB2ZXJ5IGhpZ2ggcXVhbGl0eVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsIiAgICAtaSAgICBpbnB1dCBmaWxlIHNhbXBsZSByYXRlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBkbHEgOiBkeW5hbWljIGxvdyBxdWFsaXR5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBkbXEgOiBkeW5hbWljIG1lZGl1bSBxdWFsaXR5XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBkaHEgOiBkeW5hbWljIGhpZ2ggcXVhbGl0eVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtaSAgICBpbnB1dCBmaWxlIHNhbXBsZSByYXRlIChpZ25vcmVkIGlmIGlucHV0IGZpbGUgaXMgc3BlY2lmaWVkKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAtbyAgICBvdXRwdXQgZmlsZSBzYW1wbGUgcmF0ZVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtTyAgICAjIGZyYW1lcyBvdXRwdXQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1QICAgICMgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CiAgICAgcmV0dXJuIC0xOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisvLyBDb252ZXJ0IGEgbGlzdCBvZiBpbnRlZ2VycyBpbiBDU1YgZm9ybWF0IHRvIGEgVmVjdG9yIG9mIHRob3NlIHZhbHVlcy4KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCwgb3IgLTEgb24gZXJyb3IuCitpbnQgcGFyc2VDU1YoY29uc3QgY2hhciAqc3RyaW5nLCBWZWN0b3I8aW50PiYgdmFsdWVzKQoreworICAgIC8vIHBhc3MgMTogY291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgYW5kIGRvIHN5bnRheCBjaGVjaworICAgIHNpemVfdCBudW1WYWx1ZXMgPSAwOworICAgIGJvb2wgaGFkRGlnaXQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBzdHJpbmc7IDsgKSB7CisgICAgICAgIHN3aXRjaCAoKnArKykgeworICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgICAgICAgIGhhZERpZ2l0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKKyAgICAgICAgICAgICAgICAvLyBwYXNzIDI6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHZlY3RvciBvZiB2YWx1ZXMKKyAgICAgICAgICAgICAgICB2YWx1ZXMucmVzaXplKCsrbnVtVmFsdWVzKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZWRpdEl0ZW1BdCgwKSA9IGF0b2kocCA9IG9wdGFyZyk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1WYWx1ZXM7ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnArKyA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5lZGl0SXRlbUF0KGkrKykgPSBhdG9pKHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudW1WYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKKyAgICAgICAgICAgICAgICBoYWREaWdpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG51bVZhbHVlcysrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9Cit9CiAKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgICBjb25zdCBjaGFyKiBjb25zdCBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0gICAgYm9vbCBwcm9maWxpbmcgPSBmYWxzZTsKLSAgICBib29sIHdyaXRlSGVhZGVyID0gZmFsc2U7CisgICAgYm9vbCBwcm9maWxlUmVzYW1wbGUgPSBmYWxzZTsKKyAgICBib29sIHByb2ZpbGVGaWx0ZXIgPSBmYWxzZTsKKyAgICBib29sIHVzZUZsb2F0ID0gZmFsc2U7CiAgICAgaW50IGNoYW5uZWxzID0gMTsKICAgICBpbnQgaW5wdXRfZnJlcSA9IDA7CiAgICAgaW50IG91dHB1dF9mcmVxID0gMDsKICAgICBBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpERUZBVUxUX1FVQUxJVFk7CisgICAgVmVjdG9yPGludD4gT3ZhbHVlczsKKyAgICBWZWN0b3I8aW50PiBQdmFsdWVzOwogCiAgICAgaW50IGNoOwotICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgInBoc3E6aTpvOiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgInBmRnZjOnE6aTpvOk86UDoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgIHByb2ZpbGluZyA9IHRydWU7CisgICAgICAgICAgICBwcm9maWxlUmVzYW1wbGUgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgd3JpdGVIZWFkZXIgPSB0cnVlOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIHByb2ZpbGVGaWx0ZXIgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgY2hhbm5lbHMgPSAyOworICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgIHVzZUZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIGdWZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIGNoYW5uZWxzID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAiZHEiKSkKQEAgLTExMSw2ICsxNDIsMTIgQEAKICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWTsKICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAidmhxIikpCiAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZGxxIikpCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFk7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImRtcSIpKQorICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJkaHEiKSkKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICB1c2FnZShwcm9nbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTIyLDEyICsxNTksMzUgQEAKICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgICBvdXRwdXRfZnJlcSA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIGlmIChwYXJzZUNTVihvcHRhcmcsIE92YWx1ZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IHN5bnRheCBmb3IgLU8gb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICBpZiAocGFyc2VDU1Yob3B0YXJnLCBQdmFsdWVzKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluY29ycmVjdCBzeW50YXggZm9yIC1QIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgdXNhZ2UocHJvZ25hbWUpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKGNoYW5uZWxzIDwgMQorICAgICAgICAgICAgfHwgY2hhbm5lbHMgPiAocXVhbGl0eSA8IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFkgPyAyIDogOCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh1c2VGbG9hdCAmJiBxdWFsaXR5IDwgQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZsb2F0IHByb2Nlc3NpbmcgaXMgb25seSBwb3NzaWJsZSBmb3IgZHluYW1pYyByZXNhbXBsZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGFyZ2MgLT0gb3B0aW5kOwogICAgIGFyZ3YgKz0gb3B0aW5kOwogCkBAIC0xNDgsMjUgKzIwOCwyMiBAQAogICAgIHNpemVfdCBpbnB1dF9zaXplOwogICAgIHZvaWQqIGlucHV0X3ZhZGRyOwogICAgIGlmIChhcmdjID09IDIpIHsKLSAgICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICAgIGlmIChzdGF0KGZpbGVfaW4sICZzdCkgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN0YXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBTRl9JTkZPIGluZm87CisgICAgICAgIGluZm8uZm9ybWF0ID0gMDsKKyAgICAgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVfaW4sIFNGTV9SRUFELCAmaW5mbyk7CisgICAgICAgIGlmIChzZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwZXJyb3IoZmlsZV9pbik7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgICAgICB9Ci0KLSAgICAgICAgaW50IGlucHV0X2ZkID0gb3BlbihmaWxlX2luLCBPX1JET05MWSk7Ci0gICAgICAgIGlmIChpbnB1dF9mZCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3BlbjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnB1dF9zaXplID0gc3Quc3Rfc2l6ZTsKLSAgICAgICAgaW5wdXRfdmFkZHIgPSBtbWFwKDAsIGlucHV0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGlucHV0X2ZkLCAwKTsKLSAgICAgICAgaWYgKGlucHV0X3ZhZGRyID09IE1BUF9GQUlMRUQgKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1tYXA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGlucHV0X3NpemUgPSBpbmZvLmZyYW1lcyAqIGluZm8uY2hhbm5lbHMgKiBzaXplb2Yoc2hvcnQpOworICAgICAgICBpbnB1dF92YWRkciA9IG1hbGxvYyhpbnB1dF9zaXplKTsKKyAgICAgICAgKHZvaWQpIHNmX3JlYWRmX3Nob3J0KHNmLCAoc2hvcnQgKikgaW5wdXRfdmFkZHIsIGluZm8uZnJhbWVzKTsKKyAgICAgICAgc2ZfY2xvc2Uoc2YpOworICAgICAgICBjaGFubmVscyA9IGluZm8uY2hhbm5lbHM7CisgICAgICAgIGlucHV0X2ZyZXEgPSBpbmZvLnNhbXBsZXJhdGU7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZGF0YSBmb3IgdGVzdGluZyBpcyBleGFjdGx5IChpbnB1dCBzYW1wbGluZyByYXRlLzEwMDApLzIgc2Vjb25kcworICAgICAgICAvLyBzbyA0NC4xa2h6IGlucHV0IGlzIDIyLjA1IHNlY29uZHMKICAgICAgICAgZG91YmxlIGsgPSAxMDAwOyAvLyBIeiAvIHMKICAgICAgICAgZG91YmxlIHRpbWUgPSAoaW5wdXRfZnJlcSAvIDIpIC8gazsKICAgICAgICAgc2l6ZV90IGlucHV0X2ZyYW1lcyA9IHNpemVfdChpbnB1dF9mcmVxICogdGltZSk7CkBAIC0xNzcsOTggKzIzNCwyNzYgQEAKICAgICAgICAgICAgIGRvdWJsZSB0ID0gZG91YmxlKGkpIC8gaW5wdXRfZnJlcTsKICAgICAgICAgICAgIGRvdWJsZSB5ID0gc2luKE1fUEkgKiBrICogdCAqIHQpOwogICAgICAgICAgICAgaW50MTZfdCB5aSA9IGZsb29yKHkgKiAzMjc2Ny4wICsgMC41KTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGo9MCA7IGo8KHNpemVfdCljaGFubmVscyA7IGorKykgewotICAgICAgICAgICAgICAgIGluW2kqY2hhbm5lbHMgKyBqXSA9IHlpIC8gKDEraik7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbltpKmNoYW5uZWxzICsgal0gPSB5aSAvICgxICsgaik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgc2l6ZV90IGlucHV0X2ZyYW1lc2l6ZSA9IGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgIHNpemVfdCBpbnB1dF9mcmFtZXMgPSBpbnB1dF9zaXplIC8gaW5wdXRfZnJhbWVzaXplOworCisgICAgLy8gRm9yIGZsb2F0IHByb2Nlc3NpbmcsIGNvbnZlcnQgaW5wdXQgaW50MTZfdCB0byBmbG9hdCBhcnJheQorICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICB2b2lkICpuZXdfdmFkZHI7CisKKyAgICAgICAgaW5wdXRfZnJhbWVzaXplID0gY2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOworICAgICAgICBpbnB1dF9zaXplID0gaW5wdXRfZnJhbWVzICogaW5wdXRfZnJhbWVzaXplOworICAgICAgICBuZXdfdmFkZHIgPSBtYWxsb2MoaW5wdXRfc2l6ZSk7CisgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihyZWludGVycHJldF9jYXN0PGZsb2F0Kj4obmV3X3ZhZGRyKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QqPihpbnB1dF92YWRkciksIGlucHV0X2ZyYW1lcyAqIGNoYW5uZWxzKTsKKyAgICAgICAgZnJlZShpbnB1dF92YWRkcik7CisgICAgICAgIGlucHV0X3ZhZGRyID0gbmV3X3ZhZGRyOworICAgIH0KIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGNsYXNzIFByb3ZpZGVyOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0gICAgICAgIGludDE2X3QqIG1BZGRyOwotICAgICAgICBzaXplX3QgbU51bUZyYW1lczsKKyAgICAgICAgY29uc3Qgdm9pZCogICAgIG1BZGRyOyAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICBjb25zdCBzaXplX3QgICAgbU51bUZyYW1lczsgLy8gdG90YWwgZnJhbWVzCisgICAgICAgIGNvbnN0IHNpemVfdCAgICBtRnJhbWVTaXplOyAvLyBzaXplIG9mIGVhY2ggZnJhbWUgaW4gYnl0ZXMKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIG1OZXh0RnJhbWU7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gcHJvdmlkZQorICAgICAgICBzaXplX3QgICAgICAgICAgbVVucmVsOyAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBub3QgeWV0IHJlbGVhc2VkCisgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQ+IG1QdmFsdWVzOyAvLyBudW1iZXIgb2YgZnJhbWVzIHByb3ZpZGVkIHBlciBjYWxsCisgICAgICAgIHNpemVfdCAgICAgICAgICBtTmV4dFBpZHg7ICAvLyBpbmRleCBvZiBuZXh0IGVudHJ5IGluIG1QdmFsdWVzIHRvIHVzZQogICAgIHB1YmxpYzoKLSAgICAgICAgUHJvdmlkZXIoY29uc3Qgdm9pZCogYWRkciwgc2l6ZV90IHNpemUsIGludCBjaGFubmVscykgewotICAgICAgICAgICAgbUFkZHIgPSAoaW50MTZfdCopIGFkZHI7Ci0gICAgICAgICAgICBtTnVtRnJhbWVzID0gc2l6ZSAvIChjaGFubmVscypzaXplb2YoaW50MTZfdCkpOworICAgICAgICBQcm92aWRlcihjb25zdCB2b2lkKiBhZGRyLCBzaXplX3QgZnJhbWVzLCBzaXplX3QgZnJhbWVTaXplLCBjb25zdCBWZWN0b3I8aW50PiYgUHZhbHVlcykKKyAgICAgICAgICA6IG1BZGRyKGFkZHIpLAorICAgICAgICAgICAgbU51bUZyYW1lcyhmcmFtZXMpLAorICAgICAgICAgICAgbUZyYW1lU2l6ZShmcmFtZVNpemUpLAorICAgICAgICAgICAgbU5leHRGcmFtZSgwKSwgbVVucmVsKDApLCBtUHZhbHVlcyhQdmFsdWVzKSwgbU5leHRQaWR4KDApIHsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMgPSBrSW52YWxpZFBUUykgewotICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lczsKLSAgICAgICAgICAgIGJ1ZmZlci0+aTE2ID0gbUFkZHI7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAodm9pZClwdHM7IC8vIHN1cHByZXNzIHdhcm5pbmcKKyAgICAgICAgICAgIHNpemVfdCByZXF1ZXN0ZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVkRnJhbWVzID4gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVB2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHByb3ZpZGVkID0gbVB2YWx1ZXNbbU5leHRQaWR4KytdOworICAgICAgICAgICAgICAgIHByaW50ZigibVB2YWx1ZVslenVdPSV6dSBub3QgJXp1XG4iLCBtTmV4dFBpZHgtMSwgcHJvdmlkZWQsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVkIDwgYnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IHByb3ZpZGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobU5leHRQaWR4ID49IG1QdmFsdWVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtTmV4dFBpZHggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiZ2V0TmV4dEJ1ZmZlcigpIHJlcXVlc3RlZCAlenUgZnJhbWVzIG91dCBvZiAlenUgZnJhbWVzIGF2YWlsYWJsZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCByZXR1cm5lZCAlenUgZnJhbWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRnJhbWVzLCAoc2l6ZV90KSAobU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpLCBidWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVVucmVsID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJhdyA9IChjaGFyICopbUFkZHIgKyBtRnJhbWVTaXplICogbU5leHRGcmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiByZWxlYXNlQnVmZmVyKCkgcmVsZWFzZWQgJXp1IGZyYW1lcyBidXQgb25seSAlenUgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlXG4iLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICAgICAgbU5leHRGcmFtZSArPSBtVW5yZWw7CisgICAgICAgICAgICAgICAgbVVucmVsID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigicmVsZWFzZUJ1ZmZlcigpIHJlbGVhc2VkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gcmVsZWFzZVxuIiwgYnVmZmVyLT5mcmFtZUNvdW50LCBtVW5yZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTmV4dEZyYW1lICs9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBtVW5yZWwgLT0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICAgICAgfQotICAgIH0gcHJvdmlkZXIoaW5wdXRfdmFkZHIsIGlucHV0X3NpemUsIGNoYW5uZWxzKTsKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1OZXh0RnJhbWUgPSAwOworICAgICAgICB9CisgICAgfSBwcm92aWRlcihpbnB1dF92YWRkciwgaW5wdXRfZnJhbWVzLCBpbnB1dF9mcmFtZXNpemUsIFB2YWx1ZXMpOwogCi0gICAgc2l6ZV90IGlucHV0X2ZyYW1lcyA9IGlucHV0X3NpemUgLyAoY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOwotICAgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IDIgKiA0ICogKChpbnQ2NF90KSBpbnB1dF9mcmFtZXMgKiBvdXRwdXRfZnJlcSkgLyBpbnB1dF9mcmVxOwotICAgIG91dHB1dF9zaXplICY9IH43OyAvLyBhbHdheXMgc3RlcmVvLCAzMi1iaXRzCisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiJXp1IGlucHV0IGZyYW1lc1xuIiwgaW5wdXRfZnJhbWVzKTsKKyAgICB9CiAKLSAgICB2b2lkKiBvdXRwdXRfdmFkZHIgPSBtYWxsb2Mob3V0cHV0X3NpemUpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHVzZUZsb2F0ID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGludCBvdXRwdXRfY2hhbm5lbHMgPSBjaGFubmVscyA+IDIgPyBjaGFubmVscyA6IDI7IC8vIG91dHB1dCBpcyBhdCBsZWFzdCBzdGVyZW8gc2FtcGxlcworICAgIHNpemVfdCBvdXRwdXRfZnJhbWVzaXplID0gb3V0cHV0X2NoYW5uZWxzICogKHVzZUZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQzMl90KSk7CisgICAgc2l6ZV90IG91dHB1dF9mcmFtZXMgPSAoKGludDY0X3QpIGlucHV0X2ZyYW1lcyAqIG91dHB1dF9mcmVxKSAvIGlucHV0X2ZyZXE7CisgICAgc2l6ZV90IG91dHB1dF9zaXplID0gb3V0cHV0X2ZyYW1lcyAqIG91dHB1dF9mcmFtZXNpemU7CiAKLSAgICBpZiAocHJvZmlsaW5nKSB7Ci0gICAgICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVscywKLSAgICAgICAgICAgICAgICBvdXRwdXRfZnJlcSwgcXVhbGl0eSk7Ci0KLSAgICAgICAgc2l6ZV90IG91dF9mcmFtZXMgPSBvdXRwdXRfc2l6ZS84OwotICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRfZnJlcSk7Ci0gICAgICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKDB4MTAwMCwgMHgxMDAwKTsKLQotICAgICAgICBtZW1zZXQob3V0cHV0X3ZhZGRyLCAwLCBvdXRwdXRfc2l6ZSk7CisgICAgaWYgKHByb2ZpbGVGaWx0ZXIpIHsKKyAgICAgICAgLy8gQ2hlY2sgaG93IGZhc3Qgc2FtcGxlIHJhdGUgY2hhbmdlcyBhcmUgdGhhdCByZXF1aXJlIGZpbHRlciBjaGFuZ2VzLgorICAgICAgICAvLyBUaGUgZGVsdGEgc2FtcGxlIHJhdGUgY2hhbmdlcyBtdXN0IGluZGljYXRlIGEgZG93bnNhbXBsaW5nIHJhdGlvLAorICAgICAgICAvLyBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAxMCUgY2hhbmdlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gZmFzdCBkZXZpY2VzLCBmaWx0ZXJzIHNob3VsZCBiZSBnZW5lcmF0ZWQgYmV0d2VlbiAwLjFtcyAtIDFtcy4KKyAgICAgICAgLy8gKHNpbmdsZSB0aHJlYWRlZCkuCisgICAgICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgODAwMCwgcXVhbGl0eSk7CisgICAgICAgIGludCBsb29wbGltaXQgPSAxMDA7CiAgICAgICAgIHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CiAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmc3RhcnQpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSg5MDAwKTsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgxMjAwMCk7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMjAwMDApOworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDMwMDAwKTsKKyAgICAgICAgfQogICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CiAgICAgICAgIGludDY0X3Qgc3RhcnRfbnMgPSBzdGFydC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBzdGFydC50dl9uc2VjOwogICAgICAgICBpbnQ2NF90IGVuZF9ucyA9IGVuZC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBlbmQudHZfbnNlYzsKLSAgICAgICAgaW50NjRfdCB0aW1lID0gKGVuZF9ucyAtIHN0YXJ0X25zKS80OwotICAgICAgICBwcmludGYoIiVmIE1zcGwvc1xuIiwgb3V0X2ZyYW1lcy8odGltZS8xZTkpLzFlNik7CisgICAgICAgIGludDY0X3QgdGltZSA9IGVuZF9ucyAtIHN0YXJ0X25zOworICAgICAgICBwcmludGYoIiUuMmYgc2FtcGxlIHJhdGUgY2hhbmdlcyB3aXRoIGZpbHRlciBjYWxjdWxhdGlvbi9zZWNcbiIsCisgICAgICAgICAgICAgICAgbG9vcGxpbWl0ICogNCAvICh0aW1lIC8gMWU5KSk7CiAKKyAgICAgICAgLy8gQ2hlY2sgaG93IGZhc3Qgc2FtcGxlIHJhdGUgY2hhbmdlcyBhcmUgd2l0aG91dCBmaWx0ZXIgY2hhbmdlcy4KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgdmVyeSBmYXN0LCBwcm9iYWJseSAwLjF1cyAtIDF1cyBwZXIgc2FtcGxlIHJhdGUKKyAgICAgICAgLy8gY2hhbmdlLgorICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMTAwMCk7CisgICAgICAgIGxvb3BsaW1pdCA9IDEwMDA7CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmc3RhcnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMTAwMCtpKTsKKyAgICAgICAgfQorICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmVuZCk7CisgICAgICAgIHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKKyAgICAgICAgZW5kX25zID0gZW5kLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIGVuZC50dl9uc2VjOworICAgICAgICB0aW1lID0gZW5kX25zIC0gc3RhcnRfbnM7CisgICAgICAgIHByaW50ZigiJS4yZiBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHdpdGhvdXQgZmlsdGVyIGNhbGN1bGF0aW9uL3NlY1xuIiwKKyAgICAgICAgICAgICAgICBsb29wbGltaXQgLyAodGltZSAvIDFlOSkpOworICAgICAgICByZXNhbXBsZXItPnJlc2V0KCk7CiAgICAgICAgIGRlbGV0ZSByZXNhbXBsZXI7CiAgICAgfQogCi0gICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoMTYsIGNoYW5uZWxzLAorICAgIHZvaWQqIG91dHB1dF92YWRkciA9IG1hbGxvYyhvdXRwdXRfc2l6ZSk7CisgICAgQXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywKICAgICAgICAgICAgIG91dHB1dF9mcmVxLCBxdWFsaXR5KTsKLSAgICBzaXplX3Qgb3V0X2ZyYW1lcyA9IG91dHB1dF9zaXplLzg7CisKICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRfZnJlcSk7Ci0gICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOworICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULCBBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisKKyAgICBpZiAocHJvZmlsZVJlc2FtcGxlKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBwcm9maWxpbmcgb24gbW9iaWxlIGRldmljZXMsIHVwb24gZXhwZXJpbWVudGF0aW9uCisgICAgICAgICAqIGl0IGlzIGJldHRlciB0byBydW4gYSBmZXcgdHJpYWxzIHdpdGggYSBzaG9ydGVyIGxvb3AgbGltaXQsCisgICAgICAgICAqIGFuZCB0YWtlIHRoZSBtaW5pbXVtIHRpbWUuCisgICAgICAgICAqCisgICAgICAgICAqIExvbmcgdGVzdHMgY2FuIGNhdXNlIENQVSB0ZW1wZXJhdHVyZSB0byBidWlsZCB1cCBhbmQgdGhlcm1hbCB0aHJvdHRsaW5nCisgICAgICAgICAqIHRvIHJlZHVjZSBDUFUgZnJlcXVlbmN5LgorICAgICAgICAgKgorICAgICAgICAgKiBGb3IgZnJlcXVlbmN5IGNoZWNrcyAoaW5kZXg9MCwgb3IgMSwgZXRjLik6CisgICAgICAgICAqICJjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JHtpbmRleH0vY3B1ZnJlcS9zY2FsaW5nXypfZnJlcSIKKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIHRlbXBlcmF0dXJlIGNoZWNrcyAoaW5kZXg9MCwgb3IgMSwgZXRjLik6CisgICAgICAgICAqICJjYXQgL3N5cy9jbGFzcy90aGVybWFsL3RoZXJtYWxfem9uZSR7aW5kZXh9L3RlbXAiCisgICAgICAgICAqCisgICAgICAgICAqIEFub3RoZXIgd2F5IHRvIGF2b2lkIHRoZXJtYWwgdGhyb3R0bGluZyBpcyB0byBmaXggdGhlIENQVSBmcmVxdWVuY3kKKyAgICAgICAgICogYXQgYSBsb3dlciBsZXZlbCB3aGljaCBwcmV2ZW50cyBleGNlc3NpdmUgdGVtcGVyYXR1cmVzLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgaW50IHRyaWFscyA9IDQ7CisgICAgICAgIGNvbnN0IGludCBsb29wbGltaXQgPSA0OworICAgICAgICB0aW1lc3BlYyBzdGFydCwgZW5kOworICAgICAgICBpbnQ2NF90IHRpbWUgPSAwOworCisgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgdHJpYWxzOyArK24pIHsKKyAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmc3RhcnQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wbGltaXQ7ICsraSkgeworICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0cHV0X2ZyYW1lcywgJnByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlci5yZXNldCgpOyAvLyAgZHVyaW5nIGJlbmNobWFya2luZyByZXNldCBvbmx5IHRoZSBwcm92aWRlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOworICAgICAgICAgICAgaW50NjRfdCBzdGFydF9ucyA9IHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHN0YXJ0LnR2X25zZWM7CisgICAgICAgICAgICBpbnQ2NF90IGVuZF9ucyA9IGVuZC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBlbmQudHZfbnNlYzsKKyAgICAgICAgICAgIGludDY0X3QgZGlmZl9ucyA9IGVuZF9ucyAtIHN0YXJ0X25zOworICAgICAgICAgICAgaWYgKG4gPT0gMCB8fCBkaWZmX25zIDwgdGltZSkgeworICAgICAgICAgICAgICAgIHRpbWUgPSBkaWZmX25zOyAgIC8vIHNhdmUgdGhlIGJlc3Qgb3V0IG9mIG91ciB0cmlhbHMuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTWZybXMvcyBpcyAiTWlsbGlvbnMgb2Ygb3V0cHV0IGZyYW1lcyBwZXIgc2Vjb25kIi4KKyAgICAgICAgcHJpbnRmKCJxdWFsaXR5OiAlZCAgY2hhbm5lbHM6ICVkICBtc2VjOiAlIiBQUklkNjQgIiAgTWZybXMvczogJS4ybGZcbiIsCisgICAgICAgICAgICAgICAgcXVhbGl0eSwgY2hhbm5lbHMsIHRpbWUvMTAwMDAwMCwgb3V0cHV0X2ZyYW1lcyAqIGxvb3BsaW1pdCAvICh0aW1lIC8gMWU5KSAvIDFlNik7CisgICAgICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICB9CiAKICAgICBtZW1zZXQob3V0cHV0X3ZhZGRyLCAwLCBvdXRwdXRfc2l6ZSk7Ci0gICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInJlc2FtcGxlKCkgJXp1IG91dHB1dCBmcmFtZXNcbiIsIG91dHB1dF9mcmFtZXMpOworICAgIH0KKyAgICBpZiAoT3ZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgT3ZhbHVlcy5wdXNoKG91dHB1dF9mcmFtZXMpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMCwgaiA9IDA7IGkgPCBvdXRwdXRfZnJhbWVzOyApIHsKKyAgICAgICAgc2l6ZV90IHRoaXNGcmFtZXMgPSBPdmFsdWVzW2orK107CisgICAgICAgIGlmIChqID49IE92YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpc0ZyYW1lcyA9PSAwIHx8IHRoaXNGcmFtZXMgPiBvdXRwdXRfZnJhbWVzIC0gaSkgeworICAgICAgICAgICAgdGhpc0ZyYW1lcyA9IG91dHB1dF9mcmFtZXMgLSBpOworICAgICAgICB9CisgICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciArIG91dHB1dF9jaGFubmVscyppLCB0aGlzRnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICBpICs9IHRoaXNGcmFtZXM7CisgICAgfQorICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInJlc2FtcGxlKCkgY29tcGxldGVcbiIpOworICAgIH0KKyAgICByZXNhbXBsZXItPnJlc2V0KCk7CisgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigicmVzZXQoKSBjb21wbGV0ZVxuIik7CisgICAgfQorICAgIGRlbGV0ZSByZXNhbXBsZXI7CisgICAgcmVzYW1wbGVyID0gTlVMTDsKIAotICAgIC8vIGRvd24tbWl4ICh3ZSBqdXN0IHRydW5jYXRlIGFuZCBrZWVwIHRoZSBsZWZ0IGNoYW5uZWwpCisgICAgLy8gRm9yIGZsb2F0IHByb2Nlc3NpbmcsIGNvbnZlcnQgb3V0cHV0IGZvcm1hdCBmcm9tIGZsb2F0IHRvIFE0LjI3LAorICAgIC8vIHdoaWNoIGlzIHRoZW4gY29udmVydGVkIHRvIGludDE2X3QgZm9yIGZpbmFsIHN0b3JhZ2UuCisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIG1lbWNweV90b19xNF8yN19mcm9tX2Zsb2F0KHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KG91dHB1dF92YWRkciksCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dHB1dF92YWRkciksIG91dHB1dF9mcmFtZXMgKiBvdXRwdXRfY2hhbm5lbHMpOworICAgIH0KKworICAgIC8vIG1vbm8gdGFrZXMgbGVmdCBjaGFubmVsIG9ubHkgKG91dCBvZiBzdGVyZW8gb3V0cHV0IHBhaXIpCisgICAgLy8gc3RlcmVvIGFuZCBtdWx0aWNoYW5uZWwgcHJlc2VydmUgYWxsIGNoYW5uZWxzLgogICAgIGludDMyX3QqIG91dCA9IChpbnQzMl90Kikgb3V0cHV0X3ZhZGRyOwotICAgIGludDE2X3QqIGNvbnZlcnQgPSAoaW50MTZfdCopIG1hbGxvYyhvdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0X2ZyYW1lczsgaSsrKSB7Ci0gICAgICAgIGZvciAoaW50IGo9MCA7IGo8Y2hhbm5lbHMgOyBqKyspIHsKLSAgICAgICAgICAgIGludDMyX3QgcyA9IG91dFtpICogMiArIGpdID4+IDEyOwotICAgICAgICAgICAgaWYgKHMgPiAzMjc2NykgICAgICAgcyA9ICAzMjc2NzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHMgPCAtMzI3NjgpIHMgPSAtMzI3Njg7CisgICAgaW50MTZfdCogY29udmVydCA9IChpbnQxNl90KikgbWFsbG9jKG91dHB1dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICBjb25zdCBpbnQgdm9sdW1lU2hpZnQgPSAxMjsgLy8gc2hpZnQgcmVxdWlyZW1lbnQgZm9yIFE0LjI3IHRvIFEuMTUKKyAgICAvLyByb3VuZCB0byBoYWxmIHRvd2FyZHMgemVybyBhbmQgc2F0dXJhdGUgYXQgaW50MTYgKG5vbi1kaXRoZXJlZCkKKyAgICBjb25zdCBpbnQgcm91bmRWYWwgPSAoMTw8KHZvbHVtZVNoaWZ0LTEpKSAtIDE7IC8vIHZvbHVtZVByZWNpc2lvbiA+IDAKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0X2ZyYW1lczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgaW50MzJfdCBzID0gb3V0W2kgKiBvdXRwdXRfY2hhbm5lbHMgKyBqXSArIHJvdW5kVmFsOyAvLyBhZGQgb2Zmc2V0IGhlcmUKKyAgICAgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgICAgIHMgPSAocyArIDEpID4+IHZvbHVtZVNoaWZ0OyAvLyByb3VuZCB0byAwCisgICAgICAgICAgICAgICAgaWYgKHMgPCAtMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IC0zMjc2ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMgPSBzID4+IHZvbHVtZVNoaWZ0OworICAgICAgICAgICAgICAgIGlmIChzID4gMzI3NjcpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IDMyNzY3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnZlcnRbaSAqIGNoYW5uZWxzICsgal0gPSBpbnQxNl90KHMpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gd3JpdGUgb3V0cHV0IHRvIGRpc2sKLSAgICBpbnQgb3V0cHV0X2ZkID0gb3BlbihmaWxlX291dCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywKLSAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOwotICAgIGlmIChvdXRwdXRfZmQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAib3BlbjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBTRl9JTkZPIGluZm87CisgICAgaW5mby5mcmFtZXMgPSAwOworICAgIGluZm8uc2FtcGxlcmF0ZSA9IG91dHB1dF9mcmVxOworICAgIGluZm8uY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBpbmZvLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBTRl9GT1JNQVRfUENNXzE2OworICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihmaWxlX291dCwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVfb3V0KTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CisgICAgKHZvaWQpIHNmX3dyaXRlZl9zaG9ydChzZiwgY29udmVydCwgb3V0cHV0X2ZyYW1lcyk7CisgICAgc2ZfY2xvc2Uoc2YpOwogCi0gICAgaWYgKHdyaXRlSGVhZGVyKSB7Ci0gICAgICAgIEhlYWRlcldhdiB3YXYob3V0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpLCBjaGFubmVscywgb3V0cHV0X2ZyZXEsIDE2KTsKLSAgICAgICAgd3JpdGUob3V0cHV0X2ZkLCAmd2F2LCBzaXplb2Yod2F2KSk7Ci0gICAgfQotCi0gICAgd3JpdGUob3V0cHV0X2ZkLCBjb252ZXJ0LCBvdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOwotICAgIGNsb3NlKG91dHB1dF9mZCk7Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmJhMDViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3MyBAQAorIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgYXVkaW9mbGluZ2VyCisKKyMKKyMgcmVzYW1wbGVyIHVuaXQgdGVzdAorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlibG9nIFwKKwlsaWJ1dGlscyBcCisJbGliY3V0aWxzIFwKKwlsaWJzdGxwb3J0IFwKKwlsaWJhdWRpb3V0aWxzIFwKKwlsaWJhdWRpb3Jlc2FtcGxlcgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKwlsaWJndGVzdCBcCisJbGliZ3Rlc3RfbWFpbgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwliaW9uaWMgXAorCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCisJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKwlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCXJlc2FtcGxlcl90ZXN0cy5jcHAKKworTE9DQUxfTU9EVUxFIDo9IHJlc2FtcGxlcl90ZXN0cworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMKKyMgYXVkaW8gbWl4ZXIgdGVzdCB0b29sCisjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCXRlc3QtbWl4ZXIuY3BwIFwKKwkuLi9BdWRpb01peGVyLmNwcC5hcm0gXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwliaW9uaWMgXAorCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAorCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorCWxpYnNuZGZpbGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlic3RscG9ydCBcCisJbGliZWZmZWN0cyBcCisJbGlibmJhaW8gXAorCWxpYmNvbW1vbl90aW1lX2NsaWVudCBcCisJbGliYXVkaW9yZXNhbXBsZXIgXAorCWxpYmF1ZGlvdXRpbHMgXAorCWxpYmRsIFwKKwlsaWJjdXRpbHMgXAorCWxpYnV0aWxzIFwKKwlsaWJsb2cKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1taXhlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0NTNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCitwdXNoZCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvCitwd2QKK21tCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcmVzYW1wbGVyLnNvIC9zeXN0ZW0vbGliCithZGIgcHVzaCAkT1VUL3N5c3RlbS9iaW4vcmVzYW1wbGVyX3Rlc3RzIC9zeXN0ZW0vYmluCisKK3NoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKKworcG9wZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWIzOWU3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2gKQEAgLTAsMCArMSwxMzQgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFRoaXMgc2NyaXB0IHVzZXMgdGVzdC1taXhlciB0byBnZW5lcmF0ZSBXQVYgZmlsZXMKKyMgZm9yIGV2YWx1YXRpb24gb2YgdGhlIEF1ZGlvTWl4ZXIgY29tcG9uZW50LgorIworIyBTaW5lIGFuZCBjaGlycCBzaWduYWxzIGFyZSB1c2VkIGZvciBpbnB1dCBiZWNhdXNlIHRoZXkKKyMgc2hvdyB1cCBhcyBjbGVhciBsaW5lcywgZWl0aGVyIGhvcml6b250YWwgb3IgZGlhZ29uYWwsCisjIG9uIGEgc3BlY3Ryb2dyYW0uIFRoaXMgbWVhbnMgZWFzeSB2ZXJpZmljYXRpb24gb2YgbXVsdGlwbGUKKyMgdHJhY2sgbWl4aW5nLgorIworIyBBZnRlciBleGVjdXRpb24sIGxvb2sgZm9yIGNyZWF0ZWQgc3ViZGlyZWN0b3JpZXMgbGlrZQorIyBtaXhlcl9pX2kKKyMgbWl4ZXJfaV9mCisjIG1peGVyX2ZfZgorIworIyBSZWNvbW1lbmQgdXNpbmcgYSBwcm9ncmFtIHN1Y2ggYXMgYXVkYWNpdHkgdG8gZXZhbHVhdGUKKyMgdGhlIG91dHB1dCBXQVYgZmlsZXMsIGUuZy4KKyMKKyMgY2QgdGVzdGRpcgorIyBhdWRhY2l0eSAqLndhdgorIworIyBVc2luZyBBdWRhY2l0eToKKyMKKyMgVW5kZXIgIldhdmVmb3JtIiB2aWV3IG1vZGUgeW91IGNhbiB6b29tIGludG8gdGhlCisjIHN0YXJ0IG9mIHRoZSBXQVYgZmlsZSB0byB2ZXJpZnkgcHJvcGVyIHJhbXBpbmcuCisjCisjIFNlbGVjdCAiU3BlY3Ryb2dyYW0iIHRvIHNlZSB2ZXJpZnkgdGhlIGxpbmVzCisjIChzaW5lID0gaG9yaXpvbnRhbCwgY2hpcnAgPSBkaWFnb25hbCkgd2hpY2ggc2hvdWxkCisjIGJlIGNsZWFyIChleGNlcHQgZm9yIGFyb3VuZCB0aGUgc3RhcnQgYXMgdGhlIHZvbHVtZQorIyByYW1waW5nIGNhdXNlcyBzcGVjdHJhbCBkaXN0b3J0aW9uKS4KKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK3B1c2hkICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci8KKworIyBidWlsZAorcHdkCittbQorCisjIHNlbmQgdG8gZGV2aWNlCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKK2FkYiBwdXNoICRPVVQvc3lzdGVtL2xpYi9saWJhdWRpb3Jlc2FtcGxlci5zbyAvc3lzdGVtL2xpYgorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vYmluL3Rlc3QtbWl4ZXIgL3N5c3RlbS9iaW4KKworIyBjcmVhdGV3YXYgY3JlYXRlcyBhIHNlcmllcyBvZiBXQVYgZmlsZXMgdGVzdGluZyB2YXJpb3VzCisjIG1peGVyIHNldHRpbmdzCisjICQxID0gZmxhZ3MKKyMgJDIgPSBkaXJlY3RvcnkKK2Z1bmN0aW9uIGNyZWF0ZXdhdigpIHsKKyMgY3JlYXRlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgaWYgWyAhIC1kICQyIF07IHRoZW4KKyAgICAgICAgbWtkaXIgJDIKKyAgICBmaQorCisjIFRlc3Q6CisjIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nCisjIHRyYWNrX19SZXNhbXBsZSAvIHRyYWNrX19nZW5lcmljUmVzYW1wbGUKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyA0ODAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG00ODAwMGdyLndhdiBcCisgICAgICAgIHNpbmU6Miw0MDAwLDc1MjAgY2hpcnA6Miw5MjAwIHNpbmU6MSwzMDAwLDE4MDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ4MDAwZ3Iud2F2ICQyCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxlCisjIHRyYWNrX19SZXNhbXBsZSAvIHRyYWNrX19nZW5lcmljUmVzYW1wbGUKKyMgdHJhY2tfX05vUmVzYW1wbGUgLyB0cmFja19fMTZCaXRzU3RlcmVvIC8gdHJhY2tfXzE2Qml0c01vbm8KKyMgQXV4IGJ1ZmZlcgorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1jIDUgLXMgOTMwNyBcCisgICAgICAgIC1hIC9zZGNhcmQvYXV4OTMwN2dyYS53YXYgLW8gL3NkY2FyZC90bTkzMDdncmEud2F2IFwKKyAgICAgICAgc2luZTo0LDEwMDAsMzAwMCBzaW5lOjEsMjAwMCw5MzA3IGNoaXJwOjMsOTMwNworICAgIGFkYiBwdWxsIC9zZGNhcmQvdG05MzA3Z3JhLndhdiAkMgorICAgIGFkYiBwdWxsIC9zZGNhcmQvYXV4OTMwN2dyYS53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nCisjIHRyYWNrX19Ob1Jlc2FtcGxlIC8gdHJhY2tfXzE2Qml0c1N0ZXJlbyAvIHRyYWNrX18xNkJpdHNNb25vCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgMzIwMDAgXAorICAgICAgICAtbyAvc2RjYXJkL3RtMzIwMDBnbnIud2F2IFwKKyAgICAgICAgc2luZToyLDEwMDAsMzIwMDAgY2hpcnA6MiwzMjAwMCAgc2luZToxLDMwMDAsMzIwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtMzIwMDBnbnIud2F2ICQyCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZworIyB0cmFja19fTm9SZXNhbXBsZSAvIHRyYWNrX18xNkJpdHNTdGVyZW8gLyB0cmFja19fMTZCaXRzTW9ubworIyBBdXggYnVmZmVyCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgMzIwMDAgXAorICAgICAgICAtYSAvc2RjYXJkL2F1eDMyMDAwZ25yYS53YXYgLW8gL3NkY2FyZC90bTMyMDAwZ25yYS53YXYgXAorICAgICAgICBzaW5lOjIsMTAwMCwzMjAwMCBjaGlycDoyLDMyMDAwICBzaW5lOjEsMzAwMCwzMjAwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG0zMjAwMGducmEud2F2ICQyCisgICAgYWRiIHB1bGwgL3NkY2FyZC9hdXgzMjAwMGducmEud2F2ICQyCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fTm9SZXNhbXBsZU9uZVRyYWNrIC8gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcKKyMgRG93bm1peGVyCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgMzIwMDAgXAorICAgICAgICAtbyAvc2RjYXJkL3RtMzIwMDBucm90LndhdiBcCisgICAgICAgIHNpbmU6NiwxMDAwLDMyMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTMyMDAwbnJvdC53YXYgJDIKKworIyBUZXN0OgorIyBwcm9jZXNzX19Ob1Jlc2FtcGxlT25lVHJhY2sgLyBPbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZworIyBBdXggYnVmZmVyCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDQxMDAgXAorICAgICAgICAtYSAvc2RjYXJkL2F1eDQ0MTAwbnJvdGEud2F2IC1vIC9zZGNhcmQvdG00NDEwMG5yb3RhLndhdiBcCisgICAgICAgIHNpbmU6MiwyMDAwLDQ0MTAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTQ0MTAwbnJvdGEud2F2ICQyCisgICAgYWRiIHB1bGwgL3NkY2FyZC9hdXg0NDEwMG5yb3RhLndhdiAkMgorfQorCisjCisjIENhbGwgY3JlYXRld2F2IHRvIGdlbmVyYXRlIFdBViBmaWxlcyBpbiB2YXJpb3VzIGNvbWJpbmF0aW9ucworIworIyBpX2kgPSBpbnRlZ2VyIGlucHV0IHRyYWNrLCBpbnRlZ2VyIG1peGVyIG91dHB1dAorIyBmX2YgPSBmbG9hdCBpbnB1dCB0cmFjaywgICBmbG9hdCBtaXhlciBvdXRwdXQKKyMgaV9mID0gaW50ZWdlciBpbnB1dCB0cmFjaywgZmxvYXRfbWl4ZXIgb3V0cHV0CisjCisjIElmIHRoZSBtaXhlciBvdXRwdXQgaXMgZmxvYXQsIHRoZW4gdGhlIG91dHB1dCBXQVYgZmlsZSBpcyBwY20gZmxvYXQuCisjCisjIFRPRE86IGNyZWF0ZSBhICJzbnIiIGxpa2UgImRpZmYiIHRvIGF1dG9tYXRpY2FsbHkKKyMgY29tcGFyZSBmaWxlcyBpbiB0aGVzZSBkaXJlY3RvcmllcyB0b2dldGhlci4KKyMKKworY3JlYXRld2F2ICIiICJ0ZXN0cy9taXhlcl9pX2kiCitjcmVhdGV3YXYgIi1mIC1tIiAidGVzdHMvbWl4ZXJfZl9mIgorY3JlYXRld2F2ICItbSIgInRlc3RzL21peGVyX2lfZiIKKworcG9wZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIxN2JhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImF1ZGlvZmxpbmdlcl9yZXNhbXBsZXJfdGVzdHMiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJ0ZXN0X3V0aWxzLmgiCisKK3ZvaWQgcmVzYW1wbGUoaW50IGNoYW5uZWxzLCB2b2lkICpvdXRwdXQsCisgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJm91dHB1dEluY3IsCisgICAgICAgIGFuZHJvaWQ6OkF1ZGlvQnVmZmVyUHJvdmlkZXIgKnByb3ZpZGVyLCBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlciAqcmVzYW1wbGVyKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBqID0gMDsgaSA8IG91dHB1dEZyYW1lczsgKSB7CisgICAgICAgIHNpemVfdCB0aGlzRnJhbWVzID0gb3V0cHV0SW5jcltqKytdOworICAgICAgICBpZiAoaiA+PSBvdXRwdXRJbmNyLnNpemUoKSkgeworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXNGcmFtZXMgPT0gMCB8fCB0aGlzRnJhbWVzID4gb3V0cHV0RnJhbWVzIC0gaSkgeworICAgICAgICAgICAgdGhpc0ZyYW1lcyA9IG91dHB1dEZyYW1lcyAtIGk7CisgICAgICAgIH0KKyAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopIG91dHB1dCArIGNoYW5uZWxzKmksIHRoaXNGcmFtZXMsIHByb3ZpZGVyKTsKKyAgICAgICAgaSArPSB0aGlzRnJhbWVzOworICAgIH0KK30KKwordm9pZCBidWZmZXJjbXAoY29uc3Qgdm9pZCAqcmVmZXJlbmNlLCBjb25zdCB2b2lkICp0ZXN0LAorICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3Qgb3V0cHV0RnJhbWVzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0RnJhbWVzOyArK2kpIHsKKyAgICAgICAgaW50IGNoZWNrID0gbWVtY21wKChjb25zdCBjaGFyKilyZWZlcmVuY2UgKyBpICogb3V0cHV0RnJhbWVTaXplLAorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKil0ZXN0ICsgaSAqIG91dHB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplKTsKKyAgICAgICAgaWYgKGNoZWNrKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbHVyZSBhdCBmcmFtZSAlenUiLCBpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjaGVjaywgMCk7IC8qIGZhaWxzICovCisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdGVzdEJ1ZmZlckluY3JlbWVudChzaXplX3QgY2hhbm5lbHMsIGJvb2wgdXNlRmxvYXQsCisgICAgICAgIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSwKKyAgICAgICAgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSB1c2VGbG9hdCA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAvLyBjcmVhdGUgdGhlIHByb3ZpZGVyCisgICAgc3RkOjp2ZWN0b3I8aW50PiBpbnB1dEluY3I7CisgICAgU2lnbmFsUHJvdmlkZXIgcHJvdmlkZXI7CisgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgIHByb3ZpZGVyLnNldENoaXJwPGZsb2F0PihjaGFubmVscywKKyAgICAgICAgICAgICAgICAwLiwgb3V0cHV0RnJlcS8yLiwgb3V0cHV0RnJlcSwgb3V0cHV0RnJlcS8yMDAwLik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvdmlkZXIuc2V0Q2hpcnA8aW50MTZfdD4oY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgMC4sIG91dHB1dEZyZXEvMi4sIG91dHB1dEZyZXEsIG91dHB1dEZyZXEvMjAwMC4pOworICAgIH0KKyAgICBwcm92aWRlci5zZXRJbmNyKGlucHV0SW5jcik7CisKKyAgICAvLyBjYWxjdWxhdGUgdGhlIG91dHB1dCBzaXplCisgICAgc2l6ZV90IG91dHB1dEZyYW1lcyA9ICgoaW50NjRfdCkgcHJvdmlkZXIuZ2V0TnVtRnJhbWVzKCkgKiBvdXRwdXRGcmVxKSAvIGlucHV0RnJlcTsKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplID0gY2hhbm5lbHMgKiAodXNlRmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDMyX3QpKTsKKyAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IG91dHB1dEZyYW1lU2l6ZSAqIG91dHB1dEZyYW1lczsKKyAgICBvdXRwdXRTaXplICY9IH43OworCisgICAgLy8gY3JlYXRlIHRoZSByZXNhbXBsZXIKKyAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyOworCisgICAgcmVzYW1wbGVyID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGNoYW5uZWxzLCBvdXRwdXRGcmVxLCBxdWFsaXR5KTsKKyAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKKyAgICByZXNhbXBsZXItPnNldFZvbHVtZShhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKworICAgIC8vIHNldCB1cCB0aGUgcmVmZXJlbmNlIHJ1bgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gcmVmSW5jcjsKKyAgICByZWZJbmNyLnB1c2hfYmFjayhvdXRwdXRGcmFtZXMpOworICAgIHZvaWQqIHJlZmVyZW5jZSA9IG1hbGxvYyhvdXRwdXRTaXplKTsKKyAgICByZXNhbXBsZShjaGFubmVscywgcmVmZXJlbmNlLCBvdXRwdXRGcmFtZXMsIHJlZkluY3IsICZwcm92aWRlciwgcmVzYW1wbGVyKTsKKworICAgIHByb3ZpZGVyLnJlc2V0KCk7CisKKyNpZiAwCisgICAgLyogdGhpcyB0ZXN0IHdpbGwgZmFpbCAtIEFQSSBpbnRlcmZhY2UgaXNzdWU6IHJlc2V0KCkgZG9lcyBub3QgY2xlYXIgaW50ZXJuYWwgYnVmZmVycyAqLworICAgIHJlc2FtcGxlci0+cmVzZXQoKTsKKyNlbHNlCisgICAgZGVsZXRlIHJlc2FtcGxlcjsKKyAgICByZXNhbXBsZXIgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsIG91dHB1dEZyZXEsIHF1YWxpdHkpOworICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOworICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworI2VuZGlmCisKKyAgICAvLyBzZXQgdXAgdGhlIHRlc3QgcnVuCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBvdXRJbmNyOworICAgIG91dEluY3IucHVzaF9iYWNrKDEpOworICAgIG91dEluY3IucHVzaF9iYWNrKDIpOworICAgIG91dEluY3IucHVzaF9iYWNrKDMpOworICAgIHZvaWQqIHRlc3QgPSBtYWxsb2Mob3V0cHV0U2l6ZSk7CisgICAgaW5wdXRJbmNyLnB1c2hfYmFjaygxKTsKKyAgICBpbnB1dEluY3IucHVzaF9iYWNrKDMpOworICAgIHByb3ZpZGVyLnNldEluY3IoaW5wdXRJbmNyKTsKKyAgICByZXNhbXBsZShjaGFubmVscywgdGVzdCwgb3V0cHV0RnJhbWVzLCBvdXRJbmNyLCAmcHJvdmlkZXIsIHJlc2FtcGxlcik7CisKKyAgICAvLyBjaGVjaworICAgIGJ1ZmZlcmNtcChyZWZlcmVuY2UsIHRlc3QsIG91dHB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVzKTsKKworICAgIGZyZWUocmVmZXJlbmNlKTsKKyAgICBmcmVlKHRlc3QpOworICAgIGRlbGV0ZSByZXNhbXBsZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGRvdWJsZSBzcXIoVCB2KQoreworICAgIGRvdWJsZSBkdiA9IHN0YXRpY19jYXN0PGRvdWJsZT4odik7CisgICAgcmV0dXJuIGR2ICogZHY7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorZG91YmxlIHNpZ25hbEVuZXJneShUICpzdGFydCwgVCAqZW5kLCB1bnNpZ25lZCBzdHJpZGUpCit7CisgICAgZG91YmxlIGFjY3VtID0gMDsKKworICAgIGZvciAoVCAqcCA9IHN0YXJ0OyBwIDwgZW5kOyBwICs9IHN0cmlkZSkgeworICAgICAgICBhY2N1bSArPSBzcXIoKnApOworICAgIH0KKyAgICB1bnNpZ25lZCBjb3VudCA9IChlbmQgLSBzdGFydCArIHN0cmlkZSAtIDEpIC8gc3RyaWRlOworICAgIHJldHVybiBhY2N1bSAvIGNvdW50OworfQorCisvLyBUSSA9IHJlc2FtcGxlciBpbnB1dCB0eXBlLCBpbnQxNl90IG9yIGZsb2F0CisvLyBUTyA9IHJlc2FtcGxlciBvdXRwdXQgdHlwZSwgaW50MzJfdCBvciBmbG9hdAordGVtcGxhdGUgPHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb24oc2l6ZV90IGNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBpbnB1dEZyZXEsIHVuc2lnbmVkIG91dHB1dEZyZXEsCisgICAgICAgIHVuc2lnbmVkIHBhc3NiYW5kLCB1bnNpZ25lZCBzdG9wYmFuZCwKKyAgICAgICAgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSkKK3sKKyAgICAvLyBjcmVhdGUgdGhlIHByb3ZpZGVyCisgICAgc3RkOjp2ZWN0b3I8aW50PiBpbnB1dEluY3I7CisgICAgU2lnbmFsUHJvdmlkZXIgcHJvdmlkZXI7CisgICAgcHJvdmlkZXIuc2V0Q2hpcnA8VEk+KGNoYW5uZWxzLAorICAgICAgICAgICAgMC4sIGlucHV0RnJlcS8yLiwgaW5wdXRGcmVxLCBpbnB1dEZyZXEvMjAwMC4pOworICAgIHByb3ZpZGVyLnNldEluY3IoaW5wdXRJbmNyKTsKKworICAgIC8vIGNhbGN1bGF0ZSB0aGUgb3V0cHV0IHNpemUKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gKChpbnQ2NF90KSBwcm92aWRlci5nZXROdW1GcmFtZXMoKSAqIG91dHB1dEZyZXEpIC8gaW5wdXRGcmVxOworICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUgPSBjaGFubmVscyAqIHNpemVvZihUTyk7CisgICAgc2l6ZV90IG91dHB1dFNpemUgPSBvdXRwdXRGcmFtZVNpemUgKiBvdXRwdXRGcmFtZXM7CisgICAgb3V0cHV0U2l6ZSAmPSB+NzsKKworICAgIC8vIGNyZWF0ZSB0aGUgcmVzYW1wbGVyCisgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlcjsKKworICAgIHJlc2FtcGxlciA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCisgICAgICAgICAgICBpc19zYW1lPFRJLCBpbnQxNl90Pjo6dmFsdWUgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICBjaGFubmVscywgb3V0cHV0RnJlcSwgcXVhbGl0eSk7CisgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0RnJlcSk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisKKyAgICAvLyBzZXQgdXAgdGhlIHJlZmVyZW5jZSBydW4KKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHJlZkluY3I7CisgICAgcmVmSW5jci5wdXNoX2JhY2sob3V0cHV0RnJhbWVzKTsKKyAgICB2b2lkKiByZWZlcmVuY2UgPSBtYWxsb2Mob3V0cHV0U2l6ZSk7CisgICAgcmVzYW1wbGUoY2hhbm5lbHMsIHJlZmVyZW5jZSwgb3V0cHV0RnJhbWVzLCByZWZJbmNyLCAmcHJvdmlkZXIsIHJlc2FtcGxlcik7CisKKyAgICBUTyAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxUTyAqPihyZWZlcmVuY2UpOworCisgICAgLy8gY2hlY2sgc2lnbmFsIGVuZXJneSBpbiBwYXNzYmFuZAorICAgIGNvbnN0IHVuc2lnbmVkIHBhc3NiYW5kRnJhbWUgPSBwYXNzYmFuZCAqIG91dHB1dEZyZXEgLyAxMDAwLjsKKyAgICBjb25zdCB1bnNpZ25lZCBzdG9wYmFuZEZyYW1lID0gc3RvcGJhbmQgKiBvdXRwdXRGcmVxIC8gMTAwMC47CisKKyAgICAvLyBjaGVjayBlYWNoIGNoYW5uZWwgc2VwYXJhdGVseQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhbm5lbHM7ICsraSkgeworICAgICAgICBkb3VibGUgcGFzc2JhbmRFbmVyZ3kgPSBzaWduYWxFbmVyZ3kob3V0LCBvdXQgKyBwYXNzYmFuZEZyYW1lICogY2hhbm5lbHMsIGNoYW5uZWxzKTsKKyAgICAgICAgZG91YmxlIHN0b3BiYW5kRW5lcmd5ID0gc2lnbmFsRW5lcmd5KG91dCArIHN0b3BiYW5kRnJhbWUgKiBjaGFubmVscywKKyAgICAgICAgICAgICAgICBvdXQgKyBvdXRwdXRGcmFtZXMgKiBjaGFubmVscywgY2hhbm5lbHMpOworICAgICAgICBkb3VibGUgZGJBdHRlbiA9IC0xMC4gKiBsb2cxMChzdG9wYmFuZEVuZXJneSAvIHBhc3NiYW5kRW5lcmd5KTsKKyAgICAgICAgQVNTRVJUX0dUKGRiQXR0ZW4sIDYwLik7CisKKyNpZiAwCisgICAgICAgIC8vIGludGVybmFsIHZlcmlmaWNhdGlvbgorICAgICAgICBwcmludGYoImlmOiVkICBvZjolZCAgcGJmOiVkICBzYmY6JWQgIHNiZTogJWYgIHBiZTogJWYgIGRiOiAlLjJmXG4iLAorICAgICAgICAgICAgICAgIHByb3ZpZGVyLmdldE51bUZyYW1lcygpLCBvdXRwdXRGcmFtZXMsCisgICAgICAgICAgICAgICAgcGFzc2JhbmRGcmFtZSwgc3RvcGJhbmRGcmFtZSwgc3RvcGJhbmRFbmVyZ3ksIHBhc3NiYW5kRW5lcmd5LCBkYkF0dGVuKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgb3V0W2krcGFzc2JhbmRGcmFtZSpjaGFubmVsc10gPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8IG91dFtpK3N0b3BiYW5kRnJhbWUqY2hhbm5lbHNdIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgZnJlZShyZWZlcmVuY2UpOworICAgIGRlbGV0ZSByZXNhbXBsZXI7Cit9CisKKy8qIEJ1ZmZlciBpbmNyZW1lbnQgdGVzdAorICoKKyAqIFdlIGNvbXBhcmUgYSByZWZlcmVuY2Ugb3V0cHV0LCB3aGVyZSB3ZSBjb25zdW1lIGFuZCBwcm9jZXNzIHRoZSBlbnRpcmUKKyAqIGJ1ZmZlciBhdCBhIHRpbWUsIGFuZCBhIHRlc3Qgb3V0cHV0LCB3aGVyZSB3ZSBwcm92aWRlIHNtYWxsIGNodW5rcyBvZiBpbnB1dAorICogZGF0YSBhbmQgcHJvY2VzcyBzbWFsbCBjaHVua3Mgb2Ygb3V0cHV0ICh3aGljaCBtYXkgbm90IGJlIGVxdWl2YWxlbnQgaW4gc2l6ZSkuCisgKgorICogVHdvIHN1YnRlc3RzIC0gZml4ZWQgcGhhc2UgKDM6MiBkb3duKSBhbmQgaW50ZXJwb2xhdGVkIHBoYXNlICgxNDc6MzIwIHVwKQorICovCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGJ1ZmZlcmluY3JlbWVudF9maXhlZHBoYXNlKSB7CisgICAgLy8gYWxsIG9mIHRoZXNlIHdvcmsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RCdWZmZXJJbmNyZW1lbnQoMiwgZmFsc2UsIDQ4MDAwLCAzMjAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGJ1ZmZlcmluY3JlbWVudF9pbnRlcnBvbGF0ZWRwaGFzZSkgeworICAgIC8vIGFsbCBvZiB0aGVzZSB3b3JrIGV4Y2VwdCBsb3cgcXVhbGl0eQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisvLyAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RCdWZmZXJJbmNyZW1lbnQoMiwgZmFsc2UsIDIyMDUwLCA0ODAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGJ1ZmZlcmluY3JlbWVudF9maXhlZHBoYXNlX211bHRpKSB7CisgICAgLy8gb25seSBkeW5hbWljIHF1YWxpdHkKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCg0LCBmYWxzZSwgNDgwMDAsIDMyMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgYnVmZmVyaW5jcmVtZW50X2ludGVycG9sYXRlZHBoYXNlX211bHRpX2Zsb2F0KSB7CisgICAgLy8gb25seSBkeW5hbWljIHF1YWxpdHkKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdEJ1ZmZlckluY3JlbWVudCg4LCB0cnVlLCAyMjA1MCwgNDgwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworLyogU2ltcGxlIGFsaWFzaW5nIHRlc3QKKyAqCisgKiBUaGlzIGNoZWNrcyBzdG9wYmFuZCByZXNwb25zZSBvZiB0aGUgY2hpcnAgc2lnbmFsIHRvIG1ha2Ugc3VyZSBmcmVxdWVuY2llcworICogYXJlIHByb3Blcmx5IHN1cHByZXNzZWQuICBJdCB1c2VzIGRvd25zYW1wbGluZyBiZWNhdXNlIHRoZSBzdG9wYmFuZCBjYW4gYmUKKyAqIGNsZWFybHkgaXNvbGF0ZWQgYnkgaW5wdXQgZnJlcXVlbmNpZXMgZXhjZWVkaW5nIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUgKG55cXVpc3QpLgorICovCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIHN0b3BiYW5kcmVzcG9uc2VfaW50ZWdlcikgeworICAgIC8vIG5vdCBhbGwgb2YgdGhlc2UgbWF5IHdvcmsgKG9sZCByZXNhbXBsZXJzIGZhaWwgb24gZG93bnNhbXBsaW5nKQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiAxMmtIeiBhbmQgMjBrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGludDE2X3QsIGludDMyX3Q+KAorICAgICAgICAgICAgICAgIDIsIDQ4MDAwLCAzMjAwMCwgMTIwMDAsIDIwMDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiA3a0h6IGFuZCAxNWtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgLy8gKHRoZSB3ZWlyZCByYXRpbyB0cmlnZ2VycyBpbnRlcnBvbGF0aXZlIHJlc2FtcGxpbmcpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgMiwgNDgwMDAsIDIyMTAxLCA3MDAwLCAxNTAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIHN0b3BiYW5kcmVzcG9uc2VfaW50ZWdlcl9tdWx0aWNoYW5uZWwpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxpbnQxNl90LCBpbnQzMl90PigKKyAgICAgICAgICAgICAgICA4LCA0ODAwMCwgMzIwMDAsIDEyMDAwLCAyMDAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gN2tIeiBhbmQgMTVrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIC8vICh0aGUgd2VpcmQgcmF0aW8gdHJpZ2dlcnMgaW50ZXJwb2xhdGl2ZSByZXNhbXBsaW5nKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGludDE2X3QsIGludDMyX3Q+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAyMjEwMSwgNzAwMCwgMTUwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBzdG9wYmFuZHJlc3BvbnNlX2Zsb2F0KSB7CisgICAgLy8gbm90IGFsbCBvZiB0aGVzZSBtYXkgd29yayAob2xkIHJlc2FtcGxlcnMgZmFpbCBvbiBkb3duc2FtcGxpbmcpCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDEya0h6IGFuZCAyMGtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMzIwMDAsIDEyMDAwLCAyMDAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gN2tIeiBhbmQgMTVrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIC8vICh0aGUgd2VpcmQgcmF0aW8gdHJpZ2dlcnMgaW50ZXJwb2xhdGl2ZSByZXNhbXBsaW5nKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGZsb2F0LCBmbG9hdD4oCisgICAgICAgICAgICAgICAgMiwgNDgwMDAsIDIyMTAxLCA3MDAwLCAxNTAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIHN0b3BiYW5kcmVzcG9uc2VfZmxvYXRfbXVsdGljaGFubmVsKSB7CisgICAgLy8gbm90IGFsbCBvZiB0aGVzZSBtYXkgd29yayAob2xkIHJlc2FtcGxlcnMgZmFpbCBvbiBkb3duc2FtcGxpbmcpCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDEya0h6IGFuZCAyMGtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248ZmxvYXQsIGZsb2F0PigKKyAgICAgICAgICAgICAgICA4LCA0ODAwMCwgMzIwMDAsIDEyMDAwLCAyMDAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gN2tIeiBhbmQgMTVrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIC8vICh0aGUgd2VpcmQgcmF0aW8gdHJpZ2dlcnMgaW50ZXJwb2xhdGl2ZSByZXNhbXBsaW5nKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGZsb2F0LCBmbG9hdD4oCisgICAgICAgICAgICAgICAgOCwgNDgwMDAsIDIyMTAxLCA3MDAwLCAxNTAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZmFlNmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDExIEBACisjIS9iaW4vYmFzaAorCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CisKK2FkYiBzaGVsbCAvc3lzdGVtL2Jpbi9yZXNhbXBsZXJfdGVzdHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTRmYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKKyNpbmNsdWRlICJ0ZXN0X3V0aWxzLmgiCisKKy8qIFRlc3RpbmcgaXMgdHlwaWNhbGx5IHRocm91Z2ggY3JlYXRpb24gb2YgYW4gb3V0cHV0IFdBViBmaWxlIGZyb20gc2V2ZXJhbAorICogc291cmNlIGlucHV0cywgdG8gYmUgbGF0ZXIgYW5hbHl6ZWQgYnkgYW4gYXVkaW8gcHJvZ3JhbSBzdWNoIGFzIEF1ZGFjaXR5LgorICoKKyAqIFNpbmUgb3IgY2hpcnAgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgbW9yZSB1c2VmdWwgYXMgaW5wdXQgdG8gdGhlIG1peGVyCisgKiBhcyB0aGV5IHNob3cgdXAgYXMgc3RyYWlnaHQgbGluZXMgb24gYSBzcGVjdHJvZ3JhbSBpZiBzdWNjZXNzZnVsbHkgbWl4ZWQuCisgKgorICogQSBzYW1wbGUgc2hlbGwgc2NyaXB0IGlzIHByb3ZpZGVkOiBtaXhlcl90b193YXZlX3Rlc3RzLnNoCisgKi8KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWZdIFstbV0gWy1jIGNoYW5uZWxzXSIKKyAgICAgICAgICAgICAgICAgICAgIiBbLXMgc2FtcGxlLXJhdGVdIFstbyA8b3V0cHV0LWZpbGU+XSBbLWEgPGF1eC1idWZmZXItZmlsZT5dIFstUCBjc3ZdIgorICAgICAgICAgICAgICAgICAgICAiICg8aW5wdXQtZmlsZT4gfCA8Y29tbWFuZD4pK1xuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWYgICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IGlucHV0IHRyYWNrXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgbWl4ZXIgb3V0cHV0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyAgICBudW1iZXIgb2YgbWl4ZXIgb3V0cHV0IGNoYW5uZWxzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcyAgICBtaXhlciBzYW1wbGUtcmF0ZVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLW8gICAgPG91dHB1dC1maWxlPiBXQVYgZmlsZSwgcGNtMTYgKG9yIGZsb2F0IGlmIC1tIHNwZWNpZmllZClcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1hICAgIDxhdXgtYnVmZmVyLWZpbGU+XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtUCAgICAjIGZyYW1lcyBwcm92aWRlZCBwZXIgY2FsbCB0byByZXNhbXBsZSgpIGluIENTViBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxpbnB1dC1maWxlPiBpcyBhIFdBViBmaWxlXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICA8Y29tbWFuZD4gY2FuIGJlICdzaW5lOjxjaGFubmVscz4sPGZyZXF1ZW5jeT4sPHNhbXBsZXJhdGU+J1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAnY2hpcnA6PGNoYW5uZWxzPiw8c2FtcGxlcmF0ZT4nXG4iKTsKK30KKworc3RhdGljIGludCB3cml0ZUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsIHNpemVfdCBmcmFtZXMsIGJvb2wgaXNCdWZmZXJGbG9hdCkgeworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBvayB0byBwYXNzIGluIE5VTEwgZmlsZW5hbWUKKyAgICB9CisgICAgLy8gd3JpdGUgb3V0cHV0IHRvIGZpbGUuCisgICAgU0ZfSU5GTyBpbmZvOworICAgIGluZm8uZnJhbWVzID0gMDsKKyAgICBpbmZvLnNhbXBsZXJhdGUgPSBzYW1wbGVSYXRlOworICAgIGluZm8uY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBpbmZvLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCAoaXNCdWZmZXJGbG9hdCA/IFNGX0ZPUk1BVF9GTE9BVCA6IFNGX0ZPUk1BVF9QQ01fMTYpOworICAgIHByaW50Zigic2F2aW5nIGZpbGU6JXMgIGNoYW5uZWxzOiV1ICBzYW1wbGVyYXRlOiV1ICBmcmFtZXM6JXp1XG4iLAorICAgICAgICAgICAgZmlsZW5hbWUsIGluZm8uY2hhbm5lbHMsIGluZm8uc2FtcGxlcmF0ZSwgZnJhbWVzKTsKKyAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZW5hbWUsIFNGTV9XUklURSwgJmluZm8pOworICAgIGlmIChzZiA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChpc0J1ZmZlckZsb2F0KSB7CisgICAgICAgICh2b2lkKSBzZl93cml0ZWZfZmxvYXQoc2YsIChmbG9hdCopYnVmZmVyLCBmcmFtZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKSBzZl93cml0ZWZfc2hvcnQoc2YsIChzaG9ydCopYnVmZmVyLCBmcmFtZXMpOworICAgIH0KKyAgICBzZl9jbG9zZShzZik7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHByb2duYW1lID0gYXJndlswXTsKKyAgICBib29sIHVzZUlucHV0RmxvYXQgPSBmYWxzZTsKKyAgICBib29sIHVzZU1peGVyRmxvYXQgPSBmYWxzZTsKKyAgICBib29sIHVzZVJhbXAgPSB0cnVlOworICAgIHVpbnQzMl90IG91dHB1dFNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICB1aW50MzJfdCBvdXRwdXRDaGFubmVscyA9IDI7IC8vIHN0ZXJlbyBmb3Igbm93CisgICAgc3RkOjp2ZWN0b3I8aW50PiBQdmFsdWVzOworICAgIGNvbnN0IGNoYXIqIG91dHB1dEZpbGVuYW1lID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKiBhdXhGaWxlbmFtZSA9IE5VTEw7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gTmFtZXM7CisgICAgc3RkOjp2ZWN0b3I8U2lnbmFsUHJvdmlkZXI+IFByb3ZpZGVyczsKKworICAgIGZvciAoaW50IGNoOyAoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImZtYzpzOm86YTpQOiIpKSAhPSAtMTspIHsKKyAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIHVzZUlucHV0RmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgdXNlTWl4ZXJGbG9hdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICBvdXRwdXRDaGFubmVscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgIG91dHB1dFNhbXBsZVJhdGUgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICBvdXRwdXRGaWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIGF1eEZpbGVuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgaWYgKHBhcnNlQ1NWKG9wdGFyZywgUHZhbHVlcykgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3Qgc3ludGF4IGZvciAtUCBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1c2FnZShwcm9nbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPT0gMCkgeworICAgICAgICB1c2FnZShwcm9nbmFtZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmICgodW5zaWduZWQpYXJnYyA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgdHJhY2tzOiAlZCA+ICV1IiwgYXJnYywgQXVkaW9NaXhlcjo6TUFYX05VTV9UUkFDS1MpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHNpemVfdCBvdXRwdXRGcmFtZXMgPSAwOworCisgICAgLy8gY3JlYXRlIHByb3ZpZGVycyBmb3IgZWFjaCB0cmFjaworICAgIFByb3ZpZGVycy5yZXNpemUoYXJnYyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hpcnBbXSA9ICJjaGlycDoiOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzaW5lW10gPSAic2luZToiOworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtTZWNvbmRzID0gMTsKKworICAgICAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgY2hpcnAsIHN0cmxlbihjaGlycCkpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisKKyAgICAgICAgICAgIHBhcnNlQ1NWKGFyZ3ZbaV0gKyBzdHJsZW4oY2hpcnApLCB2KTsKKyAgICAgICAgICAgIGlmICh2LnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBjaGlycCglZCAlZClcbiIsIHZbMF0sIHZbMV0pOworICAgICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRDaGlycDxmbG9hdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldENoaXJwPGludDE2X3Q+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxmb3JtZWQgaW5wdXQgJyVzJ1xuIiwgYXJndltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgc2luZSwgc3RybGVuKHNpbmUpKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworCisgICAgICAgICAgICBwYXJzZUNTVihhcmd2W2ldICsgc3RybGVuKHNpbmUpLCB2KTsKKyAgICAgICAgICAgIGlmICh2LnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBzaW5lKCVkICVkICVkKVxuIiwgdlswXSwgdlsxXSwgdlsyXSk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldFNpbmU8ZmxvYXQ+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0U2luZTxpbnQxNl90Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgZmlsZW5hbWUoJXMpXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8ZmxvYXQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0RmlsZTxzaG9ydD4oYXJndltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgZnJhbWVzCisgICAgICAgIHNpemVfdCBuZnJhbWVzID0gKGludDY0X3QpIFByb3ZpZGVyc1tpXS5nZXROdW1GcmFtZXMoKSAqIG91dHB1dFNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAvIFByb3ZpZGVyc1tpXS5nZXRTYW1wbGVSYXRlKCk7CisgICAgICAgIGlmIChpID09IDAgfHwgb3V0cHV0RnJhbWVzID4gbmZyYW1lcykgeyAvLyBjaG9vc2UgbWluaW11bSBmb3Igb3V0cHV0RnJhbWVzCisgICAgICAgICAgICBvdXRwdXRGcmFtZXMgPSBuZnJhbWVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIGNvbnN0IHNpemVfdCBvdXRwdXRGcmFtZVNpemUgPSBvdXRwdXRDaGFubmVscworICAgICAgICAgICAgKiAodXNlTWl4ZXJGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCkpOworICAgIGNvbnN0IHNpemVfdCBvdXRwdXRTaXplID0gb3V0cHV0RnJhbWVzICogb3V0cHV0RnJhbWVTaXplOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChvdXRwdXRDaGFubmVscyk7CisgICAgdm9pZCAqb3V0cHV0QWRkciA9IE5VTEw7CisgICAgKHZvaWQpIHBvc2l4X21lbWFsaWduKCZvdXRwdXRBZGRyLCAzMiwgb3V0cHV0U2l6ZSk7CisgICAgbWVtc2V0KG91dHB1dEFkZHIsIDAsIG91dHB1dFNpemUpOworCisgICAgLy8gY3JlYXRlIHRoZSBhdXggYnVmZmVyLCBpZiBuZWVkZWQuCisgICAgY29uc3Qgc2l6ZV90IGF1eEZyYW1lU2l6ZSA9IHNpemVvZihpbnQzMl90KTsgLy8gUTQuMjcgYWx3YXlzCisgICAgY29uc3Qgc2l6ZV90IGF1eFNpemUgPSBvdXRwdXRGcmFtZXMgKiBhdXhGcmFtZVNpemU7CisgICAgdm9pZCAqYXV4QWRkciA9IE5VTEw7CisgICAgaWYgKGF1eEZpbGVuYW1lKSB7CisgICAgICAgICh2b2lkKSBwb3NpeF9tZW1hbGlnbigmYXV4QWRkciwgMzIsIGF1eFNpemUpOworICAgICAgICBtZW1zZXQoYXV4QWRkciwgMCwgYXV4U2l6ZSk7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSBtaXhlci4KKyAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZUNvdW50ID0gMzIwOyAvLyB0eXBpY2FsIG51bWJlcnMgbWF5IHJhbmdlIGZyb20gMjQwIG9yIDk2MAorICAgIEF1ZGlvTWl4ZXIgKm1peGVyID0gbmV3IEF1ZGlvTWl4ZXIobWl4ZXJGcmFtZUNvdW50LCBvdXRwdXRTYW1wbGVSYXRlKTsKKyAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IHVzZUlucHV0RmxvYXQKKyAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVyRm9ybWF0ID0gdXNlTWl4ZXJGbG9hdAorICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQgLyBQcm92aWRlcnMuc2l6ZSgpOyAvLyBub3JtYWxpemUgdm9sdW1lIGJ5ICMgdHJhY2tzCisgICAgc3RhdGljIGZsb2F0IGYwOyAvLyB6ZXJvCisKKyAgICAvLyBzZXQgdXAgdGhlIHRyYWNrcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFByb3ZpZGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAvL3ByaW50ZigidHJhY2sgJWQgb3V0IG9mICVkXG4iLCBpLCBQcm92aWRlcnMuc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoUHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOworICAgICAgICBpbnQzMl90IG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICBOYW1lcy5wdXNoX2JhY2sobmFtZSk7CisgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCAmUHJvdmlkZXJzW2ldKTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgICAgICAgICAgKHZvaWQgKilvdXRwdXRBZGRyKTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbWl4ZXJGb3JtYXQpOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClpbnB1dEZvcm1hdCk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW91dHB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpY2hhbm5lbE1hc2spOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KVByb3ZpZGVyc1tpXS5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBpZiAodXNlUmFtcCkgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmMCk7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYwKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZik7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYpOworICAgICAgICB9CisgICAgICAgIGlmIChhdXhGaWxlbmFtZSkgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXV4QWRkcik7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZmMCk7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJmYpOworICAgICAgICB9CisgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgfQorCisgICAgLy8gcHVtcCB0aGUgbWl4ZXIgdG8gcHJvY2VzcyBkYXRhLgorICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRGcmFtZXMgLSBtaXhlckZyYW1lQ291bnQ7IGkgKz0gbWl4ZXJGcmFtZUNvdW50KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgTmFtZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoTmFtZXNbal0sIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgb3V0cHV0QWRkciArIGkgKiBvdXRwdXRGcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKGF1eEZpbGVuYW1lKSB7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihOYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBhdXhBZGRyICsgaSAqIGF1eEZyYW1lU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWl4ZXItPnByb2Nlc3MoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOworICAgIH0KKyAgICBvdXRwdXRGcmFtZXMgPSBpOyAvLyByZXNldCBvdXRwdXQgZnJhbWVzIHRvIHRoZSBkYXRhIGFjdHVhbGx5IHByb2R1Y2VkLgorCisgICAgLy8gd3JpdGUgdG8gZmlsZXMKKyAgICB3cml0ZUZpbGUob3V0cHV0RmlsZW5hbWUsIG91dHB1dEFkZHIsCisgICAgICAgICAgICBvdXRwdXRTYW1wbGVSYXRlLCBvdXRwdXRDaGFubmVscywgb3V0cHV0RnJhbWVzLCB1c2VNaXhlckZsb2F0KTsKKyAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgLy8gQXV4IGJ1ZmZlciBpcyBhbHdheXMgaW4gcTRfMjcgZm9ybWF0IGZvciBub3cuCisgICAgICAgIC8vIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygpLCBidXQgd2l0aCBzdGVyZW8gZnJhbWUgY291bnQgKG5vdCBzYW1wbGUgY291bnQpCisgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilhdXhBZGRyLCAoaW50MzJfdCopYXV4QWRkciwgb3V0cHV0RnJhbWVzID4+IDEpOworICAgICAgICB3cml0ZUZpbGUoYXV4RmlsZW5hbWUsIGF1eEFkZHIsIG91dHB1dFNhbXBsZVJhdGUsIDEsIG91dHB1dEZyYW1lcywgZmFsc2UpOworICAgIH0KKworICAgIGRlbGV0ZSBtaXhlcjsKKyAgICBmcmVlKG91dHB1dEFkZHIpOworICAgIGZyZWUoYXV4QWRkcik7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0X3V0aWxzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTFjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdF91dGlscy5oCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1RFU1RfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1RFU1RfVVRJTFNfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisjZW5kaWYKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc19zYW1lCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfc2FtZTxULCBUPiAgLy8gcGFydGlhbCBzcGVjaWFsaXphdGlvbgoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIFQgY29udmVydFZhbHVlKGRvdWJsZSB2YWwpCit7CisgICAgaWYgKGlzX3NhbWU8VCwgaW50MTZfdD46OnZhbHVlKSB7CisgICAgICAgIHJldHVybiBmbG9vcih2YWwgKiAzMjc2Ny4wICsgMC41KTsKKyAgICB9IGVsc2UgaWYgKGlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlKSB7CisgICAgICAgIHJldHVybiBmbG9vcih2YWwgKiAoMVVMPDwzMSkgKyAwLjUpOworICAgIH0KKyAgICByZXR1cm4gdmFsOyAvLyBhc3N1bWUgZmxvYXQgb3IgZG91YmxlCit9CisKKy8vIENvbnZlcnQgYSBsaXN0IG9mIGludGVnZXJzIGluIENTViBmb3JtYXQgdG8gYSBWZWN0b3Igb2YgdGhvc2UgdmFsdWVzLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBvciAtMSBvbiBlcnJvci4KK3N0YXRpYyBpbmxpbmUgaW50IHBhcnNlQ1NWKGNvbnN0IGNoYXIgKnN0cmluZywgc3RkOjp2ZWN0b3I8aW50PiYgdmFsdWVzKQoreworICAgIC8vIHBhc3MgMTogY291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgYW5kIGRvIHN5bnRheCBjaGVjaworICAgIHNpemVfdCBudW1WYWx1ZXMgPSAwOworICAgIGJvb2wgaGFkRGlnaXQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBzdHJpbmc7IDsgKSB7CisgICAgICAgIHN3aXRjaCAoKnArKykgeworICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgICAgICAgIGhhZERpZ2l0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKKyAgICAgICAgICAgICAgICAvLyBwYXNzIDI6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHZlY3RvciBvZiB2YWx1ZXMKKyAgICAgICAgICAgICAgICB2YWx1ZXMucmVzaXplKCsrbnVtVmFsdWVzKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBhdG9pKHAgPSBzdHJpbmcpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtVmFsdWVzOyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwKysgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaSsrXSA9IGF0b2kocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bVZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlICcsJzoKKyAgICAgICAgICAgIGlmIChoYWREaWdpdCkgeworICAgICAgICAgICAgICAgIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbnVtVmFsdWVzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ3JlYXRlcyBhIHR5cGUtaW5kZXBlbmRlbnQgYXVkaW8gYnVmZmVyIHByb3ZpZGVyIGZyb20KKyAqIGEgYnVmZmVyIGJhc2UgYWRkcmVzcywgc2l6ZSwgZnJhbWVzaXplLCBhbmQgaW5wdXQgaW5jcmVtZW50IGFycmF5LgorICoKKyAqIE5vIGFsbG9jYXRpb24gb3IgZGVhbGxvY2F0aW9uIG9mIHRoZSBwcm92aWRlZCBidWZmZXIgaXMgZG9uZS4KKyAqLworY2xhc3MgVGVzdFByb3ZpZGVyIDogcHVibGljIGFuZHJvaWQ6OkF1ZGlvQnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIFRlc3RQcm92aWRlcih2b2lkKiBhZGRyLCBzaXplX3QgZnJhbWVzLCBzaXplX3QgZnJhbWVTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5wdXRJbmNyKQorICAgIDogbUFkZHIoYWRkciksCisgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCisgICAgICBtRnJhbWVTaXplKGZyYW1lU2l6ZSksCisgICAgICBtTmV4dEZyYW1lKDApLCBtVW5yZWwoMCksIG1JbnB1dEluY3IoaW5wdXRJbmNyKSwgbU5leHRJZHgoMCkKKyAgICB7CisgICAgfQorCisgICAgVGVzdFByb3ZpZGVyKCkKKyAgICA6IG1BZGRyKE5VTEwpLCBtTnVtRnJhbWVzKDApLCBtRnJhbWVTaXplKDApLAorICAgICAgbU5leHRGcmFtZSgwKSwgbVVucmVsKDApLCBtTmV4dElkeCgwKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIHNldEluY3IoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW5wdXRJbmNyKSB7CisgICAgICAgIG1JbnB1dEluY3IgPSBpbnB1dEluY3I7CisgICAgICAgIG1OZXh0SWR4ID0gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzIF9fdW51c2VkID0ga0ludmFsaWRQVFMpCisgICAgeworICAgICAgICBzaXplX3QgcmVxdWVzdGVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICBpZiAocmVxdWVzdGVkRnJhbWVzID4gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOworICAgICAgICB9CisgICAgICAgIGlmICghbUlucHV0SW5jci5lbXB0eSgpKSB7CisgICAgICAgICAgICBzaXplX3QgcHJvdmlkZWQgPSBtSW5wdXRJbmNyW21OZXh0SWR4KytdOworICAgICAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXIoKSBtVmFsdWVbJXp1XT0lenUgbm90ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0SWR4LTEsIHByb3ZpZGVkLCBidWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICAgICAgaWYgKHByb3ZpZGVkIDwgYnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gcHJvdmlkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU5leHRJZHggPj0gbUlucHV0SW5jci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBtTmV4dElkeCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXIoKSByZXF1ZXN0ZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUiCisgICAgICAgICAgICAgICAgIiBhbmQgcmV0dXJuZWQgJXp1IGZyYW1lcyIsCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkRnJhbWVzLCBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgbVVucmVsID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKW1BZGRyICsgbUZyYW1lU2l6ZSAqIG1OZXh0RnJhbWU7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9UX0VOT1VHSF9EQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpCisgICAgeworICAgICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7CisgICAgICAgICAgICBBTE9HRSgicmVsZWFzZUJ1ZmZlcigpIHJlbGVhc2VkICV6dSBmcmFtZXMgYnV0IG9ubHkgJXp1IGF2YWlsYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlIiwgYnVmZmVyLT5mcmFtZUNvdW50LCBtVW5yZWwpOworICAgICAgICAgICAgbU5leHRGcmFtZSArPSBtVW5yZWw7CisgICAgICAgICAgICBtVW5yZWwgPSAwOworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUJ1ZmZlcigpIHJlbGVhc2VkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2UiLCBidWZmZXItPmZyYW1lQ291bnQsIG1VbnJlbCk7CisgICAgICAgICAgICBtTmV4dEZyYW1lICs9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIG1VbnJlbCAtPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgbU5leHRGcmFtZSA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IGdldE51bUZyYW1lcygpCisgICAgeworICAgICAgICByZXR1cm4gbU51bUZyYW1lczsKKyAgICB9CisKKworcHJvdGVjdGVkOgorICAgIHZvaWQqIG1BZGRyOyAgIC8vIGJhc2UgYWRkcmVzcworICAgIHNpemVfdCBtTnVtRnJhbWVzOyAgIC8vIHRvdGFsIGZyYW1lcworICAgIGludCBtRnJhbWVTaXplOyAgICAgIC8vIGZyYW1lIHNpemUgKCMgY2hhbm5lbHMgKiBieXRlcyBwZXIgc2FtcGxlKQorICAgIHNpemVfdCBtTmV4dEZyYW1lOyAgIC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gcHJvdmlkZQorICAgIHNpemVfdCBtVW5yZWw7ICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgbm90IHlldCByZWxlYXNlZAorICAgIHN0ZDo6dmVjdG9yPGludD4gbUlucHV0SW5jcjsgLy8gbnVtYmVyIG9mIGZyYW1lcyBwcm92aWRlZCBwZXIgY2FsbAorICAgIHNpemVfdCBtTmV4dElkeDsgICAgIC8vIGluZGV4IG9mIG5leHQgZW50cnkgaW4gbUlucHV0SW5jciB0byB1c2UKK307CisKKy8qIENyZWF0ZXMgYSBidWZmZXIgZmlsbGVkIHdpdGggYSBzaW5lIHdhdmUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBjcmVhdGVTaW5lKHZvaWQgKnZidWZmZXIsIHNpemVfdCBmcmFtZXMsCisgICAgICAgIHNpemVfdCBjaGFubmVscywgZG91YmxlIHNhbXBsZVJhdGUsIGRvdWJsZSBmcmVxKQoreworICAgIGRvdWJsZSB0c2NhbGUgPSAxLiAvIHNhbXBsZVJhdGU7CisgICAgVCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxUKj4odmJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICBkb3VibGUgdCA9IGkgKiB0c2NhbGU7CisgICAgICAgIGRvdWJsZSB5ID0gc2luKDIuICogTV9QSSAqIGZyZXEgKiB0KTsKKyAgICAgICAgVCB5dCA9IGNvbnZlcnRWYWx1ZTxUPih5KTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNoYW5uZWxzOyArK2opIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpKmNoYW5uZWxzICsgal0gPSB5dCAvIFQoaiArIDEpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBDcmVhdGVzIGEgYnVmZmVyIGZpbGxlZCB3aXRoIGEgY2hpcnAgc2lnbmFsIChhIHNpbmUgd2F2ZSBzd2VlcCkuCisgKgorICogV2hlbiBjcmVhdGluZyB0aGUgQ2hpcnAsIG5vdGUgdGhhdCB0aGUgZnJlcXVlbmN5IGlzIHRoZSB0cnVlIHNpbnVzb2lkYWwKKyAqIGZyZXF1ZW5jeSBub3QgdGhlIHNhbXBsaW5nIHJhdGUuCisgKgorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DaGlycAorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgY3JlYXRlQ2hpcnAodm9pZCAqdmJ1ZmZlciwgc2l6ZV90IGZyYW1lcywKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCBkb3VibGUgc2FtcGxlUmF0ZSwgIGRvdWJsZSBtaW5mcmVxLCBkb3VibGUgbWF4ZnJlcSkKK3sKKyAgICBkb3VibGUgdHNjYWxlID0gMS4gLyBzYW1wbGVSYXRlOworICAgIFQgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHZidWZmZXIpOworICAgIC8vIG5vdGUgdGhlIGNoaXJwIGNvbnN0YW50IGsgaGFzIGEgZGl2aWRlLWJ5LXR3by4KKyAgICBkb3VibGUgayA9IChtYXhmcmVxIC0gbWluZnJlcSkgLyAoMi4gKiB0c2NhbGUgKiBmcmFtZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKKyAgICAgICAgZG91YmxlIHQgPSBpICogdHNjYWxlOworICAgICAgICBkb3VibGUgeSA9IHNpbigyLiAqIE1fUEkgKiAoayAqIHQgKyBtaW5mcmVxKSAqIHQpOworICAgICAgICBUIHl0ID0gY29udmVydFZhbHVlPFQ+KHkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2hhbm5lbHM7ICsraikgeworICAgICAgICAgICAgYnVmZmVyW2kqY2hhbm5lbHMgKyBqXSA9IHl0IC8gVChqICsgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgZGVyaXZlZCBjbGFzcyBjcmVhdGVzIGEgYnVmZmVyIHByb3ZpZGVyIG9mIGRhdGF0eXBlIFQsCisgKiBjb25zaXN0aW5nIG9mIGFuIGlucHV0IHNpZ25hbCwgZS5nLiBmcm9tIGNyZWF0ZUNoaXJwKCkuCisgKiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgYmFzZSBjbGFzcworICogVGVzdFByb3ZpZGVyOjpnZXROdW1GcmFtZXMoKS4KKyAqLworCitjbGFzcyBTaWduYWxQcm92aWRlciA6IHB1YmxpYyBUZXN0UHJvdmlkZXIgeworcHVibGljOgorICAgIFNpZ25hbFByb3ZpZGVyKCkKKyAgICA6IG1TYW1wbGVSYXRlKDApLAorICAgICAgbUNoYW5uZWxzKDApCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgflNpZ25hbFByb3ZpZGVyKCkKKyAgICB7CisgICAgICAgIGZyZWUobUFkZHIpOworICAgICAgICBtQWRkciA9IE5VTEw7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBzZXRDaGlycChzaXplX3QgY2hhbm5lbHMsIGRvdWJsZSBtaW5mcmVxLCBkb3VibGUgbWF4ZnJlcSwgZG91YmxlIHNhbXBsZVJhdGUsIGRvdWJsZSB0aW1lKQorICAgIHsKKyAgICAgICAgY3JlYXRlQnVmZmVyQnlGcmFtZXM8VD4oY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHNhbXBsZVJhdGUqdGltZSk7CisgICAgICAgIGNyZWF0ZUNoaXJwPFQ+KG1BZGRyLCBtTnVtRnJhbWVzLCBtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlLCBtaW5mcmVxLCBtYXhmcmVxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIHNldFNpbmUoc2l6ZV90IGNoYW5uZWxzLAorICAgICAgICAgICAgZG91YmxlIGZyZXEsIGRvdWJsZSBzYW1wbGVSYXRlLCBkb3VibGUgdGltZSkKKyAgICB7CisgICAgICAgIGNyZWF0ZUJ1ZmZlckJ5RnJhbWVzPFQ+KGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzYW1wbGVSYXRlKnRpbWUpOworICAgICAgICBjcmVhdGVTaW5lPFQ+KG1BZGRyLCBtTnVtRnJhbWVzLCAgbUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSwgZnJlcSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBzZXRGaWxlKGNvbnN0IGNoYXIgKmZpbGVfaW4pCisgICAgeworICAgICAgICBTRl9JTkZPIGluZm87CisgICAgICAgIGluZm8uZm9ybWF0ID0gMDsKKyAgICAgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVfaW4sIFNGTV9SRUFELCAmaW5mbyk7CisgICAgICAgIGlmIChzZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwZXJyb3IoZmlsZV9pbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlQnVmZmVyQnlGcmFtZXM8VD4oaW5mby5jaGFubmVscywgaW5mby5zYW1wbGVyYXRlLCBpbmZvLmZyYW1lcyk7CisgICAgICAgIGlmIChpc19zYW1lPFQsIGZsb2F0Pjo6dmFsdWUpIHsKKyAgICAgICAgICAgICh2b2lkKSBzZl9yZWFkZl9mbG9hdChzZiwgKGZsb2F0ICopIG1BZGRyLCBtTnVtRnJhbWVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc19zYW1lPFQsIHNob3J0Pjo6dmFsdWUpIHsKKyAgICAgICAgICAgICh2b2lkKSBzZl9yZWFkZl9zaG9ydChzZiwgKHNob3J0ICopIG1BZGRyLCBtTnVtRnJhbWVzKTsKKyAgICAgICAgfQorICAgICAgICBzZl9jbG9zZShzZik7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjcmVhdGVCdWZmZXJCeUZyYW1lcyhzaXplX3QgY2hhbm5lbHMsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHNpemVfdCBmcmFtZXMpCisgICAgeworICAgICAgICBtTnVtRnJhbWVzID0gZnJhbWVzOworICAgICAgICBtQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IG1DaGFubmVscyAqIHNpemVvZihUKTsKKyAgICAgICAgZnJlZShtQWRkcik7CisgICAgICAgIG1BZGRyID0gbWFsbG9jKG1GcmFtZVNpemUgKiBtTnVtRnJhbWVzKTsKKyAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXROdW1DaGFubmVscygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DaGFubmVsczsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCBtQ2hhbm5lbHM7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19URVNUX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTJjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsODYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAorICAgIEF1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKworaWZlcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgXAorICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKKworICAgIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCitlbHNlCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAorICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJoYXJkd2FyZSBcCisgICAgbGliaGFyZHdhcmVfbGVnYWN5CisKK2lmbmVxICgkKFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZKSwgMSkKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcgorZW5kaWYKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJzZXJ2aWNldXRpbGl0eQorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXNlcnZpY2UKKworTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisKK2lmbmVxICgkKFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZKSwgMSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1BvbGljeU1hbmFnZXIuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisgICAgbGlic291bmR0cmlnZ2VyCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlcgorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaWZuZXEgKCQoVVNFX0NVU1RPTV9BVURJT19QT0xJQ1kpLCAxKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUG9saWN5RmFjdG9yeS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXIKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDkwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUNsaWVudEltcGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsaWVudCBpbnRlcmZhY2UgZnJvbSB0aGUgcG9saWN5IG1hbmFnZXIgKi8KKworYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5sb2FkSHdNb2R1bGUobmFtZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KG1vZHVsZSwgb3V0cHV0LCBjb25maWcsIGRldmljZXMsIGFkZHJlc3MsIGxhdGVuY3lNcywgZmxhZ3MpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuRHVwbGljYXRlT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+c3VzcGVuZE91dHB1dChvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpyZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm9wZW5JbnB1dChtb2R1bGUsIGlucHV0LCBjb25maWcsIGRldmljZSwgYWRkcmVzcywgc291cmNlLCBmbGFncyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5jbG9zZUlucHV0KGlucHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRlbGF5X21zKTsKK30KKworU3RyaW5nOCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlzKQoreworICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrZXlzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0b3BUb25lKCkKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSwgZGVsYXlfbXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50Ojptb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3Rfb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjX291dHB1dCwgZHN0X291dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+Y2xpZW50Q3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPmNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldEF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5jbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uZmlnLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKK30KKworYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZCgpCit7CisgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzcxOWRhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI3VuZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBfX1NURElOVF9MSU1JVFMKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorLy8jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSB0byB0aGUgcG9saWN5IG1hbmFnZXIgKi8KK2V4dGVybiAiQyIgeworCithdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5sb2FkSHdNb2R1bGUobmFtZSk7Cit9CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBvcGVuX291dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBpZiAocFNhbXBsaW5nUmF0ZSA9PSBOVUxMIHx8IHBGb3JtYXQgPT0gTlVMTCB8fCBwQ2hhbm5lbE1hc2sgPT0gTlVMTCB8fAorICAgICAgICAgICAgcERldmljZXMgPT0gTlVMTCB8fCBwTGF0ZW5jeU1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKnBTYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLmZvcm1hdCA9ICpwRm9ybWF0OworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAqcENoYW5uZWxNYXNrOworICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgfQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuT3V0cHV0KG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywgcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksIHBMYXRlbmN5TXMsIGZsYWdzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpwU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAqcEZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICpwQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgKigoYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKilvZmZsb2FkSW5mbykgPSBjb25maWcub2ZmbG9hZF9pbmZvOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUoKQorYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIHJldHVybiBvcGVuX291dHB1dCgoYXVkaW9fbW9kdWxlX2hhbmRsZV90KTAsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBOVUxMKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgcmV0dXJuIG9wZW5fb3V0cHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fZHVwX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWYtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MSwgb3V0cHV0Mik7Cit9CisKK2ludCBhcHNfY2xvc2Vfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlT3V0cHV0KG91dHB1dCk7Cit9CisKK2ludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+c3VzcGVuZE91dHB1dChvdXRwdXQpOworfQorCitpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnJlc3RvcmVPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5faW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBpZiAocFNhbXBsaW5nUmF0ZSA9PSBOVUxMIHx8IHBGb3JtYXQgPT0gTlVMTCB8fCBwQ2hhbm5lbE1hc2sgPT0gTlVMTCB8fCBwRGV2aWNlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOzsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAqcFNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWcuZm9ybWF0ID0gKnBGb3JtYXQ7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9ICpwQ2hhbm5lbE1hc2s7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+b3BlbklucHV0KG1vZHVsZSwgJmlucHV0LCAmY29uZmlnLCBwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLCBBVURJT19TT1VSQ0VfTUlDLCBBVURJT19JTlBVVF9GTEFHX0ZBU1QgLypGSVhNRSovKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpwU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAqcEZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICpwQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKKworLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKCksIGFuZCBhY291c3RpY3MgcGFyYW1ldGVyIGlzIGlnbm9yZWQKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2luX2Fjb3VzdGljc190IGFjb3VzdGljcyBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gIG9wZW5faW5wdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaykKK3sKKyAgICByZXR1cm4gIG9wZW5faW5wdXQobW9kdWxlLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKK30KKworaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOworfQorCitpbnQgYXBzX2ludmFsaWRhdGVfc3RyZWFtKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworfQorCitpbnQgYXBzX21vdmVfZWZmZWN0cyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOworfQorCitjaGFyICogYXBzX2dldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzKQoreworICAgIFN0cmluZzggcmVzdWx0ID0gQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBTdHJpbmc4KGtleXMpKTsKKyAgICByZXR1cm4gc3RyZHVwKHJlc3VsdC5zdHJpbmcoKSk7Cit9CisKK3ZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga3ZfcGFpcnMsIGRlbGF5X21zKTsKK30KKworaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyk7Cit9CisKK2ludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Cit9CisKK2ludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Cit9CisKK2ludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKK3sKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOworCisgICAgcmV0dXJuIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7Cit9CisKK307IC8vIGV4dGVybiAiQyIKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTFiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0wLDAgKzEsNjY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUVmZmVjdHMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lFZmZlY3RzIEltcGxlbWVudGF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F1ZGlvUG9saWN5RWZmZWN0czo6QXVkaW9Qb2xpY3lFZmZlY3RzKCkKK3sKKyAgICAvLyBsb2FkIGF1dG9tYXRpYyBhdWRpbyBlZmZlY3QgbW9kdWxlcworICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICBsb2FkQXVkaW9FZmZlY3RDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7CisgICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFKTsKKyAgICB9Cit9CisKKworQXVkaW9Qb2xpY3lFZmZlY3RzOjp+QXVkaW9Qb2xpY3lFZmZlY3RzKCkKK3sKKyAgICBzaXplX3QgaSA9IDA7CisgICAgLy8gcmVsZWFzZSBhdWRpbyBpbnB1dCBwcm9jZXNzaW5nIHJlc291cmNlcworICAgIGZvciAoaSA9IDA7IGkgPCBtSW5wdXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1JbnB1dFNvdXJjZXMuY2xlYXIoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+bUVmZmVjdHMuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICB9CisgICAgbUlucHV0cy5jbGVhcigpOworCisgICAgLy8gcmVsZWFzZSBhdWRpbyBvdXRwdXQgcHJvY2Vzc2luZyByZXNvdXJjZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGVsZXRlIG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1PdXRwdXRTdHJlYW1zLmNsZWFyKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbU91dHB1dFNlc3Npb25zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGkpLT5tRWZmZWN0cy5jbGVhcigpOworICAgICAgICBkZWxldGUgbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1PdXRwdXRTZXNzaW9ucy5jbGVhcigpOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgYXVkaW9fc291cmNlX3QgYWxpYXNTb3VyY2UgPSAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiA6IGlucHV0U291cmNlOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0U291cmNlcy5pbmRleE9mS2V5KGFsaWFzU291cmNlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJhZGRJbnB1dEVmZmVjdHMoKTogbm8gcHJvY2Vzc2luZyBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGlzIHNvdXJjZSIpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzc2l6ZV90IGlkeCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgRWZmZWN0VmVjdG9yICppbnB1dERlc2M7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgaW5wdXREZXNjID0gbmV3IEVmZmVjdFZlY3RvcihhdWRpb1Nlc3Npb24pOworICAgICAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFZmZlY3RWZWN0b3IgaXMgZXhpc3RpbmcgYW5kIHdlIGp1c3QgbmVlZCB0byBpbmNyZWFzZSByZWYgY291bnQKKyAgICAgICAgaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlkeCk7CisgICAgfQorICAgIGlucHV0RGVzYy0+bVJlZkNvdW50Kys7CisKKyAgICBBTE9HVigiYWRkSW5wdXRFZmZlY3RzKCk6IGlucHV0OiAlZCwgcmVmQ291bnQ6ICVkIiwgaW5wdXQsIGlucHV0RGVzYy0+bVJlZkNvdW50KTsKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMSkgeworICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiYWRkSW5wdXRFZmZlY3RzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gc291cmNlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCAoaW50MzJfdClhbGlhc1NvdXJjZSk7CisgICAgICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZWZmZWN0LT5tUGFyYW1zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZngtPnNldFBhcmFtZXRlcihlZmZlY3QtPm1QYXJhbXNbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImFkZElucHV0RWZmZWN0cygpOiBhZGRlZCBGeCAlcyBvbiBzb3VyY2U6ICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIChpbnQzMl90KWFsaWFzU291cmNlKTsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bUVmZmVjdHMuYWRkKGZ4KTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERlc2MtPnNldFByb2Nlc3NvckVuYWJsZWQodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpyZWxlYXNlSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIEVmZmVjdFZlY3RvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudC0tOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXRFZmZlY3RzKCk6IGlucHV0OiAlZCwgcmVmQ291bnQ6ICVkIiwgaW5wdXQsIGlucHV0RGVzYy0+bVJlZkNvdW50KTsKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBpbnB1dERlc2MtPnNldFByb2Nlc3NvckVuYWJsZWQoZmFsc2UpOworICAgICAgICBkZWxldGUgaW5wdXREZXNjOworICAgICAgICBtSW5wdXRzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBBTE9HVigicmVsZWFzZUlucHV0RWZmZWN0cygpOiBhbGwgZWZmZWN0cyByZWxlYXNlZCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bVNlc3Npb25JZCA9PSBhdWRpb1Nlc3Npb24pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBtSW5wdXRzLnNpemUoKSkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IGVmZmVjdHMgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3RzW2ldLT5kZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChpIDwgKmNvdW50KSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yc1tpXSA9IGRlc2M7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7CisgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICB9CisgICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnF1ZXJ5RGVmYXVsdE91dHB1dFNlc3Npb25FZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbU91dHB1dFNlc3Npb25zLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaW5kZXgpLT5tU2Vzc2lvbklkID09IGF1ZGlvU2Vzc2lvbikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4ID09IG1PdXRwdXRTZXNzaW9ucy5zaXplKCkpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3RzW2ldLT5kZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChpIDwgKmNvdW50KSB7CisgICAgICAgICAgICBkZXNjcmlwdG9yc1tpXSA9IGRlc2M7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVmZmVjdHMuc2l6ZSgpID4gKmNvdW50KSB7CisgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKKyAgICB9CisgICAgKmNvdW50ID0gZWZmZWN0cy5zaXplKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBubyBvdXRwdXQgcHJvY2Vzc2luZyBuZWVkZWQgZm9yIHRoaXMgc3RyZWFtIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTZXNzaW9ucy5pbmRleE9mS2V5KGF1ZGlvU2Vzc2lvbik7CisgICAgRWZmZWN0VmVjdG9yICpwcm9jRGVzYzsKKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBwcm9jRGVzYyA9IG5ldyBFZmZlY3RWZWN0b3IoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgbU91dHB1dFNlc3Npb25zLmFkZChhdWRpb1Nlc3Npb24sIHByb2NEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFZmZlY3RWZWN0b3IgaXMgZXhpc3RpbmcgYW5kIHdlIGp1c3QgbmVlZCB0byBpbmNyZWFzZSByZWYgY291bnQKKyAgICAgICAgcHJvY0Rlc2MgPSBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpZHgpOworICAgIH0KKyAgICBwcm9jRGVzYy0+bVJlZkNvdW50Kys7CisKKyAgICBBTE9HVigiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogc2Vzc2lvbjogJWQsIHJlZkNvdW50OiAlZCIsCisgICAgICAgICAgYXVkaW9TZXNzaW9uLCBwcm9jRGVzYy0+bVJlZkNvdW50KTsKKyAgICBpZiAocHJvY0Rlc2MtPm1SZWZDb3VudCA9PSAxKSB7CisgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAgJXMgb24gc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAvLyBmeCBnb2VzIG91dCBvZiBzY29wZSBhbmQgc3Ryb25nIHJlZiBvbiBBdWRpb0VmZmVjdCBpcyByZWxlYXNlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IGFkZGVkIEZ4ICVzIG9uIHNlc3Npb246ICVkIGZvciBzdHJlYW06ICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIGF1ZGlvU2Vzc2lvbiwgKGludDMyX3Qpc3RyZWFtKTsKKyAgICAgICAgICAgIHByb2NEZXNjLT5tRWZmZWN0cy5hZGQoZngpOworICAgICAgICB9CisKKyAgICAgICAgcHJvY0Rlc2MtPnNldFByb2Nlc3NvckVuYWJsZWQodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgICh2b2lkKSBvdXRwdXQ7IC8vIGFyZ3VtZW50IG5vdCB1c2VkIGZvciBub3cKKyAgICAodm9pZCkgc3RyZWFtOyAvLyBhcmd1bWVudCBub3QgdXNlZCBmb3Igbm93CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U2Vzc2lvbnMuaW5kZXhPZktleShhdWRpb1Nlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0czogbm8gb3V0cHV0IHByb2Nlc3Npbmcgd2FzIGF0dGFjaGVkIHRvIHRoaXMgc3RyZWFtIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBFZmZlY3RWZWN0b3IgKnByb2NEZXNjID0gbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOworICAgIHByb2NEZXNjLT5tUmVmQ291bnQtLTsKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKCk6IHNlc3Npb246ICVkLCByZWZDb3VudDogJWQiLAorICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgcHJvY0Rlc2MtPm1SZWZDb3VudCk7CisgICAgaWYgKHByb2NEZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBwcm9jRGVzYy0+c2V0UHJvY2Vzc29yRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHByb2NEZXNjLT5tRWZmZWN0cy5jbGVhcigpOworICAgICAgICBkZWxldGUgcHJvY0Rlc2M7CisgICAgICAgIG1PdXRwdXRTZXNzaW9ucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBvdXRwdXQgcHJvY2Vzc2luZyByZWxlYXNlZCBmcm9tIHNlc3Npb246ICVkIiwKKyAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5RWZmZWN0czo6RWZmZWN0VmVjdG9yOjpzZXRQcm9jZXNzb3JFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RzLml0ZW1BdChpKS0+c2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW8gcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qc3RhdGljKi8gY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUG9saWN5RWZmZWN0czo6a0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV0gPSB7CisgICAgTUlDX1NSQ19UQUcsCisgICAgVk9JQ0VfVUxfU1JDX1RBRywKKyAgICBWT0lDRV9ETF9TUkNfVEFHLAorICAgIFZPSUNFX0NBTExfU1JDX1RBRywKKyAgICBDQU1DT1JERVJfU1JDX1RBRywKKyAgICBWT0lDRV9SRUNfU1JDX1RBRywKKyAgICBWT0lDRV9DT01NX1NSQ19UQUcKK307CisKKy8vIHJldHVybnMgdGhlIGF1ZGlvX3NvdXJjZV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgc291cmNlIG5hbWUgb3IKKy8vIEFVRElPX1NPVVJDRV9DTlQgaXMgbm8gbWF0Y2ggZm91bmQKKy8qc3RhdGljKi8gYXVkaW9fc291cmNlX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjppbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBBVURJT19TT1VSQ0VfTUlDOyBpIDwgQVVESU9fU09VUkNFX0NOVDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwga0lucHV0U291cmNlTmFtZXNbaSAtIEFVRElPX1NPVVJDRV9NSUNdKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiaW5wdXRTb3VyY2VOYW1lVG9FbnVtIGZvdW5kIHNvdXJjZSAlcyAlZCIsIG5hbWUsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChhdWRpb19zb3VyY2VfdClpOworfQorCitjb25zdCBjaGFyICpBdWRpb1BvbGljeUVmZmVjdHM6OmtTdHJlYW1OYW1lc1tBVURJT19TVFJFQU1fQ05UKzFdID0geworICAgIEFVRElPX1NUUkVBTV9ERUZBVUxUX1RBRywKKyAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTF9UQUcsCisgICAgQVVESU9fU1RSRUFNX1NZU1RFTV9UQUcsCisgICAgQVVESU9fU1RSRUFNX1JJTkdfVEFHLAorICAgIEFVRElPX1NUUkVBTV9NVVNJQ19UQUcsCisgICAgQVVESU9fU1RSRUFNX0FMQVJNX1RBRywKKyAgICBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OX1RBRywKKyAgICBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDT19UQUcsCisgICAgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEVfVEFHLAorICAgIEFVRElPX1NUUkVBTV9EVE1GX1RBRywKKyAgICBBVURJT19TVFJFQU1fVFRTX1RBRworfTsKKworLy8gcmV0dXJucyB0aGUgYXVkaW9fc3RyZWFtX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtIG5hbWUgb3IKKy8vIEFVRElPX1NUUkVBTV9DTlQgaXMgbm8gbWF0Y2ggZm91bmQKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpzdHJlYW1OYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBrU3RyZWFtTmFtZXNbaSAtIEFVRElPX1NUUkVBTV9ERUZBVUxUXSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInN0cmVhbU5hbWVUb0VudW0gZm91bmQgc3RyZWFtICVzICVkIiwgbmFtZSwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX3N0cmVhbV90eXBlX3QpaTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW8gRWZmZWN0IENvbmZpZyBwYXJzZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2l6ZV90IEF1ZGlvUG9saWN5RWZmZWN0czo6Z3Jvd1BhcmFtU2l6ZShjaGFyICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKQoreworICAgIC8vICpjdXJTaXplIGlzIGF0IGxlYXN0IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCkKKyAgICBzaXplX3QgcG9zID0gKCgqY3VyU2l6ZSAtIDEgKSAvIHNpemUgKyAxKSAqIHNpemU7CisKKyAgICBpZiAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7CisgICAgICAgIHdoaWxlIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKKyAgICAgICAgICAgICp0b3RTaXplICs9ICgoKnRvdFNpemUgKyA3KSAvIDgpICogNDsKKyAgICAgICAgfQorICAgICAgICBwYXJhbSA9IChjaGFyICopcmVhbGxvYyhwYXJhbSwgKnRvdFNpemUpOworICAgIH0KKyAgICAqY3VyU2l6ZSA9IHBvcyArIHNpemU7CisgICAgcmV0dXJuIHBvczsKK30KKworc2l6ZV90IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKK3sKKyAgICBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBTSE9SVF9UQUcsIHNpemVvZihTSE9SVF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKHNob3J0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgICooc2hvcnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoc2hvcnQpYXRvaShub2RlLT52YWx1ZSk7CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgc2hvcnQgJWQiLCAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihzaG9ydCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIElOVF9UQUcsIHNpemVvZihJTlRfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihpbnQpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBhdG9pKG5vZGUtPnZhbHVlKTsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBpbnQgJWQiLCAqKGludCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7CisgICAgICAgIHJldHVybiBzaXplb2YoaW50KTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgRkxPQVRfVEFHLCBzaXplb2YoRkxPQVRfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihmbG9hdCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICAqKGZsb2F0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKGZsb2F0KWF0b2Yobm9kZS0+dmFsdWUpOworICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGZsb2F0ICVmIiwqKGZsb2F0ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEJPT0xfVEFHLCBzaXplb2YoQk9PTF9UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGJvb2wpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgaWYgKHN0cm5jbXAobm9kZS0+dmFsdWUsICJmYWxzZSIsIHN0cmxlbigiZmFsc2UiKSArIDEpID09IDApIHsKKyAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGJvb2wgJXMiLCooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGJvb2wpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBTVFJJTkdfVEFHLCBzaXplb2YoU1RSSU5HX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJubGVuKG5vZGUtPnZhbHVlLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpOworICAgICAgICBpZiAoKmN1clNpemUgKyBsZW4gKyAxID4gKnRvdFNpemUpIHsKKyAgICAgICAgICAgICp0b3RTaXplID0gKmN1clNpemUgKyBsZW4gKyAxOworICAgICAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKKyAgICAgICAgfQorICAgICAgICBzdHJuY3B5KHBhcmFtICsgKmN1clNpemUsIG5vZGUtPnZhbHVlLCBsZW4pOworICAgICAgICAqY3VyU2l6ZSArPSBsZW47CisgICAgICAgIHBhcmFtWypjdXJTaXplXSA9ICdcMCc7CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgc3RyaW5nICVzIiwgcGFyYW0gKyAqY3VyU2l6ZSAtIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorICAgIEFMT0dXKCJyZWFkUGFyYW1WYWx1ZSgpIHVua25vd24gcGFyYW0gdHlwZSAlcyIsIG5vZGUtPm5hbWUpOworICAgIHJldHVybiAwOworfQorCitlZmZlY3RfcGFyYW1fdCAqQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KQoreworICAgIGNub2RlICpwYXJhbTsKKyAgICBjbm9kZSAqdmFsdWU7CisgICAgc2l6ZV90IGN1clNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpOworICAgIHNpemVfdCB0b3RTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDIgKiBzaXplb2YoaW50KTsKKyAgICBlZmZlY3RfcGFyYW1fdCAqZnhfcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QgKiltYWxsb2ModG90U2l6ZSk7CisKKyAgICBwYXJhbSA9IGNvbmZpZ19maW5kKHJvb3QsIFBBUkFNX1RBRyk7CisgICAgdmFsdWUgPSBjb25maWdfZmluZChyb290LCBWQUxVRV9UQUcpOworICAgIGlmIChwYXJhbSA9PSBOVUxMICYmIHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgLy8gdHJ5IHRvIHBhcnNlIHNpbXBsZSBwYXJhbWV0ZXIgZm9ybSB7aW50IGludH0KKyAgICAgICAgcGFyYW0gPSByb290LT5maXJzdF9jaGlsZDsKKyAgICAgICAgaWYgKHBhcmFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IHRoYXQgYSBwYWlyIG9mIHJhbmRvbSBzdHJpbmdzIGlzIHJlYWQgYXMgMCAwCisgICAgICAgICAgICBpbnQgKnB0ciA9IChpbnQgKilmeF9wYXJhbS0+ZGF0YTsKKyAgICAgICAgICAgIGludCAqcHRyMiA9IChpbnQgKikoKGNoYXIgKilwYXJhbSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpOworICAgICAgICAgICAgQUxPR1coImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSBwdHIgJXAgcHRyMiAlcCIsIHB0ciwgcHRyMik7CisgICAgICAgICAgICAqcHRyKysgPSBhdG9pKHBhcmFtLT5uYW1lKTsKKyAgICAgICAgICAgICpwdHIgPSBhdG9pKHBhcmFtLT52YWx1ZSk7CisgICAgICAgICAgICBmeF9wYXJhbS0+cHNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIGZ4X3BhcmFtLT52c2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICAgICAgcmV0dXJuIGZ4X3BhcmFtOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtZXRlciBkZXNjcmlwdGlvbiAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IDA7CisgICAgcGFyYW0gPSBwYXJhbS0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKHBhcmFtKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcmVhZGluZyBwYXJhbSBvZiB0eXBlICVzIiwgcGFyYW0tPm5hbWUpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IHJlYWRQYXJhbVZhbHVlKHBhcmFtLCAoY2hhciAqKWZ4X3BhcmFtLCAmY3VyU2l6ZSwgJnRvdFNpemUpOworICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGZ4X3BhcmFtLT5wc2l6ZSArPSBzaXplOworICAgICAgICBwYXJhbSA9IHBhcmFtLT5uZXh0OworICAgIH0KKworICAgIC8vIGFsaWduIHN0YXJ0IG9mIHZhbHVlIGZpZWxkIG9uIDMyIGJpdCBib3VuZGFyeQorICAgIGN1clNpemUgPSAoKGN1clNpemUgLSAxICkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisKKyAgICBmeF9wYXJhbS0+dnNpemUgPSAwOworICAgIHZhbHVlID0gdmFsdWUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlICh2YWx1ZSkgeworICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgdmFsdWUgb2YgdHlwZSAlcyIsIHZhbHVlLT5uYW1lKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZSh2YWx1ZSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBmeF9wYXJhbS0+dnNpemUgKz0gc2l6ZTsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gZnhfcGFyYW07CisKK2Vycm9yOgorICAgIGRlbGV0ZSBmeF9wYXJhbTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcnMoKSBsb2FkaW5nIHBhcmFtICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwYXJhbSA9IGxvYWRFZmZlY3RQYXJhbWV0ZXIobm9kZSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKKworQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3REZXNjVmVjdG9yICpBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3RDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cykKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZSgpIGVtcHR5IGVsZW1lbnQgJXMiLCByb290LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0cm5jbXAoZWZmZWN0c1tpXS0+bU5hbWUsIG5vZGUtPm5hbWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0Q29uZmlnKCkgZm91bmQgZWZmZWN0ICVzIGluIGxpc3QiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSBlZmZlY3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RDb25maWcoKSBlZmZlY3QgJXMgbm90IGluIGxpc3QiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoKmVmZmVjdHNbaV0pOyAgIC8vIGRlZXAgY29weQorICAgICAgICBsb2FkRWZmZWN0UGFyYW1ldGVycyhub2RlLCBlZmZlY3QtPm1QYXJhbXMpOworICAgICAgICBBTE9HVigibG9hZEVmZmVjdENvbmZpZygpIGFkZGluZyBlZmZlY3QgJXMgdXVpZCAlMDh4IiwKKyAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgZWZmZWN0LT5tVXVpZC50aW1lTG93KTsKKyAgICAgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBpZiAoZGVzYy0+bUVmZmVjdHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR1coImxvYWRFZmZlY3RDb25maWcoKSBubyB2YWxpZCBlZmZlY3RzIGZvdW5kIGluIGNvbmZpZyAlcyIsIHJvb3QtPm5hbWUpOworICAgICAgICBkZWxldGUgZGVzYzsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkZXNjOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRJbnB1dEVmZmVjdENvbmZpZ3VyYXRpb25zKGNub2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBQUkVQUk9DRVNTSU5HX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0U291cmNlTmFtZVRvRW51bShub2RlLT5uYW1lKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ05UKSB7CisgICAgICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlcygpIGludmFsaWQgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2VzKCkgbG9hZGluZyBpbnB1dCBzb3VyY2UgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IGxvYWRFZmZlY3RDb25maWcobm9kZSwgZWZmZWN0cyk7CisgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBPVVRQVVRfU0VTU0lPTl9QUk9DRVNTSU5HX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtTmFtZVRvRW51bShub2RlLT5uYW1lKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgICAgICBBTE9HVygibG9hZFN0cmVhbUVmZmVjdENvbmZpZ3VyYXRpb25zKCkgaW52YWxpZCBvdXRwdXQgc3RyZWFtICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMoKSBsb2FkaW5nIG91dHB1dCBzdHJlYW0gJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciAqZGVzYyA9IGxvYWRFZmZlY3RDb25maWcobm9kZSwgZWZmZWN0cyk7CisgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dFN0cmVhbXMuYWRkKHN0cmVhbSwgZGVzYyk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK0F1ZGlvUG9saWN5RWZmZWN0czo6RWZmZWN0RGVzYyAqQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkRWZmZWN0KGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgVVVJRF9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAoQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChub2RlLT52YWx1ZSwgJnV1aWQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0KCkgaW52YWxpZCB1dWlkICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBFZmZlY3REZXNjKHJvb3QtPm5hbWUsIHV1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBFRkZFQ1RTX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0cygpIGxvYWRpbmcgZWZmZWN0ICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGxvYWRFZmZlY3Qobm9kZSk7CisgICAgICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3RzLmFkZChlZmZlY3QpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisKKyAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisKKyAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0czsKKyAgICBsb2FkRWZmZWN0cyhyb290LCBlZmZlY3RzKTsKKyAgICBsb2FkSW5wdXRFZmZlY3RDb25maWd1cmF0aW9ucyhyb290LCBlZmZlY3RzKTsKKyAgICBsb2FkU3RyZWFtRWZmZWN0Q29uZmlndXJhdGlvbnMocm9vdCwgZWZmZWN0cyk7CisKKyAgICBjb25maWdfZnJlZShyb290KTsKKyAgICBmcmVlKHJvb3QpOworICAgIGZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwZDUzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZRUZGRUNUU19ICisjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQXVkaW9Qb2xpY3lFZmZlY3RzIGNsYXNzCisvLyBUaGlzIGNsYXNzIHdpbGwgbWFuYWdlIGFsbCBlZmZlY3RzIGF0dGFjaGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcyBpbgorLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mLgorY2xhc3MgQXVkaW9Qb2xpY3lFZmZlY3RzIDogcHVibGljIFJlZkJhc2UKK3sKKworcHVibGljOgorCisgICAgLy8gVGhlIGNvbnN0cnVjdG9yIHdpbGwgcGFyc2UgYXVkaW9fZWZmZWN0cy5jb25mCisgICAgLy8gRmlyc3QgaXQgd2lsbCBsb29rIHdoZXRoZXIgdmVuZG9yIHNwZWNpZmljIGZpbGUgZXhpc3RzLAorICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIHBhcnNlIHRoZSBzeXN0ZW0gZGVmYXVsdCBmaWxlLgorCSAgICAgICAgIEF1ZGlvUG9saWN5RWZmZWN0cygpOworICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5RWZmZWN0cygpOworCisgICAgLy8gTk9URTogbWV0aG9kcyBvbiBBdWRpb1BvbGljeUVmZmVjdHMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aXRoIHRoZSBBdWRpb1BvbGljeVNlcnZpY2UKKyAgICAvLyBtYWluIG11dGV4IChtTG9jaykgaGVsZCBhcyB0aGV5IHdpbGwgaW5kaXJlY3RseSBjYWxsIGJhY2sgaW50byBBdWRpb1BvbGljeVNlcnZpY2Ugd2hlbgorICAgIC8vIG1hbmFnaW5nIGF1ZGlvIGVmZmVjdHMuCisKKyAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBpbnB1dCBlZmZlY3RzCisgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGF1ZGlvU2Vzc2lvbgorICAgIHN0YXR1c190IHF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKworICAgIC8vIEFkZCBhbGwgaW5wdXQgZWZmZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnB1dAorICAgIC8vIEVmZmVjdHMgYXJlIGF0dGFjaGVkIGRlcGVuZGluZyBvbiB0aGUgYXVkaW9fc291cmNlX3QKKyAgICBzdGF0dXNfdCBhZGRJbnB1dEVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKTsKKworICAgIC8vIEFkZCBhbGwgaW5wdXQgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgaW5wdXQKKyAgICBzdGF0dXNfdCByZWxlYXNlSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworCisgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBlZmZlY3QgZGVzY3JpcHRvcnMgZm9yIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggYXVkaW9TZXNzaW9uCisgICAgc3RhdHVzX3QgcXVlcnlEZWZhdWx0T3V0cHV0U2Vzc2lvbkVmZmVjdHMoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisKKyAgICAvLyBBZGQgYWxsIG91dHB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBvdXRwdXQKKyAgICAvLyBFZmZlY3RzIGFyZSBhdHRhY2hlZCBkZXBlbmRpbmcgb24gdGhlIGF1ZGlvX3N0cmVhbV90eXBlX3QKKyAgICBzdGF0dXNfdCBhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKTsKKworICAgIC8vIHJlbGVhc2UgYWxsIG91dHB1dCBlZmZlY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dHB1dCBzdHJlYW0gYW5kIGF1ZGlvc2Vzc2lvbgorICAgIHN0YXR1c190IHJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uKTsKKworcHJpdmF0ZToKKworICAgIC8vIGNsYXNzIHRvIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlZmZlY3RzIGFuZCBpdHMgcGFyYW1ldGVycworICAgIC8vIGFzIGRlZmluZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCisgICAgY2xhc3MgRWZmZWN0RGVzYyB7CisgICAgcHVibGljOgorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSB7IH0KKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBFZmZlY3REZXNjJiBvcmlnKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAob3JpZy5tTmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHNpemUgYW5kIHZzaXplIGFyZSByb3VuZGVkIHVwIHRvIGFuIGludCBib3VuZGFyeSBmb3IgYWxsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3JpZ1NpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmlnUGFyYW0tPnBzaXplICsgMykgJiB+MykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+dnNpemUgKyAzKSAmIH4zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmR1cFBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhvcmlnU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkdXBQYXJhbSwgb3JpZ1BhcmFtLCBvcmlnU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgcGFyYW0gYnVmZmVyIGFsbG9jYXRpb24gaXMgYWxzbyBkb25lIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlcyBvZiA0IGJ5dGVzIG9yaWdpbmFsbHkuIEluIHRoZW9yeSB3ZSBzaG91bGQgbWVtY3B5IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBwYXJhbSBzaXplLCB0aGF0IGlzIHdpdGhvdXQgcm91bmRpbmcgdnNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMuYWRkKGR1cFBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qdmlydHVhbCovIH5FZmZlY3REZXNjKCkgeworICAgICAgICAgICAgZnJlZShtTmFtZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1QYXJhbXNba10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoYXIgKm1OYW1lOworICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOworICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7CisgICAgfTsKKworICAgIC8vIGNsYXNzIHRvIHN0b3JlIHZvY3RvciBvZiBFZmZlY3REZXNjCisgICAgY2xhc3MgRWZmZWN0RGVzY1ZlY3RvciB7CisgICAgcHVibGljOgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKCkge30KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVmZmVjdERlc2NWZWN0b3IoKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1FZmZlY3RzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1FZmZlY3RzW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBtRWZmZWN0czsKKyAgICB9OworCisgICAgLy8gY2xhc3MgdG8gc3RvcmUgdm9jdG9yIG9mIEF1ZGlvRWZmZWN0cworICAgIGNsYXNzIEVmZmVjdFZlY3RvciB7CisgICAgcHVibGljOgorICAgICAgICBFZmZlY3RWZWN0b3IoaW50IHNlc3Npb24pIDogbVNlc3Npb25JZChzZXNzaW9uKSwgbVJlZkNvdW50KDApIHt9CisgICAgICAgIC8qdmlydHVhbCovIH5FZmZlY3RWZWN0b3IoKSB7fQorCisgICAgICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIGFsbCBlZmZlY3RzIGluIGVmZmVjdCB2ZWN0b3IKKyAgICAgICAgdm9pZCBzZXRQcm9jZXNzb3JFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgY29uc3QgaW50IG1TZXNzaW9uSWQ7CisgICAgICAgIC8vIEF1ZGlvUG9saWN5TWFuYWdlciBrZWVwcyBtTG9jaywgbm8gbmVlZCBmb3IgbG9jayBvbiByZWZlcmVuY2UgY291bnQgaGVyZQorICAgICAgICBpbnQgbVJlZkNvdW50OworICAgICAgICBWZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+bUVmZmVjdHM7CisgICAgfTsKKworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXTsKKyAgICBzdGF0aWMgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2VOYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtTdHJlYW1OYW1lc1tBVURJT19TVFJFQU1fQ05UKzFdOyAvLysxIHJlcXVpcmVkIGFzIHN0cmVhbXMgc3RhcnQgZnJvbSAtMQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIC8vIFBhcnNlIGF1ZGlvX2VmZmVjdHMuY29uZgorICAgIHN0YXR1c190IGxvYWRBdWRpb0VmZmVjdENvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKworICAgIC8vIExvYWQgYWxsIGVmZmVjdHMgZGVzY3JpcHRvcnMgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CisgICAgRWZmZWN0RGVzYyAqbG9hZEVmZmVjdChjbm9kZSAqcm9vdCk7CisKKyAgICAvLyBMb2FkIGFsbCBhdXRvbWF0aWMgZWZmZWN0IGNvbmZpZ3VyYXRpb25zCisgICAgc3RhdHVzX3QgbG9hZElucHV0RWZmZWN0Q29uZmlndXJhdGlvbnMoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CisgICAgc3RhdHVzX3QgbG9hZFN0cmVhbUVmZmVjdENvbmZpZ3VyYXRpb25zKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmxvYWRFZmZlY3RDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7CisKKyAgICAvLyBMb2FkIGFsbCBhdXRvbWF0aWMgZWZmZWN0IHBhcmFtZXRlcnMKKyAgICB2b2lkIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKGNub2RlICpyb290LCBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+JiBwYXJhbXMpOworICAgIGVmZmVjdF9wYXJhbV90ICpsb2FkRWZmZWN0UGFyYW1ldGVyKGNub2RlICpyb290KTsKKyAgICBzaXplX3QgcmVhZFBhcmFtVmFsdWUoY25vZGUgKm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7CisgICAgc2l6ZV90IGdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSk7CisKKyAgICAvLyBwcm90ZWN0cyBhY2Nlc3MgdG8gbUlucHV0U291cmNlcywgbUlucHV0cywgbU91dHB1dFN0cmVhbXMsIG1PdXRwdXRTZXNzaW9ucworICAgIE11dGV4IG1Mb2NrOworICAgIC8vIEF1dG9tYXRpYyBpbnB1dCBlZmZlY3RzIGFyZSBjb25maWd1cmVkIHBlciBhdWRpb19zb3VyY2VfdAorICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgRWZmZWN0RGVzY1ZlY3RvciogPiBtSW5wdXRTb3VyY2VzOworICAgIC8vIEF1dG9tYXRpYyBpbnB1dCBlZmZlY3RzIGFyZSB1bmlxdWUgZm9yIGF1ZGlvX2lvX2hhbmRsZV90CisgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBFZmZlY3RWZWN0b3IqID4gbUlucHV0czsKKworICAgIC8vIEF1dG9tYXRpYyBvdXRwdXQgZWZmZWN0cyBhcmUgb3JnYW5pemVkIHBlciBhdWRpb19zdHJlYW1fdHlwZV90CisgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3N0cmVhbV90eXBlX3QsIEVmZmVjdERlc2NWZWN0b3IqID4gbU91dHB1dFN0cmVhbXM7CisgICAgLy8gQXV0b21hdGljIG91dHB1dCBlZmZlY3RzIGFyZSB1bmlxdWUgZm9yIGF1ZGlvc2Vzc2lvbiBJRAorICAgIEtleWVkVmVjdG9yPCBpbnQzMl90LCBFZmZlY3RWZWN0b3IqID4gbU91dHB1dFNlc3Npb25zOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lFRkZFQ1RTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTdiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKAorICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQoreworICAgIHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisgICAgZGVsZXRlIGludGVyZmFjZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjQ0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uIGludGVyZmFjZXMKKy8vIGJldHdlZW4gdGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBBbmRyb2lkIGdlbmVyaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgbXVzdCBpbXBsZW1lbnQgbWV0aG9kcyBvZiB0aGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgY2xhc3MuCisvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiB0aGUgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgdG8gY29udHJvbCB0aGUgYWN0aXZpdHkgYW5kCisvLyBjb25maWd1cmF0aW9uIG9mIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKy8vCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBhdWRpbyByb3V0aW5nIGFuZCB2b2x1bWUgY29udHJvbAorLy8gcG9saWNpZXMgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0uCisvLyBUaGUgbWFpbiByb2xlcyBvZiB0aGlzIG1vZHVsZSBhcmU6CisvLyAgIC0ga2VlcCB0cmFjayBvZiBjdXJyZW50IHN5c3RlbSBzdGF0ZSAocmVtb3ZhYmxlIGRldmljZSBjb25uZWN0aW9ucywgcGhvbmUgc3RhdGUsIHVzZXIgcmVxdWVzdHMuLi4pLgorLy8gICBTeXN0ZW0gc3RhdGUgY2hhbmdlcyBhbmQgdXNlciBhY3Rpb25zIGFyZSBub3RpZmllZCB0byBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRoIG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlLgorLy8gICAtIHByb2Nlc3MgZ2V0T3V0cHV0KCkgcXVlcmllcyByZWNlaXZlZCB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0cyBhcmUgY3JlYXRlZDogVGhvc2UgcXVlcmllcworLy8gICByZXR1cm4gYSBoYW5kbGVyIG9uIGFuIG91dHB1dCB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLCBjb25maWd1cmVkIGFuZCBvcGVuZWQgYnkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCB0aGF0CisvLyAgIG11c3QgYmUgdXNlZCBieSB0aGUgQXVkaW9UcmFjayB3aGVuIHJlZ2lzdGVyaW5nIHRvIHRoZSBBdWRpb0ZsaW5nZXIgd2l0aCB0aGUgY3JlYXRlVHJhY2soKSBtZXRob2QuCisvLyAgIFdoZW4gdGhlIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHJlbGVhc2VkLCBhIHB1dE91dHB1dCgpIHF1ZXJ5IGlzIHJlY2VpdmVkIGFuZCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGRlY2lkZQorLy8gICB0byBjbG9zZSBvciByZWNvbmZpZ3VyZSB0aGUgb3V0cHV0IGRlcGVuZGluZyBvbiBvdGhlciBzdHJlYW1zIHVzaW5nIHRoaXMgb3V0cHV0IGFuZCBjdXJyZW50IHN5c3RlbSBzdGF0ZS4KKy8vICAgLSBzaW1pbGFybHkgcHJvY2VzcyBnZXRJbnB1dCgpIGFuZCBwdXRJbnB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1JlY29yZCBvYmplY3RzIGFuZCBjb25maWd1cmUgYXVkaW8gaW5wdXRzLgorLy8gICAtIHByb2Nlc3Mgdm9sdW1lIGNvbnRyb2wgcmVxdWVzdHM6IHRoZSBzdHJlYW0gdm9sdW1lIGlzIGNvbnZlcnRlZCBmcm9tIGFuIGluZGV4IHZhbHVlIChyZWNlaXZlZCBmcm9tIFVJKSB0byBhIGZsb2F0IHZhbHVlCisvLyAgIGFwcGxpY2FibGUgdG8gZWFjaCBvdXRwdXQgYXMgYSBmdW5jdGlvbiBvZiBwbGF0Zm9ybSBzcGVjaWZpYyBzZXR0aW5ncyBhbmQgY3VycmVudCBvdXRwdXQgcm91dGUgKGRlc3RpbmF0aW9uIGRldmljZSkuIEl0CisvLyAgIGFsc28gbWFrZSBzdXJlIHRoYXQgc3RyZWFtcyBhcmUgbm90IG11dGVkIGlmIG5vdCBhbGxvd2VkIChlLmcuIGNhbWVyYSBzaHV0dGVyIHNvdW5kIGluIHNvbWUgY291bnRyaWVzKS4KKy8vCisvLyBUaGUgcGxhdGZvcm0gc3BlY2lmaWMgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMgcHJvdmlkZWQgYXMgYSBzaGFyZWQgbGlicmFyeSBieSBwbGF0Zm9ybSB2ZW5kb3JzIChhcyBmb3IgbGliYXVkaW8uc28pCisvLyBhbmQgaXMgbGlua2VkIHdpdGggbGliYXVkaW9mbGluZ2VyLnNvCisKKworLy8gICAgQXVkaW8gUG9saWN5IE1hbmFnZXIgSW50ZXJmYWNlCitjbGFzcyBBdWRpb1BvbGljeUludGVyZmFjZQoreworCitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lJbnRlcmZhY2UoKSB7fQorICAgIC8vCisgICAgLy8gY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOworICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CisgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gcGhvbmUgc3RhdGUuIFZhbGlkIHBob25lcyBzdGF0ZXMgYXJlIGRlZmluZWQgYnkgYXVkaW9fbW9kZV90CisgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CisgICAgLy8gZm9yY2UgdXNpbmcgYSBzcGVjaWZpYyBkZXZpY2UgY2F0ZWdvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNhZ2UKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOworICAgIC8vIHJldHJpZXZlIGN1cnJlbnQgZGV2aWNlIGNhdGVnb3J5IGZvcmNlZCBmb3IgYSBnaXZlbiB1c2FnZQorICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpID0gMDsKKyAgICAvLyBzZXQgYSBzeXN0ZW0gcHJvcGVydHkgKGUuZy4gY2FtZXJhIHNvdW5kIGFsd2F5cyBhdWRpYmxlKQorICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpID0gMDsKKyAgICAvLyBjaGVjayBwcm9wZXIgaW5pdGlhbGl6YXRpb24KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gcm91dGluZyBxdWVyeSBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gcmVxdWVzdCBhbiBvdXRwdXQgYXBwcm9wcmlhdGUgZm9yIHBsYXliYWNrIG9mIHRoZSBzdXBwbGllZCBzdHJlYW0gdHlwZSBhbmQgcGFyYW1ldGVycworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKSA9IDA7CisgICAgLy8gcmVsZWFzZXMgdGhlIG91dHB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKworICAgIC8vIHJlcXVlc3QgYW4gaW5wdXQgYXBwcm9wcmlhdGUgZm9yIHJlY29yZCBmcm9tIHRoZSBzdXBwbGllZCBkZXZpY2Ugd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RhcnRzIGJlaW5nIHVzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgaW5wdXQgc3RvcHMgYmVpbmcgdXNlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIC8vIHJlbGVhc2VzIHRoZSBpbnB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKworICAgIC8vCisgICAgLy8gdm9sdW1lIGNvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIGluaXRpYWxpc2VzIHN0cmVhbSB2b2x1bWUgY29udmVyc2lvbiBwYXJhbWV0ZXJzIGJ5IHNwZWNpZnlpbmcgdm9sdW1lIGluZGV4IHJhbmdlLgorICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgPSAwOworCisgICAgLy8gc2V0cyB0aGUgbmV3IHN0cmVhbSB2b2x1bWUgYXQgYSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdXBwbGllZCBpbmRleCBmb3IgdGhlCisgICAgLy8gc3VwcGxpZWQgZGV2aWNlLiBCeSBjb252ZW50aW9uLCBzcGVjaWZ5aW5nIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBtZWFucworICAgIC8vIHNldHRpbmcgdm9sdW1lIGZvciBhbGwgZGV2aWNlcworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICAvLyByZXRyaWV2ZSBjdXJyZW50IHZvbHVtZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0gYW5kIHRoZQorICAgIC8vIHNwZWNpZmllZCBkZXZpY2UuIEJ5IGNvbnZlbnRpb24sIHNwZWNpZnlpbmcgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIG1lYW5zCisgICAgLy8gcXVlcnlpbmcgdGhlIHZvbHVtZSBvZiB0aGUgYWN0aXZlIGRldmljZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisKKyAgICAvLyBBdWRpbyBlZmZlY3QgbWFuYWdlbWVudAorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0ID0gMDsKKworICAgIC8vZHVtcCBzdGF0ZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKK307CisKKworLy8gQXVkaW8gUG9saWN5IGNsaWVudCBJbnRlcmZhY2UKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UoKSB7fQorCisgICAgLy8KKyAgICAvLyBBdWRpbyBIVyBtb2R1bGUgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIGxvYWRzIGEgSFcgbW9kdWxlLgorICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKSA9IDA7CisKKyAgICAvLworICAgIC8vIEF1ZGlvIG91dHB1dCBDb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBvcGVucyBhbiBhdWRpbyBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBpbmRpY2F0ZSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCisgICAgLy8gaW4gY2FzZSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaGFzIG5vIHNwZWNpZmljIHJlcXVpcmVtZW50cyBmb3IgdGhlIG91dHB1dCBiZWluZyBvcGVuZWQuCisgICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgIC8vIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBjYW4gY2hlY2sgaWYgdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMgYXJlIHN1aXRhYmxlIG9yIG5vdCBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gVGhlIGR1cGxpY2F0aW9uIGlzIHBlcmZvcm1lZCBieQorICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOworICAgIC8vIGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gc3VzcGVuZHMgdGhlIG91dHB1dC4gV2hlbiBhbiBvdXRwdXQgaXMgc3VzcGVuZGVkLCB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtIGlzIHBsYWNlZCBpbgorICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgLy8gcmVzdG9yZXMgYSBzdXNwZW5kZWQgb3V0cHV0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKKworICAgIC8vCisgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gb3BlbnMgYW4gYXVkaW8gaW5wdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICAvLyBjbG9zZXMgYW4gYXVkaW8gaW5wdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKKyAgICAvLworICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gc2V0IGEgc3RyZWFtIHZvbHVtZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dC4gRm9yIHRoZSBzYW1lIHVzZXIgc2V0dGluZywgYSBnaXZlbiBzdHJlYW0gdHlwZSBjYW4gaGF2ZSBkaWZmZXJlbnQgdm9sdW1lcworICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGludCBkZWxheU1zID0gMCkgPSAwOworCisgICAgLy8gaW52YWxpZGF0ZSBhIHN0cmVhbSB0eXBlLCBjYXVzaW5nIGEgcmVyb3V0ZSB0byBhbiB1bnNwZWNpZmllZCBuZXcgb3V0cHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisKKyAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byBzZW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRvIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKKworICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZworICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKSA9IDA7CisKKyAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKSA9IDA7CisKKyAgICAvLyBtb3ZlIGVmZmVjdCB0byB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkgPSAwOworCisgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKSA9IDA7CisKKyAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKSA9IDA7CisKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKSA9IDA7Cit9OworCitleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CitleHRlcm4gIkMiIHZvaWQgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUludGVyZmFjZSAqaW50ZXJmYWNlKTsKKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMGFjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTAsMCArMSw1ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5SW50ZWZhY2VJbXBsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFICYmCisgICAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdGF0ZSkgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CisKKyAgICAvLyBUT0RPOiBjaGVjayBpZiBpdCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRvIGRvIGl0IGluIHBsYXRmb3JtIHNwZWNpZmljIHBvbGljeSBtYW5hZ2VyCisgICAgQXVkaW9TeXN0ZW06OnNldE1vZGUoc3RhdGUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRQaG9uZVN0YXRlKHN0YXRlKTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBob25lU3RhdGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRGb3JjZVVzZSh1c2FnZSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAorICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgICAgICBpbnB1dCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0KGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KWF1ZGlvU2Vzc2lvbiwgZmxhZ3MpOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZElucHV0RWZmZWN0cyhpbnB1dCwgaW5wdXRTb3VyY2UsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGlucHV0KTsKKyAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKKy8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpMDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gTk9fSU5JVCBoZXJlCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yRWZmZWN0KGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU4MWUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lTZXJ2aWNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKKyAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKKworICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX21vZGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1QaG9uZVN0YXRlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5zZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlLCBjb25maWcpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXQobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2Vfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIG91dHB1dCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKKyAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgICAgICBpbnB1dCA9IG1wQXVkaW9Qb2xpY3ktPmdldF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KSAwKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGlucHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKworICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZElucHV0RWZmZWN0cyhpbnB1dCwgaW5wdXRTb3VyY2UsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RvcF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uIF9fdW51c2VkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtcEF1ZGlvUG9saWN5LT5yZWxlYXNlX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoaW5wdXQpOworICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+aW5pdF9zdHJlYW1fdm9sdW1lKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyYXRlZ3lfZm9yX3N0cmVhbShtcEF1ZGlvUG9saWN5LCBzdHJlYW0pOworfQorCisvL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlc19mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIE5PX0lOSVQgaGVyZQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXRfZm9yX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+dW5yZWdpc3Rlcl9lZmZlY3QobXBBdWRpb1BvbGljeSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9lZmZlY3RfZW5hYmxlZChtcEF1ZGlvUG9saWN5LCBpZCwgZW5hYmxlZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc3RyZWFtX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmVfcmVtb3RlbHkobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHNvdXJjZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyA9PSAwKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIm1wQXVkaW9Qb2xpY3kgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIkhBTCBkb2VzIG5vdCBpbXBsZW1lbnQgaXNfb2ZmbG9hZF9zdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZChtcEF1ZGlvUG9saWN5LCAmaW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uIF9fdW51c2VkKQoreworICAgICpudW1fcG9ydHMgPSAwOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCwKKyAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uIF9fdW51c2VkKQoreworICAgICpudW1fcGF0Y2hlcyA9IDA7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKKworICAgIHJldHVybiBnZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjk4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNzI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXQoKQorI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInJlbW90ZSIgd2hlbiBldmFsdWF0aW5nCisvLyBhY3RpdmUgb3V0cHV0IGRldmljZXMgaW4gaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgpCisjZGVmaW5lIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKKy8vIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KKyNkZWZpbmUgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgU3RyaW5nVG9FbnVtIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQzMl90IHZhbHVlOworfTsKKworI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRGV2aWNlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKK307CisKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHRhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHRhYmxlW2ldLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICpBdWRpb1BvbGljeU1hbmFnZXI6OmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAodGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlOiAleCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworCisgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKKyAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQorICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKKyAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKKyAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoYWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgYWRkcmVzcyk7CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgICAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCisgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgIGlmICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobU91dHB1dHMua2V5QXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQorICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhbU91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSAgLy8gZW5kIGlmIGlzIG91dHB1dCBkZXZpY2UKKworICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2VzCisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0czsKKworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtb2R1bGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihhZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cywgYWRkcmVzcyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2VBbGxJbnB1dHMoKTsKKworICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IC8vIGVuZCBpZiBpcyBpbnB1dCBkZXZpY2UKKworICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUgPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBEZXZpY2VWZWN0b3IgKmRldmljZVZlY3RvcjsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIGluZGV4ID0gZGV2aWNlVmVjdG9yLT5pbmRleE9mKGRldkRlc2MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zKQoreworICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisKKyAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsUnhQYXRjaC5jbGVhcigpOworICAgIH0KKyAgICAvLyByZWxlYXNlIFRYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOworICAgIH0KKworICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzCisgICAgLy8gdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgorICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSAmIHJ4RGV2aWNlKSB7CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIHRydWUsIGRlbGF5TXMpOworICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIGFsc28gb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCBzZXRPdXRwdXREZXZpY2UoKSB3aWxsIHRha2UgY2FyZQorICAgICAgICAvLyBvZiBpdCBkdWUgdG8gbGVnYWN5IGltcGxlbWVudGF0aW9uLiBJZiBub3QsIGNyZWF0ZSBhIHBhdGNoLgorICAgICAgICBpZiAoKGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIHR4RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pCisgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY3JlYXRlIFJYIHBhdGggYXVkaW8gcGF0Y2gKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShyeERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBvdXRwdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFJYIGRldmljZSIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKworICAgICAgICByeFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcnhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBSWCBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShyeERldmljZSwgbU91dHB1dHMpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgIH0KKyAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeworCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKKyAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKKworICAgIC8vIGFyZSB3ZSBlbnRlcmluZyBvciBzdGFydGluZyBhIGNhbGwKKyAgICBpZiAoIWlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEVudGVyaW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN0YXJ0aW5nIGEgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9EVE1GXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX1ZPSUNFX0NBTExdW2pdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiAhaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBleGl0aW5nIGEgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9EVE1GXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0RUTUZdW2pdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIFN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworCisgICAgaW50IGRlbGF5TXMgPSAwOworICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAorICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCisgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5TXMgPCAoaW50KWRlc2MtPm1MYXRlbmN5KjIpKSB7CisgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPm1MYXRlbmN5KjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIG1PdXRwdXRzLmtleUF0KGkpLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG1PdXRwdXRzLmtleUF0KGkpLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAvLyB0aGUgZGV2aWNlIHJldHVybmVkIGlzIG5vdCBuZWNlc3NhcmlseSByZWFjaGFibGUgdmlhIHRoaXMgb3V0cHV0CisgICAgYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAorICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgcnhEZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcnhEZXZpY2UgPSBod091dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcocnhEZXZpY2UsIGRlbGF5TXMpOworICAgIH0gZWxzZSBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgIH0KKyAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgeworICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbVBob25lU3RhdGUpOworCisgICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOworICAgIHN3aXRjaCh1c2FnZSkgeworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hFQURQSE9ORVMgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0sgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQ6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0s6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU06CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1NZU1RFTSIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU86CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvckhETUlfU1lTVEVNX0FVRElPIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIHVzYWdlICVkIiwgdXNhZ2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKKyAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIG5ld0RldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7CisgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDApIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZUlucHV0KSk7CisgICAgfQorCit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpCit7CisgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKK30KKworLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbworLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA6IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICBpZiAoZm91bmQgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLAorICAgICAgICAgICAgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCkgY2FsbGVkIHdpdGggTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHVzYWdlPSVkLCBjb250ZW50PSVkLCB0YWc9JXMgZmxhZ3M9JTA4eCIsCisgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT50YWdzLCBhdHRyLT5mbGFncyk7CisKKyAgICAvLyBUT0RPIHRoaXMgaXMgd2hlcmUgZmlsdGVyaW5nIGZvciBjdXN0b20gcG9saWNpZXMgKHJlcm91dGluZywgZHluYW1pYyBzb3VyY2VzKSB3aWxsIGdvCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoYXR0cik7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBkZXZpY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChhdHRyKTsKKyAgICByZXR1cm4gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLAorICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7CisKKyAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBtVGVzdERldmljZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1EaXJlY3RPdXRwdXQgPyBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1UZXN0Q2hhbm5lbHM7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbVRlc3RGb3JtYXQ7CisgICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLG1DdXJPdXRwdXQpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSxvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XTsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQorCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0CisgICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CisgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAorICAgICAgICAgICAgIWlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAocHJvZmlsZSAhPSAwKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IGRlc2M7CisgICAgICAgICAgICAgICAgLy8gcmV1c2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc2FtcGxpbmdSYXRlID09IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xvc2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChvdXRwdXREZXNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0oYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworCisgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAoc2FtcGxpbmdSYXRlICE9IDAgJiYgc2FtcGxpbmdSYXRlICE9IGNvbmZpZy5zYW1wbGVfcmF0ZSkgfHwKKyAgICAgICAgICAgIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgeworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGluZ1JhdGUgJWQgJWQsIgorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsTWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKK25vbl9kaXJlY3Rfb3V0cHV0OgorCisgICAgLy8gaWdub3JpbmcgY2hhbm5lbCBtYXNrIGR1ZSB0byBkb3dubWl4IGNhcGFiaWxpdHkgaW4gbWl4ZXIKKworICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAorCisgICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAorICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgorICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIGZsYWdzLCBmb3JtYXQpOworICAgIH0KKyAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCisgICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgorICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCisgICAgLy8gMjogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRzWzBdOworICAgIH0KKworICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKKyAgICB9CisgICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgorICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKKyAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQorICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIHVpbnQzMl90IHdhaXRNcyA9IDA7CisgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpcyBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3CisgICAgICAgICAgICAgICAgLy8gbW9kdWxlIGFuZCBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgorICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gbmV3RGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmICh3YWl0TXMgPCBsYXRlbmN5KSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSk7CisKKyAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KG5ld0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgorICAgICAgICAvLyByb3V0aW5nCisgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgaWYgKHdhaXRNcyA+IG11dGVXYWl0TXMpIHsKKyAgICAgICAgICAgIHVzbGVlcCgod2FpdE1zIC0gbXV0ZVdhaXRNcykgKiAyICogMTAwMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CisgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0CisgICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQorICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgorICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCisgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZmFsc2UsIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOworCisgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQorICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGN1ck91dHB1dCAhPSBvdXRwdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGN1ck91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShjdXJPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpbnQgdGVzdEluZGV4ID0gdGVzdE91dHB1dEluZGV4KG91dHB1dCk7CisgICAgaWYgKHRlc3RJbmRleCAhPSAwKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIC8vIElmIGVmZmVjdHMgd2hlcmUgcHJlc2VudCBvbiB0aGUgb3V0cHV0LCBhdWRpb2ZsaW5nZXIgbW92ZWQgdGhlbSB0byB0aGUgcHJpbWFyeQorICAgICAgICAgICAgLy8gb3V0cHV0IGJ5IGRlZmF1bHQ6IG1vdmUgdGhlbSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQuCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgICAgIGlmIChkc3RPdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBtUHJpbWFyeU91dHB1dCwgZHN0T3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgQUxPR1YoImdldElucHV0KCkgaW5wdXRTb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3giLAorICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb24sIGZsYWdzKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7CisKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dCgpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3IgaW5wdXRTb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICAvLyBhZGFwdCBjaGFubmVsIHNlbGVjdGlvbiB0byBpbnB1dCBzb3VyY2UKKyAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIgPSBmYWxzZTsKKyAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBpbnB1dCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKKyAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKTsKKyAgICAgICAgICAgIEFMT0dWKCJTb3VuZFRyaWdnZXIgY2FwdHVyZSBvbiBzZXNzaW9uICVkIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAocHJvZmlsZSA9PSAwKSB7CisgICAgICAgIC8vcmV0cnkgd2l0aG91dCBmbGFncworICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxvZ19mbGFncyA9IGZsYWdzOworICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgaWYgKHByb2ZpbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0KCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGxvZ19mbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dCgpOiBIVyBtb2R1bGUgJXMgbm90IG9wZW5lZCIsIHByb2ZpbGUtPm1Nb2R1bGUtPm1OYW1lKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKKyAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAoZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8CisgICAgICAgIChjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4IiwKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICBpZiAoaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50ID0gMDsKKyAgICBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPSAxOworICAgIGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMuYWRkKHNlc3Npb24pOworICAgIGlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyID0gaXNTb3VuZFRyaWdnZXI7CisKKyAgICBhZGRJbnB1dChpbnB1dCwgaW5wdXREZXNjKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0YXJ0SW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyB2aXJ0dWFsIGlucHV0IGRldmljZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBpbnB1dCBkZXZpY2VzCisgICAgaWYgKCFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisKKyAgICAgICAgLy8gZm9yIGEgbm9uLXZpcnR1YWwgaW5wdXQgZGV2aWNlLCBjaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIChub24tdmlydHVhbCkgYWN0aXZlIGlucHV0CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDAgJiYgYWN0aXZlSW5wdXQgIT0gaW5wdXQpIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGFscmVhZHkgYWN0aXZlIGlucHV0IHVzZXMgQVVESU9fU09VUkNFX0hPVFdPUkQgdGhlbiBpdCBpcyBjbG9zZWQsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGFjdGl2ZSBpbnB1dCBjb250aW51ZXMgYW5kIHRoZSBuZXcgaW5wdXQgY2Fubm90IGJlIHN0YXJ0ZWQuCisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBwcmVlbXB0aW5nIGxvdy1wcmlvcml0eSBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CisgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dCksIHRydWUgLyogZm9yY2UgKi8pOworCisgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQuCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIEFVRElPX1JFTU9URV9TVUJNSVhfREVWSUNFX0FERFJFU1MpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBBVURJT19SRU1PVEVfU1VCTUlYX0RFVklDRV9BRERSRVNTKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOworCisgICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKKyAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2xvc2VJbnB1dChpbnB1dCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKKyAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOworCisgICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7CisgICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICB9CisgICAgbUlucHV0cy5jbGVhcigpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBpZiAocGF0Y2hSZW1vdmVkKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7CisgICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWluID0gaW5kZXhNaW47CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXggPSBpbmRleE1heDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisKKyAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4pIHx8IChpbmRleCA+IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAorICAgIGlmICghbVN0cmVhbXNbc3RyZWFtXS5tQ2FuQmVNdXRlZCkgaW5kZXggPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKworICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKKyAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKKyAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmNsZWFyKCk7CisgICAgfQorICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKKworICAgIC8vIGNvbXB1dGUgYW5kIGFwcGx5IHN0cmVhbSB2b2x1bWUgb24gYWxsIG91dHB1dHMgYWNjb3JkaW5nIHRvIGNvbm5lY3RlZCBkZXZpY2UKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPQorICAgICAgICAgICAgICAgIGdldERldmljZUZvclZvbHVtZShtT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2UoKSk7CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKGRldmljZSA9PSBjdXJEZXZpY2UpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIGluZGV4LCBtT3V0cHV0cy5rZXlBdChpKSwgY3VyRGV2aWNlKTsKKyAgICAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShnZXRTdHJhdGVneShzdHJlYW0pLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKworICAgICppbmRleCA9ICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSk7CisgICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dEZvckVmZmVjdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCBzdWl0YWJsZSBmb3IgZ2xvYmFsIGVmZmVjdHMuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogQW4gb2ZmbG9hZGVkIG91dHB1dC4gSWYgdGhlIGVmZmVjdCBlbmRzIHVwIG5vdCBiZWluZyBvZmZsb2FkYWJsZSwKKyAgICAvLyAgICBBdWRpb0ZsaW5nZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSB0cmFjayBhbmQgdGhlIG9mZmxvYWRlZCBvdXRwdXQKKyAgICAvLyAgICB3aWxsIGJlIGNsb3NlZCBjYXVzaW5nIHRoZSBlZmZlY3QgdG8gYmUgbW92ZWQgdG8gYSBQQ00gb3V0cHV0LgorICAgIC8vIDI6IEEgZGVlcCBidWZmZXIgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0T2ZmbG9hZGVkID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0c1slenVdIGZsYWdzICV4IiwgaSwgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlZXBCdWZmZXIgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0T2ZmbG9hZGVkICVkIG91dHB1dERlZXBCdWZmZXIgJWQiLAorICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCwgb3V0cHV0RGVlcEJ1ZmZlcik7CisgICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRPZmZsb2FkZWQ7CisgICAgfQorICAgIGlmIChvdXRwdXREZWVwQnVmZmVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERlZXBCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBmeCAlcyBmbGFncyAleCIsCisgICAgICAgICAgb3V0cHV0LCAoZGVzYyA9PSBOVUxMKSA/ICJ1bnNwZWNpZmllZCIgOiBkZXNjLT5uYW1lLCAgKGRlc2MgPT0gTlVMTCkgPyAwIDogZGVzYy0+ZmxhZ3MpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgeworICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKKyAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKKyAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneTsKKyAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKKworICAgIG1FZmZlY3RzLmFkZChpZCwgZWZmZWN0RGVzYyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBtZW1vcnkgJWQgdG90YWwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGlkLCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBtRWZmZWN0cy5yZW1vdmVJdGVtKGlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gc2V0RWZmZWN0RW5hYmxlZChtRWZmZWN0cy52YWx1ZUF0KGluZGV4KSwgZW5hYmxlZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkID09IGVmZmVjdERlc2MtPm1FbmFibGVkKSB7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKCVzKSBlZmZlY3QgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgZW5hYmxlZD8idHJ1ZSI6ImZhbHNlIiwgZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID4gZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCisgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIChmbG9hdCllZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLzEwKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCAtPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0KKyAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgICAgICgoZWZmZWN0RGVzYy0+bURlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgJXMgZW5hYmxlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGVmZmVjdERlc2MtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IChpbnQpc291cmNlIHx8CisgICAgICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gJiYKKyAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKQorICAgICAgICAgICAgICYmIChpbnB1dERlc2NyaXB0b3ItPm1SZWZDb3VudCA+IDApKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLCBtUHJpbWFyeU91dHB1dCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQaG9uZSBzdGF0ZTogJWRcbiIsIG1QaG9uZVN0YXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCisgICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKKyAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlczpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gQXZhaWxhYmxlIGlucHV0IGRldmljZXM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUh3TW9kdWxlc1tpXS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1PdXRwdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIG1JbnB1dHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1TdHJlYW1zW2ldLmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKKyAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIG1FZmZlY3RzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtRWZmZWN0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9QYXRjaGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1BhdGNoZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCisvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5CisvLyBvZiB0aGUgc3lzdGVtLgorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCit7CisgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKKyAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lIiBQUklkNjQgIiB1cywgaGFzX3ZpZGVvPSVkIiwKKyAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKKyAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSwgb2ZmbG9hZEluZm8uYml0X3JhdGUsIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzLAorICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8pOworCisgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAorICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7CisgICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgorICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCisgICAgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL1RPRE86IGVuYWJsZSBhdWRpbyBvZmZsb2FkaW5nIHdpdGggdmlkZW8gd2hlbiByZWFkeQorICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8pCisgICAgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgeworICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAoaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCisgICAgLy8gQVVESU9fREVWSUNFX05PTkUKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOworICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcG9ydHMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwb3J0c1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwb3J0c01heCA9ICpudW1fcG9ydHM7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUlucHV0cy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0cyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0c1tpXS0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0cysrOworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbnVtT3V0cHV0czsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSBnb3QgJXp1IHBvcnRzIG5lZWRlZCAlZCIsIHBvcnRzV3JpdHRlbiwgKm51bV9wb3J0cyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZyb21JZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXREZXNjOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0RnJvbUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0RGVzYzsKK30KKworc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRm9yRGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKK3sKKyAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAobUh3TW9kdWxlc1tpXS0+bU5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGU7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkKK3sKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlcyAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKQoreworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBwcmltYXJ5SGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpLT5tUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bU1vZHVsZS0+bUhhbmRsZSA9PSBwcmltYXJ5SGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzIHw9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQoreworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkiKTsKKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKKyAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIG9ubHkgb25lIHNvdXJjZSBwZXIgYXVkaW8gcGF0Y2ggc3VwcG9ydGVkIGZvciBub3cKKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzb3VyY2UgaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpOworI2lmIExPR19OREVCVUcgPT0gMAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNpbmsgJWQ6IGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIGksIHBhdGNoLT5zaW5rc1tpXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqaGFuZGxlID0gMDsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwiZHVwbGljYXRlZCBvdXRwdXQgJWQgaW4gc291cmNlIGluIHBvcnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBtaXggdG8gZGV2aWNlcyBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBtaXggdG8gbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgbWl4IGJ1dCBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dCBkZXZpY2Ugbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwcm9maWxlIG5vdCBzdXBwb3J0ZWQgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlcy50eXBlcygpLCB0cnVlLCAwLCBoYW5kbGUpOworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0T3V0cHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0T3V0cHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgLy8gaW5wdXQgZGV2aWNlIHRvIGlucHV0IG1peCBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBvbmx5IG9uZSBzaW5rIHN1cHBvcnRlZCB3aGVuIGNvbm5lY3RpbmcgYW4gaW5wdXQgZGV2aWNlIHRvIGEgbWl4CisgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc2lua3NbMF0uaWQgIT0gcGF0Y2gtPnNpbmtzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+bURldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPm1EZXZpY2VUeXBlLCB0cnVlLCBoYW5kbGUpOworICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgLy8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5CisgICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOworICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgZGV2aWNlIGJ1dCBvbmUgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOworCisgICAgICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUgIT0gc2lua0RldmljZURlc2MtPm1Nb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0ZWQgZGV2aWNlcyBhY3Jvc3MgSFcgbW9kdWxlcworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdQYXRjaCwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQoreworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZwYXRjaERlc2MtPm1QYXRjaDsKKyAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIHRydWUgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGlucHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAoKm51bV9wYXRjaGVzICE9IDAgJiYgcGF0Y2hlcyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAorICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgbUF1ZGlvUGF0Y2hlcy5zaXplKCkpOworICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wYXRjaGVzID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgcGF0Y2hlc1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwYXRjaGVzTWF4ID0gKm51bV9wYXRjaGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgaSAgPCBtQXVkaW9QYXRjaGVzLnNpemUoKSAmJiBwYXRjaGVzV3JpdHRlbiA8IHBhdGNoZXNNYXg7IGkrKykgeworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuXSA9IG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaDsKKyAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IG1BdWRpb1BhdGNoZXNbaV0tPm1IYW5kbGU7CisgICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgIGksIG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaC5udW1fc291cmNlcywgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zaW5rcyk7CisgICAgfQorICAgICpudW1fcGF0Y2hlcyA9IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOworCisgICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkiKTsKKworICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkgb24gcG9ydCBoYW5kbGUgJWQiLCBjb25maWctPmlkKTsKKyAgICAvLyBPbmx5IHN1cHBvcnQgZ2FpbiBjb25maWd1cmF0aW9uIGZvciBub3cKKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAhPSBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZzsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gaW5wdXREZXNjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKKyAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlRGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGRldmljZURlc2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOworICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZiYWNrdXBDb25maWcpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCit7CisgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDwgKHNzaXplX3QpbUF1ZGlvUGF0Y2hlcy5zaXplKCk7IGkrKykgIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgLy8gcmVsZWFzZUF1ZGlvUGF0Y2goKSByZW1vdmVzIHRoZSBwYXRjaCBmcm9tIG1BdWRpb1BhdGNoZXMKKyAgICAgICAgICAgIGlmIChyZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICpkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisKKyAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWRkKCpzZXNzaW9uLCAqaW9IYW5kbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigpIHNlc3Npb24gJWQgbm90IHJlZ2lzdGVyZWQiLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgYWxyZWFkeSBpbiIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgbUF1ZGlvUGF0Y2hlcy5hZGQoaGFuZGxlLCBwYXRjaCk7CisgICAgQUxPR1YoImFkZEF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBzb3VyY2UgaGFuZGxlICVkIgorICAgICAgICAgICAgInNpbmsgaGFuZGxlICVkIiwKKyAgICAgICAgICBoYW5kbGUsIHBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcywgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3MsCisgICAgICAgICAgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVtb3ZlQXVkaW9QYXRjaCgpIHBhdGNoICVkIG5vdCBpbiIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIiwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCktPm1BZlBhdGNoSGFuZGxlKTsKKyAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dFVuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDoKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIFRocmVhZChmYWxzZSksCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1QcmltYXJ5T3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkwKSwKKyAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKKyAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKKyAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisgICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKSwKKyAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKQoreworICAgIG1VaWRDYWNoZWQgPSBnZXR1aWQoKTsKKyAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgeworICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOworICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKKworICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kKKyAgICBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7CisKKyAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXREZXZpY2VUeXBlcworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUpOworCisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBpbnB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcyB0byB2YWxpZGF0ZQorICAgICAgICAvLyBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIGxpc3QKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBpblByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKKworICAgICAgICAgICAgaWYgKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgLy8gaW5wdXREZXZpY2VUeXBlcworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7CisKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOworCisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gaW5wdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoaW5Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCisgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgeworICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7CisgICAgfQorCisgICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOworICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKKyAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOworICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorfQorCitBdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQoreworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgZXhpdCgpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgIH0KKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGkpKTsKKyAgIH0KKyAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNsZWFyKCk7CisgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNsZWFyKCk7CisgICBtT3V0cHV0cy5jbGVhcigpOworICAgbUlucHV0cy5jbGVhcigpOworICAgbUh3TW9kdWxlcy5jbGVhcigpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtUHJpbWFyeU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKK30KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dGhyZWFkTG9vcCgpCit7CisgICAgQUxPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIFN0cmluZzggY29tbWFuZDsKKyAgICAgICAgaW50IHZhbHVlSW50OworICAgICAgICBTdHJpbmc4IHZhbHVlOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7CisKKyAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKKworICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKKyAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7CisgICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7CisgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9NUDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Rm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiZm9ybWF0IiksIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpKTsKKyAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJDaGFubmVscyBTdGVyZW8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOworCisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gb3V0cHV0RGVzYy0+bU1vZHVsZS0+bUhhbmRsZTsKKworICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obVByaW1hcnlPdXRwdXQpOworCisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobW9kdWxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUHJpbWFyeU91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChtUHJpbWFyeU91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZXhpdCgpCit7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Cit9CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKy8vIC0tLQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKKyAgICBvdXRwdXREZXNjLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCit7CisgICAgaW5wdXREZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKKyAgICBpbnB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCisgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgeworICAgIC8vIGxvb2sgZm9yIGEgbWF0Y2ggb24gdGhlIGdpdmVuIGFkZHJlc3Mgb24gdGhlIGFkZHJlc3NlcyBvZiB0aGUgb3V0cHV0czoKKyAgICAvLyBmaW5kIHRoZSBhZGRyZXNzIGJ5IGZpbmRpbmcgdGhlIHBhdGNoIHRoYXQgbWFwcyB0byB0aGlzIG91dHB1dAorICAgIHNzaXplX3QgcGF0Y2hJZHggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoZGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAvL0FMT0dWKCIgICAgaW5zcGVjdGluZyBvdXRwdXQgJWQgKHBhdGNoICVkKSBmb3Igc3VwcG9ydGVkIGRldmljZT0weCV4IiwKKyAgICAvLyAgICAgICAgb3V0cHV0SWR4LCBwYXRjaElkeCwgIGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKyAgICBpZiAocGF0Y2hJZHggPj0gMCkgeworICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hJZHgpOworICAgICAgICBjb25zdCBpbnQgbnVtU2lua3MgPSBwYXRjaERlc2MtPm1QYXRjaC5udW1fc2lua3M7CisgICAgICAgIGZvciAoc3NpemVfdCBqPTA7IGogPCBudW1TaW5rczsgaisrKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGF0Y2hBZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzW2pdLmV4dC5kZXZpY2UuYWRkcmVzczsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChwYXRjaEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLCAgcGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+bURldmljZVR5cGU7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcworICAgIGRldkRlc2MtPmNsZWFyQ2FwYWJpbGl0aWVzKCk7CisKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgY2hlY2tpbmcgYWRkcmVzcyBtYXRjaCBkdWUgdG8gZGV2aWNlIDB4JXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiAgZm91bmQgJWQgcHJvZmlsZXMsICVkIG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIG91dHB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IG91dHB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgb3V0cHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBwcm9maWxlOiBzYXZlIHRoZSBzYW1wbGUgcmF0ZXMsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHByb2ZpbGUgaW4gb3VyIGRldmljZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSk7CisgICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAorICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCisgICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKKyAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGZvcm1hdHMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIG1pc3NpbmcgcGFyYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCB8fCBwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkdXBsaWNhdGVkT3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gZHVwIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgICghKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgPT0gZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIGlucHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBpbnB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pZHggPSAwOyBtb2R1bGVfaWR4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgaW5wdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wZW4gaW5wdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBpbnB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IHByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgaW5wdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQorICAgICAgICAgICAgc2l6ZV90IGlucHV0X2luZGV4OworICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRfaW5kZXggIT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAweCVYIHdpdGggcGFyYW1zICVzIiwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dCwgU3RyaW5nOChwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcworICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7CisgICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgZm9ybWF0cyAlcyIsIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRJbkNoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBtaXNzaW5nIHBhcmFtIik7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dChpbnB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCisKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2luZGV4ID0gMDsgbW9kdWxlX2luZGV4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKKyAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKKyAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFzIGFsbCBhY3RpdmUgdHJhY2tzIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IHdpbGwgYmUgZGVsZXRlZCwKKyAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCisgICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQoZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoImNsb3NlSW5wdXQoJWQpIiwgaW5wdXQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworfQorCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gb3Blbk91dHB1dHMpCit7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworCisgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJWQgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRzOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3sKKyAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOworICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBzcmNPdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBzcmNPdXRwdXRzW2ldLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBmeE91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG1vdmVkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChlZmZlY3REZXNjLT5tU2Vzc2lvbiA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyAhPSBmeE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWQuaW5kZXhPZihlZmZlY3REZXNjLT5tSW8pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3ZpbmcgZWZmZWN0ICVkIHRvIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0cy5rZXlBdChpKSwgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgZWZmZWN0RGVzYy0+bUlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkLmFkZChlZmZlY3REZXNjLT5tSW8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyA9IGZ4T3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQoreworICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBMmRwT3V0cHV0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgb3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQoreworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQgPSBnZXRBMmRwT3V0cHV0KCk7CisgICAgaWYgKGEyZHBPdXRwdXQgPT0gMCkgeworICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBpc1Njb0Nvbm5lY3RlZCA9CisgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgIT0gMDsKKyAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8CisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQorICAgIC8vCisgICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKKyAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8CisgICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCisgICAgLy8KKyAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKKyAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgJiYKKyAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKKyAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCisgICAgICAgICAgICAgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHx8CisgICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8CisgICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7CisgICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgorICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKKyAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQorICAgIC8vIDM6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKKyAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCisgICAgLy8gNTogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCisgICAgLy8gNjogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKKyAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgorICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9QSE9ORSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRFRNRikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKKyAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCisgICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KKyAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlczsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKKyAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCisgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgeworICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoIChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlIik7CisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisgICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0CisgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKKyAgICAvLyBmbGFncyB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfUEhPTkU7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfTUVESUE7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHN3aXRjaChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIGlmIChmcm9tQ2FjaGUpIHsKKyAgICAgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZyb20gY2FjaGUgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsCisgICAgICAgICAgICAgIHN0cmF0ZWd5LCBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldKTsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV07CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgc3dpdGNoIChzdHJhdGVneSkgeworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQorICAgICAgICAgICAgLy8gICB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90CisgICAgICAgICAgICAvLyAgIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKQorICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIChvciBoYXMgcmVjZW50bHkgcGxheWVkKSwgdXNlIHRoZSBzYW1lIGRldmljZQorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCisgICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9EVE1GOgorICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gb2ZmIGNhbGwsIERUTUYgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBNRURJQSBzdHJhdGVneQorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcworICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CisgICAgICAgIC8vIEZvcmNlIHVzZSBvZiBvbmx5IGRldmljZXMgb24gcHJpbWFyeSBvdXRwdXQgaWY6CisgICAgICAgIC8vIC0gaW4gY2FsbCBBTkQKKyAgICAgICAgLy8gICAtIGNhbm5vdCByb3V0ZSBmcm9tIHZvaWNlIGNhbGwgUlggT1IKKyAgICAgICAgLy8gICAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wIGFuZCBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgaWYgKCgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKCh0eERldmljZSAmIGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChod091dHB1dERlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5tSGFsVmVyc2lvbiA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApKSkgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieSBvcmRlcgorICAgICAgICAvLyBvZiBwcmlvcml0eQorICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KKyAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9QSE9ORSwgRk9SQ0VfU1BFQUtFUiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgorCisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKKyAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisgICAgICAgIC8vIGV4Y2VwdDoKKyAgICAgICAgLy8gICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKyAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisKKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIHNlY29uZCBkZXZpY2UgdXNlZCBmb3Igc29uaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXZpY2UgdXNlZCBieSBtZWRpYSBzdHJhdGVneQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfTUVESUE6IHsKKyAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIGF1eCBkaWdpdGFsIChlLmcuIEhETUkpCisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisgICAgICAgIGludCBkZXZpY2UzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgLy8gQVJDLCBTUERJRiBhbmQgQVVYX0xJTkUgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzLgorICAgICAgICAgICAgZGV2aWNlMyA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUERJRik7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlMiB8PSBkZXZpY2UzOworICAgICAgICAvLyBkZXZpY2UgaXMgREVWSUNFX09VVF9TUEVBS0VSIGlmIHdlIGNvbWUgZnJvbSBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTiBvcgorICAgICAgICAvLyBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBBVURJT19ERVZJQ0VfTk9ORSBvdGhlcndpc2UKKyAgICAgICAgZGV2aWNlIHw9IGRldmljZTI7CisKKyAgICAgICAgLy8gSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9PQorICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9NRURJQSIpOworICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSB1bmtub3duIHN0cmF0ZWd5OiAlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKHBvcGNvdW50KGRldmljZSkgPj0gMik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKKworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9NdXRlKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKKyAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChqKTsKKyAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlLCBjdXJPdXRwdXQpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBjdXJPdXRwdXQsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgdGltZSB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcHJvY2VzcyBhIGJ1ZmZlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gb25lIGJ1ZmZlciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgZGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bworICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7CisgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIC8vIGRvIHRlbXBNdXRlIHVubXV0ZSBhZnRlciB0d2ljZSB0aGUgbXV0ZSB3YWl0IHRpbWUKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAorICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgeworICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7CisgICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCit7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIG91dHB1dCAlZCBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKKworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQxLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0Mi0+bUlvSGFuZGxlLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKKyAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAlMDR4IiwgcHJldkRldmljZSk7CisKKyAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgfQorICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworCisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKKyAgICAvLyAgLSB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBBVURJT19ERVZJQ0VfTk9ORQorICAgIC8vICAtIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlIGFuZCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucworICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJiAhZm9yY2UpIHsKKyAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHNldHRpbmcgc2FtZSBkZXZpY2UgJTA0eCBvciBudWxsIGRldmljZSBmb3Igb3V0cHV0ICVkIiwgZGV2aWNlLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisKKyAgICAvLyBkbyB0aGUgcm91dGluZworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBkZWxheU1zLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IChhZGRyZXNzID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKQorICAgICAgICAgICAgICAgIDogbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAwOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgorICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluZm9ybSBhbGwgaW5wdXQgYXMgd2VsbAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgaW5wdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogaW5mb3JtIGlucHV0ICVkIG9mIGRldmljZTolZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIGlucHV0Q21kLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSxkZXZpY2UpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q21kLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgc3RyZWFtIHZvbHVtZXMgYWNjb3JkaW5nIHRvIG5ldyBkZXZpY2UKKyAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworCisgICAgcmV0dXJuIG11dGVXYWl0TXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIH0KKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCJyZXNldE91dHB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgeworICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CisgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCisgICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIpIHsKKyAgICAgICAgICAgICAgICBwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKKyAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4OworICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigic2V0SW5wdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgQUxPR1YoInJlc2V0SW5wdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIC8vIENob29zZSBhbiBpbnB1dCBwcm9maWxlIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2FwdHVyZSBwYXJhbWV0ZXJzOiBzZWxlY3QgdGhlIGZpcnN0IGF2YWlsYWJsZQorICAgIC8vIHByb2ZpbGUgc3VwcG9ydGluZyBhbGwgcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgeworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIC8vIHByb2ZpbGUtPmxvZygpOworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX291dHB1dF9mbGFnc190KSBmbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCit7CisgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAvLyBBbGxvdyBvbmx5IHVzZSBvZiBkZXZpY2VzIG9uIHByaW1hcnkgaW5wdXQgaWYgaW4gY2FsbCBhbmQgSEFMIGRvZXMgbm90IHN1cHBvcnQgcm91dGluZworICAgICAgICAvLyB0byB2b2ljZSBjYWxsIHBhdGguCisgICAgICAgIGlmICgobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpID09IDApIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CisgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEFMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgeworICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKKyAgICByZXR1cm4gKChkZXZpY2UgJiBBUE1fQVVESU9fREVWSUNFX01BVENIX0FERFJFU1NfQUxMKSAhPSAwKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChpbnB1dF9kZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fCAhaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXRfZGVzY3JpcHRvci0+bURldmljZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0Cit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiBmb3JjaW5nIGEgcm91dGUgdXBkYXRlIGFuZCBubyB0cmFjayBpcyBhY3RpdmUgb24gYW4gb3V0cHV0LgorICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBpbXBvcnRhbnQuCisgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgfSBlbHNlIGlmIChwb3Bjb3VudChkZXZpY2UpID4gMSkgeworICAgICAgICAvLyBNdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uIGlzIGVpdGhlcjoKKyAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCisgICAgICAgIC8vICAtIG9uZSBBMkRQIGRldmljZSArIGFub3RoZXIgZGV2aWNlOiBoYXBwZW5zIHdpdGggZHVwbGljYXRlZCBvdXRwdXQuIEluIHRoaXMgY2FzZQorICAgICAgICAvLyByZXRhaW4gdGhlIGRldmljZSBvbiB0aGUgQTJEUCBvdXRwdXQgYXMgdGhlIG90aGVyIG11c3Qgbm90IGNvcnJlc3BvbmQgdG8gYW4gYWN0aXZlCisgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCisgICAgICAgIC8vICAtIEhETUktQ0VDIHN5c3RlbSBhdWRpbyBtb2RlIG9ubHkgb3V0cHV0OiBnaXZlIHByaW9yaXR5IHRvIGF2YWlsYWJsZSBpdGVtIGluIG9yZGVyLgorICAgICAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BESUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qU1BFQUtFUl9TQUZFIGlzIGFuIGFsaWFzIG9mIFNQRUFLRVIgZm9yIHB1cnBvc2VzIG9mIHZvbHVtZSBjb250cm9sKi8KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKQorICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisKKyAgICBBTE9HV19JRihwb3Bjb3VudChkZXZpY2UpICE9IDEsCisgICAgICAgICAgICAiZ2V0RGV2aWNlRm9yVm9sdW1lKCkgaW52YWxpZCBkZXZpY2UgY29tYmluYXRpb246ICUwOHgiLAorICAgICAgICAgICAgZGV2aWNlKTsKKworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlX2NhdGVnb3J5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBzd2l0Y2goZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSkpIHsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRTsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfTElORToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOgorICAgICAgICAvKlVTQj8gIFJlbW90ZSBzdWJtaXg/Ki8KKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKKyAgICB9Cit9CisKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6dm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSBnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpOworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5tVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldOworCisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCisgICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVk9MTUlOXS5tSW5kZXg7CisgICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHN0cmVhbURlc2MubUluZGV4TWluKSkgLworICAgICAgICAgICAgKHN0cmVhbURlc2MubUluZGV4TWF4IC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pOworCisgICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcworICAgIGludCBzZWdtZW50ID0gMDsKKyAgICBpZiAodm9sSWR4IDwgY3VydmVbVk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUyXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDE7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVk9MTUFYXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDI7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7CisKKyAgICBmbG9hdCBhbXBsaWZpY2F0aW9uID0gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCisKKyAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSBhbXBsPSUuNWYiLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgZGVjaWJlbHMsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgYW1wbGlmaWNhdGlvbik7CisKKyAgICByZXR1cm4gYW1wbGlmaWNhdGlvbjsKK30KKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCisvLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcworLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KKy8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgorLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgorCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgICAgICAgICAgKkF1ZGlvUG9saWN5TWFuYWdlcjo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0FMQVJNCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUKKyAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUworICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbaV0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW2ldW2pdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKKyAgICBpZiAobVNwZWFrZXJEcmNFbmFibGVkKSB7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9TWVNURU1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9SSU5HXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUxBUk1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT05dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjOworICAgIH0KK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBmbG9hdCB2b2x1bWUgPSAxLjA7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKKworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgdm9sdW1lID0gdm9sSW5kZXhUb0FtcGwoZGV2aWNlLCBzdHJlYW1EZXNjLCBpbmRleCk7CisKKyAgICAvLyBpZiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkLCBhcHBseSB0aGUgZm9sbG93aW5nIHJ1bGVzIHRvIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMKKyAgICAvLyB0byBhdm9pZCBzb3VuZCBsZXZlbCBidXJzdHMgaW4gdXNlcidzIGVhcnM6CisgICAgLy8gLSBhbHdheXMgYXR0ZW51YXRlIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMgdm9sdW1lIGJ5IDZkQgorICAgIC8vIC0gaWYgbXVzaWMgaXMgcGxheWluZywgYWx3YXlzIGxpbWl0IHRoZSB2b2x1bWUgdG8gY3VycmVudCBtdXNpYyB2b2x1bWUsCisgICAgLy8gd2l0aCBhIG1pbmltdW0gdGhyZXNob2xkIGF0IC0zNmRCIHNvIHRoYXQgbm90aWZpY2F0aW9uIGlzIGFsd2F5cyBwZXJjZWl2ZWQuCisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSkpICYmCisgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKKyAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkKKyAgICAgICAgICAgICAgICB8fCAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICBzdHJlYW1EZXNjLm1DYW5CZU11dGVkKSB7CisgICAgICAgIHZvbHVtZSAqPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SOworICAgICAgICAvLyB3aGVuIHRoZSBwaG9uZSBpcyByaW5naW5nIHdlIG11c3QgY29uc2lkZXIgdGhhdCBtdXNpYyBjb3VsZCBoYXZlIGJlZW4gcGF1c2VkIGp1c3QgYmVmb3JlCisgICAgICAgIC8vIGJ5IHRoZSBtdXNpYyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIG11c2ljIHdhcyBhY3RpdmUgaWYgdGhlIGxhc3QgbXVzaWMgdHJhY2sgd2FzCisgICAgICAgIC8vIGp1c3Qgc3RvcHBlZAorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkgfHwKKyAgICAgICAgICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbCA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10uZ2V0Vm9sdW1lSW5kZXgobXVzaWNEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7CisgICAgICAgICAgICBmbG9hdCBtaW5Wb2wgPSAobXVzaWNWb2wgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTjsKKyAgICAgICAgICAgIGlmICh2b2x1bWUgPiBtaW5Wb2wpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWUgPSBtaW5Wb2w7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sLCBtdXNpY1ZvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9sdW1lOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKworICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAorICAgIGlmIChtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtLCBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0pOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCisgICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKKyAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gJiYKKyAgICAgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgeworICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCisgICAgICAgICAgICAgc3RyZWFtLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKKyAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKKyAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAorICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0CisgICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKKyAgICAgICAgICAgIGZvcmNlKSB7CisgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKKyAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzCisgICAgICAgIC8vIGVuYWJsZWQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBvdXRwdXQgJWQgYW5kIGRldmljZSAleCIsIG91dHB1dCwgZGV2aWNlKTsKKworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgJWQiLCBzdHJhdGVneSwgb24sIG91dHB1dCk7CisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBvbiwgb3V0cHV0LCBkZWxheU1zLCBkZXZpY2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtU3RyZWFtc1tzdHJlYW1dOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICBBTE9HVlYoInNldFN0cmVhbU11dGUoKSBzdHJlYW0gJWQsIG11dGUgJWQsIG91dHB1dCAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0LCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0sIGRldmljZSk7CisKKyAgICBpZiAob24pIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCAmJgorICAgICAgICAgICAgICAgICAgICAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBpbmNyZW1lbnQgbU11dGVDb3VudCBhZnRlciBjYWxsaW5nIGNoZWNrQW5kU2V0Vm9sdW1lKCkgc28gdGhhdCB2b2x1bWUgY2hhbmdlIGlzIG5vdCBpZ25vcmVkCisgICAgICAgIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInNldFN0cmVhbU11dGUoKSB1bm11dGluZyBub24gbXV0ZWQgc3RyZWFtISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCit7CisgICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKKyAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQorICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAorICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKKyAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCisgICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKKyAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOworICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKQoreworICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1QaG9uZVN0YXRlKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKSB7CisgICAgcmV0dXJuICgoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAorICAgICAgICAgICAgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTikpOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heEVmZmVjdHNDcHVMb2FkKCkKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfQ1BVX0xPQUQ7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c01lbW9yeSgpCit7CisgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKK30KKworCisvLyAtLS0gQXVkaW9PdXRwdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCisgICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwgbUxhdGVuY3koMCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1QYXRjaEhhbmRsZSgwKSwKKyAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtRGlyZWN0T3BlbkNvdW50KDApCit7CisgICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBtUmVmQ291bnRbaV0gPSAwOworICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKKyAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7CisgICAgICAgIG1TdG9wVGltZVtpXSA9IDA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgfQorICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPm1GbGFnczsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmxhdGVuY3koKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5tTGF0ZW5jeSA+IG1PdXRwdXQyLT5tTGF0ZW5jeSkgPyBtT3V0cHV0MS0+bUxhdGVuY3kgOiBtT3V0cHV0Mi0+bUxhdGVuY3k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1MYXRlbmN5OworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAorICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSl7CisgICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDEpIHx8IHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChtUHJvZmlsZS0+bU1vZHVsZSA9PSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bU1vZHVsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit7CisgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICB9CisgICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgeworICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7CisgICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gaXNTdHJhdGVneUFjdGl2ZShOVU1fU1RSQVRFR0lFUywgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKyAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0KKyAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIEF1ZGlvSW5wdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCisgICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwKKyAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUGF0Y2hIYW5kbGUoMCksIG1SZWZDb3VudCgwKSwKKyAgICAgIG1JbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtSXNTb3VuZFRyaWdnZXIoZmFsc2UpCit7CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKKyAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKKworICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPSBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6U3RyZWFtRGVzY3JpcHRvcigpCisgICAgOiAgIG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQoreworICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCAwKTsKK30KKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBkZXZpY2UgPSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKKyAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOworICAgIH0KKyAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAorICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCisgICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gSHdNb2R1bGUgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwKKyAgICAgIG1IYWxWZXJzaW9uKEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pLCBtSGFuZGxlKDApCit7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6On5Id01vZHVsZSgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOworICAgIH0KKyAgICBmcmVlKCh2b2lkICopbU5hbWUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXMpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1GbGFncyA9IHBhcnNlSW5wdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZElucHV0KCkgYWRkaW5nIGlucHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKworICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZE91dHB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCB0aGlzKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VPdXRwdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKKyAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7CisKKyAgICAgICAgQUxPR1YoImxvYWRPdXRwdXQoKSBhZGRpbmcgb3V0cHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSwgcHJvZmlsZS0+bUZsYWdzKTsKKworICAgICAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfVFlQRSkgPT0gMCkgeworICAgICAgICAgICAgdHlwZSA9IHBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKKyAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgeworICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgocm9vdC0+bmFtZSksIHR5cGUpOworICAgIGRldmljZURlc2MtPm1Nb2R1bGUgPSB0aGlzOworCisgICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFX0FERFJFU1MpID09IDApIHsKKyAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIG5hbWUgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAorICAgICAgICAgIGRldmljZURlc2MtPm1OYW1lLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICBtRGVjbGFyZWREZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgbU5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgbUhhbFZlcnNpb24gPj4gOCwgbUhhbFZlcnNpb24gJiAweEZGKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtRGVjbGFyZWREZXZpY2VzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBkZXZpY2VzOlxuIiwgc3RybGVuKCIgIC0gZGV2aWNlczpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjbGFyZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA0LCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkgOgorICAgIG1OYW1lKG5hbWUpLCBtVHlwZSh0eXBlKSwgbVJvbGUocm9sZSksIG1Nb2R1bGUobW9kdWxlKSwgbUZsYWdzKDApCit7CisgICAgbVVzZUluQ2hhbm5lbE1hc2sgPSAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBwb3J0LT5yb2xlID0gbVJvbGU7CisgICAgcG9ydC0+dHlwZSA9IG1UeXBlOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX1NBTVBMSU5HX1JBVEVTOyBpKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPnNhbXBsZV9yYXRlc1tpXSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9zYW1wbGVfcmF0ZXMgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmNoYW5uZWxfbWFza3NbaV0gPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9jaGFubmVsX21hc2tzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9GT1JNQVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmZvcm1hdHNbaV0gPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fZm9ybWF0cyA9IGk7CisKKyAgICBBTE9HVigiQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydCgpIG51bSBnYWlucyAlenUiLCBtR2FpbnMuc2l6ZSgpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9HQUlOUzsgaSsrKSB7CisgICAgICAgIHBvcnQtPmdhaW5zW2ldID0gbUdhaW5zW2ldLT5tR2FpbjsKKyAgICB9CisgICAgcG9ydC0+bnVtX2dhaW5zID0gaTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCkgeworICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCB1aW50MzJfdCByYXRlID0gcG9ydC0+bVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGspOworICAgICAgICBpZiAocmF0ZSAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIHJhdGVzCisgICAgICAgICAgICBib29sIGhhc1JhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChyYXRlID09IG1TYW1wbGluZ1JhdGVzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNSYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNSYXRlKSB7IC8vIG5ldmVyIGltcG9ydCBhIHNhbXBsaW5nIHJhdGUgdHdpY2UKKyAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUNoYW5uZWxNYXNrcy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayA9IHBvcnQtPm1DaGFubmVsTWFza3MuaXRlbUF0KGspOworICAgICAgICBpZiAobWFzayAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIG1hc2tzCisgICAgICAgICAgICBib29sIGhhc01hc2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1DaGFubmVsTWFza3Muc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT0gbUNoYW5uZWxNYXNrcy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzTWFzayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzTWFzaykgeyAvLyBuZXZlciBpbXBvcnQgYSBjaGFubmVsIG1hc2sgdHdpY2UKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tRm9ybWF0cy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcG9ydC0+bUZvcm1hdHMuaXRlbUF0KGspOworICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgZm9ybWF0cworICAgICAgICAgICAgYm9vbCBoYXNGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1Gb3JtYXRzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbUZvcm1hdHMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzRm9ybWF0KSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjbGVhckNhcGFiaWxpdGllcygpIHsKKyAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgbUZvcm1hdHMuY2xlYXIoKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBzYW1wbGluZworICAgIC8vIHJhdGVzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgcmF0ZSA9IGF0b2koc3RyKTsKKyAgICAgICAgaWYgKHJhdGUgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRTYW1wbGluZ1JhdGVzKCkgYWRkaW5nIHJhdGUgJWQiLCByYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRGb3JtYXRzKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1Gb3JtYXRzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGZvcm1hdHMKKyAgICAvLyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3Qpc3RyaW5nVG9FbnVtKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSAlcyIsIG5hbWUpOworCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgYWRkaW5nIGNoYW5uZWxNYXNrICUwNHgiLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkT3V0Q2hhbm5lbHMoKSAlcyIsIG5hbWUpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtQ2hhbm5lbE1hc2tzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGNoYW5uZWwKKyAgICAvLyBtYXNrcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCithdWRpb19nYWluX21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZEdhaW5Nb2RlKCkgJXMiLCBuYW1lKTsKKyAgICBhdWRpb19nYWluX21vZGVfdCBtb2RlID0gMDsKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgbW9kZSB8PSAoYXVkaW9fZ2Fpbl9tb2RlX3Qpc3RyaW5nVG9FbnVtKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8QXVkaW9HYWluPiBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCwgbVVzZUluQ2hhbm5lbE1hc2spOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1vZGUgPSBsb2FkR2Fpbk1vZGUoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tYXhfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLmRlZmF1bHRfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLnN0ZXBfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5taW5fcmFtcF9tcyA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAorICAgICAgICAgIGdhaW4tPm1HYWluLm1vZGUsIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzaywgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlLCBnYWluLT5tR2Fpbi5tYXhfdmFsdWUpOworCisgICAgaWYgKGdhaW4tPm1HYWluLm1vZGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1HYWlucy5hZGQoZ2Fpbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWlucyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkR2Fpbihub2RlLCBpbmRleCsrKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldID09IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKK3sKKyAgICAvLyBTZWFyY2ggZm9yIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCBzYW1wbGluZyByYXRlIHRoYXQgaXMgYWJvdmUgKHByZWZlcnJlZCkKKyAgICAvLyBvciBiZWxvdyAoYWNjZXB0YWJsZSkgdGhlIGRlc2lyZWQgc2FtcGxpbmcgcmF0ZSwgd2l0aGluIGEgcGVybWl0dGVkIHJhdGlvLgorICAgIC8vIFRoZSBzYW1wbGluZyByYXRlcyBkbyBub3QgbmVlZCB0byBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAgIHNzaXplX3QgbWF4QmVsb3cgPSAtMTsKKyAgICBzc2l6ZV90IG1pbkFib3ZlID0gLTE7CisgICAgdWludDMyX3QgY2FuZGlkYXRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuZGlkYXRlIDwgZGVzaXJlZAorICAgICAgICBpZiAoY2FuZGlkYXRlIDwgc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAobWF4QmVsb3cgPCAwIHx8IGNhbmRpZGF0ZSA+IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XSkgeworICAgICAgICAgICAgICAgIG1heEJlbG93ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gY2FuZGlkYXRlID4gZGVzaXJlZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1pbkFib3ZlIDwgMCB8fCBjYW5kaWRhdGUgPCBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV0pIHsKKyAgICAgICAgICAgICAgICBtaW5BYm92ZSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIGFib3V0IEF1ZGlvRmxpbmdlciByZXNhbXBsaW5nIHJhdGlvcy4KKyAgICAvLyBUT0RPIE1vdmUgdGhlc2UgYXNzdW1wdGlvbnMgb3V0LgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4RG93blNhbXBsZVJhdGlvID0gNjsgIC8vIGJleW9uZCB0aGlzIGFsaWFzaW5nIG9jY3VycworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VXBTYW1wbGVSYXRpbyA9IDI1NjsgIC8vIGJleW9uZCB0aGlzIHNhbXBsZSByYXRlIGluYWNjdXJhY2llcyBvY2N1cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byBhcHByb3hpbWF0aW9uIGJ5IGFuIGludDMyX3Qgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2UgaW5jcmVtZW50cworICAgIC8vIFByZWZlciB0byBkb3duLXNhbXBsZSBmcm9tIGEgaGlnaGVyIHNhbXBsaW5nIHJhdGUsIGFzIHdlIGdldCB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgc3BlY3RydW0uCisgICAgaWYgKG1pbkFib3ZlID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdOworICAgICAgICBpZiAoY2FuZGlkYXRlIC8ga01heERvd25TYW1wbGVSYXRpbyA8PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCdXQgaWYgd2UgaGF2ZSB0byB1cC1zYW1wbGUgZnJvbSBhIGxvd2VyIHNhbXBsaW5nIHJhdGUsIHRoYXQncyBPSy4KKyAgICBpZiAobWF4QmVsb3cgPj0gMCkgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttYXhCZWxvd107CisgICAgICAgIGlmIChjYW5kaWRhdGUgKiBrTWF4VXBTYW1wbGVSYXRpbyA+PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBsZWF2ZSB1cGRhdGVkU2FtcGxpbmdSYXRlIHVubW9kaWZpZWQKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tFeGFjdENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykKKyAgICAgICAgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIC8vIEZJWE1FIERvZXMgbm90IGhhbmRsZSBtdWx0aS1jaGFubmVsIGF1dG9tYXRpYyBjb252ZXJzaW9ucyB5ZXQKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3VwcG9ydGVkID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgaWYgKHN1cHBvcnRlZCA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlY29yZFRocmVhZCkgeworICAgICAgICAgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIHRoYXQgQXVkaW9GbGluZ2VyIGNhbiBzaWxlbnRseSBkb3duLW1peCBhbmQgdXAtbWl4LgorICAgICAgICAgICAgLy8gRklYTUUgQWJzdHJhY3QgdGhpcyBvdXQgdG8gYSB0YWJsZS4KKyAgICAgICAgICAgIGlmICgoKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sgfHwgc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKQorICAgICAgICAgICAgICAgICAgICAmJiBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHx8CisgICAgICAgICAgICAgICAgKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSworICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDEgJiYgbVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBzYW1wbGluZyByYXRlOiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCisgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAvLyBzaW5rCisgICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA8IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldID4gMCkpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNhbXBsaW5nUmF0ZSA9PSBVSU5UX01BWCkgPyAwIDogc2FtcGxpbmdSYXRlOworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgdWludDMyX3QgbWF4UmF0ZSA9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFOworCisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIHNhbXBsaW5nIHJhdGVzLiBEbyBub3QKKyAgICAvLyBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQorICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpID09IDEgJiYgbUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworCisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgeworICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFubmVsTWFzazsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOworICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4gRG8gbm90CisgICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKKyAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtYXhDb3VudCA9IFVJTlRfTUFYOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hhbm5lbE1hc2s7Cit9CisKKy8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW10gPSB7CisgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VELAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKK307CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKK3sKKyAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKKyAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7CisgICAgICAgICAgICBpICsrKSB7CisgICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKKyAgICAgICAgICAgIGluZGV4MSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgeworICAgICAgICAgICAgaW5kZXgyID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCisgICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQorICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrRm9ybWF0KCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1Gb3JtYXRzLnNpemUoKSA9PSAxICYmIG1Gb3JtYXRzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPQorICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbCisgICAgICAgICAgICAgICAgQVJSQVlfU0laRShBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAorICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKKyAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8CisgICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7CisgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdAoreworICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBpZiAobU5hbWUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbVNhbXBsaW5nUmF0ZXNbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Qb3J0OjpkdW1wIG1DaGFubmVsTWFza3MgJXp1ICUwOHgiLCBpLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtQ2hhbm5lbE1hc2tzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtRm9ybWF0cy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdHM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdFN0ciA9IGVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBzdHJjbXAoZm9ybWF0U3RyLCAiIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMiLCBmb3JtYXRTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLSBBdWRpb0dhaW4gY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKK3sKKyAgICBtSW5kZXggPSBpbmRleDsKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7CisgICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKKyAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOworICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOworICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Y2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgaWYgKChjb25maWctPm1vZGUgJiB+bUdhaW4ubW9kZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbMF0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1swXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfm1HYWluLmNoYW5uZWxfbWFzaykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzW2ldIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbaV0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgeworICAgICAgICBpZiAoKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA8IG1HYWluLm1pbl9yYW1wX21zKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID4gbUdhaW4ubWF4X3JhbXBfbXMpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKKy8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCit7CisgICAgbVNhbXBsaW5nUmF0ZSA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBtR2Fpbi5pbmRleCA9IC0xOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tGb3JtYXQoY29uZmlnLT5mb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0dhaW4oJmNvbmZpZy0+Z2FpbiwgY29uZmlnLT5nYWluLmluZGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOworICAgIH0KKworZXhpdDoKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CisgICAgfQorICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgeworICAgICAgICAqYmFja3VwQ29uZmlnID0gbG9jYWxCYWNrdXBDb25maWc7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9Cit9CisKKy8vIC0tLSBJT1Byb2ZpbGUgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKKyAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlLCBtb2R1bGUpCit7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKK3sKK30KKworLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKy8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCisvLyBnZXQgYSB2YWxpZCBhIG1hdGNoCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0Cit7CisgICAgY29uc3QgYm9vbCBpc1BsYXliYWNrVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOworCisgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzYW1wbGluZ1JhdGUgPT0gMCkgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgY2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlLCAmbXlVcGRhdGVkU2FtcGxpbmdSYXRlKSAhPQorICAgICAgICAgICAgTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8IGNoZWNrRm9ybWF0KGZvcm1hdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0V4YWN0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhjaGFubmVsTWFzaykgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAobUZsYWdzICYgZmxhZ3MpICE9IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVGhlIG9ubHkgaW5wdXQgZmxhZyB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGlzIHRoZSBmYXN0IGZsYWcuCisgICAgLy8gQW4gZXhpc3RpbmcgZmFzdCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgbm9ybWFsIHRyYWNrIHJlcXVlc3QuCisgICAgLy8gQW4gZXhpc3Rpbmcgbm9ybWFsIHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBmYXN0IHRyYWNrIHJlcXVlc3QsCisgICAgLy8gYnV0IHRoZSBmYXN0IHJlcXVlc3Qgd2lsbCBiZSBkZW5pZWQgYnkgQXVkaW9GbGluZ2VyIGFuZCBjb252ZXJ0ZWQgdG8gbm9ybWFsIHRyYWNrLgorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoKG1GbGFncyBeIGZsYWdzKSAmCisgICAgICAgICAgICB+QVVESU9fSU5QVVRfRkxBR19GQVNUKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IG15VXBkYXRlZFNhbXBsaW5nUmF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNiwgaSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpsb2coKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQUxPR1YoIiAgICAtIHNhbXBsaW5nIHJhdGVzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgICVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBjaGFubmVsIG1hc2tzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGZvcm1hdHM6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDh4IiwgbUZvcm1hdHNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBkZXZpY2VzOiAweCUwNHhcbiIsIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworICAgIEFMT0dWKCIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOworfQorCisKKy8vIC0tLSBEZXZpY2VEZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCisKKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6CisgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKHR5cGUpLCBtQWRkcmVzcygiIiksIG1JZCgwKQoreworICAgIGlmIChtR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBtR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAoreworICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKKyAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBtYXNrIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY2hhbm5lbCBtYXNrCisgICAgcmV0dXJuIChtRGV2aWNlVHlwZSA9PSBvdGhlci0+bURldmljZVR5cGUpICYmCisgICAgICAgICAgIChtQWRkcmVzcyA9PSAiIiB8fCBvdGhlci0+bUFkZHJlc3MgPT0gIiIgfHwgbUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKSAmJgorICAgICAgICAgICAobUNoYW5uZWxNYXNrID09IDAgfHwgb3RoZXItPm1DaGFubmVsTWFzayA9PSAwIHx8CisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID09IG90aGVyLT5tQ2hhbm5lbE1hc2spOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQoreworICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAoreworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT5tRGV2aWNlVHlwZSk7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc2l6ZV90IGk7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6cmVtb3ZlIGRldmljZSAlMDh4IG5vdCBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpCit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7CisKKyAgICB1aW50MzJfdCByb2xlX2JpdCA9IEFVRElPX0RFVklDRV9CSVRfSU4gJiB0eXBlczsKKyAgICB0eXBlcyAmPSB+cm9sZV9iaXQ7CisKKyAgICB3aGlsZSAodHlwZXMpIHsKKyAgICAgICAgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2Nseih0eXBlcyk7CisgICAgICAgIHVpbnQzMl90IHR5cGUgPSAxIDw8IGk7CisgICAgICAgIHR5cGVzICY9IH50eXBlOworICAgICAgICBhZGQobmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUgfCByb2xlX2JpdCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcykKK3sKKyAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgdHlwZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tTmFtZShTdHJpbmc4KGRldk5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZChkZXZpY2VEZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZVR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKCkgZm9yIHR5cGUgJWQgYWRkcmVzcyAlcyBmb3VuZCAlcCIsCisgICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKCVkKSBpdGVtQXQoJXp1KS0+bUlkICVkIiwgaWQsIGksIGl0ZW1BdChpKS0+bUlkKTsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIHR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKKyAgICAgICAgICAgIHR5cGUgJj0gfml0ZW1BdChpKS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoKSBmb3IgdHlwZSAleCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICBpdGVtQXQoaSktPm1EZXZpY2VUeXBlLCBpdGVtQXQoaSkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlQWRkcigKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICAvL0FMT0dWKCIgICBsb29raW5nIGZvciBkZXZpY2U9JXgsIGFkZHI9JXMiLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vQUxPR1YoIiAgICAgYXQgaT0lZDogZGV2aWNlPSV4LCBhZGRyPSVzIiwKKyAgICAgICAgLy8gICAgICAgIGksIGl0ZW1BdChpKS0+bURldmljZVR5cGUsIGl0ZW1BdChpKS0+bUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiICAgICAgZm91bmQgbWF0Y2hpbmcgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21OYW1lKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1OYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShtRGV2aWNlVHlwZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NJTksgOiBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICBzdHJuY3B5KGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAleCIsIG1JZCwgbURldmljZVR5cGUpOworICAgIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOworICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICBzdHJuY3B5KHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgaWYgKG1JZCAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgc3BhY2VzKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BhdGNoOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uZXh0LmRldmljZS50eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBtUGF0Y2guc291cmNlc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNpbmtzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zaW5rcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IHN0cmluZ1RvRW51bShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWcgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWcgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOworICAgIH0KKworICAgIHJldHVybiBmbGFnOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IHN0cmluZ1RvRW51bShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBmbGFnOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZGV2aWNlID0gMDsKKworICAgIGNoYXIgKmRldk5hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZGV2TmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZGV2TmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZGV2aWNlIHw9IHN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldk5hbWUpOworICAgICAgICAgfQorICAgICAgICBkZXZOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOworICAgIGNub2RlICpub2RlOworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUocm9vdC0+bmFtZSk7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgREVWSUNFU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWREZXZpY2Uobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBPVVRQVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBvdXRwdXQgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZE91dHB1dChub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIElOUFVUU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgaW5wdXQgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZElucHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRId01vZHVsZShub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7CisKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKKyAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKKyAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5tRGVjbGFyZWREZXZpY2VzOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKKyAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJsb2FkR2xvYmFsQ29uZmlnKCkgZGVmYXVsdCBkZXZpY2Ugbm90IHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtU3BlYWtlckRyY0VuYWJsZWQgPSBzdHJpbmdUb0Jvb2woKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgbVNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOworICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTihtYWpvciwgbWlub3IpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtSGFsVmVyc2lvbiA9ICUwNHggbWFqb3IgJXUgbWlub3IgJXUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiwgbWFqb3IsIG1pbm9yKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIGxvYWRId01vZHVsZXMocm9vdCk7CisgICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24KKyAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIGdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCkKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOworICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKworICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCBtb2R1bGUpOworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCg0NDEwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgcHJvZmlsZS0+bUZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKKyAgICBtb2R1bGUtPm1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TSU5LLCBtb2R1bGUpOworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCg4MDAwKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfSU5fTU9OTyk7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CisgICAgbW9kdWxlLT5tSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKK3sKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhN2I5NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41CisvLyBNaW4gdm9sdW1lIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGxpbWl0ZWQgYnkgbXVzaWMgdm9sdW1lOiAtMzZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOICAwLjAxNgorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKKy8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQorLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCisjZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aXRjaCBzb21lIHN0cmVhbXMgYXJlIG11dGVkIHdoaWxlIHRoZSBhdWRpbyBwYXRoCisvLyBpcyBzd2l0Y2hlZAorI2RlZmluZSBNVVRFX1RJTUVfTVMgMjAwMAorCisjZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQorCisjZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgorCisvLyBEZWZhdWx0IG1pbmltdW0gbGVuZ3RoIGFsbG93ZWQgZm9yIG9mZmxvYWRpbmcgYSBjb21wcmVzc2VkIHRyYWNrCisvLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyBwcm9wZXJ0eQorI2RlZmluZSBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgNjAKKworI2RlZmluZSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSA0ODAwMAorI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlciBpbXBsZW1lbnRzIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXI6IHB1YmxpYyBBdWRpb1BvbGljeUludGVyZmFjZQorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgLCBwdWJsaWMgVGhyZWFkCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAoreworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKKworICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gTlVMTCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAvLyAgIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKKyAgICAgICAgLy8gICBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCitwcm90ZWN0ZWQ6CisKKyAgICAgICAgZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKKyAgICAgICAgICAgIFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICAgICAgICAgIFNUUkFURUdZX0RUTUYsCisgICAgICAgICAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAorICAgICAgICAgICAgTlVNX1NUUkFURUdJRVMKKyAgICAgICAgfTsKKworICAgICAgICAvLyA0IHBvaW50cyB0byBkZWZpbmUgdGhlIHZvbHVtZSBhdHRlbnVhdGlvbiBjdXJ2ZSwgZWFjaCBjaGFyYWN0ZXJpemVkIGJ5IHRoZSB2b2x1bWUKKyAgICAgICAgLy8gaW5kZXggKGZyb20gMCB0byAxMDApIGF0IHdoaWNoIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgICAgLy8gd2UgdXNlIDEwMCBzdGVwcyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgd2hlbiBjb21wdXRpbmcgdGhlIHZvbHVtZSBpbiB2b2xJbmRleFRvQW1wbCgpCisKKyAgICAgICAgZW51bSB7IFZPTE1JTiA9IDAsIFZPTEtORUUxID0gMSwgVk9MS05FRTIgPSAyLCBWT0xNQVggPSAzLCBWT0xDTlQgPSA0fTsKKworICAgICAgICBjbGFzcyBWb2x1bWVDdXJ2ZVBvaW50CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgICAgIGZsb2F0IG1EQkF0dGVudWF0aW9uOworICAgICAgICB9OworCisgICAgICAgIC8vIGRldmljZSBjYXRlZ29yaWVzIHVzZWQgZm9yIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50LgorICAgICAgICBlbnVtIGRldmljZV9jYXRlZ29yeSB7CisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9DTlQKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBId01vZHVsZTsKKworICAgICAgICBjbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvR2FpbigpIHt9CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEF1ZGlvUG9ydDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9ydCgpIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCk7CisgICAgICAgICAgICB2b2lkIGNsZWFyQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAgICAgICAgIHZvaWQgbG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRGb3JtYXRzKGNoYXIgKm5hbWUpOworICAgICAgICAgICAgdm9pZCBsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpOworCisgICAgICAgICAgICBhdWRpb19nYWluX21vZGVfdCBsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpOworICAgICAgICAgICAgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOworCisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGFuZCByZXR1cm5zIHRoZSBiZXN0IG1hdGNoIHZpYSB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGlucHV0IGNoYW5uZWwgbWFza3Mgb25seQorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OworICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdDsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHBpY2tDaGFubmVsTWFzaygpIGNvbnN0OworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgcGlja0Zvcm1hdCgpIGNvbnN0OworCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdOworICAgICAgICAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisKKyAgICAgICAgICAgIFN0cmluZzggICAgICAgICAgIG1OYW1lOworICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CisgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgICAgICAgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcywgbUNoYW5uZWxNYXNrcyBvciBtRm9ybWF0cworICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAvLyBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgICAgICAgICBWZWN0b3IgPHVpbnQzMl90PiBtU2FtcGxpbmdSYXRlczsgLy8gc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCisgICAgICAgICAgICBWZWN0b3IgPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtQ2hhbm5lbE1hc2tzOyAvLyBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19mb3JtYXRfdD4gbUZvcm1hdHM7IC8vIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCisgICAgICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0dhaW4+ID4gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCisgICAgICAgICAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KKyAgICAgICAgICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIChlLmcgcHJpbWFyeSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0Li4uKS4KKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBBdWRpb1BvcnRDb25maWc6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb1BvcnRDb25maWcoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9CisKKyAgICAgICAgICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOworICAgICAgICAgICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CisgICAgICAgIH07CisKKworICAgICAgICBjbGFzcyBBdWRpb1BhdGNoOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwgbVBhdGNoKCpwYXRjaCksIG1VaWQodWlkKSwgbUFmUGF0Y2hIYW5kbGUoMCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworICAgICAgICAgICAgdWlkX3QgbVVpZDsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIERldmljZURlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKKworICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CisKKyAgICAgICAgICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gKEF1ZGlvUG9ydCopIHRoaXM7IH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIFN0cmluZzggbUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorCisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KKworICAgICAgICAgICAgdm9pZCBsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcyk7CisgICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbU5hbWUoY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpOworCisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3Q7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tTmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdDsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0OworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCisgICAgICAgIC8vIEl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgYWxsIGNvbWJpbmF0aW9uIG9mIGxpc3RlZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgIC8vIEl0IGlzIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgb3IgaW5wdXQgaXMgc3VpdGFibGUgZm9yCisgICAgICAgIC8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCisgICAgICAgIC8vIHRvL2Zyb20gaXQuCisgICAgICAgIGNsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgICAgICAgICAgdmlydHVhbCB+SU9Qcm9maWxlKCk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KKyAgICAgICAgICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgorICAgICAgICAgICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgorICAgICAgICAgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICAgICAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGxvZygpOworCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgIG1TdXBwb3J0ZWREZXZpY2VzOyAvLyBzdXBwb3J0ZWQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGRldmljZXMgdGhpcyBvdXRwdXQgY2FuIGJlIHJvdXRlZCB0bykKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBId01vZHVsZSA6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICBId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfkh3TW9kdWxlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRPdXRwdXQoY25vZGUgKnJvb3QpOworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZElucHV0KGNub2RlICpyb290KTsKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWREZXZpY2UoY25vZGUgKnJvb3QpOworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgICAgICAgIG1OYW1lOyAvLyBiYXNlIG5hbWUgb2YgdGhlIGF1ZGlvIEhXIG1vZHVsZSAocHJpbWFyeSwgYTJkcCAuLi4pCisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbU91dHB1dFByb2ZpbGVzOyAvLyBvdXRwdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgICAgICAgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgICAgICAgICAgRGV2aWNlVmVjdG9yICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5LmNvbmYKKworICAgICAgICB9OworCisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBub24tbWVkaWEgYXVkaW8gb24gZXh0IG1lZGlhIG91dHB1dHMgKEhETUksIExpbmUsIGV0YykKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW0RFVklDRV9DQVRFR09SWV9DTlRdOworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAorICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KKyAgICAgICAgY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKKyAgICAgICAgICAgIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisKKyAgICAgICAgICAgIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5KCk7CisgICAgICAgICAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICAgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICAgICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKyAgICAgICAgICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKKyAgICAgICAgICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CisgICAgICAgICAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZQorICAgICAgICAgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgICAgICAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgICAgICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CisgICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgorICAgICAgICBjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBBdWRpb1JlY29yZCBjbGllbnRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5wdXQKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1PcGVuUmVmQ291bnQ7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7ICAgIC8vIGlucHV0IHNvdXJjZSBzZWxlY3RlZCBieSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyhtZWRpYXJlY29yZGVyLmgpCisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVNlc3Npb25zOyAgICAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0CisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNTb3VuZFRyaWdnZXI7IC8vIHVzZWQgYnkgYSBzb3VuZHRyaWdnZXIgY2FwdHVyZQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKyAgICAgICAgICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGNsYXNzIFN0cmVhbURlc2NyaXB0b3IKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTdHJlYW1EZXNjcmlwdG9yKCk7CisKKyAgICAgICAgICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBpbnQgbUluZGV4TWluOyAgICAgIC8vIG1pbiB2b2x1bWUgaW5kZXgKKyAgICAgICAgICAgIGludCBtSW5kZXhNYXg7ICAgICAgLy8gbWF4IHZvbHVtZSBpbmRleAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgICAvLyBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlCisgICAgICAgICAgICBib29sIG1DYW5CZU11dGVkOyAgIC8vIHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQKKworICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOworICAgICAgICB9OworCisgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCisgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IG1TdHJhdGVneTsgLy8gcm91dGluZyBzdHJhdGVneSB0aGUgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8KKyAgICAgICAgICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICAgICAgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICBzdGF0aWMgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKKyAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCisgICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKKyAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86CisgICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bworICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworCisgICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKKworICAgICAgICAvLyByZXR1cm4gaW8gaGFuZGxlIG9mIGFjdGl2ZSBpbnB1dCBvciAwIGlmIG5vIGlucHV0IGlzIGFjdGl2ZQorICAgICAgICAvLyAgICBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgorICAgICAgICAvLyAgICBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cyA9IHRydWUpOworCisgICAgICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB2b2x1bWUgY3VydmVzIGZvciBlYWNoIHN0cmF0ZWd5IGFuZCBkZXZpY2UgY2F0ZWdvcnkKKyAgICAgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7CisKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgorICAgICAgICAvLyBkZXZpY2UKKyAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQorICAgICAgICBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBhcHBseSBhbGwgc3RyZWFtIHZvbHVtZXMgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgYW5kIGRldmljZQorICAgICAgICB2b2lkIGFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSBhbGwgc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgd2hpbGUgaW4gY2FsbDogbXV0ZSBzdHJlYW1zIG9yIHJlcGxhY2UgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIHRvbmUgaW4gdGhlIGRldmljZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHZvaWQgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKTsKKworICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisKKyAgICAgICAgLy8gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpOworCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3BlbiBvdXRwdXQgY2FuIGJlIHJvdXRlZAorICAgICAgICAvLyB0byB0aGlzIGRldmljZS4gSWYgbm9uZSBpcyBvcGVuLCB0cmllcyB0byBvcGVuIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG91dHB1dHMuCisgICAgICAgIC8vIFJldHVybnMgYW4gb3V0cHV0IHN1aXRhYmxlIHRvIHRoaXMgZGV2aWNlIG9yIDAuCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3V0cHV0IGlzIG5vdCB1c2VkIGFueSBtb3JlIGFuZAorICAgICAgICAvLyByZXR1cm5zIGl0cyBoYW5kbGUgaWYgYW55LgorICAgICAgICAvLyB0cmFuc2ZlcnMgdGhlIGF1ZGlvIHRyYWNrcyBhbmQgZWZmZWN0cyBmcm9tIG9uZSBvdXRwdXQgdGhyZWFkIHRvIGFub3RoZXIgYWNjb3JkaW5nbHkuCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KKyAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgIC8vIGNsb3NlIGFuIGlucHV0LgorICAgICAgICB2b2lkIGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisgICAgICAgIC8vIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciBhbGwgc3RyYXRlZ2llcy4KKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgICAgLy8gY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CisKKyAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgYnV0IGZvciBhIGFsbCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisKKyAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKKyAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QTJkcE91dHB1dCgpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCisgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgdm9pZCB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIGlucHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKTsKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgaW50IHRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOworCisgICAgICAgIC8vIHJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBkZXZpY2UgYmVsb25ncyB0byB3aXRoIHJlZ2FyZCB0byB2b2x1bWUgY3VydmUgbWFuYWdlbWVudAorICAgICAgICBzdGF0aWMgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGV4dHJhY3Qgb25lIGRldmljZSByZWxldmFudCBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gb3Blbk91dHB1dHMpOworICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAvLyBzYW1wbGluZ1JhdGUgcGFyYW1ldGVyIGlzIGFuIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOworCisgICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKKworICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpOworICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBnZXRJbnB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKKworICAgICAgICB2b2lkIHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcgKGF1ZGlvX3BvbGljeS5jb25mKQorICAgICAgICAvLworICAgICAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpOworICAgICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpOworICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IHBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlKGNub2RlICpyb290KTsKKyAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KTsKKyAgICAgICAgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKyAgICAgICAgdm9pZCBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCk7CisKKworICAgICAgICB1aWRfdCBtVWlkQ2FjaGVkOworICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtUHJpbWFyeU91dHB1dDsgICAgICAgICAgICAgIC8vIHByaW1hcnkgb3V0cHV0IGhhbmRsZQorICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gbU91dHB1dHM7CisgICAgICAgIC8vIGNvcHkgb2YgbU91dHB1dHMgYmVmb3JlIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIG9wZW5zIG5ldyBvdXRwdXRzCisgICAgICAgIC8vIHJlc2V0IHRvIG1PdXRwdXRzIHdoZW4gdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1QcmV2aW91c091dHB1dHM7CisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKKyAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKKyAgICAgICAgaW50IG1QaG9uZVN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBob25lIHN0YXRlCisgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsgICAvLyBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbgorCisgICAgICAgIFN0cmVhbURlc2NyaXB0b3IgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0NOVF07ICAgICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvcnMgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKKyAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAorCisgICAgICAgIC8vIE1heGltdW0gQ1BVIGxvYWQgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gMC4xIE1JUFMgKEFSTXY1VEUsIDAgV1MgbWVtb3J5KSB1bml0cworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfQ1BVX0xPQUQgPSAxMDAwOworICAgICAgICAvLyBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYXVkaW8gZWZmZWN0cyBpbiBLQgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfTUVNT1JZID0gNTEyOworICAgICAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzQ3B1TG9hZDsgLy8gY3VycmVudCBDUFUgbG9hZCB1c2VkIGJ5IGVmZmVjdHMKKyAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c01lbW9yeTsgIC8vIGN1cnJlbnQgbWVtb3J5IHVzZWQgYnkgZWZmZWN0cworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cworICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKKyAgICAgICAgYm9vbCBtU3BlYWtlckRyY0VuYWJsZWQ7Ly8gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseQorCisgICAgICAgIFZlY3RvciA8IHNwPEh3TW9kdWxlPiA+IG1Id01vZHVsZXM7CisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKKworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4gbUF1ZGlvUGF0Y2hlczsKKworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBhdWRpb19pb19oYW5kbGVfdD4gbVNvdW5kVHJpZ2dlclNlc3Npb25zOworCisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAgICAgTXV0ZXggICBtTG9jazsKKyAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOworCisgICAgICAgIGludCAgICAgICAgICAgICBtQ3VyT3V0cHV0OworICAgICAgICBib29sICAgICAgICAgICAgbURpcmVjdE91dHB1dDsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVRlc3RPdXRwdXRzW05VTV9URVNUX09VVFBVVFNdOworICAgICAgICBpbnQgICAgICAgICAgICAgbVRlc3RJbnB1dDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0RGV2aWNlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdEZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Q2hhbm5lbHM7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdExhdGVuY3lNczsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKK3ByaXZhdGU6CisgICAgICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvQW1wbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOworICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQorICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKKyAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIHN0YXRpYyBib29sIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIC8vIGZpbmQgdGhlIG91dHB1dHMgb24gYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGhhdmUgdGhlIGdpdmVuIGFkZHJlc3MuCisgICAgICAgIC8vIHRvIGJlIGNhbGxlZCBvbiBhbiBBdWRpb091dHB1dERlc2NyaXB0b3Igd2hvc2Ugc3VwcG9ydGVkIGRldmljZXMgKGFzIGRlZmluZWQKKyAgICAgICAgLy8gICBpbiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMpIG1hdGNoZXMgdGhlIGRldmljZSB3aG9zZSBhZGRyZXNzIGlzIHRvIGJlIG1hdGNoZWQuCisgICAgICAgIC8vIHNlZSBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCkgZm9yIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQorICAgICAgICAvLyAgIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyLgorICAgICAgICB2b2lkIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CisgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOworICAgICAgICB1aW50MzJfdCBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICB1aW50MzJfdCBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb247IH0KKyAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgLy8gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZGVyaXZlIGEgc3RyZWFtIHR5cGUgdmFsdWUgZnJvbSBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7Cit9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MDY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIF9fU1RESU5UX0xJTUlUUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtDbWREZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOworCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrQXVkaW9Db21tYW5kVGltZW91dE5zID0gc2Vjb25kcygzKTsgLy8gMyBzZWNvbmRzCisKK25hbWVzcGFjZSB7CisgICAgZXh0ZXJuIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wczsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeVNlcnZpY2UoKQorICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSwgbXBBdWRpb1BvbGljeURldihOVUxMKSwgbXBBdWRpb1BvbGljeShOVUxMKSwKKyAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIoTlVMTCksIG1BdWRpb1BvbGljeUNsaWVudChOVUxMKSwgbVBob25lU3RhdGUoQVVESU9fTU9ERV9JTlZBTElEKQoreworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlOworICAgIGludCBmb3JjZWRfdmFsOworICAgIGludCByYzsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAorICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOworICAgICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKKyAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7CisgICAgICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZAorICAgICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtT3V0cHV0IiksIHRoaXMpOworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICAgICAgQUxPR0koIkF1ZGlvUG9saWN5U2VydmljZSBDU1RPUiBpbiBsZWdhY3kgbW9kZSIpOworCisgICAgICAgIC8qIGluc3RhbnRpYXRlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciAqLworICAgICAgICByYyA9IGh3X2dldF9tb2R1bGUoQVVESU9fUE9MSUNZX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJjID0gYXVkaW9fcG9saWN5X2Rldl9vcGVuKG1vZHVsZSwgJm1wQXVkaW9Qb2xpY3lEZXYpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IG9wZW4gYXVkaW8gcG9saWN5IGRldmljZSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtcEF1ZGlvUG9saWN5RGV2LT5jcmVhdGVfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsICZhcHNfb3BzLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1wQXVkaW9Qb2xpY3kpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGNyZWF0ZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbXBBdWRpb1BvbGljeS0+aW5pdF9jaGVjayhtcEF1ZGlvUG9saWN5KTsKKyAgICAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBpbml0X2NoZWNrIHRoZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgiTG9hZGVkIGF1ZGlvIHBvbGljeSBmcm9tICVzICglcykiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+aWQpOworI2Vsc2UKKyAgICAgICAgQUxPR0koIkF1ZGlvUG9saWN5U2VydmljZSBDU1RPUiBpbiBuZXcgbW9kZSIpOworCisgICAgICAgIG1BdWRpb1BvbGljeUNsaWVudCA9IG5ldyBBdWRpb1BvbGljeUNsaWVudCh0aGlzKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlciA9IGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lDbGllbnQpOworI2VuZGlmCisgICAgfQorICAgIC8vIGxvYWQgYXVkaW8gcHJvY2Vzc2luZyBtb2R1bGVzCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0cyA9IG5ldyBBdWRpb1BvbGljeUVmZmVjdHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1BdWRpb1BvbGljeUVmZmVjdHMgPSBhdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorfQorCitBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQoreworICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmV4aXQoKTsKKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgIT0gTlVMTCAmJiBtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgbXBBdWRpb1BvbGljeURldi0+ZGVzdHJveV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgbXBBdWRpb1BvbGljeSk7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9jbG9zZShtcEF1ZGlvUG9saWN5RGV2KTsKKyAgICB9CisjZWxzZQorICAgIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIobUF1ZGlvUG9saWN5TWFuYWdlcik7CisgICAgZGVsZXRlIG1BdWRpb1BvbGljeUNsaWVudDsKKyNlbmRpZgorCisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuY2xlYXIoKTsKKyAgICBtQXVkaW9Qb2xpY3lFZmZlY3RzLmNsZWFyKCk7Cit9CisKKy8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcworLy8gY29ubmVjdHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlLgordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCit7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7CisgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICB9Cit9CisKKy8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odWlkKTsKKworI2lmbmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2xlYXJBdWRpb1BhdGNoZXModWlkKTsKKyAgICAgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT5jcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChwYXRjaCwgaGFuZGxlLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRSZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChoYW5kbGUsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25maWcsIGRlbGF5TXMpOworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KQoreworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6fk5vdGlmaWNhdGlvbkNsaWVudCgpCit7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKKyAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IDApIHsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKK30KKworc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCit7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOworICAgIH0KKyAgICByZXR1cm4gbG9ja2VkOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBJbnRlcm5hbHMoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wQXVkaW9Qb2xpY3kpOworI2Vsc2UKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXI6ICVwXG4iLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyNlbmRpZgorICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit7CisgICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7CisgICAgICAgIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBkdW1wSW50ZXJuYWxzKGZkKTsKKyAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7CisgICAgICAgIH0KKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgICAgIGlmIChtcEF1ZGlvUG9saWN5KSB7CisgICAgICAgICAgICBtcEF1ZGlvUG9saWN5LT5kdW1wKG1wQXVkaW9Qb2xpY3ksIGZkKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgImNhbid0IGR1bXAgQXVkaW9Qb2xpY3lTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKKyAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gQm5BdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCisvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQorCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKKyAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQoreworICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Cit9CisKKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6On5BdWRpb0NvbW1hbmRUaHJlYWQoKQoreworICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKKyAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBydW4obU5hbWUuc3RyaW5nKCksIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBuc2Vjc190IHdhaXRUaW1lID0gSU5UNjRfTUFYOworCisgICAgbUxvY2subG9jaygpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjOworICAgICAgICB3aGlsZSAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgbnNlY3NfdCBjdXJUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IGV4ZWN1dGUgdGhlbSBmcm9tIGluZGV4IDAgYW5kIHVwCisgICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIDw9IGN1clRpbWUpIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBtQXVkaW9Db21tYW5kc1swXTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogeworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CisgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7CisgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogeworICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSAoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGNyZWF0ZSBhdWRpbyBwYXRjaCIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSAoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIGF1ZGlvIHBhdGNoIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlIGF1ZGlvIHBvcnQgbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QQVRDSF9MSVNUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyBwYXRjaCBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfQVVESU9QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgICAgICAgICBTZXRBdWRpb1BvcnRDb25maWdEYXRhICpkYXRhID0gKFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwb3J0IGNvbmZpZyIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woY29tbWFuZC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgLSBjdXJUaW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgbUxvY2sgYmVmb3JlIHJlbGVhc2luZyBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBzZXJ2aWNlIGFzCisgICAgICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBkZXN0cnVjdG9yIGNhbGxzIEF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpIHdoaWNoIGFjcXVpcmVzIG1Mb2NrLgorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgc3ZjLmNsZWFyKCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKCFleGl0UGVuZGluZygpICYmIG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jaworICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7CisgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB3YWtpbmcgdXAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGJlZm9yZSBxdWl0dGluZworICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0NvbW1hbmRUaHJlYWQgJXAgRHVtcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICBTdHJpbmc4IHJlc3VsdDIoa0NtZERlYWRsb2NrZWRTdHJpbmcpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0Mi5zdHJpbmcoKSwgcmVzdWx0Mi5zaXplKCkpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gQ29tbWFuZHM6XG4iKTsKKyAgICByZXN1bHQgPSBTdHJpbmc4KGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgQ29tbWFuZCBUaW1lICAgICAgICBXYWl0IHBQYXJhbVxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9Db21tYW5kc1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIiAgTGFzdCBDb21tYW5kXG4iKTsKKyAgICBpZiAobUxhc3RDb21tYW5kICE9IDApIHsKKyAgICAgICAgbUxhc3RDb21tYW5kLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgIG5vbmVcbiIpOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7CisgICAgc3A8VG9uZURhdGE+IGRhdGEgPSBuZXcgVG9uZURhdGEoKTsKKyAgICBkYXRhLT5tVHlwZSA9IHR5cGU7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9WT0xVTUU7CisgICAgc3A8Vm9sdW1lRGF0YT4gZGF0YSA9IG5ldyBWb2x1bWVEYXRhKCk7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOworICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCB2b2x1bWUgJWYsIG91dHB1dCAlZCIsCisgICAgICAgICAgICBzdHJlYW0sIHZvbHVtZSwgb3V0cHV0KTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9QQVJBTUVURVJTOworICAgIHNwPFBhcmFtZXRlcnNEYXRhPiBkYXRhID0gbmV3IFBhcmFtZXRlcnNEYXRhKCk7CisgICAgZGF0YS0+bUlPID0gaW9IYW5kbGU7CisgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMgPSBTdHJpbmc4KGtleVZhbHVlUGFpcnMpOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLCBpb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPSUNFX1ZPTFVNRTsKKyAgICBzcDxWb2ljZVZvbHVtZURhdGE+IGRhdGEgPSBuZXcgVm9pY2VWb2x1bWVEYXRhKCk7CisgICAgZGF0YS0+bVZvbHVtZSA9IHZvbHVtZTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwgdm9sdW1lKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7CisgICAgc3A8U3RvcE91dHB1dERhdGE+IGRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfT1VUUFVUOworICAgIHNwPFJlbGVhc2VPdXRwdXREYXRhPiBkYXRhID0gbmV3IFJlbGVhc2VPdXRwdXREYXRhKCk7CisgICAgZGF0YS0+bUlPID0gb3V0cHV0OworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDUkVBVEVfQVVESU9fUEFUQ0g7CisgICAgQ3JlYXRlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSBuZXcgQ3JlYXRlQXVkaW9QYXRjaERhdGEoKTsKKyAgICBkYXRhLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgZGF0YS0+bUhhbmRsZSA9ICpoYW5kbGU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBjcmVhdGUgcGF0Y2ggZGVsYXkgJWQiLCBkZWxheU1zKTsKKyAgICBzdGF0dXMgPSBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpoYW5kbGUgPSBkYXRhLT5tSGFuZGxlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX0FVRElPX1BBVENIOworICAgIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IG5ldyBSZWxlYXNlQXVkaW9QYXRjaERhdGEoKTsKKyAgICBkYXRhLT5tSGFuZGxlID0gaGFuZGxlOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBwYXRjaCBkZWxheSAlZCIsIGRlbGF5TXMpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BVURJT1BPUlRfTElTVDsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHVwZGF0ZSBhdWRpbyBwb3J0IGxpc3QiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BVURJT1BBVENIX0xJU1Q7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB1cGRhdGUgYXVkaW8gcGF0Y2ggbGlzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9BVURJT1BPUlRfQ09ORklHOworICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSBuZXcgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSgpOworICAgIGRhdGEtPm1Db25maWcgPSAqY29uZmlnOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBvcnQgY29uZmlnIGRlbGF5ICVkIiwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMpCit7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2woY29tbWFuZC0+bUxvY2spOworICAgIHdoaWxlIChjb21tYW5kLT5tV2FpdFN0YXR1cykgeworICAgICAgICBuc2Vjc190IHRpbWVPdXROcyA9IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgKyBtaWxsaXNlY29uZHMoZGVsYXlNcyk7CisgICAgICAgIGlmIChjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUoY29tbWFuZC0+bUxvY2ssIHRpbWVPdXROcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb21tYW5kLT5tU3RhdHVzOworfQorCisvLyBpbnNlcnRDb21tYW5kX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Omluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGk7ICAvLyBub3Qgc2l6ZV90IGJlY2F1c2UgaSB3aWxsIGNvdW50IGRvd24gdG8gLTEKKyAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gcmVtb3ZlZENvbW1hbmRzOworICAgIGNvbW1hbmQtPm1UaW1lID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKGRlbGF5TXMpOworCisgICAgLy8gYWNxdWlyZSB3YWtlIGxvY2sgdG8gbWFrZSBzdXJlIGRlbGF5ZWQgY29tbWFuZHMgYXJlIHByb2Nlc3NlZAorICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBzYW1lIHBlbmRpbmcgY29tbWFuZHMgd2l0aCBsYXRlciB0aW1lIHN0YW1wcyBhbmQgZWxpbWluYXRlIHRoZW0KKyAgICBmb3IgKGkgPSBtQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kMiA9IG1BdWRpb0NvbW1hbmRzW2ldOworICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogbm8gbmVlZCB0byBzY2FuIHRoZSByZXN0IG9mIG1BdWRpb0NvbW1hbmRzCisgICAgICAgIGlmIChjb21tYW5kMi0+bVRpbWUgPD0gY29tbWFuZC0+bVRpbWUpIGJyZWFrOworCisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwYXRjaCBvciByZWxlYXNlIGF1ZGlvIHBhdGNoIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50CisgICAgICAgIC8vIHdpdGggcmVnYXJkIHRvIGZpbHRlcmluZworICAgICAgICBpZiAoKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgfHwKKyAgICAgICAgICAgICAgICAoY29tbWFuZC0+bUNvbW1hbmQgPT0gUkVMRUFTRV9BVURJT19QQVRDSCkpIHsKKyAgICAgICAgICAgIGlmICgoY29tbWFuZDItPm1Db21tYW5kICE9IENSRUFURV9BVURJT19QQVRDSCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBSRUxFQVNFX0FVRElPX1BBVENIKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBjb21tYW5kLT5tQ29tbWFuZCkgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgeworICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOworICAgICAgICAgICAgQUxPR1YoIkNvbXBhcmluZyBwYXJhbWV0ZXIgY29tbWFuZCAlcyB0byBuZXcgY29tbWFuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTIgPSBBdWRpb1BhcmFtZXRlcihkYXRhMi0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXJhbS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW0uZ2V0QXQoaiwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwYXJhbTIuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkyOworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlMjsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0yLmdldEF0KGssIGtleTIsIHZhbHVlMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkyID09IGtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLnJlbW92ZShrZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHBhcmFtZXRlciAlcyIsIGtleTIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBhbGwga2V5cyBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0LCByZW1vdmUgdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHBhaXJzCisgICAgICAgICAgICBpZiAocGFyYW0yLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycyA9IHBhcmFtMi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7CisgICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCisgICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAorICAgICAgICAgICAgZGVsYXlNcyA9IDE7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CisgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhMiA9IChWb2x1bWVEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7CisgICAgICAgICAgICBpZiAoZGF0YS0+bVN0cmVhbSAhPSBkYXRhMi0+bVN0cmVhbSkgYnJlYWs7CisgICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOworICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgorICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKKyAgICAgICAgICAgIGRlbGF5TXMgPSAxOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlmIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaCA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTI7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gyOworICAgICAgICAgICAgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUyID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoMiA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUyID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gaGFuZGxlMikgYnJlYWs7CisgICAgICAgICAgICAvKiBGaWx0ZXIgQ1JFQVRFX0FVRElPX1BBVENIIGNvbW1hbmRzIG9ubHkgd2hlbiB0aGV5IGFyZSBpc3N1ZWQgZm9yCisgICAgICAgICAgICAgICBzYW1lIG91dHB1dC4gKi8KKyAgICAgICAgICAgIGlmKCAoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSAmJgorICAgICAgICAgICAgICAgIChjb21tYW5kMi0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSApIHsKKyAgICAgICAgICAgICAgICBib29sIGlzT3V0cHV0RGlmZiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwYXRjaC5udW1fc291cmNlcyA9PSBwYXRjaDIubnVtX3NvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjb3VudCA9IDA7IGNvdW50IDwgcGF0Y2gubnVtX3NvdXJjZXM7IGNvdW50KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC5zb3VyY2VzW2NvdW50XS5pZCAhPSBwYXRjaDIuc291cmNlc1tjb3VudF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dHB1dERpZmYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc091dHB1dERpZmYpCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0ICVzIGF1ZGlvIHBhdGNoIGNvbW1hbmQgZm9yIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSA/ICJjcmVhdGUiIDogInJlbGVhc2UiLCBoYW5kbGUpOworICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7CisgICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKKyAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCisgICAgICAgICAgICBkZWxheU1zID0gMTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNUQVJUX1RPTkU6CisgICAgICAgIGNhc2UgU1RPUF9UT05FOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZW1vdmUgZmlsdGVyZWQgY29tbWFuZHMKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlbW92ZWRDb21tYW5kcy5zaXplKCk7IGorKykgeworICAgICAgICAvLyByZW1vdmVkIGNvbW1hbmRzIGFsd2F5cyBoYXZlIHRpbWUgc3RhbXBzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGNvbW1hbmQKKyAgICAgICAgZm9yIChzaXplX3QgayA9IGkgKyAxOyBrIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1trXS5nZXQoKSA9PSByZW1vdmVkQ29tbWFuZHNbal0uZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic3VwcHJlc3NpbmcgY29tbWFuZDogJWQiLCBtQXVkaW9Db21tYW5kc1trXS0+bUNvbW1hbmQpOworICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KGspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJlbW92ZWRDb21tYW5kcy5jbGVhcigpOworCisgICAgLy8gRGlzYWJsZSB3YWl0IGZvciBzdGF0dXMgaWYgZGVsYXkgaXMgbm90IDAKKyAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CisgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5zZXJ0IGNvbW1hbmQgYXQgdGhlIHJpZ2h0IHBsYWNlIGFjY29yZGluZyB0byBpdHMgdGltZSBzdGFtcAorICAgIEFMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJXpkLCBudW0gY29tbWFuZHMgJXp1IiwKKyAgICAgICAgICAgIGNvbW1hbmQtPm1Db21tYW5kLCBpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7CisgICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkKK3sKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0Iik7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZDo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwMmQgICAgICAlMDZkLiUwM2QgICUwMXUgICAgJXBcbiIsCisgICAgICAgICAgICBtQ29tbWFuZCwKKyAgICAgICAgICAgIChpbnQpbnMycyhtVGltZSksCisgICAgICAgICAgICAoaW50KW5zMm1zKG1UaW1lKSUxMDAwLAorICAgICAgICAgICAgbVdhaXRTdGF0dXMsCisgICAgICAgICAgICBtUGFyYW0uZ2V0KCkpOworfQorCisvKioqKioqKiBoZWxwZXJzIGZvciB0aGUgc2VydmljZV9vcHMgY2FsbGJhY2tzIGRlZmluZWQgYmVsb3cgKioqKioqKioqLwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoc3RyZWFtLCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOworICAgIH0KKyAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAorICAgICAgICAgICAgdG9uZSk7CisgICAgfQorICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCit7CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Cit9CisKK2V4dGVybiAiQyIgeworYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKK2ludCBhcHNfY2xvc2Vfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CitpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CitpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgX191bnVzZWQpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzayk7CitpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKK2ludCBhcHNfaW52YWxpZGF0ZV9zdHJlYW0odm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSBfX3VudXNlZCwgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpOworY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cyk7Cit2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKK2ludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpOworaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKK307CisKK25hbWVzcGFjZSB7CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzID0geworICAgICAgICAub3Blbl9vdXRwdXQgICAgICAgICAgID0gYXBzX29wZW5fb3V0cHV0LAorICAgICAgICAub3Blbl9kdXBsaWNhdGVfb3V0cHV0ID0gYXBzX29wZW5fZHVwX291dHB1dCwKKyAgICAgICAgLmNsb3NlX291dHB1dCAgICAgICAgICA9IGFwc19jbG9zZV9vdXRwdXQsCisgICAgICAgIC5zdXNwZW5kX291dHB1dCAgICAgICAgPSBhcHNfc3VzcGVuZF9vdXRwdXQsCisgICAgICAgIC5yZXN0b3JlX291dHB1dCAgICAgICAgPSBhcHNfcmVzdG9yZV9vdXRwdXQsCisgICAgICAgIC5vcGVuX2lucHV0ICAgICAgICAgICAgPSBhcHNfb3Blbl9pbnB1dCwKKyAgICAgICAgLmNsb3NlX2lucHV0ICAgICAgICAgICA9IGFwc19jbG9zZV9pbnB1dCwKKyAgICAgICAgLnNldF9zdHJlYW1fdm9sdW1lICAgICA9IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSwKKyAgICAgICAgLmludmFsaWRhdGVfc3RyZWFtICAgICA9IGFwc19pbnZhbGlkYXRlX3N0cmVhbSwKKyAgICAgICAgLnNldF9wYXJhbWV0ZXJzICAgICAgICA9IGFwc19zZXRfcGFyYW1ldGVycywKKyAgICAgICAgLmdldF9wYXJhbWV0ZXJzICAgICAgICA9IGFwc19nZXRfcGFyYW1ldGVycywKKyAgICAgICAgLnN0YXJ0X3RvbmUgICAgICAgICAgICA9IGFwc19zdGFydF90b25lLAorICAgICAgICAuc3RvcF90b25lICAgICAgICAgICAgID0gYXBzX3N0b3BfdG9uZSwKKyAgICAgICAgLnNldF92b2ljZV92b2x1bWUgICAgICA9IGFwc19zZXRfdm9pY2Vfdm9sdW1lLAorICAgICAgICAubW92ZV9lZmZlY3RzICAgICAgICAgID0gYXBzX21vdmVfZWZmZWN0cywKKyAgICAgICAgLmxvYWRfaHdfbW9kdWxlICAgICAgICA9IGFwc19sb2FkX2h3X21vZHVsZSwKKyAgICAgICAgLm9wZW5fb3V0cHV0X29uX21vZHVsZSA9IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUsCisgICAgICAgIC5vcGVuX2lucHV0X29uX21vZHVsZSAgPSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUsCisgICAgfTsKK307IC8vIG5hbWVzcGFjZSA8dW5uYW1lZD4KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2OGFiMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0wLDAgKzEsNTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKKworI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsCisgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPjsKKworcHVibGljOgorICAgIC8vIGZvciBCaW5kZXJTZXJ2aWNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNlcnZpY2VOYW1lKCkgQU5EUk9JRF9BUEkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX3BvbGljeSI7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgLy8KKyAgICAvLyBCbkF1ZGlvUG9saWN5U2VydmljZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQorICAgIC8vCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgIC8vIFJlZkJhc2UKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisKKyAgICAvLworICAgIC8vIEhlbHBlcnMgZm9yIHRoZSBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGltcGxlbWVudGF0aW9uLgorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0CisgICAgLy8gYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBwb2xpY3kgc2VydmljZS4KKyAgICAvLworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50UmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCk7CisgICAgICAgICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworCitwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGR1bXBJbnRlcm5hbHMoaW50IGZkKTsKKworICAgIC8vIFRocmVhZCB1c2VkIGZvciB0b25lIHBsYXliYWNrIGFuZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCisgICAgLy8gRm9yIHRvbmUgcGxheWJhY2ssIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jayB3aXRoIG1Mb2NrIGJlY2F1c2UKKyAgICAvLyBzdGFydFRvbmUoKSBhbmQgc3RvcFRvbmUoKSBhcmUgbm9ybWFsbHkgY2FsbGVkIHdpdGggbUxvY2sgbG9ja2VkIGFuZCByZXF1ZXN0aW5nIGEgdG9uZSBzdGFydAorICAgIC8vIG9yIHN0b3Agd2lsbCBjYXVzZSBjYWxscyB0byBBdWRpb1BvbGljeVNlcnZpY2UgYW5kIGFuIGF0dGVtcHQgdG8gbG9jayBtTG9jay4KKyAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKKyAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCisgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZDsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgLy8gY29tbWFuZHMgZm9yIHRvbmUgQXVkaW9Db21tYW5kCisgICAgICAgIGVudW0geworICAgICAgICAgICAgU1RBUlRfVE9ORSwKKyAgICAgICAgICAgIFNUT1BfVE9ORSwKKyAgICAgICAgICAgIFNFVF9WT0xVTUUsCisgICAgICAgICAgICBTRVRfUEFSQU1FVEVSUywKKyAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUsCisgICAgICAgICAgICBTVE9QX09VVFBVVCwKKyAgICAgICAgICAgIFJFTEVBU0VfT1VUUFVULAorICAgICAgICAgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKKyAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCisgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKKyAgICAgICAgfTsKKworICAgICAgICBBdWRpb0NvbW1hbmRUaHJlYWQgKFN0cmluZzggbmFtZSwgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvQ29tbWFuZFRocmVhZCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFRvbmVDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIHJlcXVlc3RlZCB0b25lIHBsYXliYWNrIGV2ZW50CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZDogcHVibGljIFJlZkJhc2UgeworCisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCgpCisgICAgICAgICAgICA6IG1Db21tYW5kKC0xKSwgbVN0YXR1cyhOT19FUlJPUiksIG1XYWl0U3RhdHVzKGZhbHNlKSB7fQorCisgICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCisgICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAorICAgICAgICAgICAgTXV0ZXggbUxvY2s7ICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgdG8gbUNvbmQKKyAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCisgICAgICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBjb21tYW5kIHN0YXR1cworICAgICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBjYWxsZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCisgICAgICAgICAgICBzcDxBdWRpb0NvbW1hbmREYXRhPiBtUGFyYW07ICAgICAvLyBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTogcHVibGljIFJlZkJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb0NvbW1hbmREYXRhKCkge30KKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBQYXJhbWV0ZXJzRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICAgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBWb2ljZVZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGZsb2F0IG1Wb2x1bWU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKKyAgICAgICAgICAgIGludCBtU2Vzc2lvbjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBSZWxlYXNlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CisgICAgICAgIH07CisKKyAgICAgICAgTXV0ZXggICBtTG9jazsKKyAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOworICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcworICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKKyAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBtTGFzdENvbW1hbmQ7ICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQorICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcworICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgIH07CisKKyAgICBjbGFzcyBBdWRpb1BvbGljeUNsaWVudCA6IHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZQorICAgIHsKKyAgICAgcHVibGljOgorICAgICAgICBBdWRpb1BvbGljeUNsaWVudChBdWRpb1BvbGljeVNlcnZpY2UgKnNlcnZpY2UpIDogbUF1ZGlvUG9saWN5U2VydmljZShzZXJ2aWNlKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUNsaWVudCgpIHt9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gSFcgbW9kdWxlIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIGxvYWRzIGEgSFcgbW9kdWxlLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gb3BlbnMgYW4gYXVkaW8gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIHZhbHVlcyBjYW4gaW5kaWNhdGUgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcworICAgICAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KKyAgICAgICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAvLyBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGNoZWNrIGlmIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzIGFyZSBzdWl0YWJsZSBvciBub3QgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworICAgICAgICAvLyBjbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCisgICAgICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBvcGVucyBhbiBhdWRpbyBpbnB1dAorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLy8gY2xvc2VzIGFuIGF1ZGlvIGlucHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisgICAgICAgIC8vCisgICAgICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8vIGludmFsaWRhdGUgYSBzdHJlYW0gdHlwZSwgY2F1c2luZyBhIHJlcm91dGUgdG8gYW4gdW5zcGVjaWZpZWQgbmV3IG91dHB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKKyAgICAgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKKworICAgICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gbW92ZSBlZmZlY3QgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworCisgICAgICAgIC8qIENyZWF0ZSBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgLyogUmVsZWFzZSBhIHBhdGNoICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworCisgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSAqbUF1ZGlvUG9saWN5U2VydmljZTsKKyAgICB9OworCisgICAgLy8gLS0tIE5vdGlmaWNhdGlvbiBDbGllbnQgLS0tCisgICAgY2xhc3MgTm90aWZpY2F0aW9uQ2xpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBOb3RpZmljYXRpb25DbGllbnQmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQmIG9wZXJhdG9yID0gKGNvbnN0IE5vdGlmaWNhdGlvbkNsaWVudCYpOworCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOworICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OworICAgIH07CisKKyAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGllcy4KKyAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpOworCisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKKyAgICBBdWRpb1BvbGljeUludGVyZmFjZSAqbUF1ZGlvUG9saWN5TWFuYWdlcjsKKyAgICBBdWRpb1BvbGljeUNsaWVudCAqbUF1ZGlvUG9saWN5Q2xpZW50OworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCB1aWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworCisgICAgLy8gTWFuYWdlIGFsbCBlZmZlY3RzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODNmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZgpAQCAtMCwwICsxLDE0NSBAQAorIworIyBUZW1wbGF0ZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisjCisKKyMgR2xvYmFsIGNvbmZpZ3VyYXRpb24gc2VjdGlvbjoKKyMgLSBiZWZvcmUgYXVkaW8gSEFMIHZlcnNpb24gMy4wOgorIyAgIGxpc3RzIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgZGV2aWNlCisjICAgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0LgorIyAgIERldmljZXMgYXJlIGRlc2lnbmF0ZWQgYnkgYSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZW51bSBpbiBhdWRpby5oCisjCisjICBnbG9iYWxfY29uZmlndXJhdGlvbiB7CisjICAgIGF0dGFjaGVkX291dHB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICBkZWZhdWx0X291dHB1dF9kZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgIGF0dGFjaGVkX2lucHV0X2RldmljZXMgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisjICB9CisjCisjIC0gYWZ0ZXIgYW5kIGluY2x1ZGluZyBhdWRpbyBIQUwgMy4wIHRoZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uIGlzIGluY2x1ZGVkIGluIGVhY2gKKyMgICBoYXJkd2FyZSBtb2R1bGUgc2VjdGlvbi4KKyMgICBpdCBhbHNvIGluY2x1ZGVzIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBvZiB0aGlzIGh3IG1vZHVsZToKKyMgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyMgICAgLi4uCisjICAgICBhdWRpb19oYWxfdmVyc2lvbiA8bWFqb3IubWlub3I+ICAjIGF1ZGlvIEhBTCB2ZXJzaW9uIGluIGUuZy4gMy4wCisjICB9CisjICAgb3RoZXIgYXR0cmlidXRlcyAoYXR0YWNoZWQgZGV2aWNlcywgZGVmYXVsdCBkZXZpY2UpIGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisjICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbiBvZiBlYWNoIGhhcmR3YXJlIG1vZHVsZQorCisKKyMgYXVkaW8gaGFyZHdhcmUgbW9kdWxlIHNlY3Rpb246IGNvbnRhaW5zIGRlc2NyaXB0b3JzIGZvciBhbGwgYXVkaW8gaHcgbW9kdWxlcyBwcmVzZW50IG9uIHRoZQorIyBkZXZpY2UuIEVhY2ggaHcgbW9kdWxlIG5vZGUgaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgaHcgbW9kdWxlIGxpYnJhcnkgYmFzZSBuYW1lLgorIyBGb3IgaW5zdGFuY2UsICJwcmltYXJ5IiBjb3JyZXNwb25kcyB0byBhdWRpby5wcmltYXJ5LjxkZXZpY2U+LnNvLgorIyBUaGUgInByaW1hcnkiIG1vZHVsZSBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgb3V0cHV0IHdpdGgKKyMgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSBmbGFnLgorIyBFYWNoIG1vZHVsZSBkZXNjcmlwdG9yIGNvbnRhaW5zIG9uZSBvciBtb3JlIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0b3JzIGFuZCB6ZXJvIG9yIG1vcmUKKyMgaW5wdXQgcHJvZmlsZSBkZXNjcmlwdG9ycy4gRWFjaCBwcm9maWxlIGxpc3RzIGFsbCB0aGUgcGFyYW1ldGVycyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBvdXRwdXQKKyMgb3IgaW5wdXQgc3RyZWFtIGNhdGVnb3J5LgorIyBUaGUgImNoYW5uZWxfbWFza3MiLCAiZm9ybWF0cyIsICJkZXZpY2VzIiBhbmQgImZsYWdzIiBhcmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZ3MgY29ycmVzcG9uZGluZworIyB0byBlbnVtcyBpbiBhdWRpby5oIGFuZCBhdWRpb19wb2xpY3kuaC4gVGhleSBhcmUgY29uY2F0ZW5hdGVkIGJ5IHVzZSBvZiAifCIgd2l0aG91dCBzcGFjZSBvciAiXG4iLgorIworIyBGb3IgYXVkaW8gSEFMIHZlcnNpb24gcG9zdGVyaW9yIHRvIDMuMCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIG9yIHN1YiBzZWN0aW9ucyBjYW4gYmUgcHJlc2VudCBpbgorIyBhIGh3IG1vZHVsZSBzZWN0aW9uOgorIyAtIEEgImdsb2JhbF9jb25maWd1cmF0aW9uIiBzZWN0aW9uOiBzZWUgYWJvdmUKKyMgLSBPcHRpb25hbGx5IGEgImRldmljZXMiIHNlY3Rpb246CisjICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlc2NyaXB0b3JzIGZvciBhdWRpbyBkZXZpY2VzIHdpdGggYXR0cmlidXRlcyBsaWtlIGFuIGFkZHJlc3Mgb3IgYQorIyAgIGdhaW4gY29udHJvbGxlci4gVGhlIHN5bnRheCBmb3IgdGhlIGRldmljZXMgc2VjdGlvbiBhbmQgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXMgZm9sbG93czoKKyMgICAgZGV2aWNlcyB7CisjICAgICAgPGRldmljZSBuYW1lPiB7ICAgICAgICAgICAgICAjIDxkZXZpY2UgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZQorIyAgICAgICAgdHlwZSA8ZGV2aWNlIHR5cGU+ICAgICAgICAgIyA8ZGV2aWNlIHR5cGU+IGUuZy4gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgICAgICBhZGRyZXNzIDxhZGRyZXNzPiAgICAgICAgICAjIG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0IGluIGxlbmd0aAorIyAgICAgIH0KKyMgICAgfQorIyAtIG9uZSBvciBtb3JlICJnYWlucyIgc2VjdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4gYSBkZXZpY2UgZGVzY3JpcHRvciBzZWN0aW9uLgorIyAgIElmIHByZXNlbnQsIHRoZXkgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiBnYWluIGNvbnRyb2xsZXJzIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQgb3IKKyMgICBvdXRwdXQgZGV2aWNlLiBlLmcuIDoKKyMgICA8ZGV2aWNlIG5hbWU+IHsgICAgICAgICAgICAgICAgICAjIDxkZXZpY2UgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZQorIyAgICAgdHlwZSA8ZGV2aWNlIHR5cGU+ICAgICAgICAgICAgICMgPGRldmljZSB0eXBlPiBlLmcuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICAgYWRkcmVzcyA8YWRkcmVzcz4gICAgICAgICAgICAgICMgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQgaW4gbGVuZ3RoCisjICAgICBnYWlucyB7CisjICAgICAgIDxnYWluIG5hbWU+IHsKKyMgICAgICAgICBtb2RlIDxnYWluIG1vZGVzIHN1cHBvcnRlZD4gICAgICAgICAgICAgICMgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMKKyMgICAgICAgICBjaGFubmVsX21hc2sgPGNvbnRyb2xsZWQgY2hhbm5lbHM+ICAgICAgICMgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTCisjICAgICAgICAgbWluX3ZhbHVlX21CIDxtaW4gdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgbWF4X3ZhbHVlX21CIDxtYXggdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgZGVmYXVsdF92YWx1ZV9tQiA8ZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBzdGVwX3ZhbHVlX21CIDxzdGVwIHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIG1pbl9yYW1wX21zIDxtaW4gZHVyYXRpb24gaW4gbXM+ICAgICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUAorIyAgICAgICAgIG1heF9yYW1wX21zIDxtYXggZHVyYXRpb24gbXM+ICAgICAgICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUAorIyAgICAgICB9CisjICAgICB9CisjICAgfQorIyAtIHdoZW4gYSBkZXZpY2UgZGVzY3JpcHRvciBpcyBwcmVzZW50LCBvdXRwdXQgYW5kIGlucHV0IHByb2ZpbGVzIGNhbiByZWZlciB0byB0aGlzIGRldmljZSBieQorIyBpdHMgbmFtZSBpbiB0aGVpciAiZGV2aWNlcyIgc2VjdGlvbiBpbnN0ZWFkIG9mIHNwZWNpZnlpbmcgYSBkZXZpY2UgdHlwZS4gZS5nLiA6CisjICAgb3V0cHV0cyB7CisjICAgICBwcmltYXJ5IHsKKyMgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDQxMDAKKyMgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyMgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorIyAgICAgICBkZXZpY2VzIDxkZXZpY2UgbmFtZT4KKyMgICAgICAgZmxhZ3MgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWQorIyAgICAgfQorIyAgIH0KKyMgc2FtcGxlIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgYmVsb3cKKworYXVkaW9faHdfbW9kdWxlcyB7CisgIHByaW1hcnkgeworICAgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyAgICAgIGF0dGFjaGVkX291dHB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgZGVmYXVsdF9vdXRwdXRfZGV2aWNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMKKyAgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDMuMAorICAgIH0KKyAgICBkZXZpY2VzIHsKKyAgICAgIHNwZWFrZXIgeworICAgICAgICB0eXBlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgICBnYWlucyB7CisgICAgICAgICAgZ2Fpbl8xIHsKKyAgICAgICAgICAgIG1vZGUgQVVESU9fR0FJTl9NT0RFX0pPSU5UCisgICAgICAgICAgICBtaW5fdmFsdWVfbUIgLTg0MDAKKyAgICAgICAgICAgIG1heF92YWx1ZV9tQiA0MDAwCisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlX21CIDAKKyAgICAgICAgICAgIHN0ZXBfdmFsdWVfbUIgMTAwCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dHB1dHMgeworICAgICAgcHJpbWFyeSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBzcGVha2VyCisgICAgICAgIGZsYWdzIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRzIHsKKyAgICAgIHByaW1hcnkgeworICAgICAgICBzYW1wbGluZ19yYXRlcyA4MDAwfDE2MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9JTl9NT05PCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcl9zdWJtaXggeworICAgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyAgICAgIGF0dGFjaGVkX2lucHV0X2RldmljZXMgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDIuMAorICAgIH0KKyAgICBvdXRwdXRzIHsKKyAgICAgIHN1Ym1peCB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRzIHsKKyAgICAgIHN1Ym1peCB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIERlZmluaXRpb25zIGZvciBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIChhdWRpb19wb2xpY3kuY29uZikKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTiAzMgorCisjZGVmaW5lIEFVRElPX1BPTElDWV9DT05GSUdfRklMRSAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5LmNvbmYiCisjZGVmaW5lIEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeS5jb25mIgorCisvLyBnbG9iYWwgY29uZmlndXJhdGlvbgorI2RlZmluZSBHTE9CQUxfQ09ORklHX1RBRyAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iCisKKyNkZWZpbmUgQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHICJhdHRhY2hlZF9vdXRwdXRfZGV2aWNlcyIKKyNkZWZpbmUgREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRyAiZGVmYXVsdF9vdXRwdXRfZGV2aWNlIgorI2RlZmluZSBBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRyAiYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyIKKyNkZWZpbmUgU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcgInNwZWFrZXJfZHJjX2VuYWJsZWQiCisjZGVmaW5lIEFVRElPX0hBTF9WRVJTSU9OX1RBRyAiYXVkaW9faGFsX3ZlcnNpb24iCisKKy8vIGh3IG1vZHVsZXMgZGVzY3JpcHRpb25zCisjZGVmaW5lIEFVRElPX0hXX01PRFVMRV9UQUcgImF1ZGlvX2h3X21vZHVsZXMiCisKKyNkZWZpbmUgT1VUUFVUU19UQUcgIm91dHB1dHMiCisjZGVmaW5lIElOUFVUU19UQUcgImlucHV0cyIKKworI2RlZmluZSBTQU1QTElOR19SQVRFU19UQUcgInNhbXBsaW5nX3JhdGVzIgorI2RlZmluZSBGT1JNQVRTX1RBRyAiZm9ybWF0cyIKKyNkZWZpbmUgQ0hBTk5FTFNfVEFHICJjaGFubmVsX21hc2tzIgorI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKKyNkZWZpbmUgRkxBR1NfVEFHICJmbGFncyIKKworI2RlZmluZSBEWU5BTUlDX1ZBTFVFX1RBRyAiZHluYW1pYyIgLy8gc3BlY2lhbCB2YWx1ZSBmb3IgImNoYW5uZWxfbWFza3MiLCAic2FtcGxpbmdfcmF0ZXMiIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcm1hdHMiIGluIG91dHB1dHMgZGVzY3JpcHRvcnMgaW5kaWNhdGluZyB0aGF0IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNob3VsZCBiZSBxdWVyaWVkIGFmdGVyIG9wZW5pbmcgdGhlIG91dHB1dC4KKworI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKKyNkZWZpbmUgREVWSUNFX1RZUEUgInR5cGUiCisjZGVmaW5lIERFVklDRV9BRERSRVNTICJhZGRyZXNzIgorCisjZGVmaW5lIE1JWEVSU19UQUcgIm1peGVycyIKKyNkZWZpbmUgTUlYRVJfVFlQRSAidHlwZSIKKyNkZWZpbmUgTUlYRVJfVFlQRV9NVVggIm11eCIKKyNkZWZpbmUgTUlYRVJfVFlQRV9NSVggIm1peCIKKworI2RlZmluZSBHQUlOU19UQUcgImdhaW5zIgorI2RlZmluZSBHQUlOX01PREUgIm1vZGUiCisjZGVmaW5lIEdBSU5fQ0hBTk5FTFMgImNoYW5uZWxfbWFzayIKKyNkZWZpbmUgR0FJTl9NSU5fVkFMVUUgIm1pbl92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9NQVhfVkFMVUUgIm1heF92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9ERUZBVUxUX1ZBTFVFICJkZWZhdWx0X3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX1NURVBfVkFMVUUgInN0ZXBfdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fTUlOX1JBTVBfTVMgIm1pbl9yYW1wX21zIgorI2RlZmluZSBHQUlOX01BWF9SQU1QX01TICJtYXhfcmFtcF9tcyIKKworCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1MWJhNjk4Li5lMTg0ZDk3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEsMyArMSwxNyBAQAorIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAogIwpAQCAtMjAsNiArMzQsNyBAQAogICAgIGFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAorICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQnVyc3RDYXB0dXJlLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIFwKQEAgLTMzLDYgKzQ4LDcgQEAKICAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgXAorICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCiAgICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAogICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXApAQCAtNTMsNiArNjksNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKICAgICBleHRlcm5hbC9qcGVnCiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAppbmRleCA3ZmRmMzA0Li5iZmVmNTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcApAQCAtNDYsNiArNDYsOCBAQAogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTJEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgICBkZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggNTUwM2YyNi4uZmQ1YTQyNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTEsMjQgKzEsMjQgQEAKIC8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKQEAgLTMyLDEwICszMiwxNSBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKQEAgLTEzMCw2ICsxMzUsMTIgQEAKICAgICAgICAgICAgIG1Nb2R1bGUtPnNldF9jYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KIAorICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgeworICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgICAgIH0KKwogICAgICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpyZWdpc3RlclNlcnZpY2UodGhpcyk7CiAgICAgfQogfQpAQCAtMTQxLDYgKzE1Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICBnQ2FtZXJhU2VydmljZSA9IE5VTEw7CiB9CiAKQEAgLTE2OCw2ICsxODAsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtU2VydmljZUxvY2spOwogCisgICAgICAgICAgIC8qIFJlbW92ZSBjYWNoZWQgcGFyYW1ldGVycyBmcm9tIHNoaW0gY2FjaGUgKi8KKyAgICAgICAgICAgbVNoaW1QYXJhbXMucmVtb3ZlSXRlbShjYW1lcmFJZCk7CisKICAgICAgICAgICAgLyogRmluZCBhbGwgY2xpZW50cyB0aGF0IHdlIG5lZWQgdG8gZGlzY29ubmVjdCAqLwogICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwogICAgICAgICAgICBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKQEAgLTIyMCwxMiArMjM1LDk5IEBACiAgICAgfQogCiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmMgPSBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKTsKKyAgICBzdGF0dXNfdCByYyA9IGZpbHRlckdldEluZm9FcnJvckNvZGUoCisgICAgICAgIG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKICAgICBjYW1lcmFJbmZvLT5mYWNpbmcgPSBpbmZvLmZhY2luZzsKICAgICBjYW1lcmFJbmZvLT5vcmllbnRhdGlvbiA9IGluZm8ub3JpZW50YXRpb247CiAgICAgcmV0dXJuIHJjOwogfQogCisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgc3RydWN0IENhbWVyYUluZm8gaW5mbzsKKyAgICBpZiAoKHJldCA9IGdldENhbWVyYUluZm8oY2FtZXJhSWQsICZpbmZvKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBzaGltSW5mbzsKKyAgICBpbnQzMl90IG9yaWVudGF0aW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5mby5vcmllbnRhdGlvbik7CisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04sICZvcmllbnRhdGlvbiwgMSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdWludDhfdCBmYWNpbmcgPSAoaW5mby5mYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCkgPworICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0ZBQ0lOR19GUk9OVCA6IEFORFJPSURfTEVOU19GQUNJTkdfQkFDSzsKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfRkFDSU5HLCAmZmFjaW5nLCAxKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFZlY3RvcjxTaXplPiBzaXplczsKKyAgICBWZWN0b3I8U2l6ZT4ganBlZ1NpemVzOworICAgIFZlY3RvcjxpbnQzMl90PiBmb3JtYXRzOworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzOworICAgIHsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoLypvdXQqL3NpemVzKTsKKyAgICAgICAgc2hpbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cygvKm91dCovZm9ybWF0cyk7CisgICAgICAgIHNoaW1QYXJhbXMuZ2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKC8qb3V0Ki9qcGVnU2l6ZXMpOworICAgIH0KKworICAgIC8vIEFsd2F5cyBpbmNsdWRlIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICBmb3JtYXRzLmFkZChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworCisgICAgY29uc3Qgc2l6ZV90IElOVFNfUEVSX0NPTkZJRyA9IDQ7CisKKyAgICAvLyBCdWlsZCBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG1ldGFkYXRhCisgICAgc2l6ZV90IHN0cmVhbUNvbmZpZ1NpemUgPSAoc2l6ZXMuc2l6ZSgpICogZm9ybWF0cy5zaXplKCkgKyBqcGVnU2l6ZXMuc2l6ZSgpKSAqIElOVFNfUEVSX0NPTkZJRzsKKworICAgIFZlY3RvcjxpbnQzMl90PiBzdHJlYW1Db25maWdzOworICAgIHN0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoc3RyZWFtQ29uZmlnU2l6ZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoZm9ybWF0c1tpXSk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS53aWR0aCk7CisgICAgICAgICAgICBzdHJlYW1Db25maWdzLmFkZChzaXplc1tqXS5oZWlnaHQpOworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBqcGVnU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLndpZHRoKTsKKyAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoanBlZ1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hcnJheSgpLCBzdHJlYW1Db25maWdTaXplKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZha2VNaW5GcmFtZXNbMF07CisgICAgLy8gVE9ETzogRml4bWUsIGRvbid0IGZha2UgbWluIGZyYW1lIGR1cmF0aW9ucy4KKyAgICBpZiAoKHJldCA9IHNoaW1JbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VNaW5GcmFtZXMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDY0X3QgZmFrZVN0YWxsc1swXTsKKyAgICAvLyBUT0RPOiBGaXhtZSwgZG9uJ3QgZmFrZSBzdGFsbCBkdXJhdGlvbnMuCisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGZha2VTdGFsbHMsIDApKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpjYW1lcmFJbmZvID0gc2hpbUluZm87CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBpZiAoIWNhbWVyYUluZm8pIHsKQEAgLTIzOCwzNyArMzQwLDUxIEBACiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KIAotICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogT25seSBIQUwgbW9kdWxlIHZlcnNpb24gVjIgb3IgaGlnaGVyIHN1cHBvcnRzIHN0YXRpYyBtZXRhZGF0YSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCiAgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaW50IGZhY2luZzsKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKLSAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgY2hlY2sgb25jZSBIQUwxIHNoaW0gaXMgaW4gcGxhY2UuCi0gICAgICAgIEFMT0dFKCIlczogSEFMMSBkb2Vzbid0IHN1cHBvcnQgc3RhdGljIG1ldGFkYXRhIHlldCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgfHwKKyAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xICkgeworICAgICAgICAvKioKKyAgICAgICAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIEhBTHM6CisgICAgICAgICAqIC0gQ29udmVydCBDYW1lcmFJbmZvIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhIHByb3BlcnRpZXMuCisgICAgICAgICAqIC0gUmV0cmlldmUgY2FjaGVkIENhbWVyYVBhcmFtZXRlcnMgZm9yIHRoaXMgY2FtZXJhLiAgSWYgbm9uZSBleGlzdCwKKyAgICAgICAgICogICBhdHRlbXB0IHRvIG9wZW4gQ2FtZXJhQ2xpZW50IGFuZCByZXRyaWV2ZSB0aGUgQ2FtZXJhUGFyYW1ldGVycy4KKyAgICAgICAgICogLSBDb252ZXJ0IGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGludG8gc3RhdGljIENhbWVyYU1ldGFkYXRhCisgICAgICAgICAqICAgcHJvcGVydGllcy4KKyAgICAgICAgICovCisgICAgICAgIEFMT0dJKCIlczogU3dpdGNoaW5nIHRvIEhBTDEgc2hpbSBpbXBsZW1lbnRhdGlvbi4uLiIsIF9fRlVOQ1RJT05fXyk7CiAKLSAgICBpZiAoZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZykgPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzEpIHsKLSAgICAgICAgLy8gRGlzYWJsZSBIQUwyLnggc3VwcG9ydCBmb3IgY2FtZXJhMiBBUEkgZm9yIG5vdy4KLSAgICAgICAgQUxPR1coIiVzOiBIQUwyLnggZG9lc24ndCBzdXBwb3J0IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3Igbm93IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgICAgIGlmICgocmV0ID0gZ2VuZXJhdGVTaGltTWV0YWRhdGEoY2FtZXJhSWQsIGNhbWVyYUluZm8pKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0gICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgcmV0ID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbyk7Ci0gICAgKmNhbWVyYUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3JtYWwgSEFMIDIuMSsgY29kZXBhdGguCisgICAgICAgICAqLworICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKKyAgICAgICAgcmV0ID0gZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki9zcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIGlmICghbU1vZHVsZSkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBoYXJkd2FyZSBtb2R1bGUgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcmV0dXJuIE9LOworfQorCiBpbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihpbnQgY2FtZXJhSWQsIGludCogZmFjaW5nKSB7CiAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CiAgICAgaWYgKG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CkBAIC0yODksMjEgKzQwNSwxNjIgQEAKICAgICByZXR1cm4gZGV2aWNlVmVyc2lvbjsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjppc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IGZhY2luZzsKLSAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICBjYXNlIC1FSU5WQUw6CisgICAgICAgIGNhc2UgLUVVU0VSUzoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CiAKLSAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0Ogorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgICAgIGNhc2UgTk9fRVJST1I6CisgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wcyA9IHZlbmRvcl90YWdfb3BzX3QoKTsKKworICAgIC8vIENoZWNrIGlmIHZlbmRvciBvcGVyYXRpb25zIGhhdmUgYmVlbiBpbXBsZW1lbnRlZAorICAgIGlmIChtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiJXM6IE5vIHZlbmRvciB0YWdzIGRlZmluZWQgZm9yIHRoaXMgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKKyAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMoJnZPcHMpOworICAgIEFUUkFDRV9FTkQoKTsKKworICAgIC8vIEVuc3VyZSBhbGwgdmVuZG9yIG9wZXJhdGlvbnMgYXJlIHByZXNlbnQKKyAgICBpZiAodk9wcy5nZXRfdGFnX2NvdW50ID09IE5VTEwgfHwgdk9wcy5nZXRfYWxsX3RhZ3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfc2VjdGlvbl9uYW1lID09IE5VTEwgfHwgdk9wcy5nZXRfdGFnX25hbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgdk9wcy5nZXRfdGFnX3R5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgb3BlcmF0aW9ucyBub3QgZnVsbHkgZGVmaW5lZC4gSWdub3JpbmcgZGVmaW5pdGlvbnMuIgorICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21PcHMoJnZPcHMsIC8qb3V0Ki9kZXNjKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgorICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgdG8gdXNlIHdpdGggY2FtZXJhIG1ldGFkYXRhCisgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6c2V0QXNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKGRlc2MpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgeworICAgIGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICBzdGF0dXNfdCByZXQgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIHVpZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAvLyBFcnJvciBhbHJlYWR5IGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBib29sIG5lZWRzTmV3Q2xpZW50ID0gZmFsc2U7CisgICAgc3A8Q2xpZW50PiBjbGllbnQ7CisKKyAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJtZWRpYSIpOworICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCkuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgbmVlZHNOZXdDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0ID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNhbWVyYUNsaWVudCovTlVMTCwgLy8gRW1wdHkgYmluZGVyIGNhbGxiYWNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOworCisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY29ubmVjdCB0byBjbGllbnQgY2FtZXJhIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHJhd1BhcmFtcyk7CisgICAgICAgIG1TaGltUGFyYW1zLmFkZChjYW1lcmFJZCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBjbGllbnQgaWYgb25lIHdhcyBvcGVuZWQgc29sZWx5IGZvciB0aGlzIGNhbGwKKyAgICBpZiAobmVlZHNOZXdDbGllbnQpIHsKKyAgICAgICAgY2xpZW50LT5kaXNjb25uZWN0KCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpIHsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYUlkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworCisgICAgc3RhdHVzX3QgcmV0ID0gMDsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSAtMTsKKyAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgICAgICAvLyBSZWxlYXNlIHNlcnZpY2UgbG9jayBzbyBpbml0aWFsaXplU2hpbU1ldGFkYXRhIGNhbiBiZSBjYWxsZWQgY29ycmVjdGx5LgorCisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IG1TaGltUGFyYW1zW2luZGV4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHJldCA9IGluaXRpYWxpemVTaGltTWV0YWRhdGEoY2FtZXJhSWQpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgICAgICBpbmRleCA9IG1TaGltUGFyYW1zLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQiKTsKKworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBtU2hpbVBhcmFtc1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ29ubmVjdChpbnQgY2FtZXJhSWQsCkBAIC00MDIsNiArNjU5LDc3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXJMb2NrZWQoCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAvKmluKi8KKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGludCBjbGllbnRVaWQsCisgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgYm9vbCBsZWdhY3lNb2RlKSB7CisKKyAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKKworICAgIGlmIChoYWxWZXJzaW9uIDwgMCB8fCBoYWxWZXJzaW9uID09IGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXRoOiBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBieSBjYWxsZXIsIGNyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBIHBhcnRpY3VsYXIgSEFMIHZlcnNpb24gaXMgcmVxdWVzdGVkIGJ5IGNhbGxlci4gQ3JlYXRlIENhbWVyYUNsaWVudAorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIEhBTCB2ZXJzaW9uLgorICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICYmCisgICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCisgICAgICAgICAgICAgICAgICAgICIgb3BlbmVkIGFzIEhBTCAleCBkZXZpY2UiLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgZ2V0cGlkKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBpbnQgY2FtZXJhSWQsCkBAIC00MzUsNTAgKzc2Myw4MSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBvdGhlciBub24tZXhjbHVzaXZlIHVzZXJzIG9mIHRoZSBjYW1lcmEsCi0gICAgICAgIC8vICB0aGlzIHdpbGwgdGVhciB0aGVtIGRvd24gYmVmb3JlIHdlIGNhbiByZXVzZSB0aGUgY2FtZXJhCi0gICAgICAgIGlmIChpc1ZhbGlkQ2FtZXJhSWQoY2FtZXJhSWQpKSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIGlkICVkIiwgY2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCi0gICAgICAgICAgICAvLyBPSzogd2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2Ugd2VyZSBvcmlnaW5hbGx5IGluIFBSRVNFTlQgc3RhdGUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIG1DbGllbnRbY2FtZXJhSWRdID0gY2xpZW50OwotICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICBnZXRwaWQoKSk7CisgICAgfQorICAgIC8vIGltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sKKyAgICAvLyAgICBpbnRvIHRoZSBzZXJ2aWNlIGZyb20gaXRzIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQorCisgICAgZGV2aWNlID0gY2xpZW50OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKKyAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpIHsKKworICAgIGlmIChoYWxWZXJzaW9uICE9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMykgeworICAgICAgICAvKgorICAgICAgICAgKiBFaXRoZXIgdGhlIEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGluIHdoaWNoIGNhc2UgdGhpcyBqdXN0IGNyZWF0ZXMKKyAgICAgICAgICogYSBjYW1lcmEgY2xpZW50IHNlbGVjdGVkIGJ5IHRoZSBsYXRlc3QgZGV2aWNlIHZlcnNpb24sIG9yCisgICAgICAgICAqIGl0J3MgYSBwYXJ0aWN1bGFyIHZlcnNpb24gaW4gd2hpY2ggY2FzZSB0aGUgSEFMIG11c3Qgc3VwcG9ydGVkCisgICAgICAgICAqIHRoZSBvcGVuX2xlZ2FjeSBjYWxsCisgICAgICAgICAqLworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBIQUwgbW9kdWxlIHZlcnNpb24gJXggZG9lc24ndCBzdXBwb3J0IGNvbm5lY3RpbmcgdG8gbGVnYWN5IEhBTCBkZXZpY2VzISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIFN0cmluZzggY2xpZW50TmFtZTgoY2xpZW50UGFja2FnZU5hbWUpOworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworCisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBsZWdhY3kgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKKyAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihjbGllbnRUbXAuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovdHJ1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgIH0KICAgICAvLyBpbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrCiAgICAgLy8gICAgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKQEAgLTQ5Myw4ICs4NTIsOSBAQAogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLSAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTUwNyw2ICs4NjcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVByb0NhbWVyYVVzZXI+JiBkZXZpY2UpCiB7CisgICAgaWYgKGNhbWVyYUNiID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKIApAQCAtNTQxLDYgKzkwNiw4IEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgICAgY2xpZW50ID0gbmV3IFByb0NhbWVyYTJDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjAzLDE0ICs5NzAsNiBAQAogICAgICAgICBpbnQgZmFjaW5nID0gLTE7CiAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CiAKLSAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG90aGVyIG5vbi1leGNsdXNpdmUgdXNlcnMgb2YgdGhlIGNhbWVyYSwKLSAgICAgICAgLy8gIHRoaXMgd2lsbCB0ZWFyIHRoZW0gZG93biBiZWZvcmUgd2UgY2FuIHJldXNlIHRoZSBjYW1lcmEKLSAgICAgICAgaWYgKGlzVmFsaWRDYW1lcmFJZChjYW1lcmFJZCkpIHsKLSAgICAgICAgICAgIC8vIHRyYW5zaXRpb24gZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7Ci0gICAgICAgIH0KLQogICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHVzaW5nIG9sZCBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKQEAgLTYxOSw2ICs5NzgsOCBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjMzLDggKzk5NCw2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KLSAgICAgICAgICAgIC8vIE9LOiB3ZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSB3ZXJlIG9yaWdpbmFsbHkgaW4gUFJFU0VOVCBzdGF0ZQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBjYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKQEAgLTcwOSw2ICsxMDY4LDc4IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0TGVnYWN5UGFyYW1ldGVycygKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKSB7CisgICAgQUxPR1YoIiVzOiBmb3IgY2FtZXJhIElEID0gJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKworICAgIGlmIChwYXJhbWV0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHJldCA9IDA7CisKKyAgICBDYW1lcmFQYXJhbWV0ZXJzIHNoaW1QYXJhbXM7CisgICAgaWYgKChyZXQgPSBnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShjYW1lcmFJZCwgLypvdXQqLyZzaGltUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgbG9nZ2VkIGJ5IGNhbGxlcgorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFN0cmluZzggc2hpbVBhcmFtc1N0cmluZzggPSBzaGltUGFyYW1zLmZsYXR0ZW4oKTsKKyAgICBTdHJpbmcxNiBzaGltUGFyYW1zU3RyaW5nMTYgPSBTdHJpbmcxNihzaGltUGFyYW1zU3RyaW5nOCk7CisKKyAgICAqcGFyYW1ldGVycyA9IHNoaW1QYXJhbXNTdHJpbmcxNjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisKKyAgICBzd2l0Y2ggKGFwaVZlcnNpb24pIHsKKyAgICAgICAgY2FzZSBBUElfVkVSU0lPTl8xOgorICAgICAgICBjYXNlIEFQSV9WRVJTSU9OXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogQmFkIEFQSSB2ZXJzaW9uICVkIiwgX19GVU5DVElPTl9fLCBhcGlWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50IGZhY2luZyA9IC0xOworICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CisKKyAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzIpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgSEFMIHByaW9yIHRvIEhBTDMuMiwgZG9lc24ndCBzdXBwb3J0IGFwaTIgd2l0aG91dCBzaGltIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIH0gZWxzZSB7IC8vIGlmIChhcGlWZXJzaW9uID09IEFQSV9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgb2xkZXIgSEFMIGJlZm9yZSAzLjIsIGJ1dCBhcGkxIGlzIGFsd2F5cyBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJWQgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIF9fRlVOQ1RJT05fXywgZGV2aWNlVmVyc2lvbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZUJpbmRlcikgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlIEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKQEAgLTcyMyw5ICsxMTU0LDEzIEBACiAgICAgaWYgKGNsaWVudCAhPSAwKSB7CiAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KICAgICAgICAgTE9HMSgicmVtb3ZlQ2xpZW50OiBjbGVhciBjYW1lcmEgJWQiLCBvdXRJbmRleCk7Ci0gICAgICAgIG1DbGllbnRbb3V0SW5kZXhdLmNsZWFyKCk7CiAKLSAgICAgICAgY2xpZW50LT5nZXRSZW1vdGUoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gY2xpZW50LT5nZXRSZW1vdGUoKTsKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZW1vdGUtPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBtQ2xpZW50W291dEluZGV4XS5jbGVhcigpOwogICAgIH0gZWxzZSB7CiAKICAgICAgICAgc3A8UHJvQ2xpZW50PiBjbGllbnRQcm8gPSBmaW5kUHJvQ2xpZW50VW5zYWZlKHJlbW90ZUJpbmRlcik7CkBAIC04MzUsNiArMTI3MCw3IEBACiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9QUk86CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0RFVklDRToKKyAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOgogICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwogICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgewpAQCAtODc3LDcgKzEzMTMsNyBAQAogCiBNZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewogICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgewogICAgICAgICBtcC0+c2V0QXVkaW9TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKICAgICAgICAgbXAtPnByZXBhcmUoKTsKICAgICB9IGVsc2UgewpAQCAtOTgxLDEzICsxNDE3LDE1IEBACiB2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0KCkgewogICAgIEFMT0dWKCJCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCIpOwogICAgIG1DYW1lcmFTZXJ2aWNlLT5yZW1vdmVDbGllbnRCeVJlbW90ZShtUmVtb3RlQmluZGVyKTsKKworICAgIGZpbmlzaENhbWVyYU9wcygpOwogICAgIC8vIGNsaWVudCBzaG91bGRuJ3QgYmUgYWJsZSB0byBjYWxsIGludG8gdXMgYW55bW9yZQogICAgIG1DbGllbnRQaWQgPSAwOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6c3RhcnRDYW1lcmFPcHMoKSB7CiAgICAgaW50MzJfdCByZXM7Ci0KKyAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgbm90IGF2YWlsYWJsZQogICAgIG1PcHNDYWxsYmFjayA9IG5ldyBPcHNDYWxsYmFjayh0aGlzKTsKIAogICAgIHsKQEAgLTEwMDUsMTYgKzE0NDMsMzkgQEAKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisKICAgICBtT3BzQWN0aXZlID0gdHJ1ZTsKKworICAgIC8vIFRyYW5zaXRpb24gZGV2aWNlIGF2YWlsYWJpbGl0eSBsaXN0ZW5lcnMgZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKKyAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFLAorICAgICAgICAgICAgbUNhbWVyYUlkKTsKKwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmZpbmlzaENhbWVyYU9wcygpIHsKKyAgICAvLyBDaGVjayBpZiBzdGFydENhbWVyYU9wcyBzdWNjZWVkZWQsIGFuZCBpZiBzbywgZmluaXNoIHRoZSBjYW1lcmEgb3AKICAgICBpZiAobU9wc0FjdGl2ZSkgeworICAgICAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgYXZhaWxhYmxlIGFnYWluCiAgICAgICAgIG1BcHBPcHNNYW5hZ2VyLmZpbmlzaE9wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBtT3BzQWN0aXZlID0gZmFsc2U7CisKKyAgICAgICAgLy8gTm90aWZ5IGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIHRoYXQgdGhpcyBjYW1lcmEgaXMgYXZhaWxhYmxlCisgICAgICAgIC8vIGFnYWluCisKKyAgICAgICAgU3RhdHVzVmVjdG9yIHJlamVjdFNvdXJjZVN0YXRlczsKKyAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpOworICAgICAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORyk7CisKKyAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiBhYm92ZSAyCisgICAgICAgIC8vIHN0YXRlcworICAgICAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAmcmVqZWN0U291cmNlU3RhdGVzKTsKKwogICAgIH0KKyAgICAvLyBBbHdheXMgc3RvcCB3YXRjaGluZywgZXZlbiBpZiBubyBjYW1lcmEgb3AgaXMgYWN0aXZlCiAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BzQ2FsbGJhY2spOwogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCkBAIC0xMDQ1LDcgKzE1MDYsOCBAQAogICAgICAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCiAgICAgICAgIC8vIGFuZCB0byBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgYnkgY2xpZW50LgogICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBub3RpZnlFcnJvcigpOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCisgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFLCByZXN1bHRFeHRyYXMpOwogICAgICAgICBkaXNjb25uZWN0KCk7CiAgICAgfQogfQpAQCAtMTA3NCw3ICsxNTM2LDggQEAKICAgICByZXR1cm4gY2xpZW50OwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfUkVMRUFTRUQsIDApOwogfQogCkBAIC0xMDgzLDE1ICsxNTQ2LDYgQEAKICAgICBBTE9HVigiQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgQmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKICAgICBtQ2FtZXJhU2VydmljZS0+c2V0Q2FtZXJhRnJlZShtQ2FtZXJhSWQpOwotCi0gICAgU3RhdHVzVmVjdG9yIHJlamVjdFNvdXJjZVN0YXRlczsKLSAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCk7Ci0gICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpOwotCi0gICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiBhYm92ZSAyIHN0YXRlcwotICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVqZWN0U291cmNlU3RhdGVzKTsKIH0KIAogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpPcHNDYWxsYmFjazo6T3BzQ2FsbGJhY2sod3A8QmFzaWNDbGllbnQ+IGNsaWVudCk6CkBAIC0xMTI4LDcgKzE1ODIsOCBAQAogQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojp+UHJvQ2xpZW50KCkgewogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CiAgICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfUkVMRUFTRUQsIDApOwogfQogCkBAIC0xMTgzLDcgKzE2MzgsMjAgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBhdXRob3I6ICVzXG4iLAogICAgICAgICAgICAgICAgIG1Nb2R1bGUtPmNvbW1vbi5hdXRob3IpOwogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJOdW1iZXIgb2YgY2FtZXJhIGRldmljZXM6ICVkXG5cbiIsIG1OdW1iZXJPZkNhbWVyYXMpOworCisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgICAgIGlmIChkZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlZlbmRvciB0YWdzIGxlZnQgdW5pbXBsZW1lbnRlZC5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVmVuZG9yIHRhZyBkZWZpbml0aW9uczpcbiIpOworICAgICAgICB9CisKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICAgICAgaWYgKGRlc2MgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVzYy0+ZHVtcChmZCwgLyp2ZXJib3NpdHkqLzIsIC8qaW5kZW50YXRpb24qLzQpOworICAgICAgICB9CisKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVkIHN0YXRpYyBpbmZvcm1hdGlvbjpcbiIsIGkpOwogICAgICAgICAgICAgY2FtZXJhX2luZm8gaW5mbzsKQEAgLTEyMDgsNyArMTY3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRGV2aWNlIHN0YXRpYyBtZXRhZGF0YTpcbiIpOwogICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgZHVtcF9pbmRlbnRlZF9jYW1lcmFfbWV0YWRhdGEoaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgMiwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggYWQ2YTU4Mi4uYTczMjhjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMSwyNCArMSwyNCBAQAogLyoKLSoqCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CkBAIC0zMSw2ICszMSw5IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0lQcm9DYW1lcmFDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CiAKQEAgLTczLDEyICs3NiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqLyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RMZWdhY3koY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0UHJvKGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgLypvdXQqLwpAQCAtOTYsNiArMTA1LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVMaXN0ZW5lcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldExlZ2FjeVBhcmFtZXRlcnMoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBTdHJpbmcxNiogcGFyYW1ldGVycyk7CisKKyAgICAvLyBPSyA9IHN1cHBvcnRzIGFwaSBvZiB0aGF0IHZlcnNpb24sIC1FT1BOT1RTVVBQID0gZG9lcyBub3Qgc3VwcG9ydAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3VwcG9ydHNDYW1lcmFBcGkoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKKwogICAgIC8vIEV4dHJhIHBlcm1pc3Npb25zIGNoZWNrcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKQEAgLTEyMCw2ICsxMzgsMTAgQEAKICAgICAvLyBDYW1lcmFEZXZpY2VGYWN0b3J5IGZ1bmN0aW9uYWxpdHkKICAgICBpbnQgICAgICAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oaW50IGNhbWVyYUlkLCBpbnQqIGZhY2luZyA9IE5VTEwpOwogCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gU2hhcmVkIHV0aWxpdGllcworICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyT3BlbkVycm9yQ29kZShzdGF0dXNfdCBlcnIpOworICAgIHN0YXRpYyBzdGF0dXNfdCAgICAgZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2FtZXJhQ2xpZW50IGZ1bmN0aW9uYWxpdHkKQEAgLTEzMSwyMCArMTUzLDE5IEBACiAKICAgICBjbGFzcyBCYXNpY0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbid0IHZpcnR1YWxseSBpbmhlcml0IElJbnRlcmZhY2UsIHdoaWNoIGJyZWFrcwogICAgICAgICAvLyB2aXJ0dWFsIGluaGVyaXRhbmNlCiAgICAgICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgPSAwOwogCiAgICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIGNhbGxiYWNrIGJpbmRlciBvYmplY3QgKGUuZy4gSVByb0NhbWVyYUNhbGxiYWNrcykKLSAgICAgICAgc3A8SUJpbmRlcj4gICAgIGdldFJlbW90ZSgpIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRSZW1vdGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gbVJlbW90ZUJpbmRlcjsKICAgICAgICAgfQogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CiAKICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgIEJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLApAQCAtMTgxLDcgKzIwMiw5IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAKICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKICAgICBwcml2YXRlOgogICAgICAgICBBcHBPcHNNYW5hZ2VyICAgICAgICAgICAgICAgICAgIG1BcHBPcHNNYW5hZ2VyOwogCkBAIC0yNTgsNyArMjgxLDggQEAKICAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUuIENsaWVudCBsb2NrIHNob3VsZCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBDbGllbnQuCiAgICAgICAgIHN0YXRpYyBDbGllbnQqICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CiAKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCkBAIC0zMDYsNyArMzMwLDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpID0gMDsKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CiAgICAgfTsgLy8gY2xhc3MgUHJvQ2xpZW50CkBAIC0zODcsNiArNDEyLDU3IEBACiAgICAgLy8gSGVscGVycwogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBpc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIG1hcHBpbmcgb2YgY2FtZXJhIGlkcyB0byBDYW1lcmFQYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHRoYXQgY2FtZXJhIGRldmljZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FjaGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBDYW1lcmFDaGFyYWN0ZXJpc3RpYyBtZXRhZGF0YSB3aGVuIHVzaW5nCisgICAgICogdGhlIEhBTDEgc2hpbS4KKyAgICAgKi8KKyAgICBLZXllZFZlY3RvcjxpbnQsIENhbWVyYVBhcmFtZXRlcnM+ICAgIG1TaGltUGFyYW1zOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbmQgY2FjaGUgdGhlIG1ldGFkYXRhIHVzZWQgYnkgdGhlIEhBTDEgc2hpbSBmb3IgYSBnaXZlbiBjYW1lcmFJZC4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjYWNoZWQgQ2FtZXJhUGFyYW1ldGVycyBmb3IgdGhlIGNhbWVyYS4gSWYgdGhleSBoYXZlbid0IGJlZW4KKyAgICAgKiBjYWNoZWQgeWV0LCB0aGVuIGluaXRpYWxpemUgdGhlbSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIENhbWVyYUNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSByZXF1aXJlZCBieSB0aGUgQ2FtZXJhMiBBUEkKKyAgICAgKiBmcm9tIHRoZSBhdmFpbGFibGUgSEFMMSBDYW1lcmFQYXJhbWV0ZXJzIGFuZCBDYW1lcmFJbmZvLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IGEgbmV3IGNhbWVyYSBjbGllbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hpbGUgaG9sZGluZyB0aGUKKyAgICAgKiBtdXRleCBmb3IgbVNlcnZpY2VMb2NrLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBjb25uZWN0SGVscGVyTG9ja2VkKAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgLyppbiovCisgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24gPSBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggYWYyMzU1Ny4uZjNhODhhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC01NCwxNiArNTQsMTcgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24pOgorICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKLSAgICAgICAgbVBhcmFtZXRlcnMoY2FtZXJhSWQsIGNhbWVyYUZhY2luZyksCi0gICAgICAgIG1EZXZpY2VWZXJzaW9uKGRldmljZVZlcnNpb24pCisgICAgICAgIG1QYXJhbWV0ZXJzKGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKKworICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKQEAgLTgwLDcgKzgxLDcgQEAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAKLSAgICAgICAgcmVzID0gbC5tUGFyYW1ldGVycy5pbml0aWFsaXplKCYobURldmljZS0+aW5mbygpKSk7CisgICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZSgmKG1EZXZpY2UtPmluZm8oKSksIG1EZXZpY2VWZXJzaW9uKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuYWJsZSB0byBidWlsZCBkZWZhdWx0czogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTExOCw3ICsxMTksOSBAQAogICAgICAgICAgICAgbVpzbFByb2Nlc3NvclRocmVhZCA9IHpzbFByb2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOnsKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjogewogICAgICAgICAgICAgc3A8WnNsUHJvY2Vzc29yMz4genNsUHJvYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBac2xQcm9jZXNzb3IzKHRoaXMsIG1DYXB0dXJlU2VxdWVuY2VyKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3IgPSB6c2xQcm9jOwpAQCAtMjM4LDcgKzI0MSw3IEBACiAKICAgICByZXN1bHQuYXBwZW5kKCIgICAgU2NlbmUgbW9kZTogIik7CiAgICAgc3dpdGNoIChwLnNjZW5lTW9kZSkgewotICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiQVVUT1xuIik7IGJyZWFrOwogICAgICAgICBDQVNFX0FQUEVORF9FTlVNKEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0FDVElPTikKICAgICAgICAgQ0FTRV9BUFBFTkRfRU5VTShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9QT1JUUkFJVCkKQEAgLTQxNiwxMiArNDE5LDIwIEBACiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkKTsKIAotICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBtQ2FwdHVyZVNlcXVlbmNlci0+am9pbigpOwotICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgbVpzbFByb2Nlc3NvclRocmVhZC0+am9pbigpOwotICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+am9pbigpOworICAgIHsKKyAgICAgICAgLy8gRG9uJ3Qgd2FpdCB3aXRoIGxvY2sgaGVsZCwgaW4gY2FzZSB0aGUgb3RoZXIgdGhyZWFkcyBuZWVkIHRvCisgICAgICAgIC8vIGNvbXBsZXRlIGNhbGxiYWNrcyB0aGF0IHJlLWVudGVyIENhbWVyYTJDbGllbnQKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLnVubG9jaygpOworCisgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICAgICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5qb2luKCk7CisgICAgICAgIG1KcGVnUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1ac2xQcm9jZXNzb3JUaHJlYWQtPmpvaW4oKTsKKyAgICAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5qb2luKCk7CisKKyAgICAgICAgbUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrLmxvY2soKTsKKyAgICB9CiAKICAgICBBTE9HVigiQ2FtZXJhICVkOiBEZWxldGluZyBzdHJlYW1zIiwgbUNhbWVyYUlkKTsKIApAQCAtNDMxLDYgKzQ0Miw5IEBACiAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKICAgICBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKIAorICAgIC8vIFJlbW92ZSBhbGwgWlNMIHN0cmVhbSBzdGF0ZSBiZWZvcmUgZGlzY29ubmVjdDsgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGIvMTU0MDgxMjguCisgICAgbVpzbFByb2Nlc3Nvci0+ZGlzY29ubmVjdCgpOworCiAgICAgQUxPR1YoIkNhbWVyYSAlZDogRGlzY29ubmVjdGluZyBkZXZpY2UiLCBtQ2FtZXJhSWQpOwogCiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwpAQCAtNzUzLDYgKzc2Nyw3IEBACiAgICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4KICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIGNvbXByb21pc2UsIHRob3VnaCB0aGlzIGxpa2VseSB3b3VsZCBpbnZvbHZlIEhBTAogICAgIC8vIGNoYW5nZXMuCisgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcHJlLWNvbmZpZ3VyZSBzdGlsbCBpbWFnZSAiCkBAIC03NjAsNiArNzc1LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorICAgIGJvb2wganBlZ1N0cmVhbUNoYW5nZWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBsYXN0SnBlZ1N0cmVhbUlkOwogCiAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbXM7CiAgICAgYm9vbCBjYWxsYmFja3NFbmFibGVkID0gKHBhcmFtcy5wcmV2aWV3Q2FsbGJhY2tGbGFncyAmCkBAIC04MDgsMTQgKzgyNCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50KSB7CisKKyAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50ICYmCisgICAgICAgICAgICBnZXRSZWNvcmRpbmdTdHJlYW1JZCgpID09IE5PX1NUUkVBTSkgewogICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obVpzbFByb2Nlc3NvciwgcGFyYW1zKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgWlNMIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoanBlZ1N0cmVhbUNoYW5nZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDbGVhciBaU0wgYnVmZmVyIHF1ZXVlIHdoZW4gSnBlZyBzaXplIGlzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICAgICAgb3V0cHV0U3RyZWFtcy5wdXNoKGdldFpzbFN0cmVhbUlkKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwogICAgIH0KIAogICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRQcmV2aWV3U3RyZWFtSWQoKSk7CkBAIC04OTYsNiArOTIyLDIwIEBACiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENsZWFuIHVwIHJlY29yZGluZyBzdHJlYW0KKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPmRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHJlY29yZGluZyBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wIHByZXZpZXc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIHJlY292ZXIgdGhlIG92ZXJyaWRlIGFmdGVyIHJlY29yZGluZyBzdG9wcGVkLCBidXQKKyAgICAgICAgICAgICAgICAvLyByaWdodCBub3cgcmVjb3JkaW5nIHN0cmVhbSB3aWxsIGxpdmUgdW50aWwgaGVyZSwgc28gd2UgYXJlIGZvcmNlZCB0bworICAgICAgICAgICAgICAgIC8vIHJlY292ZXIgaGVyZS4gVE9ETzogZmluZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoYXQgKGIvMTc0OTUxNjUpCisgICAgICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIGJyZWFrCiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6V0FJVElOR19GT1JfUFJFVklFV19XSU5ET1c6IHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CkBAIC05NjMsNiArMTAwMywxMCBAQAogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlNUT1BQRUQ6CiAgICAgICAgICAgICByZXMgPSBzdGFydFByZXZpZXdMKHBhcmFtcywgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBmaXJzdCBwcmV2aWV3IHJlcXVlc3QgaXMgc3VibWl0dGVkIHRvIHRoZSBIQUwgZGV2aWNlIHRvIGF2b2lkCisgICAgICAgICAgICAvLyB0d28gY29uc2VjdXRpdmUgc2V0IG9mIGNvbmZpZ3VyZV9zdHJlYW1zIGJlaW5nIGNhbGxlZCBpbnRvIHRoZSBIQUwuCisgICAgICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciB0aGlzIHRvIGF2b2lkIGluaXRpYWwgcHJldmlldyBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlBSRVZJRVc6CiAgICAgICAgICAgICAvLyBSZWFkeSB0byBnbwpAQCAtMTAxNiwxOCArMTA2MCw5NSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIE9uIGN1cnJlbnQgSEFMcywgY2xlYW4gdXAgWlNMIGJlZm9yZSB0cmFuc2l0aW9uaW5nIGludG8gcmVjb3JkaW5nCisgICAgaWYgKG1EZXZpY2VWZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIGlmIChtWnNsUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IE5PX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyaW5nIG91dCB6c2wgc3RyZWFtIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyByZWNvcmRpbmcgc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RvcFN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBzdG9wIHN0cmVhbWluZyB0byBkZWxldGUgY2FsbGJhY2sgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNsZWFyIHpzbCBxdWV1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1ac2xQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gZGVsZXRlIHpzbCBzdHJlYW0gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvcmQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBEaXNhYmxlIGNhbGxiYWNrcyBpZiB0aGV5J3JlIGVuYWJsZWQ7IGNhbid0IHJlY29yZCBhbmQgdXNlIGNhbGxiYWNrcywKICAgICAvLyBhbmQgd2UgY2FuJ3QgZmFpbCByZWNvcmQgc3RhcnQgd2l0aG91dCBzdGFnZWZyaWdodCBhc3NlcnRpbmcuCiAgICAgcGFyYW1zLnByZXZpZXdDYWxsYmFja0ZsYWdzID0gMDsKIAotICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbTwKLSAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAobURldmljZVZlcnNpb24gIT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgLy8gRm9yIG5ld2VyIGRldmljZXMsIG1heSBuZWVkIHRvIHJlY29uZmlndXJlIHZpZGVvIHNuYXBzaG90IEpQRUcgc2l6ZXMKKyAgICAgICAgLy8gZHVyaW5nIHJlY29yZGluZyBzdGFydHVwLCBzbyBuZWVkIGEgbW9yZSBjb21wbGV4IHNlcXVlbmNlIGhlcmUgdG8KKyAgICAgICAgLy8gZW5zdXJlIGFuIGVhcmx5IHN0cmVhbSByZWNvbmZpZ3VyYXRpb24gZG9lc24ndCBoYXBwZW4KKyAgICAgICAgYm9vbCByZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZTsKKyAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+cmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUocGFyYW1zLCAmcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcXVlcnkgcmVjb3JkaW5nIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gc3RvcCBzdHJlYW0gaGVyZSBzbyB1cGRhdGVQcm9jZXNzb3JTdHJlYW0gd29uJ3QgdHJpZ2dlciBjb25maWd1cmVTdHJlYW0KKyAgICAgICAgICAgIC8vIFJpZ2h0IG5vdyBjYW1lcmEgZGV2aWNlIGNhbm5vdCBoYW5kbGUgY29uZmlndXJlU3RyZWFtIGZhaWx1cmUgZ3JhY2VmdWxseQorICAgICAgICAgICAgLy8gd2hlbiBkZXZpY2UgaXMgc3RyZWFtaW5nCisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdG9wU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHN0b3Agc3RyZWFtaW5nIHRvIHVwZGF0ZSByZWNvcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgJlN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTWFpbnRhaW4gY2FsbCBzZXF1ZW5jaW5nIGZvciBIQUx2MiBkZXZpY2VzLgorICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08CisgICAgICAgICAgICAgICAgU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4obVN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgcmVjb3JkaW5nIHN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICAgICB9CiAKICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtczsKQEAgLTEwMzYsNiArMTE1NywxNiBAQAogCiAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RhcnRTdHJlYW0oU3RyZWFtaW5nUHJvY2Vzc29yOjpSRUNPUkQsCiAgICAgICAgICAgICBvdXRwdXRTdHJlYW1zKTsKKworICAgIC8vIHN0YXJ0U3RyZWFtIG1pZ2h0IHRyaWdnZXIgYSBjb25maWd1cmVTdHJlYW0gY2FsbCBhbmQgZGV2aWNlIG1pZ2h0IGZhaWwKKyAgICAvLyBjb25maWd1cmVTdHJlYW0gZHVlIHRvIGpwZWcgc2l6ZSA+IHZpZGVvIHNpemUuIFRyeSBhZ2FpbiB3aXRoIGpwZWcgc2l6ZSBvdmVycmlkZGVuCisgICAgLy8gdG8gdmlkZW8gc2l6ZS4KKyAgICBpZiAocmVzID09IEJBRF9WQUxVRSkgeworICAgICAgICBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKHBhcmFtcyk7CisgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0YXJ0U3RyZWFtKFN0cmVhbWluZ1Byb2Nlc3Nvcjo6UkVDT1JELAorICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbXMpOworICAgIH0KKwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCByZWNvcmRpbmcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTIwLDYgKzEyNTEsOCBAQAogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPCBQYXJhbWV0ZXJzOjpQUkVWSUVXKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FsbCBhdXRvRm9jdXMgd2hlbiBwcmV2aWV3IGlzIGluYWN0aXZlIChzdGF0ZSA9ICVkKS4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgbC5tUGFyYW1ldGVycy5zdGF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KIApAQCAtMTE2Miw3ICsxMjk1LDcgQEAKICAgICAgICAgICogSGFuZGxlIHF1aXJrIG1vZGUgZm9yIEFGIGluIHNjZW5lIG1vZGVzCiAgICAgICAgICAqLwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5xdWlya3MudHJpZ2dlckFmV2l0aEF1dG8gJiYKLSAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCAmJgorICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc2NlbmVNb2RlICE9IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEICYmCiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5mb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPICYmCiAgICAgICAgICAgICAgICAgIWwubVBhcmFtZXRlcnMuZm9jdXNpbmdBcmVhc1swXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogUXVpcms6IFN3aXRjaGluZyBmcm9tIGZvY3VzTW9kZSAlZCB0byBBVVRPIiwKQEAgLTEyMTksNiArMTM1Miw5IEBACiAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy56c2xNb2RlKSB7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgc3luY1dpdGhEZXZpY2UoKTsKIApAQCAtMTI2NiwxMyArMTQwMiwyOCBAQAogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBwaWN0dXJlIGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAKKyAgICAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gSWYgdmlkZW8gc25hcHNob3QgZmFpbCB0byBjb25maWd1cmVTdHJlYW0sIHRyeSBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvCisgICAgICAgIC8vIHZpZGVvIHNpemUKKyAgICAgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUgJiYgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgeworICAgICAgICAgICAgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShsLm1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgbC5tUGFyYW1ldGVycyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHNldCB1cCBzdGlsbCBpbWFnZSBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgICAgIHRha2VQaWN0dXJlQ291bnRlciA9ICsrbC5tUGFyYW1ldGVycy50YWtlUGljdHVyZUNvdW50ZXI7CisKKyAgICAgICAgLy8gQ2xlYXIgWlNMIGJ1ZmZlciBxdWV1ZSB3aGVuIEpwZWcgc2l6ZSBpcyBjaGFuZ2VkLgorICAgICAgICBib29sIGpwZWdTdHJlYW1DaGFuZ2VkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCkgIT0gbGFzdEpwZWdTdHJlYW1JZDsKKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBqcGVnU3RyZWFtQ2hhbmdlZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENsZWFyIFpTTCBidWZmZXIgcXVldWUgd2hlbiBKcGVnIHNpemUgaXMgY2hhbmdlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKQEAgLTEyOTgsOCArMTQ0OSwxNCBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKIAorICAgIFBhcmFtZXRlcnM6OmZvY3VzTW9kZV90IGZvY3VzTW9kZUJlZm9yZSA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOwogICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuc2V0KHBhcmFtcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICBQYXJhbWV0ZXJzOjpmb2N1c01vZGVfdCBmb2N1c01vZGVBZnRlciA9IGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlOworCisgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSAmJiBmb2N1c01vZGVBZnRlciAhPSBmb2N1c01vZGVCZWZvcmUpIHsKKyAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgIH0KIAogICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RzKGwubVBhcmFtZXRlcnMpOwogCkBAIC0xMzEwLDcgKzE0NjcsOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIGlmICggY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKKyAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCisgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOwogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6UmVhZExvY2sgbChtUGFyYW1ldGVycyk7CiAKQEAgLTEzOTAsNiArMTU0OCwxMyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAorICAgIGlmIChtTGVnYWN5TW9kZSkgeworICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgbWF5IG5vdCBiZSBhbGxvd2VkLiBJbiB0aGF0IGNhc2Ugb25seQogICAgIC8vIGFsbG93IHRoZSBtZWRpYXNlcnZlciBwcm9jZXNzIHRvIGRpc2FibGUgdGhlIHNvdW5kLgogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTE2NTUsOCArMTgyMCw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAotICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKLSAgICByZXR1cm4gbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKG1pbklkLCBtYXhJZCwgbGlzdGVuZXIpOworICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CisgICAgcmV0dXJuIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBzZW5kUGFydGlhbHMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpyZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCkBAIC0xODI1LDYgKzE5OTAsMTggQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcykgeworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBjb25maWd1cmUgc3RpbGwgc2l6ZSB0byB2aWRlbyBzaXplIGJlZm9yZSByZWNvcmRpbmciCisgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICBwYXJhbXMub3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCk7CisgICAgc3RhdHVzX3QgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IG92ZXJyaWRlIHZpZGVvIHNuYXBzaG90IHNpemUgdG8gdmlkZW8gc2l6ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBjb25zdCBjaGFyKiBDYW1lcmEyQ2xpZW50OjprQXV0b2ZvY3VzTGFiZWwgPSAiYXV0b2ZvY3VzIjsKIGNvbnN0IGNoYXIqIENhbWVyYTJDbGllbnQ6OmtUYWtlcGljdHVyZUxhYmVsID0gInRha2VfcGljdHVyZSI7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggZmUwYmY3NC4uZDY4YmIyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uKTsKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKQEAgLTExOCw3ICsxMTgsOCBAQAogICAgIGludCBnZXRac2xTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCi0gICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOworICAgICAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgYm9vbCBzZW5kUGFydGlhbHMgPSB0cnVlKTsKICAgICBzdGF0dXNfdCByZW1vdmVGcmFtZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICB3cDxjYW1lcmEyOjpGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCkBAIC0xNzAsNyArMTcxLDYgQEAKIAogICAgIHZvaWQgICAgIHNldFByZXZpZXdDYWxsYmFja0ZsYWdMKFBhcmFtZXRlcnMgJnBhcmFtcywgaW50IGZsYWcpOwogICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RzKFBhcmFtZXRlcnMgJnBhcmFtcyk7Ci0gICAgaW50IG1EZXZpY2VWZXJzaW9uOwogCiAgICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKICAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOwpAQCAtMjA0LDkgKzIwNCwxMyBAQAogICAgIGJvb2wgbUFmSW5Nb3Rpb247CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCisgICAgYm9vbCBtTGVnYWN5TW9kZTsKIAogICAgIC8vIFdhaXQgdW50aWwgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIHJlY2VpdmVkIHRoZSBsYXRlc3QgY29udHJvbCBzZXR0aW5ncwogICAgIHN0YXR1c190IHN5bmNXaXRoRGV2aWNlKCk7CisKKyAgICAvLyBWaWRlbyBzbmFwc2hvdCBqcGVnIHNpemUgb3ZlcnJpZGluZyBoZWxwZXIgZnVuY3Rpb24KKyAgICBzdGF0dXNfdCBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcyk7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IDMwYjdiYjguLjFhNGQ5YTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQogewpAQCAtNTQsNiArNTQsNyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKKyAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQpAQCAtNzksNyArODAsNyBAQAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIG1IYXJkd2FyZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBtSGFyZHdhcmUtPnNldENhbGxiYWNrcyhub3RpZnlDYWxsYmFjaywKQEAgLTEyMSw2ICsxMjIsMTYgQEAKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOworCisgICAgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTGF0ZXN0IHNldCBwYXJhbWV0ZXJzOlxuIik7CisgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOworICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CisKKyAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycy5kdW1wKGZkLCBhcmdzKTsKKworICAgIGNvbnN0IGNoYXIgKmVuZGR1bXAgPSAiXG5cbiI7CisgICAgd3JpdGUoZmQsIGVuZGR1bXAsIHN0cmxlbihlbmRkdW1wKSk7CisKICAgICByZXR1cm4gbUhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKIH0KIApAQCAtNTQ5LDYgKzU2MCw3IEBACiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKKyAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycyA9IENhbWVyYVBhcmFtZXRlcnMocGFyYW1zKTsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHAocGFyYW1zKTsKICAgICByZXR1cm4gbUhhcmR3YXJlLT5zZXRQYXJhbWV0ZXJzKHApOwogfQpAQCAtNTU2LDcgKzU2OCw4IEBACiAvLyBnZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIFN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOworICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKKyAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFN0cmluZzggcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpLmZsYXR0ZW4oKSk7CiAgICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwpAQCAtNTc1LDYgKzU4OCwxMyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAorICAgIGlmIChtTGVnYWN5TW9kZSkgeworICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5CiAgICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtOTI5LDcgKzk0OSwyMCBAQAogICAgIH0KICAgICBwcmV2aWV3QnVmZmVyID0gbVByZXZpZXdCdWZmZXI7CiAKLSAgICBtZW1jcHkocHJldmlld0J1ZmZlci0+YmFzZSgpLCAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7CisgICAgdm9pZCogcHJldmlld0J1ZmZlckJhc2UgPSBwcmV2aWV3QnVmZmVyLT5iYXNlKCk7CisgICAgdm9pZCogaGVhcEJhc2UgPSBoZWFwLT5iYXNlKCk7CisKKyAgICBpZiAoaGVhcEJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBtbWFwIGhlYXAgZm9yIHByZXZpZXcgZnJhbWUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHByZXZpZXdCdWZmZXJCYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbW1hcCBwcmV2aWV3IGJ1ZmZlciBmb3IgcHJldmlldyBmcmFtZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweShwcmV2aWV3QnVmZmVyQmFzZSwgKHVpbnQ4X3QgKikgaGVhcEJhc2UgKyBvZmZzZXQsIHNpemUpOwogCiAgICAgc3A8TWVtb3J5QmFzZT4gZnJhbWUgPSBuZXcgTWVtb3J5QmFzZShwcmV2aWV3QnVmZmVyLCAwLCBzaXplKTsKICAgICBpZiAoZnJhbWUgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggNGI4OTU2NC4uNjNhOWQwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02NCw3ICs2NCw4IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKICAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKQEAgLTEyOSw2ICsxMzAsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247ICAgICAvLyBDdXJyZW50IGRpc3BsYXkgb3JpZW50YXRpb24KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5U2h1dHRlclNvdW5kOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeU1vZGU7IC8vIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlPwogCiAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKQEAgLTE0MCw2ICsxNDIsOSBAQAogICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgICAgICBtUHJldmlld0J1ZmZlcjsKIAorICAgIC8vIERlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAgIENhbWVyYVBhcmFtZXRlcnMgICAgICAgICAgICAgICAgbUxhdGVzdFNldFBhcmFtZXRlcnM7CisKICAgICAvLyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBkZWFkbG9jayB3aGVuIHRoZSBpbmNvbWluZyBjb21tYW5kIHRocmVhZCBhbmQKICAgICAvLyB0aGUgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgY2FsbGJhY2sgdGhyZWFkIGJvdGggd2FudCB0byBncmFiIG1Mb2NrLgogICAgIC8vIEFuIGV4dHJhIGZsYWcgaXMgdXNlZCB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKaW5kZXggZDJhYzc5Yy4uYmYzMzE4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCkBAIC0xMTAsMTEgKzExMCwxMyBAQAogICAgIGlmICghbUNhbGxiYWNrVG9BcHAgJiYgbUNhbGxiYWNrQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludCwgc2luY2UgYXBwIGhhc24ndCBnaXZlbiB1cyBvbmUKICAgICAgICAgLy8gTWFrZSBpdCBhc3luYyB0byBhdm9pZCBkaXNjb25uZWN0IGRlYWRsb2NrcwotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGtDYWxsYmFja0hlYXBDb3VudCk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGtDYWxsYmFja0hlYXBDb3VudCk7CiAgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50OjpDYWxsYmFja0NvbnN1bWVyIikpOwotICAgICAgICBtQ2FsbGJhY2tXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1DYWxsYmFja1dpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKICAgICBpZiAobUNhbGxiYWNrU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CkBAIC0xNTMsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgcGFyYW1zLnByZXZpZXdGb3JtYXQpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FsbGJhY2tXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIDAsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FsbGJhY2tzOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggZjVjMjhlZC4uOTg0OWY0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtMTA2LDEzICsxMDYsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Ci0gICAgQUxPR1YoIiVzOiBMaXN0ZW5lciBmb3VuZCBuZXcgZnJhbWUiLCBfX0ZVTkNUSU9OX18pOwordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7Ci0gICAgbU5ld0ZyYW1lSWQgPSByZXF1ZXN0SWQ7Ci0gICAgbU5ld0ZyYW1lID0gZnJhbWU7CisgICAgbU5ld0ZyYW1lSWQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgbU5ld0ZyYW1lID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBpZiAoIW1OZXdGcmFtZVJlY2VpdmVkKSB7CiAgICAgICAgIG1OZXdGcmFtZVJlY2VpdmVkID0gdHJ1ZTsKICAgICAgICAgbU5ld0ZyYW1lU2lnbmFsLnNpZ25hbCgpOwpAQCAtMzUxLDggKzM1MCwxMCBAQAogICAgICAgICByZXR1cm4gRE9ORTsKICAgICB9CiAKKyAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBwYXJ0aWFsIHJlc3VsdHMgZm9yIFpTTCBjYXB0dXJlLgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIC8vIFRPRE86IEFjdHVhbGx5IHNlbGVjdCB0aGUgcmlnaHQgdGhpbmcgaGVyZS4KICAgICByZXMgPSBwcm9jZXNzb3ItPnB1c2hUb1JlcHJvY2VzcyhtQ2FwdHVyZUlkKTsKQEAgLTM5NCw4ICszOTUsMTQgQEAKIAogICAgIGJvb2wgaXNBZUNvbnZlcmdlZCA9IGZhbHNlOwogICAgIC8vIEdldCB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjayB3aGVuIHRoZSByZXF1ZXN0SUQgPT0gbUNhcHR1cmVJZAorICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZ2V0IHBhcnRpYWwgcmVzdWx0cyBmb3Igbm9ybWFsIGNhcHR1cmUsIGFzIHdlIG5lZWQKKyAgICAvLyBHZXQgQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QIGZyb20gdGhlIGNhcHR1cmUgcmVzdWx0LCBidXQgcGFydGlhbAorICAgIC8vIHJlc3VsdCBkb2Vzbid0IGhhdmUgdG8gaGF2ZSB0aGlzIG1ldGFkYXRhIGF2YWlsYWJsZS4KKyAgICAvLyBUT0RPOiBVcGRhdGUgdG8gdXNlIHRoZSBIQUx2MyBzaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVtb3ZlIHRoZQorICAgIC8vIG5lZWQgZm9yIHRoaXMgbGlzdGVuZXIgYW5kIG1ha2UgaXQgZmFzdGVyLiBzZWUgYnVnIDEyNTMwNjI4LgogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNDM4LDExICs0NDUsMTggQEAKICAgICBpZiAobU5ld0FFU3RhdGUpIHsKICAgICAgICAgaWYgKCFtQWVJblByZWNhcHR1cmUpIHsKICAgICAgICAgICAgIC8vIFdhaXRpbmcgdG8gc2VlIFBSRUNBUFRVUkUgc3RhdGUKLSAgICAgICAgICAgIGlmIChtQUVUcmlnZ2VySWQgPT0gbVRyaWdnZXJJZCAmJgotICAgICAgICAgICAgICAgICAgICBtQUVTdGF0ZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEVfUFJFQ0FQVFVSRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogR290IHByZWNhcHR1cmUgc3RhcnQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvclByZWNhcHR1cmVFbmQ7CisgICAgICAgICAgICBpZiAobUFFVHJpZ2dlcklkID09IG1UcmlnZ2VySWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX1BSRUNBUFRVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBHb3QgcHJlY2FwdHVyZSBzdGFydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIG1BZUluUHJlY2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JQcmVjYXB0dXJlRW5kOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0ZMQVNIX1JFUVVJUkVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGxlZ2FsIHRvIHRyYW5zaXQgdG8gQ09OVkVSR0VEIG9yIEZMQVNIX1JFUVVJUkVECisgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGEgdHJpZ2dlci4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBBRSBpcyBhbHJlYWR5IGluIGdvb2Qgc3RhdGUsIHN0YXJ0IGNhcHR1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXYWl0aW5nIHRvIHNlZSBQUkVDQVBUVVJFIHN0YXRlIGVuZApAQCAtNTg1LDEyICs1OTksMTUgQEAKICAgICAgICAgZW50cnkgPSBtTmV3RnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIk5vIHRpbWVzdGFtcCBmaWVsZCBpbiBjYXB0dXJlIGZyYW1lISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbnRyeS5kYXRhLmk2NFswXSAhPSBtQ2FwdHVyZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgQUxPR1coIk1pc21hdGNoZWQgY2FwdHVyZSB0aW1lc3RhbXBzOiBNZXRhZGF0YSBmcmFtZSAlIiBQUklkNjQgIiwiCi0gICAgICAgICAgICAgICAgICAgICIgY2FwdHVyZWQgYnVmZmVyICUiIFBSSWQ2NCwKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pNjRbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1DYXB0dXJlVGltZXN0YW1wKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS5pNjRbMF0gIT0gbUNhcHR1cmVUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTWlzbWF0Y2hlZCBjYXB0dXJlIHRpbWVzdGFtcHM6IE1ldGFkYXRhIGZyYW1lICUiIFBSSWQ2NCAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2FwdHVyZWQgYnVmZmVyICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTY0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVUaW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIlRpbWVzdGFtcCBtZXRhZGF0YSBpcyBtYWxmb3JtZWQhIik7CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50LT5yZW1vdmVGcmFtZUxpc3RlbmVyKG1DYXB0dXJlSWQsIG1DYXB0dXJlSWQgKyAxLCB0aGlzKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggOWZiNGVlNy4uZDQyYWIxMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJGcmFtZVByb2Nlc3Nvci5oIgogCkBAIC02MSw4ICs2Miw4IEBACiAgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBBRSBzdGF0ZSBjaGFuZ2VzCiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAKLSAgICAvLyBOb3RpZmljYXRpb25zIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpOworICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIC8vIE5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgSlBFRyBwcm9jZXNzb3IKICAgICB2b2lkIG9uQ2FwdHVyZUF2YWlsYWJsZShuc2Vjc190IHRpbWVzdGFtcCwgc3A8TWVtb3J5QmFzZT4gY2FwdHVyZUJ1ZmZlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAppbmRleCBkZDViMjdjLi4zMTJhNzhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKQEAgLTQwLDcgKzQwLDEyIEBACiAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIG1Vc2VQYXJ0aWFsUXVpcmsgPSBsLm1QYXJhbWV0ZXJzLnF1aXJrcy5wYXJ0aWFsUmVzdWx0czsKKworICAgICAgICBpZiAoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gKG1OdW1QYXJ0aWFsUmVzdWx0cyA+IDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSBsLm1QYXJhbWV0ZXJzLnF1aXJrcy5wYXJ0aWFsUmVzdWx0czsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIEluaXRpYWxpemUgc3RhcnRpbmcgM0Egc3RhdGUKICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQgPSBsLm1QYXJhbWV0ZXJzLmFmVHJpZ2dlckNvdW50ZXI7CkBAIC01NSw3ICs2MCw3IEBACiBGcmFtZVByb2Nlc3Nvcjo6fkZyYW1lUHJvY2Vzc29yKCkgewogfQogCi1ib29sIEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorYm9vbCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKIAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwpAQCAtNjMsMTcgKzY4LDIxIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBib29sIHBhcnRpYWxSZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAobVVzZVBhcnRpYWxRdWlyaykgewotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKLSAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJgotICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgewotICAgICAgICAgICAgcGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgYm9vbCBpc1BhcnRpYWxSZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA8IG1OdW1QYXJ0aWFsUmVzdWx0czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OworICAgICAgICAgICAgZW50cnkgPSBmcmFtZS5tTWV0YWRhdGEuZmluZChBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCk7CisgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgeworICAgICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXBhcnRpYWxSZXN1bHQgJiYgcHJvY2Vzc0ZhY2VEZXRlY3QoZnJhbWUsIGNsaWVudCkgIT0gT0spIHsKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCAmJiBwcm9jZXNzRmFjZURldGVjdChmcmFtZS5tTWV0YWRhdGEsIGNsaWVudCkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMjEyLDE0ICsyMjEsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzM2FTdGF0ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitzdGF0dXNfdCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2VzczNhU3RhdGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpIHsKIAogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gZnJhbWUubU1ldGFkYXRhOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogICAgIGludCBjYW1lcmFJZCA9IGNsaWVudC0+Z2V0Q2FtZXJhSWQoKTsKIAotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOwogICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKIAogICAgIC8vIERvbid0IHNlbmQgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUgbnVtYmVyIHR3aWNlCkBAIC0yMzgsMjYgKzI0OCwzMSBAQAogCiAgICAgLy8gVE9ETzogQWxzbyB1c2UgQUUgbW9kZSwgQUUgdHJpZ2dlciBJRAogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmF3YlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KGZyYW1lLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKLSAgICAgICAgICAgICZuZXczYVN0YXRlLmFmVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOworICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBuZXczYVN0YXRlLmFmVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZDsKKyAgICAgICAgbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAorICAgICAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKKyAgICAgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CisgICAgfQogCiAgICAgaWYgKCFnb3RBbGxTdGF0ZXMpIHJldHVybiBCQURfVkFMVUU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKaW5kZXggODU2YWQzMi4uNjhjZjU1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKQEAgLTUxLDE0ICs1MSwxNCBAQAogCiAgICAgdm9pZCBwcm9jZXNzTmV3RnJhbWVzKGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgdmlydHVhbCBib29sIHByb2Nlc3NTaW5nbGVGcmFtZShDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc0ZhY2VEZXRlY3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4gJmNsaWVudCk7CiAKICAgICAvLyBTZW5kIDNBIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIGNsaWVudCBiYXNlZCBvbiBmcmFtZSBtZXRhZGF0YQotICAgIHN0YXR1c190IHByb2Nlc3MzYVN0YXRlKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICBzdGF0dXNfdCBwcm9jZXNzM2FTdGF0ZShjb25zdCBDYXB0dXJlUmVzdWx0ICZmcmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCiAgICAgLy8gSGVscGVyIGZvciBwcm9jZXNzM2FTdGF0ZQpAQCAtOTEsOCArOTEsOCBAQAogICAgICAgICB9CiAgICAgfSBtM2FTdGF0ZTsKIAotICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrIGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCi0gICAgYm9vbCBtVXNlUGFydGlhbFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIHBhcnRpYWwgcmVzdWx0IGlzIGVuYWJsZWQgZm9yIHRoaXMgZGV2aWNlCisgICAgYm9vbCBtVXNlUGFydGlhbFJlc3VsdDsKIAogICAgIC8vIFRyYWNrIG1vc3QgcmVjZW50IGZyYW1lIG51bWJlciBmb3Igd2hpY2ggM0Egbm90aWZpY2F0aW9ucyB3ZXJlIHNlbnQgZm9yLgogICAgIC8vIFVzZWQgdG8gZmlsdGVyIGFnYWluc3Qgc2VuZGluZyAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IDJkZTdhMmIuLmI0MzM3ODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTczLDMwICs3Myw0MyBAQAogICAgIH0KIAogICAgIC8vIEZpbmQgb3V0IGJ1ZmZlciBzaXplIGZvciBKUEVHCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4SnBlZ1NpemUgPQotICAgICAgICAgICAgcGFyYW1zLnN0YXRpY0luZm8oQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKLSAgICBpZiAobWF4SnBlZ1NpemUuY291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBBTkRST0lEX0pQRUdfTUFYX1NJWkUhIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgc3NpemVfdCBtYXhKcGVnU2l6ZSA9IGRldmljZS0+Z2V0SnBlZ0J1ZmZlclNpemUocGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQpOworICAgIGlmIChtYXhKcGVnU2l6ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBKcGVnIGJ1ZmZlciBzaXplICglenUpIGlzIGludmFsaWQgIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbWF4SnBlZ1NpemUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKG1DYXB0dXJlQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihicSwgMSk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhcHR1cmVDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FwdHVyZUNvbnN1bWVyIikpOwotICAgICAgICBtQ2FwdHVyZVdpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbUNhcHR1cmVXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisgICAgfQorCisgICAgLy8gU2luY2UgYXNobWVtIGhlYXBzIGFyZSByb3VuZGVkIHVwIHRvIHBhZ2Ugc2l6ZSwgZG9uJ3QgcmVhbGxvY2F0ZSBpZgorICAgIC8vIHRoZSBjYXB0dXJlIGhlYXAgaXNuJ3QgZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIHRoZSByZXF1aXJlZCBKUEVHIGJ1ZmZlcgorICAgIGNvbnN0IHNpemVfdCBIRUFQX1NMQUNLX0ZBQ1RPUiA9IDI7CisgICAgaWYgKG1DYXB0dXJlSGVhcCA9PSAwIHx8CisgICAgICAgICAgICAobUNhcHR1cmVIZWFwLT5nZXRTaXplKCkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heEpwZWdTaXplKSkgfHwKKyAgICAgICAgICAgIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA+CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obWF4SnBlZ1NpemUpICogSEVBUF9TTEFDS19GQUNUT1IpICkgewogICAgICAgICAvLyBDcmVhdGUgbWVtb3J5IGZvciBBUEkgY29uc3VtcHRpb24KLSAgICAgICAgbUNhcHR1cmVIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKG1heEpwZWdTaXplLmRhdGEuaTMyWzBdLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CisgICAgICAgIG1DYXB0dXJlSGVhcC5jbGVhcigpOworICAgICAgICBtQ2FwdHVyZUhlYXAgPQorICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlIZWFwQmFzZShtYXhKcGVnU2l6ZSwgMCwgIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVIZWFwIik7CiAgICAgICAgIGlmIChtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FwdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICB9CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEpQRUcgY2FwdHVyZSBoZWFwIG5vdyAlZCBieXRlczsgcmVxdWVzdGVkICVkIGJ5dGVzIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtQ2FwdHVyZUhlYXAtPmdldFNpemUoKSwgbWF4SnBlZ1NpemUpOwogCiAgICAgaWYgKG1DYXB0dXJlU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCkBAIC0xMzIsOCArMTQ1LDcgQEAKICAgICAgICAgLy8gQ3JlYXRlIHN0cmVhbSBmb3IgSEFMIHByb2R1Y3Rpb24KICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhcHR1cmVXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQsCi0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBtYXhKcGVnU2l6ZS5kYXRhLmkzMlswXSwKLSAgICAgICAgICAgICAgICAmbUNhcHR1cmVTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCAmbUNhcHR1cmVTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FwdHVyZTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDA4MWE2ZTYuLjdiOTBkMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTI5LDYgKzI5LDkgQEAKIAogI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJzeXN0ZW0vY2FtZXJhLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEyIHsKQEAgLTQzLDcgKzQ2LDcgQEAKIFBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkgewogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvKSB7CitzdGF0dXNfdCBQYXJhbWV0ZXJzOjppbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvLCBpbnQgZGV2aWNlVmVyc2lvbikgewogICAgIHN0YXR1c190IHJlczsKIAogICAgIGlmIChpbmZvLT5lbnRyeUNvdW50KCkgPT0gMCkgewpAQCAtNTEsNiArNTQsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBQYXJhbWV0ZXJzOjppbmZvID0gaW5mbzsKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZVZlcnNpb247CiAKICAgICByZXMgPSBidWlsZEZhc3RJbmZvKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKQEAgLTU5LDEyICs2Myw0MiBAQAogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KKyAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CisgICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7CisgICAgaW50MzJfdCBtYXhWaWRlb0hlaWdodCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5oZWlnaHQubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKKyAgICBjb25zdCBTaXplIE1BWF9WSURFT19TSVpFID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9WSURFT19TSVpFLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIC8vIFRPRE86IFBpY2sgbW9yZSBpbnRlbGxpZ2VudGx5Ci0gICAgcHJldmlld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzWzBdLndpZHRoOwotICAgIHByZXZpZXdIZWlnaHQgPSBhdmFpbGFibGVQcmV2aWV3U2l6ZXNbMF0uaGVpZ2h0OworICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZAorICAgIC8vIG9uIHRoZSBsaXN0IG9mIGJvdGggcHJldmlldyBhbmQgcmVjb3JkaW5nIHNpemVzCisgICAgcHJldmlld1dpZHRoID0gMDsKKyAgICBwcmV2aWV3SGVpZ2h0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbGFibGVQcmV2aWV3U2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW50IG5ld1dpZHRoID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLndpZHRoOworICAgICAgICBpbnQgbmV3SGVpZ2h0ID0gYXZhaWxhYmxlUHJldmlld1NpemVzW2ldLmhlaWdodDsKKyAgICAgICAgaWYgKG5ld1dpZHRoID49IHByZXZpZXdXaWR0aCAmJiBuZXdIZWlnaHQgPj0gcHJldmlld0hlaWdodCAmJgorICAgICAgICAgICAgICAgIG5ld1dpZHRoIDw9IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggJiYKKyAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPD0gTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVWaWRlb1NpemVzW2pdLndpZHRoID09IG5ld1dpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2pdLmhlaWdodCA9PSBuZXdIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlld1dpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdIZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwcmV2aWV3V2lkdGggPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGluaXRpYWwgcHJldmlldyBzaXplIGNhbiBiZSBmb3VuZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICB2aWRlb1dpZHRoID0gcHJldmlld1dpZHRoOwogICAgIHZpZGVvSGVpZ2h0ID0gcHJldmlld0hlaWdodDsKIApAQCAtODQsOCArMTE4LDE3IEBACiAgICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgcHJldmlldyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkUHJldmlld1NpemVzLnN0cmluZygpKTsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKworICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFZpZGVvU2l6ZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkVmlkZW9TaXplcyArPSAiLCI7CisgICAgICAgICAgICBzdXBwb3J0ZWRWaWRlb1NpemVzICs9IFN0cmluZzg6OmZvcm1hdCgiJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVWaWRlb1NpemVzW2ldLmhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCB2aWRlbyBzaXplcyBhcmU6ICVzIiwgc3VwcG9ydGVkVmlkZW9TaXplcy5zdHJpbmcoKSk7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9WSURFT19TSVpFUywKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3U2l6ZXMpOworICAgICAgICAgICAgICAgIHN1cHBvcnRlZFZpZGVvU2l6ZXMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZwc1JhbmdlcyA9CkBAIC05OSwxNiArMTQyLDE0IEBACiAgICAgcHJldmlld1RyYW5zZm9ybSA9IGRlZ1RvVHJhbnNmb3JtKDAsCiAgICAgICAgICAgICBjYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7Ci0KICAgICB7CiAgICAgICAgIFN0cmluZzggc3VwcG9ydGVkUHJldmlld0Zvcm1hdHM7CisgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBvdXRwdXRGb3JtYXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9ICIsIjsKICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKLSAgICAgICAgICAgIHN3aXRjaCAoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSkgeworICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRGb3JtYXRzW2ldKSB7CiAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzICs9CiAgICAgICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJTUDsKQEAgLTE1MCw3ICsxOTEsNyBAQAogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBVbmtub3duIHByZXZpZXcgZm9ybWF0OiAleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCBhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIG91dHB1dEZvcm1hdHNbaV0pOwogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMjIsMjQgKzI2MywyNiBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdGcmFtZVJhdGVzKTsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTLCAyKTsKLSAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KLSAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbMF07Ci0gICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMlsxXTsKKyAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKIAogICAgIHBhcmFtcy5zZXRQaWN0dXJlU2l6ZShwaWN0dXJlV2lkdGgsCiAgICAgICAgICAgICBwaWN0dXJlSGVpZ2h0KTsKIAogICAgIHsKICAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGkgIT0gMCkgc3VwcG9ydGVkUGljdHVyZVNpemVzICs9ICIsIjsKICAgICAgICAgICAgIHN1cHBvcnRlZFBpY3R1cmVTaXplcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkeCVkIiwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSsxXSk7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzW2ldLmhlaWdodCk7CiAgICAgICAgIH0KICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMsCiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkUGljdHVyZVNpemVzKTsKQEAgLTQ3MCw3ICs1MTMsNyBAQAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEFudGliYW5kaW5nKTsKICAgICB9CiAKLSAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICBzY2VuZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TQ0VORV9NT0RFLAogICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BVVRPKTsKIApAQCAtNDg2LDcgKzUyOSw3IEBACiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZFNjZW5lTW9kZXMgKz0gIiwiOwogICAgICAgICAgICAgYWRkQ29tbWEgPSB0cnVlOwogICAgICAgICAgICAgc3dpdGNoIChhdmFpbGFibGVTY2VuZU1vZGVzLmRhdGEudThbaV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ6CiAgICAgICAgICAgICAgICAgICAgIG5vU2NlbmVNb2RlcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRkFDRV9QUklPUklUWToKQEAgLTU3OSw4ICs2MjIsOCBAQAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUFlTW9kZXMgPQogICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMsIDAsIDAsIGZhbHNlKTsKIAorICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgIGlmIChpc0ZsYXNoQXZhaWxhYmxlKSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAogICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKIApAQCAtNjAwLDExICs2NDMsMTAgQEAKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZsYXNoTW9kZXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZsYXNoTW9kZSA9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGOwotICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKKyAgICAgICAgLy8gTm8gZmxhc2ggbWVhbnMgbnVsbCBmbGFzaCBtb2RlIGFuZCBzdXBwb3J0ZWQgZmxhc2ggbW9kZXMga2V5cywgc28KKyAgICAgICAgLy8gcmVtb3ZlIHRoZW0ganVzdCB0byBiZSBzYWZlCisgICAgICAgIHBhcmFtcy5yZW1vdmUoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUpOworICAgICAgICBwYXJhbXMucmVtb3ZlKENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOwogICAgIH0KIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1pbkZvY3VzRGlzdGFuY2UgPQpAQCAtNjI0LDggKzY2NiwxNyBAQAogICAgICAgICBmb2N1c01vZGUgPSBQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0FVVE87CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX01PREUsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPKTsKLSAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFkpOwotICAgICAgICBib29sIGFkZENvbW1hID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRGb2N1c01vZGVzOworICAgICAgICBib29sIGFkZENvbW1hID0gZmFsc2U7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbiA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OLCAwLCAwLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5jb3VudCAmJgorICAgICAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT05fVU5DQUxJQlJBVEVEKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRGb2N1c01vZGVzICs9IENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfSU5GSU5JVFk7CisgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVBZk1vZGVzLmNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChhZGRDb21tYSkgc3VwcG9ydGVkRm9jdXNNb2RlcyArPSAiLCI7CkBAIC02NjgsMTMgKzcxOSwxMyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsIDEsIDEpOwotICAgIGlmICghbWF4M2FSZWdpb25zLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOworICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBpbnQzMl90IG1heE51bUZvY3VzQXJlYXMgPSAwOwogICAgIGlmIChmb2N1c01vZGUgIT0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9GSVhFRCkgewotICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdOworICAgICAgICBtYXhOdW1Gb2N1c0FyZWFzID0gbWF4M2FSZWdpb25zLmRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BRl07CiAgICAgfQogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX01BWF9OVU1fRk9DVVNfQVJFQVMsIG1heE51bUZvY3VzQXJlYXMpOwogICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0FSRUFTLApAQCAtNzM0LDcgKzc4NSw3IEBACiAKICAgICBtZXRlcmluZ0FyZWFzLmFkZChQYXJhbWV0ZXJzOjpBcmVhKDAsIDAsIDAsIDAsIDApKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX01FVEVSSU5HX0FSRUFTLAotICAgICAgICAgICAgbWF4M2FSZWdpb25zLmRhdGEuaTMyWzBdKTsKKyAgICAgICAgICAgIG1heDNhUmVnaW9ucy5kYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NRVRFUklOR19BUkVBUywKICAgICAgICAgICAgICIoMCwwLDAsMCwwKSIpOwogCkBAIC05MzEsMTMgKzk4MiwxOSBAQAogICAgIGJvb2wgZml4ZWRMZW5zID0gbWluRm9jdXNEaXN0YW5jZS5jb3VudCA9PSAwIHx8CiAgICAgICAgIG1pbkZvY3VzRGlzdGFuY2UuZGF0YS5mWzBdID09IDA7CiAKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24gPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGJvb2wgY2FuRm9jdXNJbmZpbml0eSA9IChmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uY291bnQgJiYKKyAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CisgICAgICAgICAgICBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9VTkNBTElCUkFURUQpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9jYWxMZW5ndGhzID0KICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUyk7CiAgICAgaWYgKCFhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQpIHJldHVybiBOT19JTklUOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOwotICAgIGlmICghYXZhaWxhYmxlRm9ybWF0cy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IGF2YWlsYWJsZUZvcm1hdHMgPSBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CisgICAgaWYgKCFhdmFpbGFibGVGb3JtYXRzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKIAogICAgIGlmIChzY2VuZU1vZGVPdmVycmlkZXMuY291bnQgPiAwKSB7CkBAIC05ODIsNiArMTAzOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBzY2VuZU1vZGVPdmVycmlkZXMuZGF0YS51OFtpICoga01vZGVzUGVyU2NlbmVNb2RlICsgMl07CiAgICAgICAgICAgICBzd2l0Y2goYWZNb2RlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkY6CisgICAgICAgICAgICAgICAgICAgIGlmICghZml4ZWRMZW5zICYmICFjYW5Gb2N1c0luZmluaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2NlbmUgbW9kZSBvdmVycmlkZSBsaXN0cyBhc2tzIGZvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmaXhlZCBmb2N1cyBvbiBhIGRldmljZSB3aXRoIGZvY3VzZXIgYnV0IG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjYWxpYnJhdGVkIGZvciBpbmZpbml0eSBmb2N1cyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbW9kZXMuZm9jdXNNb2RlID0gZml4ZWRMZW5zID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT0NVU19NT0RFX0ZJWEVEIDogRk9DVVNfTU9ERV9JTkZJTklUWTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDIxLDggKzEwODUsOCBAQAogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIEhBTCBzdXBwb3J0cyBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgKICAgICBmYXN0SW5mby51c2VGbGV4aWJsZVl1diA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXZhaWxhYmxlRm9ybWF0c1tpXSA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKICAgICAgICAgICAgIGZhc3RJbmZvLnVzZUZsZXhpYmxlWXV2ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMjI1LDggKzEyODksNyBAQAogICAgICAgICAgICAgICAgICAgICAiaXMgYWN0aXZlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPQotICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7CisgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgICAgICAvLyBJZiB1c2luZyBmbGV4aWJsZSBZVVYsIGFsd2F5cyBzdXBwb3J0IE5WMjEvWVYxMi4gT3RoZXJ3aXNlLCBjaGVjawogICAgICAgICAvLyBIQUwncyBsaXN0LgogICAgICAgICBpZiAoISAoZmFzdEluZm8udXNlRmxleGlibGVZdXYgJiYKQEAgLTEyMzUsMTEgKzEyOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikgKSApIHsKICAgICAgICAgICAgIC8vIE5vdCB1c2luZyBmbGV4aWJsZSBZVVYgZm9ybWF0LCBzbyBjaGVjayBleHBsaWNpdGx5Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0KSBicmVhazsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHNbaV0gPT0gdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQpIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlRm9ybWF0cy5jb3VudCkgeworICAgICAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlRm9ybWF0cy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBwcmV2aWV3IGZvcm1hdCAlcyAoMHgleCkgaXMgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1BhcmFtcy5nZXRQcmV2aWV3Rm9ybWF0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCk7CkBAIC0xMzU1LDE3ICsxNDE3LDE2IEBACiAgICAgLy8gUElDVFVSRV9TSVpFCiAgICAgbmV3UGFyYW1zLmdldFBpY3R1cmVTaXplKCZ2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKLSAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCA9PSBwaWN0dXJlV2lkdGggfHwKLSAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0ID09IHBpY3R1cmVIZWlnaHQpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUGljdHVyZVNpemVzID0KLSAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlUGljdHVyZVNpemVzLmNvdW50OyBpKz0yKSB7Ci0gICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVBpY3R1cmVTaXplcy5kYXRhLmkzMltpXSA9PQorICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoICE9IHBpY3R1cmVXaWR0aCB8fAorICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQgIT0gcGljdHVyZUhlaWdodCkgeworICAgICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUGljdHVyZVNpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlUGljdHVyZVNpemVzW2ldLndpZHRoID09CiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgpICYmCi0gICAgICAgICAgICAgICAgKGF2YWlsYWJsZVBpY3R1cmVTaXplcy5kYXRhLmkzMltpKzFdID09CisgICAgICAgICAgICAgICAgKGF2YWlsYWJsZVBpY3R1cmVTaXplc1tpXS5oZWlnaHQgPT0KICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpKSBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuY291bnQpIHsKKyAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlUGljdHVyZVNpemVzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgcGljdHVyZSBzaXplICVkIHggJWQgaXMgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpOwpAQCAtMTUyMiw3ICsxNTgzLDcgQEAKICAgICAgICAgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU0NFTkVfTU9ERSkgKTsKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBzY2VuZU1vZGUgJiYKICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEKSB7CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCkgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTY2VuZU1vZGVzID0KICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9TQ0VORV9NT0RFUyk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50OyBpKyspIHsKQEAgLTE1MzcsNyArMTU5OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgYm9vbCBzY2VuZU1vZGVTZXQgPQotICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAKICAgICAvLyBGTEFTSF9NT0RFCiAgICAgaWYgKHNjZW5lTW9kZVNldCkgewpAQCAtMTU1NSw3ICsxNjE2LDkgQEAKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSAhPSBmbGFzaE1vZGUpIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZmxhc2hBdmFpbGFibGUgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFLCAxLCAxKTsKLSAgICAgICAgaWYgKCFmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdICYmCisgICAgICAgIGJvb2wgaXNGbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUU7CisgICAgICAgIGlmICghaXNGbGFzaEF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUgIT0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIGZsYXNoIG1vZGUgXCIlc1wiIGlzIG5vdCBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICAgICAgICAgICAgIk5vIGZsYXNoIG9uIGRldmljZSIsIF9fRlVOQ1RJT05fXywKQEAgLTE1ODAsOSArMTY0MywxMSBAQAogICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSBpbiBjYXNlIG9mIG92ZXJyaWRlCi0gICAgICAgIG5ld1BhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCi0gICAgICAgICAgICAgICAgZmxhc2hNb2RlRW51bVRvU3RyaW5nKHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUpKTsKKyAgICAgICAgLy8gVXBkYXRlIGluIGNhc2Ugb2Ygb3ZlcnJpZGUsIGJ1dCBvbmx5IGlmIGZsYXNoIGlzIHN1cHBvcnRlZAorICAgICAgICBpZiAoaXNGbGFzaEF2YWlsYWJsZSkgeworICAgICAgICAgICAgbmV3UGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgZmxhc2hNb2RlRW51bVRvU3RyaW5nKHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFdISVRFX0JBTEFOQ0UKQEAgLTE2NjcsMTAgKzE3MzIsMTEgQEAKICAgICAvLyBGT0NVU19BUkVBUwogICAgIHJlcyA9IHBhcnNlQXJlYXMobmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfQVJFQVMpLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5mb2N1c2luZ0FyZWFzKTsKLSAgICBzaXplX3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywgMSwgMSkuZGF0YS5pMzJbMF07CisgICAgc2l6ZV90IG1heEFmUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pLgorICAgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUZdOwogICAgIGlmIChyZXMgPT0gT0spIHJlcyA9IHZhbGlkYXRlQXJlYXModmFsaWRhdGVkUGFyYW1zLmZvY3VzaW5nQXJlYXMsCi0gICAgICAgICAgICBtYXgzYVJlZ2lvbnMsIEFSRUFfS0lORF9GT0NVUyk7CisgICAgICAgICAgICBtYXhBZlJlZ2lvbnMsIEFSRUFfS0lORF9GT0NVUyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBmb2N1cyBhcmVhcyBhcmUgbWFsZm9ybWVkOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUykpOwpAQCAtMTcwMCwxMCArMTc2NiwxMyBAQAogICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9BVVRPX1dISVRFQkFMQU5DRV9MT0NLKSk7CiAKICAgICAvLyBNRVRFUklOR19BUkVBUworICAgIHNpemVfdCBtYXhBZVJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdOwogICAgIHJlcyA9IHBhcnNlQXJlYXMobmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUVURVJJTkdfQVJFQVMpLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlQXJlYXModmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMsIG1heDNhUmVnaW9ucywKKyAgICAgICAgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcywgbWF4QWVSZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRUFfS0lORF9NRVRFUklORyk7CiAgICAgfQogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTE3MjgsMjEgKzE3OTcsMjYgQEAKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGggIT0gdmlkZW9XaWR0aCB8fAogICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0ICE9IHZpZGVvSGVpZ2h0KSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBSRUNPUkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVmlkZW8gc2l6ZSBjYW5ub3QgYmUgdXBkYXRlZCB3aGVuIHJlY29yZGluZyBpcyBhY3RpdmUhIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVByZXZpZXdTaXplcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKChhdmFpbGFibGVQcmV2aWV3U2l6ZXNbaV0ud2lkdGggPT0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgpICYmCi0gICAgICAgICAgICAgICAgKGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS5oZWlnaHQgPT0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KSkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlUHJldmlld1NpemVzLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgdmlkZW8gc2l6ZSAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoLAorICAgICAgICAgICAgQUxPR1coIiVzOiBWaWRlbyBzaXplIGNhbm5vdCBiZSB1cGRhdGVkIChmcm9tICVkIHggJWQgdG8gJWQgeCAlZCkiCisgICAgICAgICAgICAgICAgICAgICIgd2hlbiByZWNvcmRpbmcgaXMgYWN0aXZlISBJZ25vcmUgdGhlIHNpemUgdXBkYXRlISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OworICAgICAgICAgICAgbmV3UGFyYW1zLnNldFZpZGVvU2l6ZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlVmlkZW9TaXplc1tpXS53aWR0aCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVWaWRlb1NpemVzW2ldLmhlaWdodCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHZpZGVvIHNpemUgJWQgeCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE3NjQsNiArMTgzOCw3IEBACiAgICAgLyoqIFVwZGF0ZSBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCiAKICAgICAqdGhpcyA9IHZhbGlkYXRlZFBhcmFtczsKKyAgICB1cGRhdGVPdmVycmlkZGVuSnBlZ1NpemUoKTsKIAogICAgIC8qKiBVcGRhdGUgZXh0ZXJuYWwgcGFyYW1ldGVycyBjYWxjdWxhdGVkIGZyb20gdGhlIGludGVybmFsIG9uZXMgKi8KIApAQCAtMTg1NSw3ICsxOTMwLDcgQEAKICAgICAvLyAoZmFjZSBkZXRlY3Rpb24gc3RhdGlzdGljcyBhbmQgZmFjZSBwcmlvcml0eSBzY2VuZSBtb2RlKS4gTWFwIGZyb20gb3RoZXIKICAgICAvLyB0byB0aGUgb3RoZXIuCiAgICAgYm9vbCBzY2VuZU1vZGVBY3RpdmUgPQotICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgc2NlbmVNb2RlICE9ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogICAgIHVpbnQ4X3QgcmVxQ29udHJvbE1vZGUgPSBBTkRST0lEX0NPTlRST0xfTU9ERV9BVVRPOwogICAgIGlmIChlbmFibGVGYWNlRGV0ZWN0IHx8IHNjZW5lTW9kZUFjdGl2ZSkgewogICAgICAgICByZXFDb250cm9sTW9kZSA9IEFORFJPSURfQ09OVFJPTF9NT0RFX1VTRV9TQ0VORV9NT0RFOwpAQCAtMTg2Nyw3ICsxOTQyLDcgQEAKICAgICB1aW50OF90IHJlcVNjZW5lTW9kZSA9CiAgICAgICAgICAgICBzY2VuZU1vZGVBY3RpdmUgPyBzY2VuZU1vZGUgOgogICAgICAgICAgICAgZW5hYmxlRmFjZURldGVjdCA/ICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFkgOgotICAgICAgICAgICAgKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDsKICAgICByZXMgPSByZXF1ZXN0LT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUsCiAgICAgICAgICAgICAmcmVxU2NlbmVNb2RlLCAxKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwpAQCAtMTk4OCw2ICsyMDYzLDIzIEBACiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzLCByZXFNZXRlcmluZ0FyZWFzU2l6ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAorICAgIC8vIFNldCBhd2IgcmVnaW9ucyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9ucyBpZiBhbGxvd2VkCisgICAgc2l6ZV90IG1heEF3YlJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQVdCXTsKKyAgICBpZiAobWF4QXdiUmVnaW9ucyA+IDApIHsKKyAgICAgICAgaWYgKG1heEF3YlJlZ2lvbnMgPj0gbWV0ZXJpbmdBcmVhcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXMsIHJlcU1ldGVyaW5nQXJlYXNTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgYXdiIHJlZ2lvbnMgYXJlIHplcm9lZCBpZiB0aGUgcmVnaW9uIGNvdW50IGlzIHRvbyBoaWdoLgorICAgICAgICAgICAgaW50MzJfdCB6ZXJvZWRBd2JBcmVhc1s1XSA9IHswLCAwLCAwLCAwLCAwfTsKKyAgICAgICAgICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgICAgICAgICAgICAgIHplcm9lZEF3YkFyZWFzLCBzaXplb2YoemVyb2VkQXdiQXJlYXMpL3NpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBkZWxldGVbXSByZXFNZXRlcmluZ0FyZWFzOwogCiAgICAgLyogZG9uJ3QgaW5jbHVkZSBqcGVnIHRodW1ibmFpbCBzaXplIC0gaXQncyB2YWxpZCBmb3IKQEAgLTIwNjQsNiArMjE1Niw1MiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgUGFyYW1ldGVyczo6b3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCkgeworICAgIGlmIChwaWN0dXJlU2l6ZU92ZXJyaWRlbikgeworICAgICAgICBBTE9HVigiUGljdHVyZSBzaXplIGhhcyBiZWVuIG92ZXJyaWRkZW4uIFNraXAgb3ZlcnJpZGluZyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSB0cnVlOworICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CisgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OworICAgIHBpY3R1cmVXaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IHZpZGVvSGVpZ2h0OworICAgIC8vIFRoaXMgY2hhbmdlIG9mIHBpY3R1cmUgc2l6ZSBpcyBpbnZpc2libGUgdG8gYXBwIGxheWVyLgorICAgIC8vIERvIG5vdCB1cGRhdGUgYXBwIHZpc2libGUgcGFyYW1zCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJzOjp1cGRhdGVPdmVycmlkZGVuSnBlZ1NpemUoKSB7CisgICAgaWYgKCFwaWN0dXJlU2l6ZU92ZXJyaWRlbikgeworICAgICAgICBBTE9HVigiUGljdHVyZSBzaXplIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLiBTa2lwIGNoZWNraW5nIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOworICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKKworICAgIGlmIChwaWN0dXJlV2lkdGggPD0gdmlkZW9XaWR0aCAmJiBwaWN0dXJlSGVpZ2h0IDw9IHZpZGVvSGVpZ2h0KSB7CisgICAgICAgIC8vIFBpY3R1cmUgc2l6ZSBpcyBub3cgc21hbGxlciB0aGFuIHZpZGVvIHNpemUuIE5vIG5lZWQgdG8gb3ZlcnJpZGUgYW55bW9yZQorICAgICAgICByZXR1cm4gcmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpOworICAgIH0KKworICAgIHBpY3R1cmVXaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgcGljdHVyZUhlaWdodCA9IHZpZGVvSGVpZ2h0OworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJzOjpyZWNvdmVyT3ZlcnJpZGRlbkpwZWdTaXplKCkgeworICAgIGlmICghcGljdHVyZVNpemVPdmVycmlkZW4pIHsKKyAgICAgICAgQUxPR1YoIlBpY3R1cmUgc2l6ZSBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbi4gU2tpcCByZWNvdmVyaW5nIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKKyAgICBwaWN0dXJlV2lkdGggPSBwaWN0dXJlV2lkdGhMYXN0U2V0OworICAgIHBpY3R1cmVIZWlnaHQgPSBwaWN0dXJlSGVpZ2h0TGFzdFNldDsKKyAgICByZXR1cm4gT0s7Cit9CiAKIGNvbnN0IGNoYXIqIFBhcmFtZXRlcnM6OmdldFN0YXRlTmFtZShTdGF0ZSBzdGF0ZSkgewogI2RlZmluZSBDQVNFX0VOVU1fVE9fQ0hBUih4KSBjYXNlIHg6IHJldHVybigjeCk7IGJyZWFrOwpAQCAtMjA4MywyNCArMjIyMSw3IEBACiB9CiAKIGludCBQYXJhbWV0ZXJzOjpmb3JtYXRTdHJpbmdUb0VudW0oY29uc3QgY2hhciAqZm9ybWF0KSB7Ci0gICAgcmV0dXJuCi0gICAgICAgICFmb3JtYXQgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMlNQKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIySSkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPwotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCi0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCNTY1KSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQkE4ODg4KSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQotICAgICAgICAtMTsKKyAgICByZXR1cm4gQ2FtZXJhUGFyYW1ldGVyczo6cHJldmlld0Zvcm1hdFRvRW51bShmb3JtYXQpOwogfQogCiBjb25zdCBjaGFyKiBQYXJhbWV0ZXJzOjpmb3JtYXRFbnVtVG9TdHJpbmcoaW50IGZvcm1hdCkgewpAQCAtMjIyOCw5ICsyMzQ5LDkgQEAKIGludCBQYXJhbWV0ZXJzOjpzY2VuZU1vZGVTdHJpbmdUb0VudW0oY29uc3QgY2hhciAqc2NlbmVNb2RlKSB7CiAgICAgcmV0dXJuCiAgICAgICAgICFzY2VuZU1vZGUgPwotICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgOgorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQgOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BVVRPKSA/Ci0gICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCA6CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0FDVElPTikgPwogICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfQUNUSU9OIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfUE9SVFJBSVQpID8KQEAgLTIyNjgsNyArMjM4OSw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSkgewogICAgIHJldHVybgogICAgICAgICAhZmxhc2hNb2RlID8KLSAgICAgICAgICAgIFBhcmFtZXRlcnM6OkZMQVNIX01PREVfSU5WQUxJRCA6CisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRiA6CiAgICAgICAgICFzdHJjbXAoZmxhc2hNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRikgPwogICAgICAgICAgICAgUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYgOgogICAgICAgICAhc3RyY21wKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9BVVRPKSA/CkBAIC0yNTY5LDcgKzI2OTAsNyBAQAogICAgIHJldHVybiBjcm9wWVRvQXJyYXkobm9ybWFsaXplZFlUb0Nyb3AoeSkpOwogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJzOjpnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKSB7CitzdGF0dXNfdCBQYXJhbWV0ZXJzOjpnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RhdGljIG1ldGFkYXRhIGlzIG5vdCBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMjU3OCwyMiArMjY5OSwzNyBAQAogICAgICAgICBBTE9HRSgiJXM6IElucHV0IHNpemUgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNpemVzLT5jbGVhcigpOwogCi0gICAgY29uc3Qgc2l6ZV90IFNJWkVfQ09VTlQgPSBzaXplb2YoU2l6ZSkgLyBzaXplb2YoaW50KTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUywgU0laRV9DT1VOVCk7Ci0gICAgaWYgKGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50IDwgU0laRV9DT1VOVCkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIFNpemUgcHJldmlld1NpemU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudDsgaSArPSBTSVpFX0NPVU5UKSB7Ci0gICAgICAgIHByZXZpZXdTaXplLndpZHRoID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaV07Ci0gICAgICAgIHByZXZpZXdTaXplLmhlaWdodCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2krMV07Ci0gICAgICAgICAgICAvLyBOZWVkIHNraXAgdGhlIHByZXZpZXcgc2l6ZXMgdGhhdCBhcmUgdG9vIGxhcmdlLgotICAgICAgICAgICAgaWYgKHByZXZpZXdTaXplLndpZHRoIDw9IGxpbWl0LndpZHRoICYmCi0gICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChwcmV2aWV3U2l6ZSk7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOworICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgICAgICAgICBzYy53aWR0aCA8PSBsaW1pdC53aWR0aCAmJiBzYy5oZWlnaHQgPD0gbGltaXQuaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKKyAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChzeik7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBzaXplX3QgU0laRV9DT1VOVCA9IHNpemVvZihTaXplKSAvIHNpemVvZihpbnQpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcyA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9QUk9DRVNTRURfU0laRVMsIFNJWkVfQ09VTlQpOworICAgICAgICBpZiAoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQgPCBTSVpFX0NPVU5UKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgICAgIFNpemUgZmlsdGVyZWRTaXplOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50OyBpICs9IFNJWkVfQ09VTlQpIHsKKyAgICAgICAgICAgIGZpbHRlcmVkU2l6ZS53aWR0aCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgZmlsdGVyZWRTaXplLmhlaWdodCA9IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmRhdGEuaTMyW2krMV07CisgICAgICAgICAgICAgICAgLy8gTmVlZCBza2lwIHRoZSBwcmV2aWV3IHNpemVzIHRoYXQgYXJlIHRvbyBsYXJnZS4KKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRTaXplLndpZHRoIDw9IGxpbWl0LndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFNpemUuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBzaXplcy0+cHVzaChmaWx0ZXJlZFNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChzaXplcy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCJnZW5lcmF0ZWQgcHJldmlldyBzaXplIGxpc3QgaXMgZW1wdHkhISIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjYyNyw2ICsyNzYzLDc4IEBACiAgICAgcmV0dXJuIG1heFNpemU7CiB9CiAKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDQ7CisgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKyAgICBpZiAobURldmljZVZlcnNpb24gPCBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBBTE9HRSgiU3RyZWFtQ29uZmlndXJhdGlvbiBpcyBvbmx5IHZhbGlkIGFmdGVyIGRldmljZSBIQUwgMy4yISIpOworICAgICAgICByZXR1cm4gc2NzOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgIHNjcy5hZGQoc2MpOworICAgIH0KKyAgICByZXR1cm4gc2NzOworfQorCitTb3J0ZWRWZWN0b3I8aW50MzJfdD4gUGFyYW1ldGVyczo6Z2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpIHsKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gb3V0cHV0Rm9ybWF0czsgLy8gTm9uLWR1cGxpY2F0ZWQgb3V0cHV0IGZvcm1hdHMKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CisgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkgeworICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdHMuYWRkKHNjLmZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb3JtYXRzID0gc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZvcm1hdHMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dEZvcm1hdHM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKSB7CisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGpwZWdTaXplczsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CisgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKKyAgICAgICAgICAgICAgICBqcGVnU2l6ZXMuYWRkKHN6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBKUEVHX1NJWkVfRU5UUllfQ09VTlQgPSAyOworICAgICAgICBjb25zdCBpbnQgV0lEVEhfT0ZGU0VUID0gMDsKKyAgICAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVKcGVnU2l6ZXMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSs9IEpQRUdfU0laRV9FTlRSWV9DT1VOVCkgeworICAgICAgICAgICAgaW50IHdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBXSURUSF9PRkZTRVRdOworICAgICAgICAgICAgaW50IGhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgSEVJR0hUX09GRlNFVF07CisgICAgICAgICAgICBTaXplIHN6ID0ge3dpZHRoLCBoZWlnaHR9OworICAgICAgICAgICAganBlZ1NpemVzLmFkZChzeik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGpwZWdTaXplczsKK30KKwogUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbiBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVDcm9wUmVnaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6OkNyb3BSZWdpb246Ok91dHB1dHMgb3V0cHV0cykgY29uc3QgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCBkYTA3Y2NmLi44MTVjYzU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICBpbnQgcHJldmlld1RyYW5zZm9ybTsgLy8gc2V0IGJ5IENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04KIAogICAgIGludCBwaWN0dXJlV2lkdGgsIHBpY3R1cmVIZWlnaHQ7CisgICAgLy8gU3RvcmUgdGhlIHBpY3R1cmUgc2l6ZSBiZWZvcmUgdGhleSBhcmUgb3ZlcnJpZGVuIGJ5IHZpZGVvIHNuYXBzaG90CisgICAgaW50IHBpY3R1cmVXaWR0aExhc3RTZXQsIHBpY3R1cmVIZWlnaHRMYXN0U2V0OworICAgIGJvb2wgcGljdHVyZVNpemVPdmVycmlkZW47CiAKICAgICBpbnQzMl90IGpwZWdUaHVtYlNpemVbMl07CiAgICAgdWludDhfdCBqcGVnUXVhbGl0eSwganBlZ1RodW1iUXVhbGl0eTsKQEAgLTExNCw2ICsxMTcsMTQgQEAKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2s7CiAgICAgYm9vbCBhdXRvV2hpdGVCYWxhbmNlTG9jazsKIAorICAgIC8vIDNBIHJlZ2lvbiB0eXBlcywgZm9yIHVzZSB3aXRoIEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUworICAgIGVudW0gcmVnaW9uX3QgeworICAgICAgICBSRUdJT05fQUUgPSAwLAorICAgICAgICBSRUdJT05fQVdCLAorICAgICAgICBSRUdJT05fQUYsCisgICAgICAgIE5VTV9SRUdJT04gLy8gTnVtYmVyIG9mIHJlZ2lvbiB0eXBlcworICAgIH0gcmVnaW9uOworCiAgICAgVmVjdG9yPEFyZWE+IG1ldGVyaW5nQXJlYXM7CiAKICAgICBpbnQgem9vbTsKQEAgLTE2OCw4ICsxNzksMTMgQEAKICAgICAvLyBOdW1iZXIgb2Ygem9vbSBzdGVwcyB0byBzaW11bGF0ZQogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX1pPT01fU1RFUFMgPSAxMDA7CiAgICAgLy8gTWF4IHByZXZpZXcgc2l6ZSBhbGxvd2VkCisgICAgLy8gVGhpcyBpcyBzZXQgdG8gYSAxOjEgdmFsdWUgdG8gYWxsb3cgZm9yIGFueSBhc3BlY3QgcmF0aW8gdGhhdCBoYXMKKyAgICAvLyBhIG1heCBsb25nIHNpZGUgb2YgMTkyMCBwaXhlbHMKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9QUkVWSUVXX1dJRFRIID0gMTkyMDsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfUFJFVklFV19IRUlHSFQgPSAxOTIwOworICAgIC8vIEluaXRpYWwgbWF4IHByZXZpZXcvcmVjb3JkaW5nIHNpemUgYm91bmQKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfV0lEVEggPSAxOTIwOworICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19IRUlHSFQgPSAxMDgwOwogICAgIC8vIEFzcGVjdCByYXRpbyB0b2xlcmFuY2UKICAgICBzdGF0aWMgY29uc3QgZmxvYXQgQVNQRUNUX1JBVElPX1RPTEVSQU5DRSA9IDAuMDAxOwogCkBAIC0yMTksNyArMjM1LDcgQEAKICAgICB+UGFyYW1ldGVycygpOwogCiAgICAgLy8gU2V0cyB1cCBkZWZhdWx0IHBhcmFtZXRlcnMKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhICppbmZvLCBpbnQgZGV2aWNlVmVyc2lvbik7CiAKICAgICAvLyBCdWlsZCBmYXN0LWFjY2VzcyBkZXZpY2Ugc3RhdGljIGluZm8gZnJvbSBzdGF0aWMgaW5mbwogICAgIHN0YXR1c190IGJ1aWxkRmFzdEluZm8oKTsKQEAgLTI0NSw2ICsyNjEsMTIgQEAKICAgICAvLyBBZGQvdXBkYXRlIEpQRUcgZW50cmllcyBpbiBtZXRhZGF0YQogICAgIHN0YXR1c190IHVwZGF0ZVJlcXVlc3RKcGVnKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSBjb25zdDsKIAorICAgIC8qIEhlbHBlciBmdW5jdGlvbnMgdG8gb3ZlcnJpZGUganBlZyBzaXplIGZvciB2aWRlbyBzbmFwc2hvdCAqLworICAgIC8vIE92ZXJyaWRlIGpwZWcgc2l6ZSBieSB2aWRlbyBzaXplLiBDYWxsZWQgZHVyaW5nIHN0YXJ0UmVjb3JkaW5nLgorICAgIHN0YXR1c190IG92ZXJyaWRlSnBlZ1NpemVCeVZpZGVvU2l6ZSgpOworICAgIC8vIFJlY292ZXIgb3ZlcnJpZGRlbiBqcGVnIHNpemUuICBDYWxsZWQgZHVyaW5nIHN0b3BSZWNvcmRpbmcuCisgICAgc3RhdHVzX3QgcmVjb3Zlck92ZXJyaWRkZW5KcGVnU2l6ZSgpOworCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjcm9wIHJlZ2lvbiByZWN0YW5nbGUgYmFzZWQgb24gY3VycmVudCBzdHJlYW0gc2l6ZXMKICAgICBzdHJ1Y3QgQ3JvcFJlZ2lvbiB7CiAgICAgICAgIGZsb2F0IGxlZnQ7CkBAIC0zMzQsMTAgKzM1NiwzNSBAQAogICAgIGludCBub3JtYWxpemVkWVRvQ3JvcChpbnQgeSkgY29uc3Q7CiAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUHJldmlld1NpemVzOworICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVWaWRlb1NpemVzOwogICAgIC8vIEdldCBzaXplIGxpc3QgKHRoYXQgYXJlIG5vIGxhcmdlciB0aGFuIGxpbWl0KSBmcm9tIHN0YXRpYyBtZXRhZGF0YS4KLSAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFByZXZpZXdTaXplcyhTaXplIGxpbWl0LCBWZWN0b3I8U2l6ZT4gKnNpemVzKTsKKyAgICBzdGF0dXNfdCBnZXRGaWx0ZXJlZFNpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpOwogICAgIC8vIEdldCBtYXggc2l6ZSAoZnJvbSB0aGUgc2l6ZSBhcnJheSkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBhc3BlY3QgcmF0aW8uCiAgICAgU2l6ZSBnZXRNYXhTaXplRm9yUmF0aW8oZmxvYXQgcmF0aW8sIGNvbnN0IGludDMyX3QqIHNpemVBcnJheSwgc2l6ZV90IGNvdW50KTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3Igb3ZlcnJpZGluZyBqcGVnIHNpemUgZm9yIHZpZGVvIHNuYXBzaG90CisgICAgLy8gQ2hlY2sgaWYgb3ZlcnJpZGRlbiBqcGVnIHNpemUgbmVlZHMgdG8gYmUgdXBkYXRlZCBhZnRlciBQYXJhbWV0ZXJzOjpzZXQuCisgICAgLy8gVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGFpbG9yZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIFBhcmFtZXRlcnM6OnNldC4KKyAgICAvLyBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIG90aGVyIHB1cnBvc2UuCisgICAgc3RhdHVzX3QgdXBkYXRlT3ZlcnJpZGRlbkpwZWdTaXplKCk7CisKKyAgICBzdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0OworICAgIH07CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGV4dHJhY3QgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgLy8gT25seSB2YWxpZCBzaW5jZSBkZXZpY2UgSEFMIHZlcnNpb24gMy4yCisgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAorICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBub24tZHVwbGljYXRlZCBhdmFpbGFibGUgb3V0cHV0IGZvcm1hdHMKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYXZhaWxhYmxlIG91dHB1dCBqcGVnIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworCisgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogfTsKIAogLy8gVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIFBhcmFtZXRlcnMgY2xhc3Mgc28gdGhhdCBpdCBjYW4gb25seSBiZSBhY2Nlc3NlZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCA3N2FlN2VjLi45ZTdmZmY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtODksOCArODksMjYgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBtKG1NdXRleCk7CiAgICAgaWYgKG1QcmV2aWV3UmVxdWVzdC5lbnRyeUNvdW50KCkgPT0gMCkgewotICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfUFJFVklFVywKLSAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSBDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcgZm9yIFpTTCBzdHJlYW1pbmcgY2FzZS4KKyAgICAgICAgaWYgKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICBpZiAocGFyYW1zLnpzbE1vZGUgJiYgIXBhcmFtcy5yZWNvcmRpbmdIaW50KSB7CisgICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAmbVByZXZpZXdSZXF1ZXN0KTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgcHJldmlldyByZXF1ZXN0OiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTYzLDggKzE4MSw3IEBACiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIDAsCi0gICAgICAgICAgICAgICAgJm1QcmV2aWV3U3RyZWFtSWQpOworICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUHJldmlld1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgcHJldmlldyBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0zMDEsNiArMzE4LDQ0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKAorICAgICAgICBjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgKm5lZWRzVXBkYXRlKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKG5lZWRzVXBkYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IGludmFsaWQgYXJndW1lbnQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ1N0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICAqbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBEZXZpY2UgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CisgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKKyAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyByZWNvcmRpbmcgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCisgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAobVJlY29yZGluZ0NvbnN1bWVyID09IDAgfHwgY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9XaWR0aCB8fAorICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0KSB7CisgICAgICAgICpuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgfQorICAgICpuZWVkc1VwZGF0ZSA9IGZhbHNlOworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzE5LDEzICszNzQsMTUgQEAKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQuIFdlIG5lZWQgb25lIG1vcmUgYnVmZmVyIGhlcmUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgLy8gYWx3YXlzIGFjcXVpcmUgYW5kIGZyZWUgYSBidWZmZXIgd2hlbiB0aGUgaGVhcCBpcyBmdWxsOyBvdGhlcndpc2UgdGhlIGNvbnN1bWVyCiAgICAgICAgIC8vIHdpbGwgaGF2ZSBidWZmZXJzIGluIGZsaWdodCB3ZSdsbCBuZXZlciBjbGVhciBvdXQuCi0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGJxLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAogICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQgKyAxKTsKICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1SZWNvcmRpbmdDb25zdW1lciIpKTsKLSAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICAgICAgbmV3Q29uc3VtZXIgPSB0cnVlOwogICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgbGF0ZXIsIHNpbmNlIHdlIGRvbid0IGtub3cgYnVmZmVyIHNpemUgdW50aWwgcmVjZWlwdAogICAgIH0KQEAgLTM2NSw3ICs0MjIsNyBAQAogICAgICAgICBtUmVjb3JkaW5nRnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1SZWNvcmRpbmdXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnZpZGVvV2lkdGgsIHBhcmFtcy52aWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAwLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciByZWNvcmRpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTQyOCwxMCArNDg1LDEzIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogCi0gICAgLy8gSWYgYSByZWNvcmRpbmcgc3RyZWFtIGlzIGJlaW5nIHN0YXJ0ZWQgdXAsIGZyZWUgdXAgYW55Ci0gICAgLy8gb3V0c3RhbmRpbmcgYnVmZmVycyBsZWZ0IGZyb20gdGhlIHByZXZpb3VzIHJlY29yZGluZyBzZXNzaW9uLgotICAgIC8vIFRoZXJlIHNob3VsZCBuZXZlciBiZSBhbnksIHNvIGlmIHRoZXJlIGFyZSwgd2FybiBhYm91dCBpdC4KLSAgICBpZiAoaXNTdHJlYW1BY3RpdmUob3V0cHV0U3RyZWFtcywgbVJlY29yZGluZ1N0cmVhbUlkKSkgeworICAgIC8vIElmIGEgcmVjb3JkaW5nIHN0cmVhbSBpcyBiZWluZyBzdGFydGVkIHVwIGFuZCBubyByZWNvcmRpbmcKKyAgICAvLyBzdHJlYW0gaXMgYWN0aXZlIHlldCwgZnJlZSB1cCBhbnkgb3V0c3RhbmRpbmcgYnVmZmVycyBsZWZ0CisgICAgLy8gZnJvbSB0aGUgcHJldmlvdXMgcmVjb3JkaW5nIHNlc3Npb24uIFRoZXJlIHNob3VsZCBuZXZlciBiZQorICAgIC8vIGFueSwgc28gaWYgdGhlcmUgYXJlLCB3YXJuIGFib3V0IGl0LgorICAgIGJvb2wgaXNSZWNvcmRpbmdTdHJlYW1JZGxlID0gIWlzU3RyZWFtQWN0aXZlKG1BY3RpdmVTdHJlYW1JZHMsIG1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgYm9vbCBzdGFydFJlY29yZGluZ1N0cmVhbSA9IGlzU3RyZWFtQWN0aXZlKG91dHB1dFN0cmVhbXMsIG1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgaWYgKHN0YXJ0UmVjb3JkaW5nU3RyZWFtICYmIGlzUmVjb3JkaW5nU3RyZWFtSWRsZSkgewogICAgICAgICByZWxlYXNlQWxsUmVjb3JkaW5nRnJhbWVzTG9ja2VkKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKaW5kZXggODMzYmI4Zi4uODQ2NmFmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaApAQCAtNTQsNiArNTQsOSBAQAogCiAgICAgc3RhdHVzX3Qgc2V0UmVjb3JkaW5nQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZWNvcmRpbmdSZXF1ZXN0KGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CisgICAgLy8gSWYgbmVlZHNVcGRhdGUgaXMgc2V0IHRvIHRydWUsIGEgdXBkYXRlUmVjb3JkaW5nU3RyZWFtIGNhbGwgd2l0aCBwYXJhbXMgd2lsbCByZWNyZWF0ZQorICAgIC8vIHJlY29yZGluZyBzdHJlYW0KKyAgICBzdGF0dXNfdCByZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgKm5lZWRzVXBkYXRlKTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZWNvcmRpbmdTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVSZWNvcmRpbmdTdHJlYW0oKTsKICAgICBpbnQgZ2V0UmVjb3JkaW5nU3RyZWFtSWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKaW5kZXggMTMwZjgxYS4uOGY3ODEwMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICAgICAgbURldmljZShjbGllbnQtPmdldENhbWVyYURldmljZSgpKSwKICAgICAgICAgbVNlcXVlbmNlcihzZXF1ZW5jZXIpLAogICAgICAgICBtSWQoY2xpZW50LT5nZXRDYW1lcmFJZCgpKSwKKyAgICAgICAgbURlbGV0ZWQoZmFsc2UpLAogICAgICAgICBtWnNsQnVmZmVyQXZhaWxhYmxlKGZhbHNlKSwKICAgICAgICAgbVpzbFN0cmVhbUlkKE5PX1NUUkVBTSksCiAgICAgICAgIG1ac2xSZXByb2Nlc3NTdHJlYW1JZChOT19TVFJFQU0pLApAQCAtNjIsNyArNjMsNyBAQAogCiBac2xQcm9jZXNzb3I6On5ac2xQcm9jZXNzb3IoKSB7CiAgICAgQUxPR1YoIiVzOiBFeGl0IiwgX19GVU5DVElPTl9fKTsKLSAgICBkZWxldGVTdHJlYW0oKTsKKyAgICBkaXNjb25uZWN0KCk7CiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yOjpvbkZyYW1lQXZhaWxhYmxlKCkgewpAQCAtNzMsMTggKzc0LDE5IEBACiAgICAgfQogfQogCi12b2lkIFpzbFByb2Nlc3Nvcjo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IC8qcmVxdWVzdElkKi8sCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewordm9pZCBac2xQcm9jZXNzb3I6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKICAgICAodm9pZCl0aW1lc3RhbXA7CiAgICAgQUxPR1ZWKCJHb3QgcHJldmlldyBmcmFtZSBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCwgdGltZXN0YW1wKTsKIAogICAgIGlmIChtU3RhdGUgIT0gUlVOTklORykgcmV0dXJuOwogCi0gICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IGZyYW1lOworICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOwogICAgIG1GcmFtZUxpc3RIZWFkID0gKG1GcmFtZUxpc3RIZWFkICsgMSkgJSBrRnJhbWVMaXN0RGVwdGg7CiAKICAgICBmaW5kTWF0Y2hlc0xvY2tlZCgpOwpAQCAtMTMwLDEzICsxMzIsMTUgQEAKIAogICAgIGlmIChtWnNsQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludAotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbVpzbENvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihicSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtWnNsQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLAogICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtWnNsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6WnNsQ29uc3VtZXIiKSk7Ci0gICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1ac2xXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCiAgICAgaWYgKG1ac2xTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKQEAgLTE3Miw2ICsxNzYsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbURlbGV0ZWQgPSBmYWxzZTsKKwogICAgIGlmIChtWnNsU3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENyZWF0ZSBzdHJlYW0gZm9yIEhBTCBwcm9kdWN0aW9uCiAgICAgICAgIC8vIFRPRE86IFNvcnQgb3V0IGJldHRlciB3YXkgdG8gc2VsZWN0IHJlc29sdXRpb24gZm9yIFpTTApAQCAtMTgwLDggKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgKGludClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1ac2xXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsIHBhcmFtcy5mYXN0SW5mby5hcnJheUhlaWdodCwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCAwLAotICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsICZtWnNsU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIFpTTDogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLApAQCAtMTk5LDEzICsyMDQsMjIgQEAKICAgICB9CiAgICAgY2xpZW50LT5yZWdpc3RlckZyYW1lTGlzdGVuZXIoQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRTdGFydCwKICAgICAgICAgICAgIENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkRW5kLAotICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL2ZhbHNlKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgWnNsUHJvY2Vzc29yOjpkZWxldGVTdHJlYW0oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CisgICAgLy8gV0FSKGIvMTU0MDgxMjgpOiBkbyBub3QgZGVsZXRlIHN0cmVhbSB1bmxlc3MgY2xpZW50IGlzIGJlaW5nIGRpc2Nvbm5lY3RlZC4KKyAgICBtRGVsZXRlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBac2xQcm9jZXNzb3I6OmRpc2Nvbm5lY3QoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggNmQzY2I4NS4uYjY1MzNjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCkBAIC01NCw3ICs1NSw3IEBACiAgICAgLy8gRnJvbSBtWnNsQ29uc3VtZXIKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3IKLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlKTsKIApAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CisgICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3QgcHVzaFRvUmVwcm9jZXNzKGludDMyX3QgcmVxdWVzdElkKTsKQEAgLTg1LDYgKzg3LDggQEAKICAgICB3cDxDYXB0dXJlU2VxdWVuY2VyPiBtU2VxdWVuY2VyOwogICAgIGludCBtSWQ7CiAKKyAgICBib29sIG1EZWxldGVkOworCiAgICAgbXV0YWJsZSBNdXRleCBtSW5wdXRNdXRleDsKICAgICBib29sIG1ac2xCdWZmZXJBdmFpbGFibGU7CiAgICAgQ29uZGl0aW9uIG1ac2xCdWZmZXJBdmFpbGFibGVTaWduYWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKaW5kZXggMmZjZTJiNi4uZjExMGI2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcApAQCAtNDQsNiArNDQsNyBAQAogICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwKICAgICB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOgogICAgICAgICBUaHJlYWQoZmFsc2UpLAorICAgICAgICBtTGF0ZXN0Q2xlYXJlZEJ1ZmZlclRpbWVzdGFtcCgwKSwKICAgICAgICAgbVN0YXRlKFJVTk5JTkcpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1TZXF1ZW5jZXIoc2VxdWVuY2VyKSwKQEAgLTUxLDkgKzUyLDQyIEBACiAgICAgICAgIG1ac2xTdHJlYW1JZChOT19TVFJFQU0pLAogICAgICAgICBtRnJhbWVMaXN0SGVhZCgwKSwKICAgICAgICAgbVpzbFF1ZXVlSGVhZCgwKSwKLSAgICAgICAgbVpzbFF1ZXVlVGFpbCgwKSB7Ci0gICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIGtac2xCdWZmZXJEZXB0aCk7Ci0gICAgbUZyYW1lTGlzdC5pbnNlcnRBdCgwLCBrRnJhbWVMaXN0RGVwdGgpOworICAgICAgICBtWnNsUXVldWVUYWlsKDApLAorICAgICAgICBtSGFzRm9jdXNlcihmYWxzZSkgeworICAgIC8vIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlIGFuZCBmcmFtZSBsaXN0IGJhc2VkIG9uIHBpcGVsaW5lIG1heCBkZXB0aC4KKyAgICBzaXplX3QgcGlwZWxpbmVNYXhEZXB0aCA9IGtEZWZhdWx0TWF4UGlwZWxpbmVEZXB0aDsKKyAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gZGV2aWNlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhM0RldmljZSo+KGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkuZ2V0KCkpOworICAgICAgICBpZiAoZGV2aWNlICE9IDApIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmluZm8oKS5maW5kKEFORFJPSURfUkVRVUVTVF9QSVBFTElORV9NQVhfREVQVEgpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBwaXBlbGluZU1heERlcHRoID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gZmluZCB0aGUgYW5kcm9pZC5yZXF1ZXN0LnBpcGVsaW5lTWF4RGVwdGgsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2UgZGVmYXVsdCBwaXBlbGluZSBtYXggZGVwdGggJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50cnkgPSBkZXZpY2UtPmluZm8oKS5maW5kKEFORFJPSURfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0UpOworICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJiBlbnRyeS5kYXRhLmZbMF0gIT0gMC4pIHsKKyAgICAgICAgICAgICAgICBtSGFzRm9jdXNlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlIGFuZCBmcmFtZSBsaXN0IGRlcHRoIGJhc2VkIG9uIG1heCBwaXBlbGluZSBkZXB0aCAoJWQpIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBpcGVsaW5lTWF4RGVwdGgpOworICAgIC8vIE5lZWQgdG8ga2VlcCBidWZmZXIgcXVldWUgbG9uZ2VyIHRoYW4gbWV0YWRhdGEgcXVldWUgYmVjYXVzZSBzb21ldGltZXMgYnVmZmVyIGFycml2ZXMKKyAgICAvLyBlYXJsaWVyIHRoYW4gbWV0YWRhdGEgd2hpY2ggY2F1c2VzIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB0byBvbGRlc3QgbWV0YWRhdGEgYmVpbmcKKyAgICAvLyByZW1vdmVkLgorICAgIG1GcmFtZUxpc3REZXB0aCA9IHBpcGVsaW5lTWF4RGVwdGg7CisgICAgbUJ1ZmZlclF1ZXVlRGVwdGggPSBtRnJhbWVMaXN0RGVwdGggKyAxOworCisKKyAgICBtWnNsUXVldWUuaW5zZXJ0QXQoMCwgbUJ1ZmZlclF1ZXVlRGVwdGgpOworICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKICAgICBzcDxDYXB0dXJlU2VxdWVuY2VyPiBjYXB0dXJlU2VxdWVuY2VyID0gbVNlcXVlbmNlci5wcm9tb3RlKCk7CiAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZXIgIT0gMCkgY2FwdHVyZVNlcXVlbmNlci0+c2V0WnNsUHJvY2Vzc29yKHRoaXMpOwogfQpAQCAtNjMsMTkgKzk3LDM0IEBACiAgICAgZGVsZXRlU3RyZWFtKCk7CiB9CiAKLXZvaWQgWnNsUHJvY2Vzc29yMzo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IC8qcmVxdWVzdElkKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSB7Cit2b2lkIFpzbFByb2Nlc3NvcjM6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKLSAgICAodm9pZCl0aW1lc3RhbXA7Ci0gICAgQUxPR1ZWKCJHb3QgcHJldmlldyBtZXRhZGF0YSBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCwgdGltZXN0YW1wKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSB0aW1lc3RhbXAsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGRvZXNuJ3QgaGF2ZSBmcmFtZSBudW1iZXIsIHNraXAgdGhpcyByZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBlbnRyeS5kYXRhLmkzMlswXTsKKworICAgIEFMT0dWVigiR290IHByZXZpZXcgbWV0YWRhdGEgZm9yIGZyYW1lICVkIHdpdGggdGltZXN0YW1wICUiIFBSSWQ2NCwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKLSAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOworICAgIC8vIENvcnJlc3BvbmRpbmcgYnVmZmVyIGhhcyBiZWVuIGNsZWFyZWQuIE5vIG5lZWQgdG8gcHVzaCBpbnRvIG1GcmFtZUxpc3QKKyAgICBpZiAodGltZXN0YW1wIDw9IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wKSByZXR1cm47CisKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKKyAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUgbUZyYW1lTGlzdERlcHRoOwogfQogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjp1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKSB7CkBAIC0xMzUsNyArMTg0LDcgQEAKICAgICAgICAgLy8gTm90ZSB0aGF0IGZvcm1hdCBzcGVjaWZpZWQgaW50ZXJuYWxseSBpbiBDYW1lcmEzWnNsU3RyZWFtCiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlWnNsU3RyZWFtKAogICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAga1pzbEJ1ZmZlckRlcHRoLAorICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZURlcHRoLAogICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgJm1ac2xTdHJlYW0pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0xNDQsMTAgKzE5MywxNSBAQAogICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICAvLyBPbmx5IGFkZCB0aGUgY2FtZXJhMyBidWZmZXIgbGlzdGVuZXIgd2hlbiB0aGUgc3RyZWFtIGlzIGNyZWF0ZWQuCisgICAgICAgIG1ac2xTdHJlYW0tPmFkZEJ1ZmZlckxpc3RlbmVyKHRoaXMpOwogICAgIH0KKwogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkU3RhcnQsCiAgICAgICAgICAgICBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZCwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xOTAsNiArMjQ0LDQ2IEBACiAgICAgcmV0dXJuIG1ac2xTdHJlYW1JZDsKIH0KIAorc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6dXBkYXRlUmVxdWVzdFdpdGhEZWZhdWx0U3RpbGxSZXF1ZXN0KENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSBjb25zdCB7CisgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8Q2FtZXJhM0RldmljZT4gZGV2aWNlID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhM0RldmljZSo+KGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkuZ2V0KCkpOworICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRGV2aWNlIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgc3RpbGxUZW1wbGF0ZTsKKyAgICBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworCisgICAgLy8gRmluZCBzb21lIG9mIHRoZSBwb3N0LXByb2Nlc3NpbmcgdGFncywgYW5kIGFzc2lnbiB0aGUgdmFsdWUgZnJvbSB0ZW1wbGF0ZSB0byB0aGUgcmVxdWVzdC4KKyAgICAvLyBPbmx5IGNoZWNrIHRoZSBhYmVycmF0aW9uIG1vZGUgYW5kIG5vaXNlIHJlZHVjdGlvbiBtb2RlIGZvciBub3csIGFzIHRoZXkgYXJlIHZlcnkgaW1wb3J0YW50CisgICAgLy8gZm9yIGltYWdlIHF1YWxpdHkuCisgICAgdWludDMyX3QgcG9zdFByb2Nlc3NpbmdUYWdzW10gPSB7CisgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9UT05FTUFQX01PREUsCisgICAgICAgICAgICBBTkRST0lEX1NIQURJTkdfTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfSE9UX1BJWEVMX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0VER0VfTU9ERQorICAgIH07CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihwb3N0UHJvY2Vzc2luZ1RhZ3MpIC8gc2l6ZW9mKHVpbnQzMl90KTsgaSsrKSB7CisgICAgICAgIGVudHJ5ID0gc3RpbGxUZW1wbGF0ZS5maW5kKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3QudXBkYXRlKHBvc3RQcm9jZXNzaW5nVGFnc1tpXSwgZW50cnkuZGF0YS51OCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFpzbFByb2Nlc3NvcjM6OnB1c2hUb1JlcHJvY2VzcyhpbnQzMl90IHJlcXVlc3RJZCkgewogICAgIEFMT0dWKCIlczogU2VuZCBpbiByZXByb2Nlc3MgcmVxdWVzdCB3aXRoIGlkICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKQEAgLTI0OSwxOCArMzQzLDQ1IEBACiAgICAgICAgIHVpbnQ4X3QgcmVxdWVzdFR5cGUgPSBBTkRST0lEX1JFUVVFU1RfVFlQRV9SRVBST0NFU1M7CiAgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9UWVBFLAogICAgICAgICAgICAgICAgICZyZXF1ZXN0VHlwZSwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IHR5cGUiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgaW5wdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IG1ac2xTdHJlYW1JZCB9OwotICAgICAgICBpZiAocmVzID09IE9LKSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywKKyAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1zLCAxKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3QgaW5wdXQgc3RyZWFtcyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCBjYXB0dXJlSW50ZW50ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSk7CisgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwKKyAgICAgICAgICAgICAgICAmY2FwdHVyZUludGVudCwgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCBjYXB0dXJlIGludGVudCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHdlIGFsc28gdXBkYXRlIHRoZSBsYXRlc3QgcHJldmlldyBmcmFtZT8KICAgICAgICAgaW50MzJfdCBvdXRwdXRTdHJlYW1zWzFdID0KICAgICAgICAgICAgICAgICB7IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCkgfTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAorICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtcywgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IG91dHB1dCBzdHJlYW1zIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAgICAgJnJlcXVlc3RJZCwgMSk7Ci0KICAgICAgICAgaWYgKHJlcyAhPSBPSyApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSBmcmFtZSB0byBhIHJlcHJvY2VzcyByZXF1ZXN0IiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CkBAIC0yODgsNiArNDA5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBVcGRhdGUgcG9zdC1wcm9jZXNzaW5nIHNldHRpbmdzCisgICAgICAgIHJlcyA9IHVwZGF0ZVJlcXVlc3RXaXRoRGVmYXVsdFN0aWxsUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gdXBkYXRlIHBvc3QtcHJvY2Vzc2luZyB0YWdzLCB0aGUgcmVwcm9jZXNzZWQgaW1hZ2UgcXVhbGl0eSAiCisgICAgICAgICAgICAgICAgICAgICJtYXkgYmUgY29tcHJvbWlzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKICAgICAgICAgbUxhdGVzdENhcHR1cmVkUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgIHJlcyA9IGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCktPmNhcHR1cmUocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CkBAIC0zMTIsMTEgKzQ0MCwxOSBAQAogCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjpjbGVhclpzbFF1ZXVlTG9ja2VkKCkgewogICAgIGlmIChtWnNsU3RyZWFtICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1ac2xTdHJlYW0tPmNsZWFySW5wdXRSaW5nQnVmZmVyKCk7CisgICAgICAgIC8vIGNsZWFyIHJlc3VsdCBtZXRhZGF0YSBsaXN0IGZpcnN0LgorICAgICAgICBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisgICAgICAgIHJldHVybiBtWnNsU3RyZWFtLT5jbGVhcklucHV0UmluZ0J1ZmZlcigmbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgWnNsUHJvY2Vzc29yMzo6Y2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpIHsKKyAgICBtRnJhbWVMaXN0LmNsZWFyKCk7CisgICAgbUZyYW1lTGlzdEhlYWQgPSAwOworICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKK30KKwogdm9pZCBac2xQcm9jZXNzb3IzOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgaWYgKCFtTGF0ZXN0Q2FwdHVyZWRSZXF1ZXN0LmlzRW1wdHkoKSkgewpAQCAtMzY4LDYgKzUwNCwyMyBAQAogICAgIH0KIH0KIAorYm9vbCBac2xQcm9jZXNzb3IzOjppc0ZpeGVkRm9jdXNNb2RlKHVpbnQ4X3QgYWZNb2RlKSBjb25zdCB7CisgICAgc3dpdGNoIChhZk1vZGUpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9BVVRPOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfVklERU86CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQ09OVElOVU9VU19QSUNUVVJFOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX01BQ1JPOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOgorICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0VET0Y6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogdW5rbm93biBmb2N1cyBtb2RlICVkIiwgX19GVU5DVElPTl9fLCBhZk1vZGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwogbnNlY3NfdCBac2xQcm9jZXNzb3IzOjpnZXRDYW5kaWRhdGVUaW1lc3RhbXBMb2NrZWQoc2l6ZV90KiBtZXRhZGF0YUlkeCkgY29uc3QgewogICAgIC8qKgogICAgICAqIEZpbmQgdGhlIHNtYWxsZXN0IHRpbWVzdGFtcCB3ZSBrbm93IGFib3V0IHNvIGZhcgpAQCAtNDEzLDYgKzU2NiwzOCBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX01PREUpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGZyYW1lIGhhcyBubyBBRiBtb2RlIGZpZWxkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZNb2RlID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgICAgICAgICBpZiAoYWZNb2RlID09IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRikgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCB0aGUgWlNMIGJ1ZmZlciBmb3IgbWFudWFsIEFGIG1vZGUsIGFzIHdlIGRvbid0IHJlYWxseQorICAgICAgICAgICAgICAgICAgICAvLyBrbm93IHRoZSBhZiBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgQUYgc3RhdGUgaWYgZGV2aWNlIGhhcyBmb2N1c2VyIGFuZCBmb2N1cyBtb2RlIGlzbid0IGZpeGVkCisgICAgICAgICAgICAgICAgaWYgKG1IYXNGb2N1c2VyICYmICFpc0ZpeGVkRm9jdXNNb2RlKGFmTW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYW5kaWRhdGUgZnJhbWUgaGFzIGdvb2QgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgaGFzIG5vIEFGIHN0YXRlIGZpZWxkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFmU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgICAgICBpZiAoYWZTdGF0ZSAhPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfUEFTU0lWRV9GT0NVU0VEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZTdGF0ZSAhPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfRk9DVVNFRF9MT0NLRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGZyYW1lIEFGIHN0YXRlIGlzICVkIGlzIG5vdCBnb29kIGZvciBjYXB0dXJlLCBza2lwIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhZlN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbWluVGltZXN0YW1wID0gZnJhbWVUaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgaWR4ID0gajsKICAgICAgICAgICAgIH0KQEAgLTQ1MywxMyArNjM4LDE1IEBACiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yMzo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCiAgICAgLy8gaWdub3JlIG91dHB1dCBidWZmZXJzCiAgICAgaWYgKGJ1ZmZlckluZm8ubU91dHB1dCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gTG9jayBtdXRleCBvbmx5IG9uY2Ugd2Uga25vdyB0aGlzIGlzIGFuIGlucHV0IGJ1ZmZlciByZXR1cm5lZCB0byBhdm9pZAorICAgIC8vIHBvdGVudGlhbCBkZWFkbG9jaworICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKICAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCB0aGUgYnVmZmVyIGlzIGluIG91ciBxdWV1ZSBieSBsb29raW5nIGF0IHRpbWVzdGFtcAogICAgIC8vIHRoZW9yZXRpY2FsbHkgdW5uZWNlc3NhcnkgdW5sZXNzIHdlIGNoYW5nZSB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogICAgIC8vIC0tIG9ubHkgMSBidWZmZXIgcmVwcm9jZXNzZWQgYXQgYSB0aW1lICh3aGljaCBpcyB0aGUgY2FzZSBub3cpCkBAIC00NzAsMTEgKzY1NywxNyBAQAogICAgIC8vIFdlIG5lZWQgdG8gZ3VhcmFudGVlIHRoYXQgaWYgd2UgZG8gdHdvIGJhY2stdG8tYmFjayBjYXB0dXJlcywKICAgICAvLyB0aGUgc2Vjb25kIHdvbid0IHVzZSBhIGJ1ZmZlciB0aGF0J3Mgb2xkZXIvdGhlIHNhbWUgYXMgdGhlIGZpcnN0LCB3aGljaAogICAgIC8vIGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgaWYgd2UgZG9uJ3QgY2xlYXIgb3V0IHRoZSBxdWV1ZSBhbmQgdGhlCi0gICAgLy8gc2VsZWN0aW9uIGNyaXRlcmlhIGlzIHNvbWV0aGluZyBsaWtlICduZXdlc3QnLiBDbGVhcmluZyBvdXQgdGhlIHF1ZXVlCi0gICAgLy8gb24gYSBjb21wbGV0ZWQgY2FwdHVyZSBlbnN1cmVzIHdlJ2xsIG9ubHkgdXNlIG5ldyBkYXRhLgorICAgIC8vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyBzb21ldGhpbmcgbGlrZSAnbmV3ZXN0Jy4gQ2xlYXJpbmcgb3V0IHRoZSByZXN1bHQKKyAgICAvLyBtZXRhZGF0YSBxdWV1ZSBvbiBhIGNvbXBsZXRlZCBjYXB0dXJlIGVuc3VyZXMgd2UnbGwgb25seSB1c2UgbmV3IHRpbWVzdGFtcC4KKyAgICAvLyBDYWxsaW5nIGNsZWFyWnNsUXVldWVMb2NrZWQgaXMgYSBndWFyYW50ZWVkIGRlYWRsb2NrIGJlY2F1c2UgdGhpcyBjYWxsYmFjaworICAgIC8vIGhvbGRzIHRoZSBDYW1lcmEzU3RyZWFtIGludGVybmFsIGxvY2sgKG1Mb2NrKSwgYW5kIGNsZWFyWnNsUXVldWVMb2NrZWQgcmVxdWlyZXMKKyAgICAvLyB0byBob2xkIHRoZSBzYW1lIGxvY2suCisgICAgLy8gVE9ETzogbmVlZCBmaWd1cmUgb3V0IGEgd2F5IHRvIGNsZWFyIHRoZSBac2wgYnVmZmVyIHF1ZXVlIHByb3Blcmx5LiBSaWdodCBub3cKKyAgICAvLyBpdCBpcyBzYWZlIG5vdCB0byBkbyBzbywgYXMgYmFjayB0byBiYWNrIFpTTCBjYXB0dXJlIHJlcXVpcmVzIHN0b3AgYW5kIHN0YXJ0CisgICAgLy8gcHJldmlldywgd2hpY2ggd2lsbCBmbHVzaCBaU0wgcXVldWUgYXV0b21hdGljYWxseS4KICAgICBBTE9HVigiJXM6IE1lbW9yeSBvcHRpbWl6YXRpb24sIGNsZWFyaW5nIFpTTCBxdWV1ZSIsCiAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICBjbGVhclpzbFF1ZXVlTG9ja2VkKCk7CisgICAgY2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpOwogCiAgICAgLy8gUmVxdWlyZWQgc28gd2UgYWNjZXB0IG1vcmUgWlNMIHJlcXVlc3RzCiAgICAgbVN0YXRlID0gUlVOTklORzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCmluZGV4IGQyZjgzMjIuLmZjOWY3MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaApAQCAtNTAsOCArNTAsOCBAQAogICAgIFpzbFByb2Nlc3NvcjMoc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5ac2xQcm9jZXNzb3IzKCk7CiAKLSAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSk7CisgICAgLy8gRnJvbSBGcmFtZVByb2Nlc3Nvcjo6RmlsdGVyZWRMaXN0ZW5lcgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCiAgICAgLyoqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgyLDYgKzgyLDcgQEAKIAogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBuc2Vjc190IG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wOwogCiAgICAgZW51bSB7CiAgICAgICAgIFJVTk5JTkcsCkBAIC0xMDcsOCArMTA4LDkgQEAKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1pzbEJ1ZmZlckRlcHRoID0gNDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZUxpc3REZXB0aCA9IGtac2xCdWZmZXJEZXB0aCAqIDI7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoID0gNDsKKyAgICBzaXplX3QgbUJ1ZmZlclF1ZXVlRGVwdGg7CisgICAgc2l6ZV90IG1GcmFtZUxpc3REZXB0aDsKICAgICBWZWN0b3I8Q2FtZXJhTWV0YWRhdGE+IG1GcmFtZUxpc3Q7CiAgICAgc2l6ZV90IG1GcmFtZUxpc3RIZWFkOwogCkBAIC0xMjAsMTMgKzEyMiwyMiBAQAogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhdGVzdENhcHR1cmVkUmVxdWVzdDsKIAorICAgIGJvb2wgbUhhc0ZvY3VzZXI7CisKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgY2xlYXJac2xRdWV1ZUxvY2tlZCgpOwogCisgICAgdm9pZCBjbGVhclpzbFJlc3VsdFF1ZXVlTG9ja2VkKCk7CisKICAgICB2b2lkIGR1bXBac2xRdWV1ZShpbnQgaWQpIGNvbnN0OwogCiAgICAgbnNlY3NfdCBnZXRDYW5kaWRhdGVUaW1lc3RhbXBMb2NrZWQoc2l6ZV90KiBtZXRhZGF0YUlkeCkgY29uc3Q7CisKKyAgICBib29sIGlzRml4ZWRGb2N1c01vZGUodWludDhfdCBhZk1vZGUpIGNvbnN0OworCisgICAgLy8gVXBkYXRlIHRoZSBwb3N0LXByb2Nlc3NpbmcgbWV0YWRhdGEgd2l0aCB0aGUgZGVmYXVsdCBzdGlsbCBjYXB0dXJlIHJlcXVlc3QgdGVtcGxhdGUKKyAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0V2l0aERlZmF1bHRTdGlsbFJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBzZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcAppbmRleCAxM2NhYzZkLi45ZWZlYWJhCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMiB7CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK3N0YXR1c190IFpzbFByb2Nlc3NvckludGVyZmFjZTo6ZGlzY29ubmVjdCgpIHsKKyAgICByZXR1cm4gT0s7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK307IC8vbmFtZXNwYWNlIGNhbWVyYTIKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oCmluZGV4IDE4M2MwYzIuLjllMjY2ZTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CkBAIC0zNyw2ICszOSw5IEBACiAgICAgLy8gRGVsZXRlIHRoZSB1bmRlcmx5aW5nIENhbWVyYURldmljZSBzdHJlYW1zCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKSA9IDA7CiAKKyAgICAvLyBDbGVhciBhbnkgYWRkaXRpb25hbCBzdGF0ZSBuZWNlc3NhcnkgYmVmb3JlIHRoZSBDYW1lcmFEZXZpY2UgaXMgZGlzY29ubmVjdGVkCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CisKICAgICAvKioKICAgICAgKiBTdWJtaXRzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdCAoaWQgPSByZXF1ZXN0SWQpCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCAxNDJkYTllLi5lMzMwMWFhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xNiwxMyArMTYsMTQgQEAKIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFEZXZpY2VDbGllbnQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgpAQCAtODIsNyArODMsNyBAQAogICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUFYX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnF1aXJrU2VuZFBhcnRpYWxzKi90cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTEsNzkgKzkyLDEwMSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgeworICAgIExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3Q7CisgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgc3RyZWFtaW5nLCBsYXN0RnJhbWVOdW1iZXIpOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzLXN0YXJ0IG9mIGZ1bmN0aW9uLiBSZXF1ZXN0IGxpc3Qgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RzLnNpemUoKSk7CiAKICAgICBzdGF0dXNfdCByZXM7Ci0KICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAotICAgIGlmIChyZXF1ZXN0ID09IDApIHsKKyAgICBpZiAocmVxdWVzdHMuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBudWxsIHJlcXVlc3QuIFJlamVjdGluZyByZXF1ZXN0LiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0LT5tTWV0YWRhdGEpOworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhUmVxdWVzdExpc3Q7CisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcjsKKyAgICB1aW50MzJfdCBsb29wQ291bnRlciA9IDA7CiAKLSAgICBpZiAobWV0YWRhdGEuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKLSAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogUmVxdWVzdHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdXJmYWNlIHRhcmdldC4gIgotICAgICAgICAgICAgICAiUmVqZWN0aW5nIHJlcXVlc3QuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhtZXRhZGF0YSkpIHsKLSAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGluIHRoZSBvdXRwdXQgc3RyZWFtIElEcyB3aGljaCB3ZSBjYWxjdWxhdGUgZnJvbQotICAgICAqIHRoZSBjYXB0dXJlIHJlcXVlc3QncyBsaXN0IG9mIHN1cmZhY2UgdGFyZ2V0cwotICAgICAqLwotICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgb3V0cHV0U3RyZWFtSWRzLnNldENhcGFjaXR5KHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSByZXF1ZXN0LT5tU3VyZmFjZUxpc3RbaV07Ci0KLSAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7Ci0KLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGdicC0+YXNCaW5kZXIoKSk7Ci0KLSAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCi0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCi0gICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgbnVsbCByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW1JZCk7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCB0byByZXF1ZXN0IiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC0+bU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bVN1cmZhY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFJlcXVlc3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VyZmFjZSB0YXJnZXQuICIKKyAgICAgICAgICAgICAgICAgICJSZWplY3RpbmcgcmVxdWVzdC4iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFlbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKG1ldGFkYXRhKSkgeworICAgICAgICAgICAgLy8gQ2FsbGVlIGxvZ3MKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBJRHMgd2hpY2ggd2UgY2FsY3VsYXRlIGZyb20KKyAgICAgICAgICogdGhlIGNhcHR1cmUgcmVxdWVzdCdzIGxpc3Qgb2Ygc3VyZmFjZSB0YXJnZXRzCisgICAgICAgICAqLworICAgICAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2V0Q2FwYWNpdHkocmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bVN1cmZhY2VMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gcmVxdWVzdC0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICAgICAgaWYgKHN1cmZhY2UgPT0gMCkgY29udGludWU7CisKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoZ2JwLT5hc0JpbmRlcigpKTsKKworICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIHN1Ym1pdCByZXF1ZXN0IHdpdGggc3VyZmFjZSB0aGF0IHdhc24ndCBjcmVhdGVkCisgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFRyaWVkIHRvIHN1Ym1pdCBhIHJlcXVlc3Qgd2l0aCBhIHN1cmZhY2UgdGhhdCIKKyAgICAgICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtSWQpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHRvIHJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAvKnNpemUqLzEpOworICAgICAgICBsb29wQ291bnRlcisrOyAvLyBsb29wQ291bnRlciBzdGFydHMgZnJvbSAxCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZXF1ZXN0IHdpdGggSUQgJWQgKCVkIG9mICV6dSkiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVxdWVzdElkLCBsb29wQ291bnRlciwgcmVxdWVzdHMuc2l6ZSgpKTsKKworICAgICAgICBtZXRhZGF0YVJlcXVlc3RMaXN0LnB1c2hfYmFjayhtZXRhZGF0YSk7CiAgICAgfQotCi0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywgJm91dHB1dFN0cmVhbUlkc1swXSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7Ci0KLSAgICBpbnQzMl90IHJlcXVlc3RJZCA9IG1SZXF1ZXN0SWRDb3VudGVyKys7Ci0gICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgLypzaXplKi8xKTsKLSAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VibWl0dGluZyByZXF1ZXN0IHdpdGggSUQgJWQiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXF1ZXN0SWQpOworICAgIG1SZXF1ZXN0SWRDb3VudGVyKys7CiAKICAgICBpZiAoc3RyZWFtaW5nKSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3QobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogIEdvdCBlcnJvciAlZCBhZnRlciB0cnlpbmcgdG8gc2V0IHN0cmVhbWluZyAiCiAgICAgICAgICAgICAgICAgICAicmVxdWVzdCIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCByZXMpOwpAQCAtMTcxLDExICsxOTQsMTIgQEAKICAgICAgICAgICAgIG1TdHJlYW1pbmdSZXF1ZXN0TGlzdC5wdXNoX2JhY2socmVxdWVzdElkKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG1EZXZpY2UtPmNhcHR1cmUobWV0YWRhdGEpOworICAgICAgICByZXMgPSBtRGV2aWNlLT5jYXB0dXJlTGlzdChtZXRhZGF0YVJlcXVlc3RMaXN0LCBsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogR290IGVycm9yICVkIGFmdGVyIHRyeWluZyB0byBzZXQgY2FwdHVyZSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKICAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IHJlcXVlc3RJZCA9ICVkICIsIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkKTsKICAgICB9CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRW5kIG9mIGZ1bmN0aW9uIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwpAQCAtMTg2LDcgKzIxMCw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcywgcmVxdWVzdElkID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CiAKQEAgLTIxMiw3ICsyMzYsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHJlcyA9IG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdChsYXN0RnJhbWVOdW1iZXIpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGNsZWFyZWQgc3RyZWFtaW5nIHJlcXVlc3QiLApAQCAtMjIzLDYgKzI0NywyNiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMuCisgICAgQUxPR0UoIiVzOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZSgpIHsKKyAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCV6dSBzdHJlYW1zKSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1TdHJlYW1NYXAuc2l6ZSgpKTsKKworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKKworICAgIHJldHVybiBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKCk7Cit9CisKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIChzdHJlYW1JZCA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC0yNTksOCArMzAzLDYgQEAKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCi0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdWNjZXNzZnVsbHkgZGVsZXRlZCBzdHJlYW0gSUQgKCVkKSIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKQEAgLTI3Nyw2ICszMTksMTAgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAorICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXIgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCiAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCkBAIC0zNDYsMjMgKzM5Miw3IEBACiAgICAgLy8gYWZ0ZXIgZWFjaCBjYWxsLCBidXQgb25seSBvbmNlIHdlIGFyZSBkb25lIHdpdGggYWxsLgogCiAgICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKLSAgICAgICAgLy8gSlBFRyBidWZmZXJzIG5lZWQgdG8gYmUgc2l6ZWQgZm9yIG1heGltdW0gcG9zc2libGUgY29tcHJlc3NlZCBzaXplCi0gICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIEpQRUcgc2l6ZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICJzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbWF4SnBlZ1NpemUgPSBlbnRyeS5kYXRhLmkzMlswXTsKLSAgICAgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtYXhKcGVnU2l6ZSwKLSAgICAgICAgICAgICAgICAmc3RyZWFtSWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsbCBvdGhlciBzdHJlYW1zIGFyZSBhIGtub3duIHNpemUKLSAgICAgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAvKnNpemUqLzAsCi0gICAgICAgICAgICAgICAgJnN0cmVhbUlkKTsKLSAgICB9CisgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAmc3RyZWFtSWQpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLmFkZChidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSwgc3RyZWFtSWQpOwpAQCAtNDY1LDcgKzQ5NSw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Zmx1c2goaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC00NzYsMzAgKzUwNiw0MyBAQAogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKLSAgICByZXR1cm4gbURldmljZS0+Zmx1c2goKTsKKyAgICBtU3RyZWFtaW5nUmVxdWVzdExpc3QuY2xlYXIoKTsKKyAgICByZXR1cm4gbURldmljZS0+Zmx1c2gobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYURldmljZUNsaWVudFslZF0gKCVwKSBQSUQ6ICVkLCBkdW1wOlxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmFEZXZpY2VDbGllbnRbJWRdICglcCkgZHVtcDpcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAotICAgICAgICAgICAgbUNsaWVudFBpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTogIik7CisgICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEN1cnJlbnQgY2xpZW50OiAlcyAoUElEICVkLCBVSUQgJXUpXG4iLAorICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAorICAgICAgICAgICAgbUNsaWVudFBpZCwgbUNsaWVudFVpZCk7CiAKKyAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIFJlcXVlc3QgSUQgY291bnRlcjogJWRcbiIsIG1SZXF1ZXN0SWRDb3VudGVyKTsKKyAgICBpZiAoIW1TdHJlYW1NYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDdXJyZW50IHN0cmVhbSBJRHM6XG4iKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgICBTdHJlYW0gJWRcbiIsIG1TdHJlYW1NYXAudmFsdWVBdChpKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgTm8gc3RyZWFtcyBjb25maWd1cmVkLlxuIik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKICAgICBtRnJhbWVQcm9jZXNzb3ItPmR1bXAoZmQsIGFyZ3MpOwogCiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCi0KLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KIApAQCAtNTEyLDEyICs1NTUsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKICAgICBpZiAocmVtb3RlQ2IgIT0gMCkgewotICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CiB9CiAKQEAgLTU1MiwxNiArNTk1LDE0IEBACiB9CiAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIENhbWVyYURldmljZUNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgLy8gVGhyZWFkLXNhZmUuIE5vIGxvY2sgbmVjZXNzYXJ5LgogICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gbVJlbW90ZUNhbGxiYWNrOwogICAgIGlmIChyZW1vdGVDYiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCIlczogZnJhbWUgPSAlcCAiLCBfX0ZVTkNUSU9OX18sICZmcmFtZSk7Ci0gICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgZnJhbWUpOworICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQogCkBAIC02MjAsNjEgKzY2MSw4IEBACiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmdldFJvdGF0aW9uVHJhbnNmb3JtTG9ja2VkKGludDMyX3QqIHRyYW5zZm9ybSkgewogICAgIEFMT0dWKCIlczogYmVnaW4iLCBfX0ZVTkNUSU9OX18pOwogCi0gICAgaWYgKHRyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogbnVsbCB0cmFuc2Zvcm0iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgICp0cmFuc2Zvcm0gPSAwOwotCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfT1JJRU5UQVRJT04pOwotICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluICIKLSAgICAgICAgICAgICAgICAic3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGludDMyX3QmIGZsYWdzID0gKnRyYW5zZm9ybTsKLQotICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOwotICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzE4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzI3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhBTCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiB2YWx1ZTogJWQiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYWdpYyBmbGFnIG1ha2VzIHN1cmZhY2VmbGluZ2VyIHVuLXJvdGF0ZSB0aGUgYnVmZmVycwotICAgICAqIHRvIGNvdW50ZXIgdGhlIGV4dHJhIGdsb2JhbCBkZXZpY2UgVUkgcm90YXRpb24gd2hlbmV2ZXIgdGhlIHVzZXIKLSAgICAgKiBwaHlzaWNhbGx5IHJvdGF0ZXMgdGhlIGRldmljZS4KLSAgICAgKgotICAgICAqIEJ5IGRvaW5nIHRoaXMsIHRoZSBjYW1lcmEgYnVmZmVyIGFsd2F5cyBlbmRzIHVwIGFsaWduZWQKLSAgICAgKiB3aXRoIHRoZSBwaHlzaWNhbCBjYW1lcmEgZm9yIGEgInNlZSB0aHJvdWdoIiBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBJbiBlc3NlbmNlLCB0aGUgYnVmZmVyIG9ubHkgZ2V0cyByb3RhdGVkIGR1cmluZyBwcmV2aWV3IHVzZS1jYXNlcy4KLSAgICAgKiBUaGUgdXNlciBpcyBzdGlsbCByZXNwb25zaWJsZSB0byByZS1jcmVhdGUgc3RyZWFtcyBvZiB0aGUgcHJvcGVyCi0gICAgICogYXNwZWN0IHJhdGlvLCBvciB0aGUgcHJldmlldyB3aWxsIGVuZCB1cCBsb29raW5nIG5vbi11bmlmb3JtbHkKLSAgICAgKiBzdHJldGNoZWQuCi0gICAgICovCi0gICAgZmxhZ3MgfD0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSU5WRVJTRV9ESVNQTEFZOwotCi0gICAgQUxPR1YoIiVzOiBmaW5hbCB0cmFuc2Zvcm0gPSAweCV4IiwgX19GVU5DVElPTl9fLCBmbGFncyk7Ci0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShzdGF0aWNJbmZvLCB0cmFuc2Zvcm0pOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBiOWMxNmFhLi45OTgxZGZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTYzLDkgKzYzLDIyIEBACiAgICAgICovCiAKICAgICAvLyBOb3RlIHRoYXQgdGhlIGNhbGxlZSBnZXRzIGEgY29weSBvZiB0aGUgbWV0YWRhdGEuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICAvLyBMaXN0IG9mIHJlcXVlc3RzIGFyZSBjb3BpZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKCk7CiAKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CkBAIC04OSw3ICsxMDIsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICB3YWl0VW50aWxJZGxlKCk7CiAKICAgICAvLyBGbHVzaCBhbGwgYWN0aXZlIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGFzIGZhc3QgYXMgcG9zc2libGUKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZmx1c2goLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKQEAgLTExNCwxNiArMTI4LDE2IEBACiAgICAgICovCiAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpOwotICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcigpOwotICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGluZGVwZW5kZW50IGNvbXBvbmVudHMgb2YgQ2FtZXJhRGV2aWNlQ2xpZW50LgogICAgICAqLwogcHJvdGVjdGVkOgogICAgIC8qKiBGaWx0ZXJlZExpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqLwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwogCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBBTmF0aXZlV2luZG93IHRyYW5zZm9ybSBmcm9tIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCAxYTdhN2E3Li4yZWE0NjBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcik7CiAgICAgfQogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZVN0cmVhbSh3aW5kb3csIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgLypzaXplKi8xLAorICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVTdHJlYW0od2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7CiB9CiAKQEAgLTMzNiwxMSArMzM2LDExIEBACiAgICAgICAgICAgICBtQ2FtZXJhSWQsCiAgICAgICAgICAgICBnZXRSZW1vdGVDYWxsYmFjaygpLT5hc0JpbmRlcigpLmdldCgpLAogICAgICAgICAgICAgbUNsaWVudFBpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTogIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgLy8gVE9ETzogcHJpbnQgZHluYW1pYy9yZXF1ZXN0IHNlY3Rpb24gZnJvbSBtb3N0IHJlY2VudCByZXF1ZXN0cwogICAgIG1GcmFtZVByb2Nlc3Nvci0+ZHVtcChmZCwgYXJncyk7Ci0KICAgICByZXR1cm4gZHVtcERldmljZShmZCwgYXJncyk7CiB9CiAKQEAgLTM3Myw5ICszNzMsNyBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlOjpkZXRhY2hEZXZpY2UoKTsKIH0KIAotLyoqIERldmljZS1yZWxhdGVkIG1ldGhvZHMgKi8KLXZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpIHsKK3ZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0zODMsMTMgKzM4MSwxMiBAQAogICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwogCiAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcChmcmFtZSk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHRtcChyZXN1bHQubU1ldGFkYXRhKTsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG1ldGEgPSB0bXAucmVsZWFzZSgpOwogICAgICAgICBBTE9HVigiJXM6IG1ldGEgPSAlcCAiLCBfX0ZVTkNUSU9OX18sIG1ldGEpOwotICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uUmVzdWx0UmVjZWl2ZWQocmVxdWVzdElkLCBtZXRhKTsKKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbWV0YSk7CiAgICAgICAgIHRtcC5hY3F1aXJlKG1ldGEpOwogICAgIH0KLQogfQogCiBib29sIFByb0NhbWVyYTJDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDhhMGY1NDcuLjlkODMxMjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgogI2luY2x1ZGUgImRldmljZTIvQ2FtZXJhMkRldmljZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTcsOCArOTgsOCBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgLyoqIEZpbHRlcmVkTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKiovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCYgcmVzdWx0KTsKKwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IDZhODhjODcuLmQ2ZGIxNTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtNTQsMTAgKzU0LDEzIEBACiAgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgVENsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKLSAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjaykKKyAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCisgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oY2FtZXJhSWQpKQogewotICAgIEFMT0dJKCJDYW1lcmEgJWQ6IE9wZW5lZCIsIGNhbWVyYUlkKTsKKyAgICBBTE9HSSgiQ2FtZXJhICVkOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAorICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwogICAgIG1EZXZpY2UgPSBDYW1lcmFEZXZpY2VGYWN0b3J5OjpjcmVhdGVEZXZpY2UoY2FtZXJhSWQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSA9PSAwLCAiRGV2aWNlIHNob3VsZCBuZXZlciBiZSBOVUxMIGhlcmUuIik7CiB9CkBAIC0xMTEsMTEgKzExNCwxMiBAQAogCiAgICAgVENsaWVudEJhc2U6Om1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgVENsaWVudEJhc2U6OmZpbmlzaENhbWVyYU9wcygpOwotCiAgICAgZGlzY29ubmVjdCgpOwogCi0gICAgQUxPR0koIkNsb3NlZCBDYW1lcmEgJWQiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkKTsKKyAgICBBTE9HSSgiQ2xvc2VkIENhbWVyYSAlZC4gQ2xpZW50IHdhczogJXMgKFBJRCAlZCwgVUlEICV1KSIsCisgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkLAorICAgICAgICAgICAgU3RyaW5nOChUQ2xpZW50QmFzZTo6bUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIG1Jbml0aWFsQ2xpZW50UGlkLCBUQ2xpZW50QmFzZTo6bUNsaWVudFVpZCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTIyMSwxMCArMjI1LDExIEBACiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzIpIHsKLSAgICBBTE9HRSgiRXJyb3IgY29uZGl0aW9uICVkIHJlcG9ydGVkIGJ5IEhBTCwgYXJndW1lbnRzICVkLCAlZCIsIGVycm9yQ29kZSwKLSAgICAgICAgICBhcmcxLCBhcmcyKTsKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlFcnJvcigKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQUxPR0UoIkVycm9yIGNvbmRpdGlvbiAlZCByZXBvcnRlZCBieSBIQUwsIHJlcXVlc3RJZCAlIiBQUklkMzIsIGVycm9yQ29kZSwKKyAgICAgICAgICByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjMzLDEzICsyMzgsMTMgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotdm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKK3ZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7Ci0gICAgKHZvaWQpcmVxdWVzdElkOworICAgICh2b2lkKXJlc3VsdEV4dHJhczsKICAgICAodm9pZCl0aW1lc3RhbXA7CiAKLSAgICBBTE9HVigiJXM6IFNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZXF1ZXN0IGlkICVkIGF0IHRpbWUgJSIgUFJJZDY0LAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CisgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjc5LDYgKzI4NCwxMSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CitpbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlKCkgewogICAgIHJldHVybiBtRGV2aWNlOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCA2MWU0NGYwLi5kMTk4ZTRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTJDTElFTlRfQkFTRV9ICiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjEsOSArNjIsMTEgQEAKICAgICAgKiBDYW1lcmFEZXZpY2VCYXNlOjpOb3RpZmljYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgICAqLwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMik7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UodWludDhfdCBuZXdTdGF0ZSwKQEAgLTczLDYgKzc2LDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhSWQoKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhRGV2aWNlKCk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZVZlcnNpb24oKSBjb25zdDsKICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhU2VydmljZSgpOwogCkBAIC0xMDMsNiArMTA3LDkgQEAKIAogcHJvdGVjdGVkOgogCisgICAgLy8gVGhlIFBJRCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IgY2FsbAorICAgIHBpZF90IG1Jbml0aWFsQ2xpZW50UGlkOworCiAgICAgdmlydHVhbCBzcDxJQmluZGVyPiBhc0JpbmRlcldyYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcigpOwogICAgIH0KQEAgLTExOSw2ICsxMjYsNyBAQAogCiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMisgZW50cnkgKi8KIAorICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCmluZGV4IGU4MGFiZjEuLmQyNmUyMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaApAQCAtMjIsOSArMjIsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEyLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDQsNyArNDgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBUaGUgZGV2aWNlJ3Mgc3RhdGljIGNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSBidWZmZXIKQEAgLTU0LDE5ICs1OCwzNyBAQAogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBjYXB0dXJlLiBUaGUgQ2FtZXJhRGV2aWNlIHRha2VzIG93bmVyc2hpcCBvZiB0aGUKICAgICAgKiBwYXNzZWQtaW4gYnVmZmVyLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGZyYW1lIG51bWJlciBvZiB0aGlzIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBsaXN0IG9mIHJlcXVlc3RzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogU3VibWl0IHJlcXVlc3QgZm9yIHN0cmVhbWluZy4gVGhlIENhbWVyYURldmljZSBtYWtlcyBhIGNvcHkgb2YgdGhlCiAgICAgICogcGFzc2VkLWluIGJ1ZmZlciBhbmQgdGhlIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcC4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYSBsaXN0IG9mIHJlcXVlc3RzIGZvciBzdHJlYW1pbmcuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ2xlYXIgdGhlIHN0cmVhbWluZyByZXF1ZXN0IHNsb3QuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIFdhaXQgdW50aWwgYSByZXF1ZXN0IHdpdGggdGhlIGdpdmVuIElEIGhhcyBiZWVuIGRlcXVldWVkIGJ5IHRoZQpAQCAtODcsOCArMTA5LDcgQEAKICAgICAgKiBvdGhlciBmb3JtYXRzLCB0aGUgc2l6ZSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50ICppZCkgPSAwOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGFuIGlucHV0IHJlcHJvY2VzcyBzdHJlYW0gdGhhdCB1c2VzIGJ1ZmZlcnMgZnJvbSBhbiBleGlzdGluZwpAQCAtMTIwLDYgKzE0MSwxOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCkgPSAwOwogCiAgICAgLyoqCisgICAgICogVGFrZSB0aGUgY3VycmVudGx5LWRlZmluZWQgc2V0IG9mIHN0cmVhbXMgYW5kIGNvbmZpZ3VyZSB0aGUgSEFMIHRvIHVzZQorICAgICAqIHRoZW0uIFRoaXMgaXMgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIChtYXkgYmUgc2V2ZXJhbCBodW5kZXJlZCBtcykuCisgICAgICoKKyAgICAgKiBUaGUgZGV2aWNlIG11c3QgYmUgaWRsZSAoc2VlIHdhaXRVbnRpbERyYWluZWQpIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSBvbiBlcnJvcjoKKyAgICAgKiAtIEJBRF9WQUxVRSBpZiB0aGUgc2V0IG9mIHN0cmVhbXMgd2FzIGludmFsaWQgKGUuZy4gZm10cyBvciBzaXplcykKKyAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpID0gMDsKKworICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB3aXRoIGZpZWxkcyB0aGF0IHRoZSBIQUwgZGV2aWNlIGJlbGlldmVzIGFyZQogICAgICAqIGJlc3QgZm9yIHRoZSBnaXZlbiB1c2UgY2FzZQogICAgICAqLwpAQCAtMTM0LDYgKzE2NywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCBKcGVnIGJ1ZmZlciBzaXplIGZvciBhIGdpdmVuIGpwZWcgcmVzb2x1dGlvbi4KKyAgICAgKiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yIGNvZGVzLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCA9IDA7CisKKyAgICAvKioKICAgICAgKiBBYnN0cmFjdCBjbGFzcyBmb3IgSEFMIG5vdGlmaWNhdGlvbiBsaXN0ZW5lcnMKICAgICAgKi8KICAgICBjbGFzcyBOb3RpZmljYXRpb25MaXN0ZW5lciB7CkBAIC0xNDIsMTEgKzE4MSwxMiBAQAogICAgICAgICAvLyBBUEkxIGFuZCBBUEkyLgogCiAgICAgICAgIC8vIFJlcXVpcmVkIGZvciBBUEkgMSBhbmQgMgotICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgaW50IGFyZzEsIGludCBhcmcyKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMgogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMQpAQCAtMTc5LDExICsyMTksMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRGb3JOZXh0RnJhbWUobnNlY3NfdCB0aW1lb3V0KSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBHZXQgbmV4dCBtZXRhZGF0YSBmcmFtZSBmcm9tIHRoZSBmcmFtZSBxdWV1ZS4gUmV0dXJucyBOVUxMIGlmIHRoZSBxdWV1ZQotICAgICAqIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIuCi0gICAgICogTWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgdG8gbW9zdCBtZXRob2RzLCBleGNlcHQgZm9yIHdhaXRGb3JOZXh0RnJhbWUKKyAgICAgKiBHZXQgbmV4dCBjYXB0dXJlIHJlc3VsdCBmcmFtZSBmcm9tIHRoZSByZXN1bHQgcXVldWUuIFJldHVybnMgTk9UX0VOT1VHSF9EQVRBCisgICAgICogaWYgdGhlIHF1ZXVlIGlzIGVtcHR5OyBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBtZXRhZGF0YSBidWZmZXIgaW5zaWRlCisgICAgICogdGhlIGNhcHR1cmUgcmVzdWx0IG9iamVjdCdzIG1ldGFkYXRhIGZpZWxkLgorICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpmcmFtZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVHJpZ2dlciBhdXRvLWZvY3VzLiBUaGUgbGF0ZXN0IElEIHVzZWQgaW4gYSB0cmlnZ2VyIGF1dG9mb2N1cyBvciBjYW5jZWwKQEAgLTIyNCw5ICsyNjUsMTQgQEAKICAgICAvKioKICAgICAgKiBGbHVzaCBhbGwgcGVuZGluZyBhbmQgaW4tZmxpZ2h0IHJlcXVlc3RzLiBCbG9ja3MgdW50aWwgZmx1c2ggaXMKICAgICAgKiBjb21wbGV0ZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgc3RyZWFtaW5nIHJlcXVlc3QuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgSEFMIGRldmljZSB2ZXJzaW9uLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpID0gMDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IDRkMzE2NjcuLjI5ZWI3OGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC0yOSw3ICsyOSwxNyBAQAogCiBGcmFtZVByb2Nlc3NvckJhc2U6OkZyYW1lUHJvY2Vzc29yQmFzZSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UpIDoKICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAotICAgIG1EZXZpY2UoZGV2aWNlKSB7CisgICAgbURldmljZShkZXZpY2UpLAorICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlICE9IDAgJiYKKyAgICAgICAgICAgIGNhbWVyYURldmljZS0+Z2V0RGV2aWNlVmVyc2lvbigpID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZyYW1lUHJvY2Vzc29yQmFzZTo6fkZyYW1lUHJvY2Vzc29yQmFzZSgpIHsKQEAgLTM3LDExICs0NywyMyBAQAogfQogCiBzdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnJlZ2lzdGVyTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwKLSAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgcXVpcmtTZW5kUGFydGlhbHMpIHsKKyAgICAgICAgaW50MzJfdCBtYXhJZCwgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsIGJvb2wgc2VuZFBhcnRpYWxzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOworICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj46Oml0ZXJhdG9yIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXRlbSAhPSBtUmFuZ2VMaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZW0tPm1pbklkID09IG1pbklkICYmCisgICAgICAgICAgICAgICAgaXRlbS0+bWF4SWQgPT0gbWF4SWQgJiYKKyAgICAgICAgICAgICAgICBpdGVtLT5saXN0ZW5lciA9PSBsaXN0ZW5lcikgeworICAgICAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkLCBqdXN0IHJldHVybgorICAgICAgICAgICAgQUxPR1YoIiVzOiBBdHRlbXB0IHRvIHJlZ2lzdGVyIHRoZSBzYW1lIGNsaWVudCB0d2ljZSwgaWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGl0ZW0rKzsKKyAgICB9CiAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyBsaXN0ZW5lciBmb3IgZnJhbWUgaWQgcmFuZ2UgJWQgLSAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1pbklkLCBtYXhJZCk7Ci0gICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHF1aXJrU2VuZFBhcnRpYWxzIH07CisgICAgUmFuZ2VMaXN0ZW5lciByTGlzdGVuZXIgPSB7IG1pbklkLCBtYXhJZCwgbGlzdGVuZXIsIHNlbmRQYXJ0aWFscyB9OwogICAgIG1SYW5nZUxpc3RlbmVycy5wdXNoX2JhY2sockxpc3RlbmVyKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC05OSwxNSArMTIxLDE3IEBACiB2b2lkIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWU7CisgICAgQ2FwdHVyZVJlc3VsdCByZXN1bHQ7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUHJvY2VzcyBuZXcgZnJhbWVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogCi0gICAgd2hpbGUgKCAocmVzID0gZGV2aWNlLT5nZXROZXh0RnJhbWUoJmZyYW1lKSkgPT0gT0spIHsKKyAgICB3aGlsZSAoIChyZXMgPSBkZXZpY2UtPmdldE5leHRSZXN1bHQoJnJlc3VsdCkpID09IE9LKSB7CiAKKyAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIGZyYW1lIG51bWJlciBmcm9tIG1ldGFkYXRhLCB3ZSBzaG91bGQgcmVhZAorICAgICAgICAvLyB0aGlzIGZyb20gcmVzdWx0Lm1SZXN1bHRFeHRyYXMgd2hlbiBDYW1lcmFEZXZpY2VCYXNlIGludGVyZmFjZSBpcyBmaXhlZC4KICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKLSAgICAgICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CisgICAgICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcmVhZGluZyBmcmFtZSBudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CkBAIC0xMTUsMTMgKzEzOSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIEFUUkFDRV9JTlQoImNhbTJfZnJhbWUiLCBlbnRyeS5kYXRhLmkzMlswXSk7CiAKLSAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUoZnJhbWUsIGRldmljZSkpIHsKKyAgICAgICAgaWYgKCFwcm9jZXNzU2luZ2xlRnJhbWUocmVzdWx0LCBkZXZpY2UpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZnJhbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwotICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKGZyYW1lKTsKKyAgICAgICAgICAgIG1MYXN0RnJhbWUuYWNxdWlyZShyZXN1bHQubU1ldGFkYXRhKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocmVzICE9IE5PVF9FTk9VR0hfREFUQSkgewpAQCAtMTMzLDMyICsxNTcsNDAgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKK2Jvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByb2Nlc3Mgc2luZ2xlIGZyYW1lIChpcyBlbXB0eT8gJWQpIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgZnJhbWUuaXNFbXB0eSgpKTsKLSAgICByZXR1cm4gcHJvY2Vzc0xpc3RlbmVycyhmcmFtZSwgZGV2aWNlKSA9PSBPSzsKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSwgcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpOworICAgIHJldHVybiBwcm9jZXNzTGlzdGVuZXJzKHJlc3VsdCwgZGV2aWNlKSA9PSBPSzsKIH0KIAotc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKK3N0YXR1c190IEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CiAKLSAgICAvLyBRdWlya3M6IERvbid0IGRlbGl2ZXIgcGFydGlhbCByZXN1bHRzIHRvIGxpc3RlbmVycyB0aGF0IGRvbid0IHdhbnQgdGhlbQotICAgIGJvb2wgcXVpcmtJc1BhcnRpYWwgPSBmYWxzZTsKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSAwICYmCi0gICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5vdCBmb3J3YXJkaW5nIHBhcnRpYWwgcmVzdWx0IHRvIGxpc3RlbmVycyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwotICAgICAgICBxdWlya0lzUGFydGlhbCA9IHRydWU7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcGFydGlhbC4KKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIGlmIChkZXZpY2UtPmdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAoZW50cnkuY291bnQgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPT0gQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFRoaXMgaXMgYSBwYXJ0aWFsIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lEKTsKKyAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGdldHRpbmcgcmVxdWVzdElEIGZyb20gQ2FtZXJhTWV0YWRhdGEsIHdlIHNob3VsZCBnZXQgaXQKKyAgICAvLyBmcm9tIENhcHR1cmVSZXN1bHRFeHRyYXMuIFRoaXMgd2lsbCByZXF1aXJlIGNoYW5naW5nIENhbWVyYTJEZXZpY2UuCisgICAgLy8gQ3VycmVudGx5IENhbWVyYTJEZXZpY2UgdXNlcyBNZXRhZGF0YVF1ZXVlIHRvIHN0b3JlIHJlc3VsdHMsIHdoaWNoIGRvZXMgbm90CisgICAgLy8gaW5jbHVkZSBDYXB0dXJlUmVzdWx0RXh0cmFzLgorICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CiAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgaWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGludDMyX3QgcmVxdWVzdElkID0gZW50cnkuZGF0YS5pMzJbMF07CkBAIC0xNjgsMTAgKzIwMCwxMCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAKICAgICAgICAgTGlzdDxSYW5nZUxpc3RlbmVyPjo6aXRlcmF0b3IgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5iZWdpbigpOworICAgICAgICAvLyBEb24ndCBkZWxpdmVyIHBhcnRpYWwgcmVzdWx0cyB0byBsaXN0ZW5lcnMgdGhhdCBkb24ndCB3YW50IHRoZW0KICAgICAgICAgd2hpbGUgKGl0ZW0gIT0gbVJhbmdlTGlzdGVuZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdElkID49IGl0ZW0tPm1pbklkICYmCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCA8IGl0ZW0tPm1heElkICYmCi0gICAgICAgICAgICAgICAgICAgICghcXVpcmtJc1BhcnRpYWwgfHwgaXRlbS0+cXVpcmtTZW5kUGFydGlhbHMpICkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA+PSBpdGVtLT5taW5JZCAmJiByZXF1ZXN0SWQgPCBpdGVtLT5tYXhJZCAmJgorICAgICAgICAgICAgICAgICAgICAoIWlzUGFydGlhbFJlc3VsdCB8fCBpdGVtLT5zZW5kUGFydGlhbHMpKSB7CiAgICAgICAgICAgICAgICAgc3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdGVtLT5saXN0ZW5lci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG1SYW5nZUxpc3RlbmVycy5lcmFzZShpdGVtKTsKQEAgLTE4MywxMCArMjE1LDEyIEBACiAgICAgICAgICAgICBpdGVtKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIkdvdCAlenUgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlenUiLCBsaXN0ZW5lcnMuc2l6ZSgpLCBtUmFuZ2VMaXN0ZW5lcnMuc2l6ZSgpKTsKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogR290ICV6dSByYW5nZSBsaXN0ZW5lcnMgb3V0IG9mICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBkZXZpY2UtPmdldElkKCksIGxpc3RlbmVycy5zaXplKCksIG1SYW5nZUxpc3RlbmVycy5zaXplKCkpOworCiAgICAgTGlzdDxzcDxGaWx0ZXJlZExpc3RlbmVyPiA+OjppdGVyYXRvciBpdGVtID0gbGlzdGVuZXJzLmJlZ2luKCk7CiAgICAgZm9yICg7IGl0ZW0gIT0gbGlzdGVuZXJzLmVuZCgpOyBpdGVtKyspIHsKLSAgICAgICAgKCppdGVtKS0+b25GcmFtZUF2YWlsYWJsZShyZXF1ZXN0SWQsIGZyYW1lKTsKKyAgICAgICAgKCppdGVtKS0+b25SZXN1bHRBdmFpbGFibGUocmVzdWx0KTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCmluZGV4IDg5YjYwOGEuLmE2MThkODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM5LDE2ICs0MCwxNiBAQAogICAgIHZpcnR1YWwgfkZyYW1lUHJvY2Vzc29yQmFzZSgpOwogCiAgICAgc3RydWN0IEZpbHRlcmVkTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UgewotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpID0gMDsKICAgICB9OwogCiAgICAgLy8gUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgYSByYW5nZSBvZiBJRHMgW21pbklkLCBtYXhJZCkuIE11bHRpcGxlIGxpc3RlbmVycwotICAgIC8vIGNhbiBiZSBsaXN0ZW5pbmcgdG8gdGhlIHNhbWUgcmFuZ2UuCi0gICAgLy8gUVVJUks6IHNlbmRQYXJ0aWFscyBjb250cm9scyB3aGV0aGVyIHBhcnRpYWwgcmVzdWx0cyB3aWxsIGJlIHNlbnQuCisgICAgLy8gY2FuIGJlIGxpc3RlbmluZyB0byB0aGUgc2FtZSByYW5nZS4gUmVnaXN0ZXJpbmcgdGhlIHNhbWUgbGlzdGVuZXIgd2l0aAorICAgIC8vIHRoZSBzYW1lIHJhbmdlIG9mIElEcyBoYXMgbm8gZWZmZWN0LgorICAgIC8vIHNlbmRQYXJ0aWFscyBjb250cm9scyB3aGV0aGVyIHBhcnRpYWwgcmVzdWx0cyB3aWxsIGJlIHNlbnQuCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHF1aXJrU2VuZFBhcnRpYWxzID0gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlbmRQYXJ0aWFscyA9IHRydWUpOwogICAgIHN0YXR1c190IHJlbW92ZUxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCkBAIC02NiwxNiArNjcsMTkgQEAKICAgICAgICAgaW50MzJfdCBtaW5JZDsKICAgICAgICAgaW50MzJfdCBtYXhJZDsKICAgICAgICAgd3A8RmlsdGVyZWRMaXN0ZW5lcj4gbGlzdGVuZXI7Ci0gICAgICAgIGJvb2wgcXVpcmtTZW5kUGFydGlhbHM7CisgICAgICAgIGJvb2wgc2VuZFBhcnRpYWxzOwogICAgIH07CiAgICAgTGlzdDxSYW5nZUxpc3RlbmVyPiBtUmFuZ2VMaXN0ZW5lcnM7CiAKKyAgICAvLyBOdW1iZXIgb2YgcGFydGlhbCByZXN1bHQgdGhlIEhBTCB3aWxsIHBvdGVudGlhbGx5IHNlbmQuCisgICAgaW50MzJfdCBtTnVtUGFydGlhbFJlc3VsdHM7CisKICAgICB2b2lkIHByb2Nlc3NOZXdGcmFtZXMoY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICB2aXJ0dWFsIGJvb2wgcHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCi0gICAgc3RhdHVzX3QgcHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgc3RhdHVzX3QgcHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAogICAgIENhbWVyYU1ldGFkYXRhIG1MYXN0RnJhbWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKaW5kZXggODdiMjgwNy4uNjM4NjgzOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtOTIsOCArOTIsMjIgQEAKICAgICBzdGF0dXNfdCBpbml0aWFsaXplKGh3X21vZHVsZV90ICptb2R1bGUpCiAgICAgewogICAgICAgICBBTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIGludCByYyA9IG1vZHVsZS0+bWV0aG9kcy0+b3Blbihtb2R1bGUsIG1OYW1lLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKKyAgICAgICAgY2FtZXJhX21vZHVsZV90ICpjYW1lcmFNb2R1bGUgPSByZWludGVycHJldF9jYXN0PGNhbWVyYV9tb2R1bGVfdCAqPihtb2R1bGUpOworICAgICAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgICAgICBzdGF0dXNfdCByZXMgPSBjYW1lcmFNb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhhdG9pKG1OYW1lLnN0cmluZygpKSwgJmluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgICAgIGludCByYyA9IE9LOworICAgICAgICBpZiAobW9kdWxlLT5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzMgJiYKKyAgICAgICAgICAgIGluZm8uZGV2aWNlX3ZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgeworICAgICAgICAgICAgLy8gT3BlbiBoaWdoZXIgdmVyc2lvbiBjYW1lcmEgZGV2aWNlIGFzIEhBTDEuMCBkZXZpY2UuCisgICAgICAgICAgICByYyA9IGNhbWVyYU1vZHVsZS0+b3Blbl9sZWdhY3kobW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChod19kZXZpY2VfdCAqKikmbURldmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5tZXRob2RzLT5vcGVuKAorICAgICAgICAgICAgICAgIG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksIChod19kZXZpY2VfdCAqKikmbURldmljZSkpOworICAgICAgICB9CiAgICAgICAgIGlmIChyYyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuIGNhbWVyYSAlczogJWQiLCBtTmFtZS5zdHJpbmcoKSwgcmMpOwogICAgICAgICAgICAgcmV0dXJuIHJjOwpAQCAtNjExLDkgKzYyNSwxNCBAQAogICAgIHN0YXRpYyBpbnQgX19zZXRfYnVmZmVyc19nZW9tZXRyeShzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LAogICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCkKICAgICB7CisgICAgICAgIGludCByYzsKICAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYSA9IGFudyh3KTsKLSAgICAgICAgcmV0dXJuIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKworICAgICAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKCFyYykgeworICAgICAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKICAgICBzdGF0aWMgaW50IF9fc2V0X2Nyb3Aoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqdywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCmluZGV4IDI5NjZkODIuLjhjYWFkZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSAiQ2FtZXJhMkRldmljZS5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02Nyw4ICs2OCw4IEBACiAKICAgICBjYW1lcmEyX2RldmljZV90ICpkZXZpY2U7CiAKLSAgICByZXMgPSBtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKCZtb2R1bGUtPmNvbW1vbiwgbmFtZSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpOworICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigKKyAgICAgICAgJm1vZHVsZS0+Y29tbW9uLCBuYW1lLCByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKSk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IG9wZW4gY2FtZXJhICVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLApAQCAtMTEyLDIwICsxMTMsNiBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHJlcyA9IGRldmljZS0+b3BzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMoZGV2aWNlLCAmbVZlbmRvclRhZ09wcyk7Ci0gICAgaWYgKHJlcyAhPSBPSyApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byByZXRyaWV2ZSB0YWcgb3BzIGZyb20gZGV2aWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMobVZlbmRvclRhZ09wcyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHNldCB0YWcgb3BzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9CiAgICAgcmVzID0gZGV2aWNlLT5vcHMtPnNldF9ub3RpZnlfY2FsbGJhY2soZGV2aWNlLCBub3RpZmljYXRpb25DYWxsYmFjaywKICAgICAgICAgICAgIE5VTEwpOwogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTEzNyw2ICsxMjQsNyBAQAogCiAgICAgbURldmljZUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOwogICAgIG1IYWwyRGV2aWNlID0gZGV2aWNlOworICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlLT5jb21tb24udmVyc2lvbjsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIxMyw3ICsyMDEsNyBAQAogICAgIHJldHVybiBtRGV2aWNlSW5mbzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMjIxLDE1ICsyMDksMjkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogQ2FtZXJhMkRldmljZSBidXJzdCBjYXB0dXJlIG5vdCBpbXBsZW1lbnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIENhbWVyYU1ldGFkYXRhIHN0cmVhbVJlcXVlc3QocmVxdWVzdCk7CiAgICAgcmV0dXJuIG1SZXF1ZXN0UXVldWUuc2V0U3RyZWFtU2xvdChzdHJlYW1SZXF1ZXN0LnJlbGVhc2UoKSk7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlcywgQ2FtZXJhMkRldmljZSBzdHJlYW1pbmcgYnVyc3Qgbm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICByZXR1cm4gbVJlcXVlc3RRdWV1ZS5zZXRTdHJlYW1TbG90KE5VTEwpOwogfQpAQCAtMjQwLDEzICsyNDIsMTYgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlU3RyZWFtKHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwgaW50ICppZCkgeworICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKIAogICAgIHNwPFN0cmVhbUFkYXB0ZXI+IHN0cmVhbSA9IG5ldyBTdHJlYW1BZGFwdGVyKG1IYWwyRGV2aWNlKTsKLQorICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICBzaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgfQogICAgIHJlcyA9IHN0cmVhbS0+Y29ubmVjdFRvRGV2aWNlKGNvbnN1bWVyLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgc3RyZWFtICglZCB4ICVkLCBmb3JtYXQgJXgpOiIKQEAgLTI2MSw2ICsyNjYsMTcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgQ2FtZXJhMkRldmljZTo6Z2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIC8vIEFsd2F5cyBnaXZlIHRoZSBtYXgganBlZyBidWZmZXIgc2l6ZSByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwganBlZyByZXNvbHV0aW9uLgorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBqcGVnQnVmTWF4U2l6ZSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKKyAgICBpZiAoanBlZ0J1Zk1heFNpemUuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIEpQRUcgc2l6ZSBpbiBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBqcGVnQnVmTWF4U2l6ZS5kYXRhLmkzMlswXTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlUmVwcm9jZXNzU3RyZWFtRnJvbVN0cmVhbShpbnQgb3V0cHV0SWQsIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTM5OSw2ICs0MTUsMTkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOworCisgICAgLyoqCisgICAgICogSEFMMiBkZXZpY2VzIGRvIG5vdCBuZWVkIHRvIGNvbmZpZ3VyZSBzdHJlYW1zOworICAgICAqIHN0cmVhbXMgYXJlIGNyZWF0ZWQgb24gdGhlIGZseS4KKyAgICAgKi8KKyAgICBBTE9HVygiJXM6IE5vLW9wIGZvciBIQUwyIGRldmljZXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCiAKIHN0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgewpAQCAtNDYyLDcgKzQ5MSwxMyBAQAogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ0FNRVJBMl9NU0dfRVJST1I6Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKGV4dDEsIGV4dDIsIGV4dDMpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuIGV4dDIgYW5kIGV4dDMgbmVlZCB0byBiZSBjb25zaWRlcmVkLgorICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZXh0MSA9PSBDQU1FUkEyX01TR19FUlJPUl9ERVZJQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXh0MSA9PSBDQU1FUkEyX01TR19FUlJPUl9IQVJEV0FSRSkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ0FNRVJBMl9NU0dfU0hVVFRFUjogewogICAgICAgICAgICAgICAgIC8vIFRPRE86IE9ubHkgbmVlZGVkIGZvciBjYW1lcmEyIEFQSSwgd2hpY2ggaXMgdW5zdXBwb3J0ZWQKQEAgLTQ5MSwxNiArNTI2LDIyIEBACiAgICAgcmV0dXJuIG1GcmFtZVF1ZXVlLndhaXRGb3JCdWZmZXIodGltZW91dCk7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IGdldCBDYXB0dXJlUmVzdWx0IiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXN1bHQgcG9pbnRlciBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGNhbWVyYV9tZXRhZGF0YV90ICpyYXdGcmFtZTsKICAgICByZXMgPSBtRnJhbWVRdWV1ZS5kZXF1ZXVlKCZyYXdGcmFtZSk7Ci0gICAgaWYgKHJhd0ZyYW1lICA9PSBOVUxMKSB7CisgICAgaWYgKHJhd0ZyYW1lID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9IGVsc2UgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBmcmFtZS0+YWNxdWlyZShyYXdGcmFtZSk7CisgICAgICAgIHJlc3VsdC0+bU1ldGFkYXRhLmFjcXVpcmUocmF3RnJhbWUpOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTU3MCwxMyArNjExLDE4IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Zmx1c2goKSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpmbHVzaChpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIG1SZXF1ZXN0UXVldWUuY2xlYXIoKTsKICAgICByZXR1cm4gd2FpdFVudGlsRHJhaW5lZCgpOwogfQogCit1aW50MzJfdCBDYW1lcmEyRGV2aWNlOjpnZXREZXZpY2VWZXJzaW9uKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIG1EZXZpY2VWZXJzaW9uOworfQorCiAvKioKICAqIENhbWVyYTJEZXZpY2U6Ok1ldGFkYXRhUXVldWUKICAqLwpAQCAtMTA2OSwyNSArMTExNSwzMyBAQAogICAgIH0KIAogICAgIGlmIChtRm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgICAgICBtU2l6ZSwgMSwgbUZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgbVNpemUsIDEpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgY29tcHJlc3NlZCBzdHJlYW0gYnVmZmVyIGdlb21ldHJ5IgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIGNvbXByZXNzZWQgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgogICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQsIHNpemUgJXp1IGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbVNpemUsIG1JZCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBmb3JtYXQgMHgleCBmb3Igc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1JZCk7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBkaW1lbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAiICVkIHggJWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVdpZHRoLCBtSGVpZ2h0LCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAorICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwgbUZvcm1hdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQiCisgICAgICAgICAgICAgICAgIiAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRm9ybWF0LCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGludCBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgcmVzID0gbUNvbnN1bWVySW50ZXJmYWNlLT5xdWVyeShtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhDb25zdW1lckJ1ZmZlcnMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAppbmRleCAxZjUzYzU2Li4yYTNmMWQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaApAQCAtNDcsMzggKzQ3LDQ4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxSZXF1ZXN0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKICAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CisgICAgLy8gTm8tb3Agb24gSEFMMiBkZXZpY2VzCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgIHdpbGxOb3RpZnkzQSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdEZvck5leHRGcmFtZShuc2Vjc190IHRpbWVvdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyUHJlY2FwdHVyZU1ldGVyaW5nKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1c2hSZXByb2Nlc3NCdWZmZXIoaW50IHJlcHJvY2Vzc1N0cmVhbUlkLAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKICAgICAvLyBGbHVzaCBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgd2FpdAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKKwogICBwcml2YXRlOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqbUhhbDJEZXZpY2U7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtRGV2aWNlSW5mbzsKLSAgICB2ZW5kb3JfdGFnX3F1ZXJ5X29wc190ICptVmVuZG9yVGFnT3BzOworCisgICAgdWludDMyX3QgbURldmljZVZlcnNpb247CiAKICAgICAvKioKICAgICAgKiBRdWV1ZSBjbGFzcyBmb3IgYm90aCBzZW5kaW5nIHJlcXVlc3RzIHRvIGEgY2FtZXJhMiBkZXZpY2UsIGFuZCBmb3IKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDFkNDc2OGMuLjZhN2Y5ZTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNDgsNiArNDgsOCBAQAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKKyNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwogCkBAIC01Nyw3ICs1OSw4IEBACiAgICAgICAgIG1JZChpZCksCiAgICAgICAgIG1IYWwzRGV2aWNlKE5VTEwpLAogICAgICAgICBtU3RhdHVzKFNUQVRVU19VTklOSVRJQUxJWkVEKSwKLSAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHRRdWlyayhmYWxzZSksCisgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0KGZhbHNlKSwKKyAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzKDEpLAogICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxpc3RlbmVyKE5VTEwpCkBAIC0xMDIsOCArMTA1LDExIEBACiAKICAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2U7CiAKLSAgICByZXMgPSBtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKCZtb2R1bGUtPmNvbW1vbiwgZGV2aWNlTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpOworICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+b3BlbiIpOworICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUobW9kdWxlLT5jb21tb24ubWV0aG9kcy0+b3BlbigKKyAgICAgICAgJm1vZHVsZS0+Y29tbW9uLCBkZXZpY2VOYW1lLnN0cmluZygpLAorICAgICAgICByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKSk7CisgICAgQVRSQUNFX0VORCgpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCBvcGVuIGNhbWVyYTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTExLDEwICsxMTcsOSBAQAogICAgIH0KIAogICAgIC8qKiBDcm9zcy1jaGVjayBkZXZpY2UgdmVyc2lvbiAqLwotCi0gICAgaWYgKGRldmljZS0+Y29tbW9uLnZlcnNpb24gIT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICBpZiAoZGV2aWNlLT5jb21tb24udmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhOiAiCi0gICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgaXMgbm90IHZlcnNpb24gJXgsIHJlcG9ydHMgJXggaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2Ugc2hvdWxkIGJlIGF0IGxlYXN0ICV4LCByZXBvcnRzICV4IGluc3RlYWQiLAogICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wLAogICAgICAgICAgICAgICAgIGRldmljZS0+Y29tbW9uLnZlcnNpb24pOwogICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwpAQCAtMTIyLDEzICsxMjcsMTQgQEAKICAgICB9CiAKICAgICBjYW1lcmFfaW5mbyBpbmZvOwotICAgIHJlcyA9IG1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKG1JZCwgJmluZm8pOworICAgIHJlcyA9IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUobW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oCisgICAgICAgIG1JZCwgJmluZm8pKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKGluZm8uZGV2aWNlX3ZlcnNpb24gIT0gZGV2aWNlLT5jb21tb24udmVyc2lvbikgewogICAgICAgICBTRVRfRVJSX0woIkhBTCByZXBvcnRpbmcgbWlzbWF0Y2hlZCBjYW1lcmFfaW5mbyB2ZXJzaW9uICgleCkiCiAgICAgICAgICAgICAgICAgIiBhbmQgZGV2aWNlIHZlcnNpb24gKCV4KS4iLAotICAgICAgICAgICAgICAgIGRldmljZS0+Y29tbW9uLnZlcnNpb24sIGluZm8uZGV2aWNlX3ZlcnNpb24pOworICAgICAgICAgICAgICAgIGluZm8uZGV2aWNlX3ZlcnNpb24sIGRldmljZS0+Y29tbW9uLnZlcnNpb24pOwogICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTE0NiwyNCArMTUyLDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvKiogR2V0IHZlbmRvciBtZXRhZGF0YSB0YWdzICovCi0KLSAgICBtVmVuZG9yVGFnT3BzLmdldF9jYW1lcmFfdmVuZG9yX3NlY3Rpb25fbmFtZSA9IE5VTEw7Ci0KLSAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyIpOwotICAgIGRldmljZS0+b3BzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMoZGV2aWNlLCAmbVZlbmRvclRhZ09wcyk7Ci0gICAgQVRSQUNFX0VORCgpOwotCi0gICAgaWYgKG1WZW5kb3JUYWdPcHMuZ2V0X2NhbWVyYV92ZW5kb3Jfc2VjdGlvbl9uYW1lICE9IE5VTEwpIHsKLSAgICAgICAgcmVzID0gc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcygmbVZlbmRvclRhZ09wcyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHNldCB0YWcgb3BzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKiBTdGFydCB1cCBzdGF0dXMgdHJhY2tlciB0aHJlYWQgKi8KICAgICBtU3RhdHVzVHJhY2tlciA9IG5ldyBTdGF0dXNUcmFja2VyKHRoaXMpOwogICAgIHJlcyA9IG1TdGF0dXNUcmFja2VyLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lZC1TdGF0dXMiLCBtSWQpLnN0cmluZygpKTsKQEAgLTE4OSwyMCArMTc3LDI5IEBACiAKICAgICAvKiogRXZlcnl0aGluZyBpcyBnb29kIHRvIGdvICovCiAKKyAgICBtRGV2aWNlVmVyc2lvbiA9IGRldmljZS0+Y29tbW9uLnZlcnNpb247CiAgICAgbURldmljZUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOwogICAgIG1IYWwzRGV2aWNlID0gZGV2aWNlOwogICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOwogICAgIG1OZXh0U3RyZWFtSWQgPSAwOworICAgIG1EdW1teVN0cmVhbUlkID0gTk9fU1RSRUFNOwogICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKICAgICBtUGF1c2VTdGF0ZU5vdGlmeSA9IGZhbHNlOwogCi0gICAgLyoqIENoZWNrIGZvciBxdWlya3MgKi8KLQogICAgIC8vIFdpbGwgdGhlIEhBTCBiZSBzZW5kaW5nIGluIGVhcmx5IHBhcnRpYWwgcmVzdWx0IG1ldGFkYXRhPwotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBwYXJ0aWFsUmVzdWx0c1F1aXJrID0KLSAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9RVUlSS1NfVVNFX1BBUlRJQUxfUkVTVUxUKTsKLSAgICBpZiAocGFydGlhbFJlc3VsdHNRdWlyay5jb3VudCA+IDAgJiYgcGFydGlhbFJlc3VsdHNRdWlyay5kYXRhLnU4WzBdID09IDEpIHsKLSAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHRRdWlyayA9IHRydWU7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBwYXJ0aWFsUmVzdWx0c0NvdW50ID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIGlmIChwYXJ0aWFsUmVzdWx0c0NvdW50LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzID0gcGFydGlhbFJlc3VsdHNDb3VudC5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gKG1OdW1QYXJ0aWFsUmVzdWx0cyA+IDEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBhcnRpYWxSZXN1bHRzUXVpcmsgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9RVUlSS1NfVVNFX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKHBhcnRpYWxSZXN1bHRzUXVpcmsuY291bnQgPiAwICYmIHBhcnRpYWxSZXN1bHRzUXVpcmsuZGF0YS51OFswXSA9PSAxKSB7CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yNzEsNyArMjY4LDkgQEAKICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKIAogICAgICAgICBpZiAobUhhbDNEZXZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5jbG9zZSIpOwogICAgICAgICAgICAgbUhhbDNEZXZpY2UtPmNvbW1vbi5jbG9zZSgmbUhhbDNEZXZpY2UtPmNvbW1vbik7CisgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgICAgICBtSGFsM0RldmljZSA9IE5VTEw7CiAgICAgICAgIH0KIApAQCAtMjk4LDYgKzI5Nyw4NSBAQAogICAgIHJldHVybiBnb3RMb2NrOwogfQogCitDYW1lcmEzRGV2aWNlOjpTaXplIENhbWVyYTNEZXZpY2U6OmdldE1heEpwZWdSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIGludDMyX3QgbWF4SnBlZ1dpZHRoID0gMCwgbWF4SnBlZ0hlaWdodCA9IDA7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGlmIChhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ID09IDAgfHwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50ICUgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU2l6ZSgwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICAgICAgaWYgKGlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgorICAgICAgICAgICAgICAgICAgICAod2lkdGggKiBoZWlnaHQgPiBtYXhKcGVnV2lkdGggKiBtYXhKcGVnSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1heEpwZWdXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYXZhaWxhYmxlSnBlZ1NpemVzID0KKyAgICAgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCA9PSAwIHx8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudCAlIDIgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNpemUoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7IGkgKz0gMikgeworICAgICAgICAgICAgaWYgKChhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaV0gKiBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIDFdKQorICAgICAgICAgICAgICAgICAgICA+IChtYXhKcGVnV2lkdGggKiBtYXhKcGVnSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1heEpwZWdXaWR0aCA9IGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXTsKKyAgICAgICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU2l6ZShtYXhKcGVnV2lkdGgsIG1heEpwZWdIZWlnaHQpOworfQorCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OmdldEpwZWdCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KKyAgICBTaXplIG1heEpwZWdSZXNvbHV0aW9uID0gZ2V0TWF4SnBlZ1Jlc29sdXRpb24oKTsKKyAgICBpZiAobWF4SnBlZ1Jlc29sdXRpb24ud2lkdGggPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBmaW5kIHZhbGlkIGF2YWlsYWJsZSBqcGVnIHNpemVzIGluIHN0YXRpYyBtZXRhZGF0YSEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBHZXQgbWF4IGpwZWcgYnVmZmVyIHNpemUKKyAgICBzc2l6ZV90IG1heEpwZWdCdWZmZXJTaXplID0gMDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkganBlZ0J1Zk1heFNpemUgPSBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CisgICAgaWYgKGpwZWdCdWZNYXhTaXplLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgbWF4aW11bSBKUEVHIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbWF4SnBlZ0J1ZmZlclNpemUgPSBqcGVnQnVmTWF4U2l6ZS5kYXRhLmkzMlswXTsKKworICAgIC8vIENhbGN1bGF0ZSBmaW5hbCBqcGVnIGJ1ZmZlciBzaXplIGZvciB0aGUgZ2l2ZW4gcmVzb2x1dGlvbi4KKyAgICBmbG9hdCBzY2FsZUZhY3RvciA9ICgoZmxvYXQpICh3aWR0aCAqIGhlaWdodCkpIC8KKyAgICAgICAgICAgIChtYXhKcGVnUmVzb2x1dGlvbi53aWR0aCAqIG1heEpwZWdSZXNvbHV0aW9uLmhlaWdodCk7CisgICAgc3NpemVfdCBqcGVnQnVmZmVyU2l6ZSA9IHNjYWxlRmFjdG9yICogbWF4SnBlZ0J1ZmZlclNpemU7CisgICAgLy8gQm91bmQgdGhlIGJ1ZmZlciBzaXplIHRvIFtNSU5fSlBFR19CVUZGRVJfU0laRSwgbWF4SnBlZ0J1ZmZlclNpemVdLgorICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA+IG1heEpwZWdCdWZmZXJTaXplKSB7CisgICAgICAgIGpwZWdCdWZmZXJTaXplID0gbWF4SnBlZ0J1ZmZlclNpemU7CisgICAgfSBlbHNlIGlmIChqcGVnQnVmZmVyU2l6ZSA8IGtNaW5KcGVnQnVmZmVyU2l6ZSkgeworICAgICAgICBqcGVnQnVmZmVyU2l6ZSA9IGtNaW5KcGVnQnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4ganBlZ0J1ZmZlclNpemU7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAodm9pZClhcmdzOwpAQCAtMzg2LDE0ICs0NjQsNyBAQAogICAgIHJldHVybiBtRGV2aWNlSW5mbzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotCi0gICAgLy8gVE9ETzogdGFrZSBvd25lcnNoaXAgb2YgdGhlIHJlcXVlc3QKLQorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKICAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6CiAgICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKQEAgLTQwMiw3ICs0NzMsNiBAQAogICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgotICAgICAgICAgICAgLy8gTWF5IGJlIGxhemlseSBjb25maWd1cmluZyBzdHJlYW1zLCB3aWxsIGNoZWNrIGR1cmluZyBzZXR1cAogICAgICAgICBjYXNlIFNUQVRVU19DT05GSUdVUkVEOgogICAgICAgICBjYXNlIFNUQVRVU19BQ1RJVkU6CiAgICAgICAgICAgICAvLyBPSwpAQCAtNDExLDcxICs0ODEsMTE5IEBACiAgICAgICAgICAgICBTRVRfRVJSX0woIlVuZXhwZWN0ZWQgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CiAKLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZChyZXF1ZXN0KTsKLSAgICBpZiAobmV3UmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0Iik7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKKyAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJm1ldGFkYXRhTGlzdCwgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KSB7CisgICAgaWYgKHJlcXVlc3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgQ0xPR0UoInJlcXVlc3RMaXN0IGNhbm5vdCBiZSBOVUxMLiIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVJlcXVlc3QobmV3UmVxdWVzdCk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAotICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOworICAgIGludDMyX3QgYnVyc3RJZCA9IDA7CisgICAgZm9yIChMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXRhZGF0YUxpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1ldGFkYXRhTGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZCgqaXQpOworICAgICAgICBpZiAobmV3UmVxdWVzdCA9PSAwKSB7CisgICAgICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgZW5xdWV1ZWQiLCBtSWQpOworCisgICAgICAgIC8vIFNldHVwIGJ1cnN0IElkIGFuZCByZXF1ZXN0IElkCisgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGJ1cnN0SWQrKzsKKyAgICAgICAgaWYgKGl0LT5leGlzdHMoQU5EUk9JRF9SRVFVRVNUX0lEKSkgeworICAgICAgICAgICAgaWYgKGl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZW50cnkgZXhpc3RzOyBidXQgbXVzdCBub3QgYmUgZW1wdHkgaW4gbWV0YWRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBpdC0+ZmluZChBTkRST0lEX1JFUVVFU1RfSUQpLmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBkb2VzIG5vdCBleGlzdCBpbiBtZXRhZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RMaXN0LT5wdXNoX2JhY2sobmV3UmVxdWVzdCk7CisKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogICAgIH0KLSAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBPSzsKIH0KIAotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzSGVscGVyKAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKLSAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5JTklUSUFMSVpFRDoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2Ugbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKLSAgICAgICAgICAgIC8vIE1heSBiZSBsYXppbHkgY29uZmlndXJpbmcgc3RyZWFtcywgd2lsbCBjaGVjayBkdXJpbmcgc2V0dXAKLSAgICAgICAgY2FzZSBTVEFUVVNfQ09ORklHVVJFRDoKLSAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgotICAgICAgICAgICAgLy8gT0sKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmV4cGVjdGVkIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXBlYXRpbmdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKHJlcXVlc3QpOwotICAgIGlmIChuZXdSZXBlYXRpbmdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSByZXBlYXRpbmcgcmVxdWVzdCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIFJlcXVlc3RMaXN0IHJlcXVlc3RMaXN0OworCisgICAgcmVzID0gY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQocmVxdWVzdHMsIC8qb3V0Ki8mcmVxdWVzdExpc3QpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gZXJyb3IgbG9nZ2VkIGJ5IHByZXZpb3VzIGNhbGwKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBSZXF1ZXN0TGlzdCBuZXdSZXBlYXRpbmdSZXF1ZXN0czsKLSAgICBuZXdSZXBlYXRpbmdSZXF1ZXN0cy5wdXNoX2JhY2sobmV3UmVwZWF0aW5nUmVxdWVzdCk7CisgICAgaWYgKHJlcGVhdGluZykgeworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQogCi0gICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnNldFJlcGVhdGluZ1JlcXVlc3RzKG5ld1JlcGVhdGluZ1JlcXVlc3RzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKKyAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi90cnVlLCBrQWN0aXZlVGltZW91dCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAogICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFJlcGVhdGluZyByZXF1ZXN0IHNldCIsIG1JZCk7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCAlIiBQUklkMzIgIiBlbnF1ZXVlZCIsIG1JZCwKKyAgICAgICAgICAgICAgKCoocmVxdWVzdExpc3QuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xPR0UoIkNhbm5vdCBxdWV1ZSByZXF1ZXN0LiBJbXBvc3NpYmxlLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi9mYWxzZSwgbGFzdEZyYW1lTnVtYmVyKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi90cnVlLCBsYXN0RnJhbWVOdW1iZXIpOworfQogCiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gQ2FtZXJhM0RldmljZTo6c2V0VXBSZXF1ZXN0TG9ja2VkKAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewpAQCAtNDgzLDEwICs2MDEsMTggQEAKIAogICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQgfHwgbU5lZWRDb25maWcpIHsKICAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOworICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQgZHVlIHRvIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIC8vIERldmljZSBiYWNrIHRvIHVuY29uZmlndXJlZCBzdGF0ZS4gQ2xpZW50IG1pZ2h0IHRyeSBvdGhlciBjb25maWd1cmFpdG9ucworICAgICAgICBpZiAocmVzID09IEJBRF9WQUxVRSAmJiBtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIENMT0dFKCJObyBzdHJlYW1zIGNvbmZpZ3VyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCBmb3Igb3RoZXIgcmVhc29uLiBGYXRhbC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBzZXQgdXAgc3RyZWFtczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICAgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0byBlbXB0eSBzdHJlYW0gY29uZmlndXJhdGlvbi4KICAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCkgewogICAgICAgICAgICAgQ0xPR0UoIk5vIHN0cmVhbXMgY29uZmlndXJlZCIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OTcsNyArNjIzLDcgQEAKICAgICByZXR1cm4gbmV3UmVxdWVzdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC01MTksNyArNjQ1LDggQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2xlYXJpbmcgcmVwZWF0aW5nIHJlcXVlc3QiLCBtSWQpOwotICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworCisgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KSB7CkBAIC02NzYsMTIgKzgwMywxMiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLCBpbnQgKmlkKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgc2l6ZSAlenUiLAotICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOworICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCIsCisgICAgICAgICAgICBtSWQsIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CiAKICAgICBzdGF0dXNfdCByZXM7CiAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKQEAgLTcxNCw4ICs4NDEsMTQgQEAKIAogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IG5ld1N0cmVhbTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc2l6ZSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBqcGVnQnVmZmVyU2l6ZSwgZm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lciwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwpAQCAtODQwLDE2ICs5NzMsMjAgQEAKICAgICB9CiAKICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOworICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOworICAgIH0KKworICAgIC8vIERlbGV0ZSBvdXRwdXQgc3RyZWFtIG9yIHRoZSBvdXRwdXQgcGFydCBvZiBhIGJpLWRpcmVjdGlvbmFsIHN0cmVhbS4KKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmVJdGVtKGlkKTsKICAgICB9CiAKQEAgLTg3Myw2ICsxMDEwLDE1IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKK30KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CkBAIC04OTgsNiArMTA0NCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGlmICghbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdLmlzRW1wdHkoKSkgeworICAgICAgICAqcmVxdWVzdCA9IG1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdSZXF1ZXN0OwogICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncyIpOwogICAgIHJhd1JlcXVlc3QgPSBtSGFsM0RldmljZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKApAQCAtOTA5LDYgKzEwNjAsNyBAQAogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgICpyZXF1ZXN0ID0gcmF3UmVxdWVzdDsKKyAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF0gPSByYXdSZXF1ZXN0OwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTE4LDYgKzEwNzAsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbERyYWluZWRMb2NrZWQoKSB7CiAgICAgc3dpdGNoIChtU3RhdHVzKSB7CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOSU5JVElBTElaRUQ6CiAgICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKQEAgLTkzNiw2ICsxMDkyLDEwIEBACiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogV2FpdGluZyB1bnRpbCBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHN0YXR1c190IHJlcyA9IHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIGZhbHNlLCBrU2h1dGRvd25UaW1lb3V0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRXJyb3Igd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtMTAwNSw2ICsxMTY1LDcgQEAKICAgICAgICAgQUxPR1coIiVzOiBSZXBsYWNpbmcgb2xkIGNhbGxiYWNrIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgbVJlcXVlc3RUaHJlYWQtPnNldE5vdGlmeUNhbGxiYWNrKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwMzAsNyArMTE5MSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKQEAgLTEwMzgsOCArMTE5OSwxNCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhICZyZXN1bHQgPSAqKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKLSAgICBmcmFtZS0+YWNxdWlyZShyZXN1bHQpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYXJndW1lbnQgY2Fubm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIENhcHR1cmVSZXN1bHQgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOworICAgIGZyYW1lLT5tUmVzdWx0RXh0cmFzID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXM7CisgICAgZnJhbWUtPm1NZXRhZGF0YS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOwogICAgIG1SZXN1bHRRdWV1ZS5lcmFzZShtUmVzdWx0UXVldWUuYmVnaW4oKSk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMDU5LDcgKzEyMjYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMDgwLDcgKzEyNDcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMTAxLDcgKzEyNjgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMTE3LDE0ICsxMjg0LDM3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKGludDY0X3QgKmZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRmx1c2hpbmcgYWxsIHJlcXVlc3RzIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKCk7Ci0gICAgcmV0dXJuIG1IYWwzRGV2aWNlLT5vcHMtPmZsdXNoKG1IYWwzRGV2aWNlKTsKKyAgICBOb3RpZmljYXRpb25MaXN0ZW5lciogbGlzdGVuZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIobGlzdGVuZXIsIC8qb3V0Ki9mcmFtZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEpIHsKKyAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmVzID0gd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IENhbWVyYTNEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKIH0KIAogLyoqCkBAIC0xMjQ4LDYgKzE0MzgsMTUgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIFdvcmthcm91bmQgZm9yIGRldmljZSBIQUx2My4yIG9yIG9sZGVyIHNwZWMgYnVnIC0gemVybyBzdHJlYW1zIHJlcXVpcmVzCisgICAgLy8gYWRkaW5nIGEgZHVtbXkgc3RyZWFtIGluc3RlYWQuCisgICAgLy8gVE9ETzogQnVnOiAxNzMyMTQwNCBmb3IgZml4aW5nIHRoZSBIQUwgc3BlYyBhbmQgcmVtb3ZpbmcgdGhpcyB3b3JrYXJvdW5kLgorICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBhZGREdW1teVN0cmVhbUxvY2tlZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyeVJlbW92ZUR1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgfQorCiAgICAgLy8gU3RhcnQgY29uZmlndXJpbmcgdGhlIHN0cmVhbXMKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAKQEAgLTEyOTUsNyArMTQ5NCw0MiBAQAogICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG1IYWwzRGV2aWNlLCAmY29uZmlnKTsKICAgICBBVFJBQ0VfRU5EKCk7CiAKLSAgICBpZiAocmVzICE9IE9LKSB7CisgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgLy8gSEFMIHJlamVjdGVkIHRoaXMgc2V0IG9mIHN0cmVhbXMgYXMgdW5zdXBwb3J0ZWQsIGNsZWFuIHVwIGNvbmZpZworICAgICAgICAvLyBhdHRlbXB0IGFuZCByZXR1cm4gdG8gdW5jb25maWd1cmVkIHN0YXRlCisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBtSW5wdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgeworICAgICAgICAgICAgcmVzID0gbUlucHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBjYW5jZWwgY29uZmlndXJpbmcgaW5wdXQgc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CisgICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY2FuY2VsIGNvbmZpZ3VyaW5nIG91dHB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gc3RhdGUgdG8gdGhhdCBhdCBzdGFydCBvZiBjYWxsLCBzbyB0aGF0IGZ1dHVyZSBjb25maWd1cmVzCisgICAgICAgIC8vIHByb3Blcmx5IGNsZWFuIHRoaW5ncyB1cAorICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKKyAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOworCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU29tZSBvdGhlciBraW5kIG9mIGVycm9yIGZyb20gY29uZmlndXJlX3N0cmVhbXMgLSB0aGlzIGlzIG5vdAorICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtcyB3aXRoIEhBTDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0xMzM1LDcgKzE1NjksNyBAQAogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIAotICAgIGlmIChjb25maWcubnVtX3N0cmVhbXMgPiAwKSB7CisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0NPTkZJR1VSRUQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CkBAIC0xMzQzLDkgKzE1NzcsNzUgQEAKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIAorICAgIC8vIHRlYXIgZG93biB0aGUgZGVsZXRlZCBzdHJlYW1zIGFmdGVyIGNvbmZpZ3VyZSBzdHJlYW1zLgorICAgIG1EZWxldGVkU3RyZWFtcy5jbGVhcigpOworCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjphZGREdW1teVN0cmVhbUxvY2tlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtRHVtbXlTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGFkZGluZyBhIHNlY29uZCBkdW1teSBzdHJlYW0gd2hlbiBvbmUgaXMgYWxyZWFkeQorICAgICAgICAvLyBhY3RpdmUKKyAgICAgICAgU0VUX0VSUl9MKCIlczogQ2FtZXJhICVkOiBBIGR1bW15IHN0cmVhbSBhbHJlYWR5IGV4aXN0cyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBZGRpbmcgYSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBkdW1teVN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQ2FtZXJhM0R1bW15U3RyZWFtKG1OZXh0U3RyZWFtSWQpOworCisgICAgcmVzID0gbU91dHB1dFN0cmVhbXMuYWRkKG1OZXh0U3RyZWFtSWQsIGR1bW15U3RyZWFtKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGFkZCBkdW1teSBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUR1bW15U3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOworICAgIG1OZXh0U3RyZWFtSWQrKzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSByZXR1cm4gT0s7CisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAxKSByZXR1cm4gT0s7CisKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUmVtb3ZpbmcgdGhlIGR1bW15IHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAorICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKKworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07CisgICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKworICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCisgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBkaXNjb25uZWN0IGRlbGV0ZWQgZHVtbXkgc3RyZWFtICVkIiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICAvLyBmYWxsIHRocm91Z2ggc2luY2Ugd2Ugd2FudCB0byBzdGlsbCBsaXN0IHRoZSBzdHJlYW0gYXMgZGVsZXRlZC4KKyAgICB9CisgICAgbURlbGV0ZWRTdHJlYW1zLmFkZChkZWxldGVkU3RyZWFtKTsKKyAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKKworICAgIHJldHVybiByZXM7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICB2YV9saXN0IGFyZ3M7CkBAIC0xMzc4LDQwICsxNjc4LDQ1IEBACiAgICAgLy8gQnV0IG9ubHkgZG8gZXJyb3Igc3RhdGUgdHJhbnNpdGlvbiBzdGVwcyBmb3IgdGhlIGZpcnN0IGVycm9yCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SIHx8IG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHJldHVybjsKIAotICAgIC8vIFNhdmUgc3RhY2sgdHJhY2UuIFZpZXcgYnkgZHVtcGluZyBpdCBsYXRlci4KLSAgICBDYW1lcmFUcmFjZXM6OnNhdmVUcmFjZSgpOwotICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBlcnJvckNhdXNlIGFuZCBjbGllbnQgcGlkL3Byb2NuYW1lCi0KICAgICBtRXJyb3JDYXVzZSA9IGVycm9yQ2F1c2U7CiAKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwogICAgIG1TdGF0dXMgPSBTVEFUVVNfRVJST1I7CisKKyAgICAvLyBOb3RpZnkgdXBzdHJlYW0gYWJvdXQgYSBkZXZpY2UgZXJyb3IKKyAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAorICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CisgICAgfQorCisgICAgLy8gU2F2ZSBzdGFjayB0cmFjZS4gVmlldyBieSBkdW1waW5nIGl0IGxhdGVyLgorICAgIENhbWVyYVRyYWNlczo6c2F2ZVRyYWNlKCk7CisgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGVycm9yQ2F1c2UgYW5kIGNsaWVudCBwaWQvcHJvY25hbWUKIH0KIAogLyoqCiAgKiBJbi1mbGlnaHQgcmVxdWVzdCBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodChpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCwgaW50MzJfdCBudW1CdWZmZXJzKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwotICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChyZXF1ZXN0SWQsIG51bUJ1ZmZlcnMpKTsKKyAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCkpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiAvKioKLSAqIFFVSVJLKHBhcnRpYWwgcmVzdWx0cykKICAqIENoZWNrIGlmIGFsbCAzQSBmaWVsZHMgYXJlIHJlYWR5LCBhbmQgc2VuZCBvZmYgYSBwYXJ0aWFsIDNBLW9ubHkgcmVzdWx0CiAgKiB0byB0aGUgb3V0cHV0IGZyYW1lIHF1ZXVlCiAgKi8KLWJvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVF1aXJrKAotICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVJlc3VsdCgKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKIAogICAgIC8vIENoZWNrIGlmIGFsbCAzQSBzdGF0ZXMgYXJlIHByZXNlbnQKICAgICAvLyBUaGUgZnVsbCBsaXN0IG9mIGZpZWxkcyBpcwpAQCAtMTQzMSw4ICsxNzM2LDYgQEAKICAgICB1aW50OF90IGFlU3RhdGU7CiAgICAgdWludDhfdCBhZlN0YXRlOwogICAgIHVpbnQ4X3QgYXdiU3RhdGU7Ci0gICAgaW50MzJfdCBhZlRyaWdnZXJJZDsKLSAgICBpbnQzMl90IGFlVHJpZ2dlcklkOwogCiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcik7CkBAIC0xNDQ5LDg4ICsxNzUyLDkyIEBACiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICZhd2JTdGF0ZSwgZnJhbWVOdW1iZXIpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAotICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKTsKLQotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzQVJlc3VsdChwYXJ0aWFsLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgJmFlVHJpZ2dlcklkLCBmcmFtZU51bWJlcik7Ci0KICAgICBpZiAoIWdvdEFsbFN0YXRlcykgcmV0dXJuIGZhbHNlOwogCiAgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmFtZSAlZCwgUmVxdWVzdCBJRCAlZDogQUYgbW9kZSAlZCwgQVdCIG1vZGUgJWQsICIKICAgICAgICAgIkFGIHN0YXRlICVkLCBBRSBzdGF0ZSAlZCwgQVdCIHN0YXRlICVkLCAiCiAgICAgICAgICJBRiB0cmlnZ2VyICVkLCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgJWQiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAogICAgICAgICBhZk1vZGUsIGF3Yk1vZGUsCiAgICAgICAgIGFmU3RhdGUsIGFlU3RhdGUsIGF3YlN0YXRlLAotICAgICAgICBhZlRyaWdnZXJJZCwgYWVUcmlnZ2VySWQpOworICAgICAgICByZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIHJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkKTsKIAogICAgIC8vIEdvdCBhbGwgc3RhdGVzLCBzbyBjb25zdHJ1Y3QgYSBtaW5pbWFsIHJlc3VsdCB0byBzZW5kCiAgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGZpZWxkcywgdGhpcyBtZWFucyBhZGRpbmcgaW4KICAgICAvLyAgIGFuZHJvaWQucmVxdWVzdC5mcmFtZUNvdW50CiAgICAgLy8gICBhbmRyb2lkLnJlcXVlc3QucmVxdWVzdElkCi0gICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0CisgICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0IChmb3IgSEFMIHZlcnNpb24gYmVsb3cgSEFMMy4yKQogCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzID0gMTA7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSYgbWluM0FSZXN1bHQgPQotICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmVuZCgpLAotICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzLCAvKmRhdGFDYXBhY2l0eSovIDApKTsKKyAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gQ2FtZXJhTWV0YWRhdGEoa01pbmltYWwzQVJlc3VsdEVudHJpZXMsIC8qZGF0YUNhcGFjaXR5Ki8gMCk7CisgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc3A8Q2FwdHVyZVJlc3VsdD4uIFRoaXMgd2lsbCBuZWVkIG90aGVyIGNoYW5nZXMsIGluY2x1ZGluZywKKyAgICAvLyBidXQgbm90IGxpbWl0ZWQgdG8gQ2FtZXJhRGV2aWNlQmFzZTo6Z2V0TmV4dFJlc3VsdAorICAgIENhcHR1cmVSZXN1bHQmIG1pbjNBUmVzdWx0ID0KKyAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgY2FwdHVyZVJlc3VsdCk7CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAmZnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIHByb2JsZW1hdGljIGNhc3RpbmcuIE5lZWQgdG8gZml4IENhbWVyYU1ldGFkYXRhLgorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmZyYW1lTnVtYmVyKSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfSUQsCisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAmcmVxdWVzdElkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhcnRpYWxSZXN1bHQgPSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMOwotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULAotICAgICAgICAgICAgJnBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFydGlhbFJlc3VsdCA9IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUw7CisgICAgICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJmF3Yk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmYWVTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZhZlN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmYXdiU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBXZSBvbmx5IHNlbmQgdGhlIGFnZ3JlZ2F0ZWQgcGFydGlhbCB3aGVuIGFsbCAzQSByZWxhdGVkIG1ldGFkYXRhIGFyZSBhdmFpbGFibGUKKyAgICAvLyBGb3IgYm90aCBBUEkxIGFuZCBBUEkyLgorICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCBwYXNzIHRocm91Z2ggYWxsIHBhcnRpYWxzIHRvIEFQSTIgdW5jb25kaXRpb25hbGx5LgogICAgIG1SZXN1bHRTaWduYWwuc2lnbmFsKCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1MzgsNyArMTg0NSw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6OmdldDNBUmVzdWx0KGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICAodm9pZCkgZnJhbWVOdW1iZXI7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKQEAgLTE1NjMsNyArMTg3MCw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6Omluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBjb25zdCBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBjb25zdCBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICBpZiAocmVzdWx0LnVwZGF0ZSh0YWcsIHZhbHVlLCAxKSAhPSBOT19FUlJPUikgewogICAgICAgICBtUmVzdWx0UXVldWUuZXJhc2UoLS1tUmVzdWx0UXVldWUuZW5kKCksIG1SZXN1bHRRdWV1ZS5lbmQoKSk7CiAgICAgICAgIFNFVF9FUlIoIkZyYW1lICVkOiBGYWlsZWQgdG8gc2V0ICVzIGluIHBhcnRpYWwgbWV0YWRhdGEiLApAQCAtMTU4MywxOCArMTg5MCwzNCBAQAogICAgIHN0YXR1c190IHJlczsKIAogICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gcmVzdWx0LT5mcmFtZV9udW1iZXI7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ID09IE5VTEwgJiYgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMCkgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCA9PSBOVUxMICYmIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzID09IDAgJiYKKyAgICAgICAgICAgIHJlc3VsdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgU0VUX0VSUigiTm8gcmVzdWx0IGRhdGEgcHJvdmlkZWQgYnkgSEFMIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgcGFydGlhbFJlc3VsdFF1aXJrID0gZmFsc2U7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUXVpcmtSZXN1bHQ7CiAKLSAgICAvLyBHZXQgY2FwdHVyZSB0aW1lc3RhbXAgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywgd2hlcmUgaXQgd2FzIGFkZGVkCi0gICAgLy8gYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLiBUaGVuIHVwZGF0ZSB0aGUgaW4tZmxpZ2h0Ci0gICAgLy8gc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZiBhbGwgcmVzdWx0IGRhdGEgaGFzIGJlZW4KLSAgICAvLyByZWNlaXZlZC4KKyAgICAvLyBGb3IgSEFMMy4yIG9yIGFib3ZlLCBJZiBIQUwgZG9lc24ndCBzdXBwb3J0IHBhcnRpYWwsIGl0IG11c3QgYWx3YXlzIHNldAorICAgIC8vIHBhcnRpYWxfcmVzdWx0IHRvIDEgd2hlbiBtZXRhZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGlzIHJlc3VsdC4KKyAgICBpZiAoIW1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMiAmJgorICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJgorICAgICAgICAgICAgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCAhPSAxKSB7CisgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlIDEiCisgICAgICAgICAgICAgICAgIiBpZiBwYXJ0aWFsIHJlc3VsdCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIENhbWVyYU1ldGFkYXRhIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCA9IGZhbHNlOworCisgICAgLy8gR2V0IGNhcHR1cmUgdGltZXN0YW1wIGFuZCByZXN1bHRFeHRyYXMgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywKKyAgICAvLyB3aGVyZSBpdCB3YXMgYWRkZWQgYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLgorICAgIC8vIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQgc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZgorICAgIC8vIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbiByZWNlaXZlZC4KICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IDA7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKQEAgLTE2MDUsNzEgKzE5MjgsMTA4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgIEFMT0dWVigiJXM6IGdvdCBJbkZsaWdodFJlcXVlc3QgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcXVlc3QucmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVxdWVzdC5yZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMuYnVyc3RJZCk7CisgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhlIHBhcnRpYWwgY291bnQgdG8gdGhlIGxhdGVzdCBvbmUuIFdoZW4gZnJhbWV3b3JrIGFnZ3JlZ2F0ZXMgYWRqYWNlbnQKKyAgICAgICAgLy8gcGFydGlhbCByZXN1bHRzIGludG8gb25lLCB0aGUgbGF0ZXN0IHBhcnRpYWwgY291bnQgd2lsbCBiZSB1c2VkLgorICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPSByZXN1bHQtPnBhcnRpYWxfcmVzdWx0OwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGNhcnJpZXMgb25seSBwYXJ0aWFsIG1ldGFkYXRhCi0gICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdFF1aXJrICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IHBhcnRpYWxSZXN1bHRFbnRyeTsKLSAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwgJnBhcnRpYWxSZXN1bHRFbnRyeSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE5BTUVfTk9UX0ZPVU5EICYmCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmRhdGEudThbMF0gPT0KLSAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgewotICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gc2V0IG9mIG1ldGFkYXRhIGludG8gdGhlIGluLWZsaWdodCBlbnRyeS4KLSAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0UXVpcmsgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQuZXJhc2UoCi0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0ID4gbU51bVBhcnRpYWxSZXN1bHRzIHx8IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlICBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSByYW5nZSBvZiBbMSwgJWRdIHdoZW4gbWV0YWRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHJlc3VsdC0+cGFydGlhbF9yZXN1bHQsIG1OdW1QYXJ0aWFsUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCBtTnVtUGFydGlhbFJlc3VsdHMpOworICAgICAgICAgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQocmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGFydGlhbFJlc3VsdEVudHJ5OworICAgICAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsICZwYXJ0aWFsUmVzdWx0RW50cnkpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvZiBtZXRhZGF0YSBpbnRvIHRoZSBpbi1mbGlnaHQgZW50cnkuCisgICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmVyYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgICAgIC8vIEZpcmUgb2ZmIGEgM0Etb25seSByZXN1bHQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmhhdmVTZW50M0EpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuaGF2ZVNlbnQzQSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcnRpYWwzQVF1aXJrKGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWFsM0FSZXN1bHQoZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRpbWVzdGFtcCA9IHJlcXVlc3QuY2FwdHVyZVRpbWVzdGFtcDsKKyAgICAgICAgcmVzdWx0RXh0cmFzID0gcmVxdWVzdC5yZXN1bHRFeHRyYXM7CisgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0ID0gcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcjsKKwogICAgICAgICAvKioKICAgICAgICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBoYXBwZW4gYmVmb3JlIGl0J3MgbGVnYWwgdG8gY2FsbCBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0LAogICAgICAgICAgKiB1bmxlc3MgcGFydGlhbCBtZXRhZGF0YSBpcyBiZWluZyBwcm92aWRlZDoKICAgICAgICAgICogLSBDQU1FUkEzX01TR19TSFVUVEVSIChleHBlY3RlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbikKICAgICAgICAgICogLSBDQU1FUkEzX01TR19FUlJPUiAoZXhwZWN0ZWQgZHVyaW5nIGZsdXNoKQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyA9PSBPSyAmJiB0aW1lc3RhbXAgPT0gMCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgPT0gT0sgJiYgdGltZXN0YW1wID09IDAgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIGJlZm9yZSBzaHV0dGVyIG5vdGlmeSBmb3IgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvLyBEaWQgd2UgZ2V0IHRoZSAoZmluYWwpIHJlc3VsdCBtZXRhZGF0YSBmb3IgdGhpcyBjYXB0dXJlPwotICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIFNFVF9FUlIoIkNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIG1ldGFkYXRhIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgJiYKLSAgICAgICAgICAgICAgICAgICAgIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb2xsZWN0ZWRRdWlya1Jlc3VsdC5hY3F1aXJlKAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICAgICAgICAgICFyZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuYWNxdWlyZSgKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0IC09IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOwotCisgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXR1cm5lZCA9IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOworICAgICAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JldHVybmVkICs9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogSW5wdXQgYnVmZmVyIHNob3VsZCBiZSBOVUxMIGlmIHRoZXJlIGlzIG5vIGlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBidWZmZXIgc2VudCBpbiB0aGUgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgLT0gbnVtQnVmZmVyc1JldHVybmVkOwogICAgICAgICBpZiAocmVxdWVzdC5udW1CdWZmZXJzTGVmdCA8IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlRvbyBtYW55IGJ1ZmZlcnMgcmV0dXJuZWQgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKQotICAgICAgICBpZiAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgcmVxdWVzdC5udW1CdWZmZXJzTGVmdCA9PSAwKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGV2ZXJ5dGhpbmcgaGFzIGFycml2ZWQgZm9yIHRoaXMgcmVzdWx0IChidWZmZXJzIGFuZCBtZXRhZGF0YSksIHJlbW92ZSBpdCBmcm9tCisgICAgICAgIC8vIEluRmxpZ2h0TWFwIGlmIGJvdGggYXJyaXZlZCBvciBIQUwgcmVwb3J0cyBlcnJvciBmb3IgdGhpcyByZXF1ZXN0IChpLmUuIGR1cmluZyBmbHVzaCkuCisgICAgICAgIGlmICgocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LKSB8fAorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApKSB7CiAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgbUluRmxpZ2h0TWFwLnJlbW92ZUl0ZW1zQXQoaWR4LCAxKTsKICAgICAgICAgfQpAQCAtMTY4NCwyNCArMjA0NCwyNiBAQAogCiAgICAgLy8gUHJvY2VzcyB0aGUgcmVzdWx0IG1ldGFkYXRhLCBpZiBwcm92aWRlZAogICAgIGJvb2wgZ290UmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIXBhcnRpYWxSZXN1bHRRdWlyaykgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCiAgICAgICAgIGdvdFJlc3VsdCA9IHRydWU7CiAKLSAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlcgorICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCiAgICAgICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKys7CisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2FwdHVyZVJlc3VsdDsKLSAgICAgICAgY2FwdHVyZVJlc3VsdCA9IHJlc3VsdC0+cmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKIAotICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBzZXQgZnJhbWUjIGluIG1ldGFkYXRhICglZCkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBnb3RSZXN1bHQgPSBmYWxzZTsKQEAgLTE3MTEsMTYgKzIwNzMsMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEFwcGVuZCBhbnkgcHJldmlvdXMgcGFydGlhbHMgdG8gZm9ybSBhIGNvbXBsZXRlIHJlc3VsdAotICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJiAhY29sbGVjdGVkUXVpcmtSZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVzdWx0LmFwcGVuZChjb2xsZWN0ZWRRdWlya1Jlc3VsdCk7CisgICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJiAhY29sbGVjdGVkUGFydGlhbFJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmFwcGVuZChjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNhcHR1cmVSZXN1bHQuc29ydCgpOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YS5zb3J0KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSdzIGEgdGltZXN0YW1wIGluIHRoZSByZXN1bHQgbWV0YWRhdGEKIAogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk5vIHRpbWVzdGFtcCBwcm92aWRlZCBieSBIQUwgZm9yIGZyYW1lICVkISIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKQEAgLTE3MzQsOSArMjA5NiwxMyBAQAogCiAgICAgICAgIGlmIChnb3RSZXN1bHQpIHsKICAgICAgICAgICAgIC8vIFZhbGlkIHJlc3VsdCwgaW5zZXJ0IGludG8gcXVldWUKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBxdWV1ZWRSZXN1bHQgPQotICAgICAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgQ2FtZXJhTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBxdWV1ZWRSZXN1bHQuc3dhcChjYXB0dXJlUmVzdWx0KTsKKyAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD46Oml0ZXJhdG9yIHF1ZXVlZFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYXB0dXJlUmVzdWx0KGNhcHR1cmVSZXN1bHQpKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXM6IHJlc3VsdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgICAgICB9CiAgICAgfSAvLyBzY29wZSBmb3IgbU91dHB1dExvY2sKIApAQCAtMTc1NCw2ICsyMTIwLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QpIHsKKyAgICAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CisgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXN1bHQtPmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoKihyZXN1bHQtPmlucHV0X2J1ZmZlcikpOworICAgICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMgdGhlCisgICAgICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RUaHJlYWQ6IENhbid0IHJldHVybiBpbnB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgorICAgICAgICAgICAgICAgICAgICAgICIgIGl0cyBzdHJlYW06JXMgKCVkKSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnB1dCBidWZmZXIgc2hvdWxkIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICIgYnVmZmVyIHNlbnQgaW4gdGhlIHJlcXVlc3QsIHNraXBwaW5nIGlucHV0IGJ1ZmZlciByZXR1cm4uIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEZpbmFsbHksIHNpZ25hbCBhbnkgd2FpdGVycyBmb3IgbmV3IGZyYW1lcwogCiAgICAgaWYgKGdvdFJlc3VsdCkgewpAQCAtMTc2Miw4ICsyMTQ3LDYgQEAKIAogfQogCi0KLQogdm9pZCBDYW1lcmEzRGV2aWNlOjpub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcjsKQEAgLTE3NzksNzIgKzIxNjIsMTEgQEAKIAogICAgIHN3aXRjaCAobXNnLT50eXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1I6IHsKLSAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IDA7Ci0gICAgICAgICAgICBpZiAobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUpOwotCi0gICAgICAgICAgICAvLyBTZXQgcmVxdWVzdCBlcnJvciBzdGF0dXMgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KS5yZXF1ZXN0U3RhdHVzID0gbXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVycm9yKG1zZy0+bWVzc2FnZS5lcnJvciwgbGlzdGVuZXIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkEzX01TR19TSFVUVEVSOiB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeDsKLSAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gbXNnLT5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyOwotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBtc2ctPm1lc3NhZ2Uuc2h1dHRlci50aW1lc3RhbXA7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgb3JkZXJpbmcgb2Ygc2h1dHRlciBub3RpZmljYXRpb25zCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwotICAgICAgICAgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uIGZvciBmcmFtZSAlZCwgZ290IGZyYW1lICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0SWQgPSAtMTsKLQotICAgICAgICAgICAgLy8gU2V0IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCB0cmFja2luZwotICAgICAgICAgICAgLy8gYW5kIGdldCB0aGUgcmVxdWVzdCBJRCB0byBzZW5kIHVwc3RyZWFtCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgICAgICAgICAgaWR4ID0gbUluRmxpZ2h0TWFwLmluZGV4T2ZLZXkoZnJhbWVOdW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPSByLnJlcXVlc3RJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciBub24tZXhpc3RlbnQgZnJhbWUgbnVtYmVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWVigiQ2FtZXJhICVkOiAlczogU2h1dHRlciBmaXJlZCBmb3IgZnJhbWUgJWQgKGlkICVkKSBhdCAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLCB0aW1lc3RhbXApOwotICAgICAgICAgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlTaHV0dGVyKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeVNodXR0ZXIobXNnLT5tZXNzYWdlLnNodXR0ZXIsIGxpc3RlbmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODUzLDYgKzIxNzUsMTIxIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisKKyAgICAvLyBNYXAgY2FtZXJhIEhBTCBlcnJvciBjb2RlcyB0byBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgZXJyb3IgY29kZXMKKyAgICAvLyBJbmRleCBpbnRvIHRoaXMgd2l0aCB0aGUgSEFMIGVycm9yIGNvZGUKKyAgICBzdGF0aWMgY29uc3QgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlCisgICAgICAgICAgICBoYWxFcnJvck1hcFtDQU1FUkEzX01TR19OVU1fRVJST1JTXSA9IHsKKyAgICAgICAgLy8gMCA9IFVudXNlZCBlcnJvciBjb2RlCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SLAorICAgICAgICAvLyAxID0gQ0FNRVJBM19NU0dfRVJST1JfREVWSUNFCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UsCisgICAgICAgIC8vIDIgPSBDQU1FUkEzX01TR19FUlJPUl9SRVFVRVNUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAvLyAzID0gQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQsCisgICAgICAgIC8vIDQgPSBDQU1FUkEzX01TR19FUlJPUl9CVUZGRVIKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUgorICAgIH07CisKKyAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KKyAgICAgICAgICAgICgobXNnLmVycm9yX2NvZGUgPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1zZy5lcnJvcl9jb2RlIDwgQ0FNRVJBM19NU0dfTlVNX0VSUk9SUykpID8KKyAgICAgICAgICAgIGhhbEVycm9yTWFwW21zZy5lcnJvcl9jb2RlXSA6CisgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjsKKworICAgIGludCBzdHJlYW1JZCA9IDA7CisgICAgaWYgKG1zZy5lcnJvcl9zdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQorICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QobXNnLmVycm9yX3N0cmVhbSk7CisgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOworICAgIH0KKyAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCisgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHN0cmVhbUlkLCBtc2cuZXJyb3JfY29kZSk7CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJDYW1lcmEgSEFMIHJlcG9ydGVkIHNlcmlvdXMgZGV2aWNlIGVycm9yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgICAgICAgICAgICAgIHIucmVxdWVzdFN0YXR1cyA9IG1zZy5lcnJvcl9jb2RlOworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IHJlcXVlc3Qgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSAlIiBQUklkNjQgIiBlcnJvciIsIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogbm8gbGlzdGVuZXIgYXZhaWxhYmxlIiwgbUlkLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJVbmtub3duIGVycm9yIG1lc3NhZ2UgZnJvbSBIQUw6ICVkIiwgbXNnLmVycm9yX2NvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeVNodXR0ZXIoY29uc3QgY2FtZXJhM19zaHV0dGVyX21zZ190ICZtc2csCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIHNzaXplX3QgaWR4OworICAgIC8vIFZlcmlmeSBvcmRlcmluZyBvZiBzaHV0dGVyIG5vdGlmaWNhdGlvbnMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlci4KKyAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyICsgMTsKKyAgICB9CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKworICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKKyAgICAvLyBhbmQgZ2V0IHRoZSByZXF1ZXN0IElEIHRvIHNlbmQgdXBzdHJlYW0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOworICAgICAgICBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIHIuY2FwdHVyZVRpbWVzdGFtcCA9IG1zZy50aW1lc3RhbXA7CisgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3Igbm9uLWV4aXN0ZW50IGZyYW1lIG51bWJlciAlZCIsCisgICAgICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1ZWKCJDYW1lcmEgJWQ6ICVzOiBTaHV0dGVyIGZpcmVkIGZvciBmcmFtZSAlZCAoaWQgJWQpIGF0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbXNnLnRpbWVzdGFtcCk7CisgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCBtc2cudGltZXN0YW1wKTsKKyAgICB9Cit9CisKKwogQ2FtZXJhTWV0YWRhdGEgQ2FtZXJhM0RldmljZTo6Z2V0TGF0ZXN0UmVxdWVzdExvY2tlZCgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xODY1LDYgKzIzMDIsNyBAQAogICAgIHJldHVybiByZXRWYWw7CiB9CiAKKwogLyoqCiAgKiBSZXF1ZXN0VGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKICAqLwpAQCAtMTg4MSwxOSArMjMxOSw0MCBAQAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKLSAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCkgeworICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKKyAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Tm90aWZ5Q2FsbGJhY2soCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y29uZmlndXJhdGlvbkNvbXBsZXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdCgKLSAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVJlcXVlc3RMaXN0KAorICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwotICAgIG1SZXF1ZXN0UXVldWUucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKKyAgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2soKml0KTsKKyAgICB9CisKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlciArIG1SZXF1ZXN0UXVldWUuc2l6ZSgpIC0gMTsKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgJWQsIG1GcmFtZU51bWJlciAlIiBQUklkMzIgIiwgbGFzdEZyYW1lTnVtYmVyICUiIFBSSWQ2NCAiLiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKCoocmVxdWVzdHMuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAqbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKIApAQCAtMTk1NywyOCArMjQxNiw3MiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRSZXBlYXRpbmdSZXF1ZXN0cygKLSAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzKSB7CisgICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmluc2VydChtUmVwZWF0aW5nUmVxdWVzdHMuYmVnaW4oKSwKICAgICAgICAgICAgIHJlcXVlc3RzLmJlZ2luKCksIHJlcXVlc3RzLmVuZCgpKTsKIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0SW4pIHsKKyAgICBpZiAobVJlcGVhdGluZ1JlcXVlc3RzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IHJlcXVlc3RJbi0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcGVhdFJlcXVlc3RzID0gbVJlcGVhdGluZ1JlcXVlc3RzOworICAgIC8vIEFsbCByZXBlYXRpbmcgcmVxdWVzdHMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBzYW1lIGlkIHNvIG9ubHkgY2hlY2sgZmlyc3QgcXVlc3QKKyAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gZmlyc3RSZXF1ZXN0ID0gKnJlcGVhdFJlcXVlc3RzLmJlZ2luKCk7CisgICAgcmV0dXJuIChmaXJzdFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkID09IHJlcXVlc3RJZCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKAorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIsCisgICAgICAgIC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOjolczoiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICAvLyBTZW5kIGVycm9ycyBmb3IgYWxsIHJlcXVlc3RzIHBlbmRpbmcgaW4gdGhlIHJlcXVlc3QgcXVldWUsIGluY2x1ZGluZworICAgIC8vIHBlbmRpbmcgcmVwZWF0aW5nIHJlcXVlc3RzCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChSZXF1ZXN0TGlzdDo6aXRlcmF0b3IgaXQgPSBtUmVxdWVzdFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1SZXF1ZXN0UXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgZnJhbWUgbnVtYmVyIHRoaXMgcmVxdWVzdCB3b3VsZCBoYXZlIGhhZCwgaWYgaXQKKyAgICAgICAgICAgIC8vIGhhZCBiZWVuIHN1Ym1pdHRlZDsgdGhpcyBmcmFtZSBudW1iZXIgd2lsbCBub3QgYmUgcmV1c2VkLgorICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RJZCBhbmQgYnVyc3RJZCBmaWVsZHMgd2VyZSBzZXQgd2hlbiB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCBvcmlnaW5hbGx5IChpbiBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCkKKyAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgbVRyaWdnZXJNYXAuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIwMzAsNiArMjUzMyw3IEBACiAKICAgICAvLyBDcmVhdGUgcmVxdWVzdCB0byBIQUwKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IHJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAKICAgICAvLyBHZXQgdGhlIHJlcXVlc3QgSUQsIGlmIGFueQpAQCAtMjA1MCw3ICsyNTU0LDcgQEAKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgKG1GcmFtZU51bWJlcisxKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMDY4LDcgKzI1NzIsNyBAQAogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IGR1bW15IHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMDkyLDcgKzI1OTYsNyBAQAogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0IChmcmFtZSBudW0gJWQpIGhhZCBBRiB0cmlnZ2VyIDB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVOdW1iZXIrMSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudThbMF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTAzLDYgKzI2MDcsNyBAQAogICAgIH0KIAogICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOworICAgIHVpbnQzMl90IHRvdGFsTnVtQnVmZmVycyA9IDA7CiAKICAgICAvLyBGaWxsIGluIGJ1ZmZlcnMKIApAQCAtMjExMCwxMSArMjYxNSwyMSBAQAogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJmlucHV0QnVmZmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIHF1ZXVlIG9yIG90aGVyIHByb2R1Y2VyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOwogICAgIH0KQEAgLTIxMjYsMjYgKzI2NDEsNDEgQEAKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPgogICAgICAgICAgICAgICAgIGdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgIC8vIGVycm9yCiAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycysrOwogICAgIH0KLQotICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgdG90YWxOdW1CdWZmZXJzICs9IHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzOwogCiAgICAgLy8gTG9nIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCBxdWV1ZQogICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYW5kIG5vd2hlcmUgdG8gc2VuZCBlcnJvcnMgdG8sIHNvIGp1c3QgbG9nIGl0CiAgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzKTsKKyAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgLypoYXNJbnB1dCovcmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCk7CisgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldyBpbi1mbGlnaHQgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yMTY4LDYgKzI2OTgsOSBAQAogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU2hvdWxkIG9ubHkgZ2V0IGEgZmFpbHVyZSBoZXJlIGZvciBtYWxmb3JtZWQgcmVxdWVzdHMgb3IgZGV2aWNlLWxldmVsCisgICAgICAgIC8vIGVycm9ycywgc28gY29uc2lkZXIgYWxsIGVycm9ycyBmYXRhbC4gIEJhZCBtZXRhZGF0YSBmYWlsdXJlcyBzaG91bGQKKyAgICAgICAgLy8gY29tZSB0aHJvdWdoIG5vdGlmeS4KICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgJWQgdG8gSEFMIgogICAgICAgICAgICAgICAgICIgZGV2aWNlOiAlcyAoJWQpIiwgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CkBAIC0yMTk2LDIxICsyNzI5LDYgQEAKICAgICB9CiAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAotICAgIC8vIFJldHVybiBpbnB1dCBidWZmZXIgYmFjayB0byBmcmFtZXdvcmsKLSAgICBpZiAocmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQotICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKLSAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcigqKHJlcXVlc3QuaW5wdXRfYnVmZmVyKSk7Ci0gICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQotICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0VGhyZWFkOiBDYW4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKLSAgICAgICAgICAgICAgICAgICAgIiAgaXRzIHN0cmVhbTolcyAoJWQpIiwgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgLy8gVE9ETzogUmVwb3J0IGVycm9yIHVwc3RyZWFtCi0gICAgICAgIH0KLSAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjIyMiw2ICsyNzQwLDcgQEAKICAgICByZXR1cm4gbUxhdGVzdFJlcXVlc3Q7CiB9CiAKKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhblVwRmFpbGVkUmVxdWVzdCgKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAmcmVxdWVzdCwKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZuZXh0UmVxdWVzdCwKQEAgLTIyNjMsNiArMjc4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICsrZmlyc3RSZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy5lbmQoKSk7CiAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHdhaXQgYW55IGxvbmdlcgorCisgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyICsgcmVxdWVzdHMuc2l6ZSgpIC0gMTsKKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjMxNCw2ICsyODM2LDExIEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBpZiAobmV4dFJlcXVlc3QgIT0gTlVMTCkgeworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1GcmFtZU51bWJlcisrOworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCA9IG1DdXJyZW50QWZUcmlnZ2VySWQ7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisgICAgfQogICAgIHJldHVybiBuZXh0UmVxdWVzdDsKIH0KIApAQCAtMjM3NiwxMyArMjkwMywzNCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1UcmlnZ2VyTXV0ZXgpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzOwogICAgIHNpemVfdCBjb3VudCA9IG1UcmlnZ2VyTWFwLnNpemUoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICBSZXF1ZXN0VHJpZ2dlciB0cmlnZ2VyID0gbVRyaWdnZXJNYXAudmFsdWVBdChpKTsKLQogICAgICAgICB1aW50MzJfdCB0YWcgPSB0cmlnZ2VyLm1ldGFkYXRhVGFnOworCisgICAgICAgIGlmICh0YWcgPT0gQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQgfHwgdGFnID09IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lEKSB7CisgICAgICAgICAgICBib29sIGlzQWVUcmlnZ2VyID0gKHRyaWdnZXIubWV0YWRhdGFUYWcgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQpOworICAgICAgICAgICAgdWludDMyX3QgdHJpZ2dlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRyaWdnZXIuZW50cnlWYWx1ZSk7CisgICAgICAgICAgICBpZiAoaXNBZVRyaWdnZXIpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyZW50LT5tRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUcmlnZ2VyIElEIHRhZyBpcyBkZXByZWNhdGVkIHNpbmNlIGRldmljZSBIQUwgMy4yCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKHRhZyk7CiAKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCA0NjhmNjQxLi5lYzZiYmExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC01NCw3ICs1Niw3IEBACiB9CiAKIC8qKgotICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAKKyAqIENhbWVyYURldmljZSBmb3IgSEFMIGRldmljZXMgd2l0aCB2ZXJzaW9uIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIG9yIGhpZ2hlci4KICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKQEAgLTc4LDkgKzgwLDE0IEBACiAKICAgICAvLyBDYXB0dXJlIGFuZCBzZXRTdHJlYW1pbmdSZXF1ZXN0IHdpbGwgY29uZmlndXJlIHN0cmVhbXMgaWYgY3VycmVudGx5IGluCiAgICAgLy8gaWRsZSBzdGF0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKIApAQCAtODgsOCArOTUsNyBAQAogICAgIC8vIElmIGFkZGluZyBzdHJlYW1zIHdoaWxlIGFjdGl2ZWx5IGNhcHR1cmluZywgd2lsbCBwYXVzZSBkZXZpY2UgYmVmb3JlIGFkZGluZwogICAgIC8vIHN0cmVhbSwgcmVjb25maWd1cmluZyBkZXZpY2UsIGFuZCB1bnBhdXNpbmcuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgKmlkKTsKQEAgLTEwOCw2ICsxMTQsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gdGhlIGlkbGUgc3RhdGUgb24gc3VjY2VzcwpAQCAtMTE2LDcgKzEyNCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgd2lsbE5vdGlmeTNBKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyQXV0b2ZvY3VzKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJDYW5jZWxBdXRvZm9jdXModWludDMyX3QgaWQpOwpAQCAtMTI1LDcgKzEzMywxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVzaFJlcHJvY2Vzc0J1ZmZlcihpbnQgcmVwcm9jZXNzU3RyZWFtSWQsCiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKTsKKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKIAogICAgIC8vIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAgICB2b2lkICAgICAgICAgICAgIG5vdGlmeVN0YXR1cyhib29sIGlkbGUpOyAvLyB1cGRhdGVzIGZyb20gU3RhdHVzVHJhY2tlcgpAQCAtMTM3LDYgKzE0OSwxMCBAQAogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtTaHV0ZG93blRpbWVvdXQgICA9IDUwMDAwMDAwMDA7IC8vIDUgc2VjCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0FjdGl2ZVRpbWVvdXQgICAgID0gNTAwMDAwMDAwOyAgLy8gNTAwIG1zCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CisgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCisgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBzdHJlYW0gSUQgd2hlbiBvbmUgZG9lc24ndCBleGlzdAorICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX1NUUkVBTSA9IC0xOwogCiAgICAgLy8gQSBsb2NrIHRvIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBvbiB0aGUgaW5wdXQvY29uZmlndXJlIHNpZGUKICAgICAvLyBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KQEAgLTE1Nyw3ICsxNzMsMTAgQEAKICAgICBjYW1lcmEzX2RldmljZV90ICAgICAgICAgICptSGFsM0RldmljZTsKIAogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1EZXZpY2VJbmZvOwotICAgIHZlbmRvcl90YWdfcXVlcnlfb3BzX3QgICAgIG1WZW5kb3JUYWdPcHM7CisKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbQ0FNRVJBM19URU1QTEFURV9DT1VOVF07CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbjsKIAogICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgU1RBVFVTX0VSUk9SLApAQCAtMTgxLDYgKzIwMCw4IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTdHJlYW1JZDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtTmVlZENvbmZpZzsKIAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1teVN0cmVhbUlkOworCiAgICAgLy8gV2hldGhlciB0byBzZW5kIHN0YXRlIHVwZGF0ZXMgdXBzdHJlYW0KICAgICAvLyBQYXVzZSB3aGVuIGRvaW5nIHRyYW5zcGFyZW50IHJlY29uZmlndXJhdGlvbgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZVN0YXRlTm90aWZ5OwpAQCAtMTg4LDggKzIwOSwxMSBAQAogICAgIC8vIE5lZWQgdG8gaG9sZCBvbiB0byBzdHJlYW0gcmVmZXJlbmNlcyB1bnRpbCBjb25maWd1cmUgY29tcGxldGVzLgogICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiA+IG1EZWxldGVkU3RyZWFtczsKIAotICAgIC8vIFdoZXRoZXIgcXVpcmsgQU5EUk9JRF9RVUlSS1NfVVNFX1BBUlRJQUxfUkVTVUxUIGlzIGVuYWJsZWQKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIEhBTCB3aWxsIHNlbmQgcGFydGlhbCByZXN1bHQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdDsKKworICAgIC8vIE51bWJlciBvZiBwYXJ0aWFsIHJlc3VsdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgSEFMLgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0czsKIAogICAgIC8qKioqIEVuZCBzY29wZSBmb3IgbUxvY2sgKioqKi8KIApAQCAtMTk5LDkgKzIyMywyMCBAQAogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CiAgICAgICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICAgICAgICAgICAgICAgICBtUmVzdWx0RXh0cmFzOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCisgICAgc3RhdHVzX3QgY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOworCisgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKKworICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxhc3QgcmVxdWVzdCBzdWJtaXR0ZWQgdG8gdGhlIGhhbCBieSB0aGUgcmVxdWVzdCB0aHJlYWQuCiAgICAgICoKQEAgLTIzNyw2ICsyNzIsMTMgQEAKICAgICBzdGF0dXNfdCB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsIG5zZWNzX3QgdGltZW91dCk7CiAKICAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB3YWl0VW50aWxEcmFpbmVkLiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZS4KKyAgICAgKgorICAgICAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggbUxvY2sgYW5kIG1JbnRlcmZhY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogRG8gY29tbW9uIHdvcmsgZm9yIHNldHRpbmcgdXAgYSBzdHJlYW1pbmcgb3Igc2luZ2xlIGNhcHR1cmUgcmVxdWVzdC4KICAgICAgKiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gQUNUSVZFIGlmIGluIElETEUuCiAgICAgICovCkBAIC0yNTUsNiArMjk3LDE3IEBACiAgICAgc3RhdHVzX3QgICAgICAgICAgIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEFkZCBhIGR1bW15IHN0cmVhbSB0byB0aGUgY3VycmVudCBzdHJlYW0gc2V0IGFzIGEgd29ya2Fyb3VuZCBmb3IKKyAgICAgKiBub3QgYWxsb3dpbmcgMCBzdHJlYW1zIGluIHRoZSBjYW1lcmEgSEFMIHNwZWMuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBkdW1teSBzdHJlYW0gaWYgdGhlIGN1cnJlbnQgY29uZmlnIGluY2x1ZGVzIHJlYWwgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKworICAgIC8qKgogICAgICAqIFNldCBkZXZpY2UgaW50byBhbiBlcnJvciBzdGF0ZSBkdWUgdG8gc29tZSBmYXRhbCBmYWlsdXJlLCBhbmQgc2V0IGFuCiAgICAgICogZXJyb3IgbWVzc2FnZSB0byBpbmRpY2F0ZSB3aHkuIE9ubHkgdGhlIGZpcnN0IGNhbGwncyBtZXNzYWdlIHdpbGwgYmUKICAgICAgKiB1c2VkLiBUaGUgbWVzc2FnZSBpcyBhbHNvIHNlbnQgdG8gdGhlIGxvZy4KQEAgLTI3MCw2ICszMjMsMTggQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgICAgdHJ5TG9ja1NwaW5SaWdodFJvdW5kKE11dGV4JiBsb2NrKTsKIAorICAgIHN0cnVjdCBTaXplIHsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBpbnQgaGVpZ2h0OworICAgICAgICBTaXplKGludCB3LCBpbnQgaCkgOiB3aWR0aCh3KSwgaGVpZ2h0KGgpe30KKyAgICB9OworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGFyZ2VzdCBKcGVnIHJlc29sdXRpb24gKGluIGFyZWEpCisgICAgICogUmV0dXJuIFNpemUoMCwgMCkgaWYgc3RhdGljIG1ldGF0ZGF0YSBpcyBpbnZhbGlkCisgICAgICovCisgICAgU2l6ZSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0OworCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTI5OCw2ICszNjMsOCBAQAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCiAgICAgICAgICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSk7CiAKKyAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2FsbCBhZnRlciBzdHJlYW0gKHJlKS1jb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZC4KICAgICAgICAgICovCkBAIC0zMDgsMTUgKzM3NSwyMiBAQAogICAgICAgICAgKiBvbiBlaXRoZXIuIFVzZSB3YWl0VW50aWxQYXVzZWQgdG8gd2FpdCB1bnRpbCByZXF1ZXN0IHF1ZXVlCiAgICAgICAgICAqIGhhcyBlbXB0aWVkIG91dC4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzKGNvbnN0IFJlcXVlc3RMaXN0JiByZXF1ZXN0cyk7Ci0gICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCBjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpOworICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmVtb3ZlIGFsbCBxdWV1ZWQgYW5kIHJlcGVhdGluZyByZXF1ZXN0cywgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IGNsZWFyKCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUXVldWUgYSB0cmlnZ2VyIHRvIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgbmV4dCBvdXRnb2luZwpAQCAtMzkxLDEwICs0NjUsMTUgQEAKICAgICAgICAgLy8gUmVsYXkgZXJyb3IgdG8gcGFyZW50IGRldmljZSBvYmplY3Qgc2V0RXJyb3JTdGF0ZQogICAgICAgICB2b2lkICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IHJlcXVlc3QgaXMgaW4gbVJlcGVhdGluZ1JlcXVlc3RzLiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1SZXF1ZXN0TG9jayBob2xkCisgICAgICAgIGJvb2wgaXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0Pik7CisKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gIG1QYXJlbnQ7CiAgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+ICBtU3RhdHVzVHJhY2tlcjsKICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAgKm1IYWwzRGV2aWNlOwogCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICptTGlzdGVuZXI7CisKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgIG1JZDsgICAgICAgLy8gVGhlIGNhbWVyYSBJRAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgbVN0YXR1c0lkOyAvLyBUaGUgUmVxdWVzdFRocmVhZCdzIGNvbXBvbmVudCBJRCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIHRyYWNraW5nCkBAIC00MjksNiArNTA4LDEwIEBACiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlck1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVtb3ZlZE1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVwbGFjZWRNYXA7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOworCisgICAgICAgIGludDY0X3QgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTQzNyw3MSArNTIwLDkwIEBACiAgICAgICovCiAKICAgICBzdHJ1Y3QgSW5GbGlnaHRSZXF1ZXN0IHsKLSAgICAgICAgLy8gYW5kcm9pZC5yZXF1ZXN0LmlkIGZvciB0aGUgcmVxdWVzdAotICAgICAgICBpbnQgICAgIHJlcXVlc3RJZDsKICAgICAgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbC4KICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZXN0YW1wOwogICAgICAgICBpbnQgICAgIHJlcXVlc3RTdGF0dXM7CiAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IGNhbGwgd2l0aCB2YWxpZCBtZXRhZGF0YQogICAgICAgICBib29sICAgIGhhdmVSZXN1bHRNZXRhZGF0YTsKICAgICAgICAgLy8gRGVjcmVtZW50ZWQgYnkgY2FsbHMgdG8gcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCB3aXRoIHZhbGlkIG91dHB1dAotICAgICAgICAvLyBidWZmZXJzCisgICAgICAgIC8vIGFuZCBpbnB1dCBidWZmZXJzCiAgICAgICAgIGludCAgICAgbnVtQnVmZmVyc0xlZnQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAvLyBJZiB0aGlzIHJlcXVlc3QgaGFzIGFueSBpbnB1dCBidWZmZXIKKyAgICAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlcjsKIAotICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmsgb25seQotICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdFF1aXJrSW5GbGlnaHQgeworICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgb25seQorICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdEluRmxpZ2h0IHsKICAgICAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IG9uY2UgM0EgaGFzIGJlZW4gc2VudCB0byBjbGllbnRzCiAgICAgICAgICAgICBib29sICAgIGhhdmVTZW50M0E7CiAgICAgICAgICAgICAvLyBSZXN1bHQgbWV0YWRhdGEgY29sbGVjdGVkIHNvIGZhciwgd2hlbiBwYXJ0aWFsIHJlc3VsdHMgYXJlIGluIHVzZQogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUmVzdWx0OwogCi0gICAgICAgICAgICBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCgpOgorICAgICAgICAgICAgUGFydGlhbFJlc3VsdEluRmxpZ2h0KCk6CiAgICAgICAgICAgICAgICAgICAgIGhhdmVTZW50M0EoZmFsc2UpIHsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBwYXJ0aWFsUmVzdWx0UXVpcms7CisgICAgICAgIH0gcGFydGlhbFJlc3VsdDsKIAogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6Ci0gICAgICAgICAgICAgICAgcmVxdWVzdElkKDApLAogICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewogICAgICAgICB9CiAKLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBpZCwgaW50IG51bUJ1ZmZlcnMpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoaWQpLAorICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMpIDoKICAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAogICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycykgeworICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKICAgICAgICAgfQotICAgIH07CisKKyAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcykgOgorICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCisgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCisgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CisgICAgICAgIH0KKworICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0KSA6CisgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKKyAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KXsKKyAgICAgICAgfQorfTsKICAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gdGhlIGluLWZsaWdodCByZXF1ZXN0IHN0YXRlCiAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW5GbGlnaHRSZXF1ZXN0PiBJbkZsaWdodE1hcDsKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TG9jazsgLy8gUHJvdGVjdHMgbUluRmxpZ2h0TWFwCiAgICAgSW5GbGlnaHRNYXAgICAgICAgICAgICBtSW5GbGlnaHRNYXA7CiAKLSAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzKTsKKyAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCk7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrLCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKKyAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0LCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKICAgICAgKiBhbmQgaWYgc28sIHF1ZXVlIHVwIDNBLW9ubHkgcmVzdWx0IHRvIHRoZSBjbGllbnQuIFJldHVybnMgdHJ1ZSBpZiAzQQogICAgICAqIGlzIHNlbnQuCiAgICAgICovCi0gICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUXVpcmsoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCk7CisgICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUmVzdWx0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIDNBIG1ldGFkYXRhIGludG8gdG8vZnJvbSBwYXJ0aWFsIHJlc3VsdHMKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgZ2V0M0FSZXN1bHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBib29sIGluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhICZyZXN1bHQsIGludDMyX3QgdGFnLCBjb25zdCBUKiB2YWx1ZSwKLSAgICAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogICAgIC8qKgogICAgICAqIFRyYWNraW5nIGZvciBpZGxlIGRldGVjdGlvbgogICAgICAqLwpAQCAtNTE4LDcgKzYyMCw3IEBACiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcjsKLSAgICBMaXN0PENhbWVyYU1ldGFkYXRhPiAgIG1SZXN1bHRRdWV1ZTsKKyAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAgKm1MaXN0ZW5lcjsKIApAQCAtNTMxLDYgKzYzMywxMiBAQAogCiAgICAgdm9pZCBub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpOwogCisgICAgLy8gU3BlY2lmaWMgbm90aWZ5IGhhbmRsZXJzCisgICAgdm9pZCBub3RpZnlFcnJvcihjb25zdCBjYW1lcmEzX2Vycm9yX21zZ190ICZtc2csCisgICAgICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisKICAgICAvKioKICAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1NmIwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUR1bW15U3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkNhbWVyYTNEdW1teVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6CisgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCkgeworCit9CisKK0NhbWVyYTNEdW1teVN0cmVhbTo6fkNhbWVyYTNEdW1teVN0cmVhbSgpIHsKKworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcHJvZHVjZSBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAorICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIENhbWVyYTNEdW1teVN0cmVhbTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICAodm9pZCkgYXJnczsKKyAgICBTdHJpbmc4IGxpbmVzOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IER1bW15XG4iLCBtSWQpOworICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKKworICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvLyBEbyBub3RoaW5nCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgeworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKKyAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0lOX0NPTkZJRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CisgICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7CisgICAgcmV0dXJuIE9LOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MjYyMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgIkNhbWVyYTNJT1N0cmVhbUJhc2UuaCIKKyNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoqCisgKiBBIGR1bW15IG91dHB1dCBzdHJlYW0gY2xhc3MsIHRvIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciB3aGVuIG5vIHZhbGlkCisgKiBzdHJlYW1zIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbWVyYSBIQUwgdjMuMiBvciBvbGRlciBkaXNhbGxvdyBjb25maWd1cmluZworICogMCBvdXRwdXQgc3RyZWFtcywgd2hpbGUgdGhlIHB1YmxpYyBjYW1lcmEyIEFQSSBhbGxvd3MgZm9yIGl0LgorICovCitjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0gOgorICAgICAgICBwdWJsaWMgQ2FtZXJhM0lPU3RyZWFtQmFzZSwKKyAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UgeworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgYSBkdW1teSBzdHJlYW07IGRvZXNuJ3QgYWN0dWFsbHkgY29ubmVjdCB0byBhbnl0aGluZywgYW5kIHVzZXMKKyAgICAgKiBhIGRlZmF1bHQgZHVtbXkgZm9ybWF0IGFuZCBzaXplLgorICAgICAqLworICAgIENhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpOworCisgICAgdmlydHVhbCB+Q2FtZXJhM0R1bW15U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQorICAgICAqLworCisgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICBwcml2YXRlOgorCisgICAgLy8gRGVmYXVsdCBkdW1teSBwYXJhbWV0ZXJzOyAzMjB4MjQwIGlzIGEgcmVxdWlyZWQgc2l6ZSBmb3IgYWxsIGRldmljZXMsCisgICAgLy8gb3RoZXJ3aXNlIGFjdCBsaWtlIGEgU3VyZmFjZVZpZXcgd291bGQuCisgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9XSURUSCA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0hFSUdIVCA9IDI0MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworCit9OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggZDY2MmNjMi4uY2M2NjQ1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0zNCw3ICszNCw4IEBACiAgICAgICAgIENhbWVyYTNTdHJlYW0oaWQsIHR5cGUsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0KSwKICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQoMCksCi0gICAgICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50KDApLAorICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQoMCksCisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQoMCksCiAgICAgICAgIG1GcmFtZUNvdW50KDApLAogICAgICAgICBtTGFzdFRpbWVzdGFtcCgwKSB7CiAKQEAgLTU1LDggKzU2LDggQEAKICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBtQ29tYmluZWRGZW5jZS0+Z2V0U2lnbmFsVGltZSgpOwogICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBIYXMgJXp1IG91dHN0YW5kaW5nIGJ1ZmZlcnMsIgogICAgICAgICAgICAgIiBidWZmZXIgc2lnbmFsIHRpbWUgaXMgJSIgUFJJZDY0LAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID4gMCB8fCBzaWduYWxUaW1lID09IElOVDY0X01BWCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzUsNyArNzYsNyBAQAogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCi0gICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCwgbURlcXVldWVkQnVmZmVyQ291bnQpOworICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQogCkBAIC0xMDQsNiArMTA1LDE0IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OworfQorCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgLSBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX0lOX1JFQ09ORklHOgpAQCAtMTE3LDkgKzEyNiw5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVOT1RDT05OOwogICAgIH0KIAotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDApIHsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID4gMCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbid0IGRpc2Nvbm5lY3Qgd2l0aCAlenUgYnVmZmVycyBzdGlsbCBkZXF1ZXVlZCEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURlcXVldWVkQnVmZmVyQ291bnQpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTMwLDcgKzEzOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVGZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZWFzZUZlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCkgewogICAgIC8qKgogICAgICAqIE5vdGUgdGhhdCBhbGwgZmVuY2VzIGFyZSBub3cgb3duZWQgYnkgSEFMLgogICAgICAqLwpAQCAtMTQ0LDE0ICsxNTQsMjUgQEAKICAgICBidWZmZXIuc3RhdHVzID0gc3RhdHVzOwogCiAgICAgLy8gSW5mb3JtIHRyYWNrZXIgYWJvdXQgYmVjb21pbmcgYnVzeQotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgogICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycworICAgICAgICAgKiBiZWZvcmUvYWZ0ZXIgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgZHVyaW5nIGluaXRpYWwgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBvciByZS1jb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGNoZWNrcyBvbmx5IG1ha2Ugc2Vuc2UgZm9yIDxIQUwzLjIKKyAgICAgICAgICovCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobVN0YXR1c0lkKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCsrOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCsrOworCisgICAgaWYgKG91dHB1dCkgeworICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50Kys7CisgICAgfQogfQogCiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRCdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0IHsKQEAgLTE2MywxNSArMTg0LDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIC8vIE9ubHkgbGltaXQgZGVxdWV1ZSBhbW91bnQgd2hlbiBmdWxseSBjb25maWd1cmVkCi0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEICYmCi0gICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEFscmVhZHkgZGVxdWV1ZWQgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIgotICAgICAgICAgICAgICAgICIgYnVmZmVycyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTgzLDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IE5vIGJ1ZmZlcnMgb3V0c3RhbmRpbmcgdG8gcmV0dXJuIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIG1JZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTIyMSw5ICsyMzMsMjAgQEAKICAgICAgICAgbUNvbWJpbmVkRmVuY2UgPSBGZW5jZTo6bWVyZ2UobU5hbWUsIG1Db21iaW5lZEZlbmNlLCByZWxlYXNlRmVuY2UpOwogICAgIH0KIAotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50LS07Ci0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgorICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudC0tOworICAgIH0KKworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudC0tOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCiAgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF2b2lkIGEgc3B1cmlvdXMgSURMRS0+QUNUSVZFLT5JRExFIHRyYW5zaXRpb24gd2hlbiB1c2luZyBidWZmZXJzCisgICAgICAgICAqIGJlZm9yZS9hZnRlciByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBkdXJpbmcgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBmb3IgPEhBTDMuMgorICAgICAgICAgKi8KICAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEFsbCBidWZmZXJzIHJldHVybmVkOyBub3cgaWRsZSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBtSWQpOwogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCBmY2I5ZDA0Li5hMzVjMjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtNDgsNyArNDgsMTAgQEAKICAgcHJvdGVjdGVkOgogICAgIHNpemVfdCAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50OwogICAgIC8vIHN1bSBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdGhhdCBhcmUgY3VycmVudGx5IGFjcXVpcmVkIGJ5IEhBTAotICAgIHNpemVfdCAgICAgICAgICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50OworICAgIHNpemVfdCAgICAgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudDsKKyAgICAvLyBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnMgdGhhdCBhcmUgY3VycmVudGx5IGFjcXVpcmVkIGJ5IEhBTC4gVGhpcyB3aWxsIGJlCisgICAgLy8gUmVkdW5kYW50IHdoZW4gY2FtZXJhMyBzdHJlYW1zIGFyZSBubyBsb25nZXIgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLgorICAgIHNpemVfdCAgICAgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7CiAgICAgQ29uZGl0aW9uICAgICAgICAgbUJ1ZmZlclJldHVybmVkU2lnbmFsOwogICAgIHVpbnQzMl90ICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgIC8vIExhc3QgcmVjZWl2ZWQgb3V0cHV0IGJ1ZmZlcidzIHRpbWVzdGFtcApAQCAtNzYsNiArNzksMTAgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAorICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CiAKICAgICBzdGF0dXNfdCBnZXRCdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0OwpAQCAtOTIsNyArOTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVfZmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlX2ZlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0KTsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM0lPU3RyZWFtQmFzZQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggNWFhOWEzZS4uMzE5YmUxZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtODEsNyArODEsNyBAQAogICAgICAqIGluIHdoaWNoIGNhc2Ugd2UgcmVhc3NpZ24gaXQgdG8gYWNxdWlyZV9mZW5jZQogICAgICAqLwogICAgIGhhbmRvdXRCdWZmZXJMb2NrZWQoKmJ1ZmZlciwgJihhbmItPmhhbmRsZSksIC8qYWNxdWlyZUZlbmNlKi9mZW5jZUZkLAotICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spOworICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki9mYWxzZSk7CiAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soYnVmZmVySXRlbSk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xOTksMTQgKzE5OSwzNiBAQAogICAgIGFzc2VydChtTWF4U2l6ZSA9PSAwKTsKICAgICBhc3NlcnQoY2FtZXJhM19zdHJlYW06OmZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0JMT0IpOwogCi0gICAgbVRvdGFsQnVmZmVyQ291bnQgPSBCdWZmZXJRdWV1ZTo6TUlOX1VOREVRVUVVRURfQlVGRkVSUyArCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQgPSAwOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogCiAgICAgaWYgKG1Db25zdW1lci5nZXQoKSA9PSAwKSB7Ci0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGJxLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKworICAgICAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPSAwOworICAgICAgICByZXMgPSBwcm9kdWNlci0+cXVlcnkoTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1pblVuZGVxdWV1ZWRCdWZmZXJzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENvdWxkIG5vdCBxdWVyeSBtaW4gdW5kZXF1ZXVlZCBidWZmZXJzIChlcnJvciAlZCwgYnVmQ291bnQgJWQpIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCByZXMsIG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG1pbkJ1ZnMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgcHJvbWlzZSBuZXZlciB0byAnYWNxdWlyZScgbW9yZSB0aGFuIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycworICAgICAgICAgKiBhdCBhbnkgb25lIHRpbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEJvb3N0IHRoZSBudW1iZXIgdXAgdG8gbWVldCB0aGUgbWluaW11bSByZXF1aXJlZCBidWZmZXIgY291bnQuCisgICAgICAgICAqCisgICAgICAgICAqIChOb3RlIHRoYXQgdGhpcyBzZXRzIGNvbnN1bWVyLXNpZGUgYnVmZmVyIGNvdW50IG9ubHksCisgICAgICAgICAqIGFuZCBub3QgdGhlIHN1bSBvZiBwcm9kdWNlcitjb25zdW1lciBzaWRlIGFzIGluIG90aGVyIGNhbWVyYSBzdHJlYW1zKS4KKyAgICAgICAgICovCisgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID4gbWluQnVmcyA/CisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgOiBtaW5CdWZzOworICAgICAgICAvLyBUT0RPOiBzb21laG93IHNldCB0aGUgdG90YWwgYnVmZmVyIGNvdW50IHdoZW4gcHJvZHVjZXIgY29ubmVjdHM/CisKKyAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwgY2FtZXJhM19zdHJlYW06OnVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhMy1JbnB1dFN0cmVhbS0lZCIsIG1JZCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDY4MWQ2ODQuLmFlNDk0NjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNDQsNiArNDQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CiAKKyAgICAvLyBUT0RPOiBleHBvc2UgYW4gaW50ZXJmYWNlIHRvIGdldCB0aGUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorCiAgIHByaXZhdGU6CiAKICAgICB0eXBlZGVmIEJ1ZmZlckl0ZW1Db25zdW1lcjo6QnVmZmVySXRlbSBCdWZmZXJJdGVtOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggNjgyNzU1ZC4uNzdhZDUwMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0zNyw3ICszNyw4IEBACiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCi0gICAgICAgIG1UcmFuc2Zvcm0oMCkgeworICAgICAgICBtVHJhbnNmb3JtKDApLAorICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSB7CiAKICAgICBpZiAobUNvbnN1bWVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb25zdW1lciBpcyBOVUxMISIsIF9fRlVOQ1RJT05fXyk7CkBAIC01MSw3ICs1Miw4IEBACiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAotICAgICAgICBtVHJhbnNmb3JtKDApIHsKKyAgICAgICAgbVRyYW5zZm9ybSgwKSwKKyAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSkgewogCiAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0IGZvciBzaXplLW9ubHkgc3RyZWFtOiAlZCIsIF9fRlVOQ1RJT05fXywKQEAgLTExOSw3ICsxMjEsNyBAQAogICAgICAqIGluIHdoaWNoIGNhc2Ugd2UgcmVhc3NpZ24gaXQgdG8gYWNxdWlyZV9mZW5jZQogICAgICAqLwogICAgIGhhbmRvdXRCdWZmZXJMb2NrZWQoKmJ1ZmZlciwgJihhbmItPmhhbmRsZSksIC8qYWNxdWlyZUZlbmNlKi9mZW5jZUZkLAotICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spOworICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki90cnVlKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIwMiw2ICsyMDQsMTUgQEAKICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtVHJhY2VGaXJzdEJ1ZmZlciAmJiAoc3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fT1VUUFVUKSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VMb2dbNDhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKHRyYWNlTG9nLCBzaXplb2YodHJhY2VMb2cpLCAiU3RyZWFtICVkOiBmaXJzdCBmdWxsIGJ1ZmZlclxuIiwgbUlkKTsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSh0cmFjZUxvZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgcmVzID0gY3VycmVudENvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKGJ1ZmZlci5idWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIsIGhhbmRsZSksCiAgICAgICAgICAgICAgICAgYW53UmVsZWFzZUZlbmNlKTsKQEAgLTI1Nyw2ICsyNjgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y29uZmlndXJlUXVldWVMb2NrZWQoKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCisgICAgbVRyYWNlRmlyc3RCdWZmZXIgPSB0cnVlOwogICAgIGlmICgocmVzID0gQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Y29uZmlndXJlUXVldWVMb2NrZWQoKSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC0yODksMjAgKzMwMSwyNSBAQAogCiAgICAgaWYgKG1NYXhTaXplID09IDApIHsKICAgICAgICAgLy8gRm9yIGJ1ZmZlcnMgb2Yga25vd24gc2l6ZQotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1Db25zdW1lci5nZXQoKSwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGb3IgYnVmZmVycyB3aXRoIGJvdW5kZWQgc2l6ZQotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1Db25zdW1lci5nZXQoKSwKLSAgICAgICAgICAgICAgICBtTWF4U2l6ZSwgMSwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgICAgICBtTWF4U2l6ZSwgMSk7CiAgICAgfQogICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZ2VvbWV0cnkiCi0gICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBmb3JtYXQgJXggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGRpbWVuc2lvbnMiCisgICAgICAgICAgICAgICAgIiAlZCB4ICVkIChtYXhTaXplICV6dSkgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgbUlkKTsKKyAgICAgICAgICAgICAgICBtTWF4U2l6ZSwgbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgJSN4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgbUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKQEAgLTMyNCw3ICszNDEsNyBAQAogICAgIH0KIAogICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gbWF4Q29uc3VtZXJCdWZmZXJzICsgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzOwotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKICAgICBtTGFzdFRpbWVzdGFtcCA9IDA7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggNmNiYjlmNC4uYmUyNzhjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTc2LDEyICs3NiwxNiBAQAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisKICAgICBzcDxBTmF0aXZlV2luZG93PiBtQ29uc3VtZXI7CiAgIHByaXZhdGU6CiAgICAgaW50ICAgICAgICAgICAgICAgbVRyYW5zZm9ybTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgIHNldFRyYW5zZm9ybUxvY2tlZChpbnQgdHJhbnNmb3JtKTsKIAorICAgIGJvb2wgbVRyYWNlRmlyc3RCdWZmZXI7CisKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwpAQCAtOTEsNyArOTUsNiBAQAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDcwNDA2ZjEuLjNjMGU5MDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvU3RhdHVzVHJhY2tlci5oIgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CkBAIC0xMzcsNiArMTM5LDcgQEAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0NPTlNUUlVDVEVEKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOX0NPTkZJRzsKICAgICB9IGVsc2UgeyAvLyBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRAorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVELCAiSW52YWxpZCBzdGF0ZTogMHgleCIsIG1TdGF0ZSk7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOX1JFQ09ORklHOwogICAgIH0KIApAQCAtMjA2LDExICsyMDksNjEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpjYW5jZWxDb25maWd1cmF0aW9uKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6CisgICAgICAgICAgICBBTE9HRSgiJXM6IEluIGVycm9yIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBTVEFURV9JTl9DT05GSUc6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CisgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfQ09OU1RSVUNURUQ6CisgICAgICAgIGNhc2UgU1RBVEVfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGNhbmNlbCBjb25maWd1cmF0aW9uIHRoYXQgaGFzbid0IGJlZW4gc3RhcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RhdGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSA9IG9sZFVzYWdlOworICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9IG9sZE1heEJ1ZmZlcnM7CisKKyAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0NPTkZJR1VSRUQgOiBTVEFURV9DT05TVFJVQ1RFRDsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCisgICAgaWYgKGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgeworICAgICAgICBBTE9HVigiJXM6IEFscmVhZHkgZGVxdWV1ZWQgbWF4IG91dHB1dCBidWZmZXJzICglZCksIHdhaXQgZm9yIG5leHQgcmV0dXJuZWQgb25lLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICByZXMgPSBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXQgZm9yIG91dHB1dCBidWZmZXIgcmV0dXJuIHRpbWVkIG91dCBhZnRlciAlbGxkbXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uIC8gMTAwMDAwMExMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBnZXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoKmJ1ZmZlciwgLyphY3F1aXJlZCovdHJ1ZSwgLypvdXRwdXQqL3RydWUpOwogICAgIH0KQEAgLTIyMyw5ICsyNzYsMTggQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIC8qKgorICAgICAqIFRPRE86IENoZWNrIHRoYXQgdGhlIHN0YXRlIGlzIHZhbGlkIGZpcnN0LgorICAgICAqCisgICAgICogPEhBTDMuMiBJTl9DT05GSUcgYW5kIElOX1JFQ09ORklHIGluIGFkZGl0aW9uIHRvIENPTkZJR1VSRUQuCisgICAgICogPj0gSEFMMy4yIENPTkZJR1VSRUQgb25seQorICAgICAqCisgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCisgICAgICovCiAgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOworICAgICAgICBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWwuc2lnbmFsKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKQEAgLTIzNCw4ICsyOTYsMzAgQEAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldElucHV0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRJbnB1dEJ1ZmZlckxvY2tlZChidWZmZXIpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgorICAgIGlmIChnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgeworICAgICAgICBBTE9HVigiJXM6IEFscmVhZHkgZGVxdWV1ZWQgbWF4IGlucHV0IGJ1ZmZlcnMgKCVkKSwgd2FpdCBmb3IgbmV4dCByZXR1cm5lZCBvbmUuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgIHJlcyA9IG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBpbnB1dCBidWZmZXIgcmV0dXJuIHRpbWVkIG91dCBhZnRlciAlbGxkbXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uIC8gMTAwMDAwMExMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPSBnZXRJbnB1dEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgqYnVmZmVyLCAvKmFjcXVpcmVkKi90cnVlLCAvKm91dHB1dCovZmFsc2UpOwogICAgIH0KQEAgLTI1MCw2ICszMzQsNyBAQAogICAgIHN0YXR1c190IHJlcyA9IHJldHVybklucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki9mYWxzZSk7CisgICAgICAgIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQpAQCAtMzE0LDEyICszOTksMzUgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmVnaXN0ZXJCdWZmZXJzTG9ja2VkKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIC8qKgorICAgICAqID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAqCisgICAgICogY2FtZXJhM19kZXZpY2VfdC0+b3BzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycygpIGlzIG5vdCBjYWxsZWQgYW5kIG11c3QKKyAgICAgKiBiZSBOVUxMLgorICAgICAqLworICAgIGlmIChoYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBBTE9HVigiJXM6IHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIHVudXNlZCBhcyBvZiBIQUwzLjIiLCBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIGlmIChoYWwzRGV2aWNlLT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgaXMgZGVwcmVjYXRlZCBpbiBIQUwzLjI7ICIKKyAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc2V0IHRvIE5VTEwgaW4gY2FtZXJhM19kZXZpY2U6Om9wcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiJXM6IFNraXBwaW5nIE5VTEwgY2hlY2sgZm9yIGRlcHJlY2F0ZWQgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgdXNpbmcgZGVwcmVjYXRlZCBjb2RlIHBhdGgiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKwogICAgIHN0YXR1c190IHJlczsKIAogICAgIHNpemVfdCBidWZmZXJDb3VudCA9IGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKICAgICBWZWN0b3I8YnVmZmVyX2hhbmRsZV90Kj4gYnVmZmVyczsKLSAgICBidWZmZXJzLmluc2VydEF0KE5VTEwsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICBidWZmZXJzLmluc2VydEF0KC8qcHJvdG90eXBlX2l0ZW0qL05VTEwsIC8qaW5kZXgqLzAsIGJ1ZmZlckNvdW50KTsKIAogICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl9zZXQgYnVmZmVyU2V0ID0gY2FtZXJhM19zdHJlYW1fYnVmZmVyX3NldCgpOwogICAgIGJ1ZmZlclNldC5zdHJlYW0gPSB0aGlzOwpAQCAtMzI3LDcgKzQzNSw3IEBACiAgICAgYnVmZmVyU2V0LmJ1ZmZlcnMgPSBidWZmZXJzLmVkaXRBcnJheSgpOwogCiAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBzdHJlYW1CdWZmZXJzOwotICAgIHN0cmVhbUJ1ZmZlcnMuaW5zZXJ0QXQoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QoKSwgMCwgYnVmZmVyQ291bnQpOworICAgIHN0cmVhbUJ1ZmZlcnMuaW5zZXJ0QXQoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QoKSwgLyppbmRleCovMCwgYnVmZmVyQ291bnQpOwogCiAgICAgLy8gUmVnaXN0ZXIgYWxsIGJ1ZmZlcnMgd2l0aCB0aGUgSEFMLiBUaGlzIG1lYW5zIGdldHRpbmcgYWxsIHRoZSBidWZmZXJzCiAgICAgLy8gZnJvbSB0aGUgc3RyZWFtLCBwcm92aWRpbmcgdGhlbSB0byB0aGUgSEFMIHdpdGggdGhlCkBAIC0zOTQsNiArNTAyLDE4IEBACiB2b2lkIENhbWVyYTNTdHJlYW06OmFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuYmVnaW4oKSwgZW5kID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5lbmQoKTsKKyAgICAgICAgIGl0ICE9IGVuZDsKKyAgICAgICAgICkgeworICAgICAgICBpZiAoKml0ID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeSB0byBhZGQgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UsIGlnbm9yaW5nLi4uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKwogICAgIG1CdWZmZXJMaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCA2ZWViNzIxLi5kMGUxMzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtODIsNiArODIsMjMgQEAKICAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX0NPTlNUUlVDVEVEOgogICogICAgICAgIFdoZW4gZGlzY29ubmVjdCgpIGlzIGNhbGxlZCBhZnRlciBtYWtpbmcgc3VyZSBzdHJlYW0gaXMgaWRsZSB3aXRoCiAgKiAgICAgICAgd2FpdFVudGlsSWRsZSgpLgorICoKKyAqIFN0YXR1cyBUcmFja2luZzoKKyAqICAgIEVhY2ggc3RyZWFtIGlzIHRyYWNrZWQgYnkgU3RhdHVzVHJhY2tlciBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCwKKyAqICAgIGRlcGVuZGluZyBvbiB0aGUgaGFuZGVkIG91dCBidWZmZXIgY291bnQuIFRoZSBzdGF0ZSBtdXN0IGJlIFNUQVRFX0NPTkZJR1VSRUQKKyAqICAgIGluIG9yZGVyIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIG1hcmtlZC4KKyAqCisgKiAgICBJdCdzIG1hcmtlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisgKgorICogICAgLSBBQ1RJVkU6IE9uZSBvciBtb3JlIGJ1ZmZlcnMgaGF2ZSBiZWVuIGhhbmRlZCBvdXQgKHdpdGggI2dldEJ1ZmZlcikuCisgKiAgICAtIElETEU6IEFsbCBidWZmZXJzIGhhdmUgYmVlbiByZXR1cm5lZCAod2l0aCAjcmV0dXJuQnVmZmVyKSwgYW5kIHRoZWlyCisgKiAgICAgICAgICByZXNwZWN0aXZlIHJlbGVhc2VfZmVuY2UocykgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICoKKyAqICAgIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyBvdXRwdXQgc3RyZWFtcy4gV2hlbiB0aGUgSEFMIGhhcyBhbnkgYnVmZmVycworICogICAgZGVxdWV1ZWQsIHRoZSBzdHJlYW0gaXMgbWFya2VkIEFDVElWRS4gV2hlbiB0aGUgSEFMIHJldHVybnMgYWxsIGJ1ZmZlcnMKKyAqICAgIChlLmcuIGlmIG5vIGNhcHR1cmUgcmVxdWVzdHMgYXJlIGFjdGl2ZSksIHRoZSBzdHJlYW0gaXMgbWFya2VkIElETEUuCisgKiAgICBJbiB0aGlzIHVzZSBjYXNlLCB0aGUgYXBwIGNvbnN1bWVyIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcG9uZW50IHN0YXR1cy4KKyAqCiAgKi8KIGNsYXNzIENhbWVyYTNTdHJlYW0gOgogICAgICAgICBwcm90ZWN0ZWQgY2FtZXJhM19zdHJlYW0sCkBAIC0xNDIsNiArMTU5LDEzIEBACiAgICAgc3RhdHVzX3QgICAgICAgICBmaW5pc2hDb25maWd1cmF0aW9uKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKTsKIAogICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFRoaXMgcmV0dXJucyB0aGUgc3RyZWFtIHRvIHRoZQorICAgICAqIGluaXRpYWwgc3RhdGUsIGFsbG93aW5nIGl0IHRvIGJlIGNvbmZpZ3VyZWQgYWdhaW4gbGF0ZXIuCisgICAgICogVGhpcyBpcyBkb25lIGlmIHRoZSBIQUwgcmVqZWN0cyB0aGUgcHJvcG9zZWQgY29tYmluZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIGNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKQEAgLTIwOSw4ICsyMzMsMTcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gQWRkaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlIGhhcworICAgICAqIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIGFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gUmVtb3ZpbmcgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UKKyAgICAgKiBvciB0aGUgbGlzdGVuZXIgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgaGFzIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIHJlbW92ZUJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiYgbGlzdGVuZXIpOwogCkBAIC0yNjIsNiArMjk1LDEyIEBACiAgICAgLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcXVldWUKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCisgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKworICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CkBAIC0yNzQsNiArMzEzLDkgQEAKICAgcHJpdmF0ZToKICAgICB1aW50MzJfdCBvbGRVc2FnZTsKICAgICB1aW50MzJfdCBvbGRNYXhCdWZmZXJzOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIC8vIEdldHMgYWxsIGJ1ZmZlcnMgZnJvbSBlbmRwb2ludCBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgSEFMLgogICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGM5M2FlMTUuLmRhOTg5Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC04Miw2ICs4MiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluaXNoQ29uZmlndXJhdGlvbihjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCisgICAgICogaW5pdGlhbCBzdGF0ZSwgYWxsb3dpbmcgaXQgdG8gYmUgY29uZmlndXJlZCBhZ2FpbiBsYXRlci4KKyAgICAgKiBUaGlzIGlzIGRvbmUgaWYgdGhlIEhBTCByZWplY3RzIHRoZSBwcm9wb3NlZCBjb21iaW5lZCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsQ29uZmlndXJhdGlvbigpID0gMDsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCmluZGV4IDQ0ZDgxODguLjgxMzMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcApAQCAtMTExLDE1ICsxMTEsMTcgQEAKIH0gLy8gbmFtZXNwYWNlIGFub255bW91cwogCiBDYW1lcmEzWnNsU3RyZWFtOjpDYW1lcmEzWnNsU3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgaW50IGRlcHRoKSA6CisgICAgICAgIGludCBidWZmZXJDb3VudCkgOgogICAgICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGlkLCBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSwKLSAgICAgICAgbURlcHRoKGRlcHRoKSB7CisgICAgICAgIG1EZXB0aChidWZmZXJDb3VudCkgewogCi0gICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbVByb2R1Y2VyID0gbmV3IFJpbmdCdWZmZXJDb25zdW1lcihicSwgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLCBkZXB0aCk7Ci0gICAgbUNvbnN1bWVyID0gbmV3IFN1cmZhY2UoYnEpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbVByb2R1Y2VyID0gbmV3IFJpbmdCdWZmZXJDb25zdW1lcihjb25zdW1lciwgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLCBidWZmZXJDb3VudCk7CisgICAgbUNvbnN1bWVyID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogfQogCiBDYW1lcmEzWnNsU3RyZWFtOjp+Q2FtZXJhM1pzbFN0cmVhbSgpIHsKQEAgLTE3NCw3ICsxNzYsNyBAQAogICAgICAqIGluIHdoaWNoIGNhc2Ugd2UgcmVhc3NpZ24gaXQgdG8gYWNxdWlyZV9mZW5jZQogICAgICAqLwogICAgIGhhbmRvdXRCdWZmZXJMb2NrZWQoKmJ1ZmZlciwgJihhbmItPmhhbmRsZSksIC8qYWNxdWlyZUZlbmNlKi9mZW5jZUZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL2ZhbHNlKTsKIAogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCkBAIC0yOTgsNiArMzAwLDcgQEAKICAgICBuc2Vjc190IGFjdHVhbCA9IHBpbm5lZEJ1ZmZlci0+Z2V0QnVmZmVySXRlbSgpLm1UaW1lc3RhbXA7CiAKICAgICBpZiAoYWN0dWFsICE9IHRpbWVzdGFtcCkgeworICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIHByb2JsZW1hdGljLCB3ZSdsbCBlbmQgdXAgd2l0aCB1c2luZyB3cm9uZyByZXN1bHQgZm9yIHRoaXMgcGlubmVkIGJ1ZmZlci4KICAgICAgICAgQUxPR1coIiVzOiBaU0wgYnVmZmVyIGNhbmRpZGF0ZSBzZWFyY2ggZGlkbid0IGZpbmQgYW4gZXhhY3QgbWF0Y2ggLS0iCiAgICAgICAgICAgICAgICIgcmVxdWVzdGVkIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCAiLCBhY3R1YWwgdGltZXN0YW1wID0gJSIgUFJJZDY0LAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcCwgYWN0dWFsKTsKQEAgLTMxMiwxNCArMzE1LDI4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlcigpIHsKK3N0YXR1c190IENhbWVyYTNac2xTdHJlYW06OmNsZWFySW5wdXRSaW5nQnVmZmVyKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAorICAgIHJldHVybiBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChsYXRlc3RUaW1lc3RhbXApOworfQorCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApIHsKKworICAgIGlmIChsYXRlc3RUaW1lc3RhbXApIHsKKyAgICAgICAgKmxhdGVzdFRpbWVzdGFtcCA9IG1Qcm9kdWNlci0+Z2V0TGF0ZXN0VGltZXN0YW1wKCk7CisgICAgfQogICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVByb2R1Y2VyLT5jbGVhcigpOwogfQogCitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKE5VTEwpOworCisgICAgcmV0dXJuIENhbWVyYTNPdXRwdXRTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6c2V0VHJhbnNmb3JtKGludCAvKnRyYW5zZm9ybSovKSB7CiAgICAgQUxPR1YoIiVzOiBOb3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKaW5kZXggYzdmNDQ5MC4uNTMyM2E0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmgKQEAgLTM3LDEwICszNywxMCBAQAogICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbSB7CiAgIHB1YmxpYzoKICAgICAvKioKLSAgICAgKiBTZXQgdXAgYSBaU0wgc3RyZWFtIG9mIGEgZ2l2ZW4gcmVzb2x1dGlvbi4gRGVwdGggaXMgdGhlIG51bWJlciBvZiBidWZmZXJzCisgICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIGJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycwogICAgICAqIGNhY2hlZCB3aXRoaW4gdGhlIHN0cmVhbSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZm9yIGlucHV0LgogICAgICAqLwotICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZGVwdGgpOworICAgIENhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgYnVmZmVyQ291bnQpOwogICAgIH5DYW1lcmEzWnNsU3RyZWFtKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKQEAgLTU5LDggKzU5LDEwIEBACiAKICAgICAvKioKICAgICAgKiBDbGVhcnMgdGhlIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBlbnF1ZXVlSW5wdXRCdWZmZXJCeVRpbWVzdGFtcAorICAgICAqIGxhdGVzdFRpbWVzdGFtcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBsYXJnZXN0IHRpbWVzdGFtcCBvZiBidWZmZXJzCisgICAgICogYmVpbmcgY2xlYXJlZCwgMCBpZiB0aGVyZSBpcyBubyBidWZmZXIgYmVpbmcgY2xlYXIuCiAgICAgICovCi0gICAgc3RhdHVzX3QgY2xlYXJJbnB1dFJpbmdCdWZmZXIoKTsKKyAgICBzdGF0dXNfdCBjbGVhcklucHV0UmluZ0J1ZmZlcihuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApOwogCiAgIHByb3RlY3RlZDoKIApAQCAtOTYsNiArOTgsMTIgQEAKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOworCisgICAgLy8gRGlzY29ubmV0IHRoZSBDYW1lcmEzWnNsU3RyZWFtIHNwZWNpZmljIGJ1ZmZlclF1ZXVlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICAgIHN0YXR1c190IGNsZWFySW5wdXRSaW5nQnVmZmVyTG9ja2VkKG5zZWNzX3QqIGxhdGVzdFRpbWVzdGFtcCk7CisKIH07IC8vIGNsYXNzIENhbWVyYTNac2xTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKaW5kZXggZTRlYzVmZC4uZjg1NjJlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAKQEAgLTQxLDcgKzQxLDggQEAKICAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKICAgICAgICAgaW50IGJ1ZmZlckNvdW50KSA6CiAgICAgQ29uc3VtZXJCYXNlKGNvbnN1bWVyKSwKLSAgICBtQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpCisgICAgbUJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KSwKKyAgICBtTGF0ZXN0VGltZXN0YW1wKDApCiB7CiAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKICAgICBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwpAQCAtMTUyLDYgKzE1MywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorbnNlY3NfdCBSaW5nQnVmZmVyQ29uc3VtZXI6OmdldExhdGVzdFRpbWVzdGFtcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBpZiAobUJ1ZmZlckl0ZW1MaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbUxhdGVzdFRpbWVzdGFtcDsKK30KKwogdm9pZCBSaW5nQnVmZmVyQ29uc3VtZXI6OnBpbkJ1ZmZlckxvY2tlZChjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CiAgICAgTGlzdDxSaW5nQnVmZmVySXRlbT46Oml0ZXJhdG9yIGl0LCBlbmQ7CiAKQEAgLTMwMiw2ICszMTEsMTMgQEAKICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgbUJ1ZmZlckl0ZW1MaXN0LnNpemUoKSwgbUJ1ZmZlckNvdW50KTsKIAorICAgICAgICBpZiAoaXRlbS5tVGltZXN0YW1wIDwgbUxhdGVzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgQklfTE9HRSgiVGltZXN0YW1wICBkZWNyZWFzZXMgZnJvbSAlIiBQUklkNjQgIiB0byAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RUaW1lc3RhbXAsIGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBtTGF0ZXN0VGltZXN0YW1wID0gaXRlbS5tVGltZXN0YW1wOworCiAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXIgPSBtU2xvdHNbaXRlbS5tQnVmXS5tR3JhcGhpY0J1ZmZlcjsKICAgICB9IC8vIGVuZCBvZiBtTXV0ZXggbG9jawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKaW5kZXggYjRhZDgyNC4uZGE5N2ExMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaApAQCAtNjQsNyArNjQsNyBAQAogICAgIC8vIGJ1ZmZlckNvdW50IHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG1hbnkgYnVmZmVycyBjYW4gYmUgcGlubmVkIGZvciB1c2VyCiAgICAgLy8gYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBjb25zdW1lciwgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKLSAgICAgICAgICAgIGludCBidWZmZXJDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTKTsKKyAgICAgICAgICAgIGludCBidWZmZXJDb3VudCk7CiAKICAgICB2aXJ0dWFsIH5SaW5nQnVmZmVyQ29uc3VtZXIoKTsKIApAQCAtMTU5LDYgKzE1OSw5IEBACiAgICAgLy8gUmVsZWFzZSBhbGwgdGhlIG5vbi1waW5uZWQgYnVmZmVycyBpbiB0aGUgcmluZyBidWZmZXIKICAgICBzdGF0dXNfdCBjbGVhcigpOwogCisgICAgLy8gUmV0dXJuIDAgaWYgUmluZ0J1ZmZlciBpcyBlbXB0eSwgb3RoZXJ3aXNlIHJldHVybiB0aW1lc3RhbXAgb2YgbGF0ZXN0IGJ1ZmZlci4KKyAgICBuc2Vjc190IGdldExhdGVzdFRpbWVzdGFtcCgpOworCiAgIHByaXZhdGU6CiAKICAgICAvLyBPdmVycmlkZSBDb25zdW1lckJhc2U6Om9uRnJhbWVBdmFpbGFibGUKQEAgLTE4MCw2ICsxODMsOSBAQAogICAgIC8vIExpc3Qgb2YgYWNxdWlyZWQgYnVmZmVycyBpbiBvdXIgcmluZyBidWZmZXIKICAgICBMaXN0PFJpbmdCdWZmZXJJdGVtPiAgICAgICBtQnVmZmVySXRlbUxpc3Q7CiAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50OworCisgICAgLy8gVGltZXN0YW1wIG9mIGxhdGVzdCBidWZmZXIKKyAgICBuc2Vjc190IG1MYXRlc3RUaW1lc3RhbXA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCBlNTNiM2E2Li40MWRhYjFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTU0LDcgKzU0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCitzdGF0dXNfdCBNZWRpYUxvZ1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBidXQgbm90IGlkZW50aWNhbCBjb2RlIGF0IHNlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyYWU1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDUgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisKK2lmZXEgKCQoU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUpLCAxKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCitlbmRpZgorCitMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKKyAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCisgICAgbGlidWkgXAorICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmJpbmRlciBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJoYXJkd2FyZSBcCisgICAgbGlic291bmR0cmlnZ2VyIFwKKyAgICBsaWJtZWRpYQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJzZXJ2aWNldXRpbGl0eQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgorCitMT0NBTF9NT0RVTEU6PSBsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYWVlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsODIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXJId1NlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3NvdW5kX3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxTZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCisjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInN0dWIiCisjZWxzZQorI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJwcmltYXJ5IgorI2VuZGlmCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKKyAgICA6IEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlKCksCisgICAgICBtTmV4dFVuaXF1ZUlkKDEpLAorICAgICAgbU1lbW9yeURlYWxlcihuZXcgTWVtb3J5RGVhbGVyKDEwMjQgKiAxMDI0LCAiU291bmRUcmlnZ2VySHdTZXJ2aWNlIikpLAorICAgICAgbUNhcHR1cmVTdGF0ZShmYWxzZSkKK3sKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uRmlyc3RSZWYoKQoreworICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CisgICAgaW50IHJjOworICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlICpkZXY7CisKKyAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIEhXX01PRFVMRV9QUkVGSVgsICZtb2QpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHNvdW5kIHRyaWdnZXIgbW9kdWxlICVzLiVzICglcykiLAorICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByYyA9IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX29wZW4obW9kLCAmZGV2KTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKKyAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRldi0+Y29tbW9uLnZlcnNpb24gIT0gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgeworICAgICAgICBBTE9HRSgid3Jvbmcgc291bmQgdHJpZ2dlciBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgZGV2LT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgcmMgPSBkZXYtPmdldF9wcm9wZXJ0aWVzKGRldiwgJmRlc2NyaXB0b3IucHJvcGVydGllcyk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkZXNjcmlwdG9yLmhhbmRsZSA9CisgICAgICAgICAgICAoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKKyAgICBBTE9HSSgibG9hZGVkIGRlZmF1bHQgbW9kdWxlICVzLCBoYW5kbGUgJWQiLCBkZXNjcmlwdG9yLnByb3BlcnRpZXMuZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5oYW5kbGUpOworCisgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbmV3IE1vZHVsZSh0aGlzLCBkZXYsIGRlc2NyaXB0b3IsIGNsaWVudCk7CisgICAgbU1vZHVsZXMuYWRkKGRlc2NyaXB0b3IuaGFuZGxlLCBtb2R1bGUpOworICAgIG1DYWxsYmFja1RocmVhZCA9IG5ldyBDYWxsYmFja1RocmVhZCh0aGlzKTsKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjp+U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKK3sKKyAgICBpZiAobUNhbGxiYWNrVGhyZWFkICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrVGhyZWFkLT5leGl0KCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2VfY2xvc2UobU1vZHVsZXMudmFsdWVBdChpKS0+aHdEZXZpY2UoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKK3sKKyAgICBBTE9HVigibGlzdE1vZHVsZXMiKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgbW9kdWxlcyA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzaXplX3QgbWF4TW9kdWxlcyA9ICpudW1Nb2R1bGVzOworICAgICpudW1Nb2R1bGVzID0gbU1vZHVsZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpICYmIGkgPCBtYXhNb2R1bGVzOyBpKyspIHsKKyAgICAgICAgbW9kdWxlc1tpXSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSktPmRlc2NyaXB0b3IoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZUludGVyZmFjZSkKK3sKKyAgICBBTE9HVigiYXR0YWNoIG1vZHVsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBtb2R1bGVJbnRlcmZhY2UuY2xlYXIoKTsKKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3NpemVfdCBpbmRleCA9IG1Nb2R1bGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7CisKKyAgICBtb2R1bGUtPnNldENsaWVudChjbGllbnQpOworICAgIGNsaWVudC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobW9kdWxlKTsKKyAgICBtb2R1bGVJbnRlcmZhY2UgPSBtb2R1bGU7CisKKyAgICBtb2R1bGUtPnNldENhcHR1cmVTdGF0ZV9sKG1DYXB0dXJlU3RhdGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSkKK3sKKyAgICBBTE9HVigic2V0Q2FwdHVyZVN0YXRlICVkIiwgYWN0aXZlKTsKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIG1DYXB0dXJlU3RhdGUgPSBhY3RpdmU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtTW9kdWxlcy52YWx1ZUF0KGkpLT5zZXRDYXB0dXJlU3RhdGVfbChhY3RpdmUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmRldGFjaE1vZHVsZShzcDxNb2R1bGU+IG1vZHVsZSkKK3sKKyAgICBBTE9HVigiZGV0YWNoTW9kdWxlIik7CisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBtb2R1bGUtPmNsZWFyQ2xpZW50KCk7Cit9CisKKworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwID0gNjAwMDA7CisKK3N0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQoreworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcCk7CisgICAgfQorICAgIHJldHVybiBsb2NrZWQ7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU291bmRUcmlnZ2VySHdTZXJ2aWNlIik7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIFNvdW5kVHJpZ2dlckh3U2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgICAgIGlmICghbG9ja2VkKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJTb3VuZFRyaWdnZXJId1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9ja2VkKSBtU2VydmljZUxvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICByZXR1cm4gQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCisvLyBzdGF0aWMKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpyZWNvZ25pdGlvbkNhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKK3sKKyAgICBNb2R1bGUgKm1vZHVsZSA9IChNb2R1bGUgKiljb29raWU7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbW9kdWxlLT5zZXJ2aWNlKCkucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlcnZpY2UtPnNlbmRSZWNvZ25pdGlvbkV2ZW50KGV2ZW50LCBtb2R1bGUpOworfQorCitzcDxJTWVtb3J5PiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KQoreworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OworCisgICAgLy9zYW5pdGl6ZSBldmVudAorICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFOgorICAgICAgICBBTE9HV19JRihldmVudC0+ZGF0YV9zaXplICE9IDAgJiYgZXZlbnQtPmRhdGFfb2Zmc2V0ICE9CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciBrZXlwaHJhc2UgZXZlbnQgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCk7CisgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfVU5LTk9XTjoKKyAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciB1bmtub3duIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQpOworICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXZlbnRNZW1vcnk7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBldmVudC0+ZGF0YV9vZmZzZXQgKyBldmVudC0+ZGF0YV9zaXplOworICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisgICAgbWVtY3B5KGV2ZW50TWVtb3J5LT5wb2ludGVyKCksIGV2ZW50LCBzaXplKTsKKworICAgIHJldHVybiBldmVudE1lbW9yeTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRSZWNvZ25pdGlvbkV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKm1vZHVsZSkKKyB7CisgICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbChldmVudCk7CisgICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgc3A8TW9kdWxlPiBzdHJvbmdNb2R1bGU7CisgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZSkgeworICAgICAgICAgICAgIHN0cm9uZ01vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5LCBzdHJvbmdNb2R1bGUpKTsKK30KKworLy8gc3RhdGljCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c291bmRNb2RlbENhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQoreworICAgIE1vZHVsZSAqbW9kdWxlID0gKE1vZHVsZSAqKWNvb2tpZTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBtb2R1bGUtPnNlcnZpY2UoKS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VydmljZS0+c2VuZFNvdW5kTW9kZWxFdmVudChldmVudCwgbW9kdWxlKTsKK30KKworc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KQoreworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OworCisgICAgc2l6ZV90IHNpemUgPSBldmVudC0+ZGF0YV9vZmZzZXQgKyBldmVudC0+ZGF0YV9zaXplOworICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisgICAgbWVtY3B5KGV2ZW50TWVtb3J5LT5wb2ludGVyKCksIGV2ZW50LCBzaXplKTsKKworICAgIHJldHVybiBldmVudE1lbW9yeTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCit7CisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChldmVudCk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZSkgeworICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJvbmdNb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9TT1VORE1PREVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5LCBzdHJvbmdNb2R1bGUpKTsKK30KKworCitzcDxJTWVtb3J5PiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKQoreworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OworCisgICAgc2l6ZV90IHNpemUgPSBzaXplb2Yoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3QpOworICAgIGV2ZW50TWVtb3J5ID0gbU1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisgICAgKigoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpKSA9IHN0YXRlOworICAgIHJldHVybiBldmVudE1lbW9yeTsKK30KKworLy8gY2FsbCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQoreworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBzdHJvbmdNb2R1bGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZXMudmFsdWVBdChpKS5nZXQoKSA9PSBtb2R1bGUpIHsKKyAgICAgICAgICAgIHN0cm9uZ01vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU0VSVklDRV9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1lbW9yeSwgc3Ryb25nTW9kdWxlKSk7Cit9CisKKy8vIGNhbGwgd2l0aCBtU2VydmljZUxvY2sgaGVsZAordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRDYWxsYmFja0V2ZW50X2woY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZENhbGxiYWNrRXZlbnQoZXZlbnQpOworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3sKKyAgICBBTE9HVigib25DYWxsYmFja0V2ZW50Iik7CisgICAgc3A8TW9kdWxlPiBtb2R1bGU7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBtb2R1bGUgPSBldmVudC0+bU1vZHVsZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1vZHVsZS0+b25DYWxsYmFja0V2ZW50KGV2ZW50KTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIC8vIGNsZWFyIG5vdyB0byBleGVjdXRlIHdpdGggbVNlcnZpY2VMb2NrIGxvY2tlZAorICAgICAgICBldmVudC0+bU1lbW9yeS5jbGVhcigpOworICAgIH0KK30KKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZCIKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6Q2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpCit7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6On5DYWxsYmFja1RocmVhZCgpCit7CisgICAgd2hpbGUgKCFtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgbUV2ZW50UXVldWVbMF0tPm1NZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbUV2ZW50UXVldWUucmVtb3ZlQXQoMCk7CisgICAgfQorfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQoreworICAgIHJ1bigic291bmRUcmlnZ2VyIGNiayIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKK30KKworYm9vbCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgc3A8Q2FsbGJhY2tFdmVudD4gZXZlbnQ7CisgICAgICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgICAgICAgICAgd2hpbGUgKG1FdmVudFF1ZXVlLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHNsZWVwIik7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZC53YWl0KG1DYWxsYmFja0xvY2spOworICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHdha2UgdXAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudCA9IG1FdmVudFF1ZXVlWzBdOworICAgICAgICAgICAgbUV2ZW50UXVldWUucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXJ2aWNlICE9IDApIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPm9uQ2FsbGJhY2tFdmVudChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OmV4aXQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIG1DYWxsYmFja0NvbmQuYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6c2VuZENhbGxiYWNrRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtQ2FsbGJhY2tMb2NrKTsKKyAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnQpOworICAgIG1DYWxsYmFja0NvbmQuc2lnbmFsKCk7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tFdmVudDo6Q2FsbGJhY2tFdmVudChldmVudF90eXBlIHR5cGUsIHNwPElNZW1vcnk+IG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxNb2R1bGU+IG1vZHVsZSkKKyAgICA6IG1UeXBlKHR5cGUpLCBtTWVtb3J5KG1lbW9yeSksIG1Nb2R1bGUobW9kdWxlKQoreworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrRXZlbnQ6On5DYWxsYmFja0V2ZW50KCkKK3sKK30KKworCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZSIKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6Ok1vZHVsZShjb25zdCBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCkKKyA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtSHdEZXZpY2UoaHdEZXZpY2UpLCBtRGVzY3JpcHRvcihkZXNjcmlwdG9yKSwKKyAgIG1DbGllbnQoY2xpZW50KSwgbVNlcnZpY2VTdGF0ZShTT1VORF9UUklHR0VSX1NUQVRFX05PX0lOSVQpCit7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjp+TW9kdWxlKCkgeworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpkZXRhY2goKSB7CisgICAgQUxPR1YoImRldGFjaCgpIik7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2RlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJkZXRhY2goKSB1bmxvYWRpbmcgbW9kZWwgJWQiLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbU1vZGVscy5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUNsaWVudCAhPSAwKSB7CisgICAgICAgIG1DbGllbnQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgfQorICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VydmljZS0+ZGV0YWNoTW9kdWxlKHRoaXMpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6bG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIEFMT0dWKCJsb2FkU291bmRNb2RlbCgpIGhhbmRsZSIpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIGlmIChtb2RlbE1lbW9yeSA9PSAwIHx8IG1vZGVsTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibG9hZFNvdW5kTW9kZWwoKSBtb2RlbE1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwgPQorICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICopbW9kZWxNZW1vcnktPnBvaW50ZXIoKTsKKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSHdEZXZpY2UtPmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzb3VuZE1vZGVsQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworCisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZzZXNzaW9uLCAmaW9IYW5kbGUsICZkZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBuZXcgTW9kZWwoKmhhbmRsZSwgc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSwgc291bmRfbW9kZWwtPnR5cGUpOworICAgIG1Nb2RlbHMucmVwbGFjZVZhbHVlRm9yKCpoYW5kbGUsIG1vZGVsKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigidW5sb2FkU291bmRNb2RlbCgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtTW9kZWxzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpbmRleCk7CisgICAgbU1vZGVscy5yZW1vdmVJdGVtKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgfQorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihtb2RlbC0+bUNhcHR1cmVTZXNzaW9uKTsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKK3sKKyAgICBBTE9HVigic3RhcnRSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgaWYgKGRhdGFNZW1vcnkgIT0gMCAmJiBkYXRhTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFNZW1vcnkgaXMgbm9uLTAgYnV0IGhhcyBOVUxMIHBvaW50ZXIoKSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNlcnZpY2VTdGF0ZSA9PSBTT1VORF9UUklHR0VSX1NUQVRFX0RJU0FCTEVEKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKGRhdGFNZW1vcnkgPT0gMCkgfHwKKyAgICAgICAgICAgIChkYXRhTWVtb3J5LT5zaXplKCkgPCBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZyA9CisgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICopZGF0YU1lbW9yeS0+cG9pbnRlcigpOworCisgICAgLy9UT0RPOiBnZXQgY2FwdHVyZSBoYW5kbGUgYW5kIGRldmljZSBmcm9tIGF1ZGlvIHBvbGljeSBzZXJ2aWNlCisgICAgY29uZmlnLT5jYXB0dXJlX2hhbmRsZSA9IG1vZGVsLT5tQ2FwdHVyZUlPSGFuZGxlOworICAgIGNvbmZpZy0+Y2FwdHVyZV9kZXZpY2UgPSBtb2RlbC0+bUNhcHR1cmVEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUh3RGV2aWNlLT5zdGFydF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cmVjb2duaXRpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9BQ1RJVkU7CisgICAgICAgIG1vZGVsLT5tQ29uZmlnID0gKmNvbmZpZzsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigic3RvcFJlY29nbml0aW9uKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtb2RlbC0+bVN0YXRlICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUpOworICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3sKKyAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOworCisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBldmVudC0+bU1lbW9yeTsKKworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtQ2xpZW50ID09IDApIHsKKyAgICAgICAgQUxPR0koIiVzIG1DbGllbnQgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoZXZlbnQtPm1UeXBlKSB7CisgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1JFQ09HTklUSU9OOiB7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpyZWNvZ25pdGlvbkV2ZW50ID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKHJlY29nbml0aW9uRXZlbnQtPm1vZGVsKTsKKyAgICAgICAgICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIG1vZGVsID09IDAiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgbW9kZWwtPm1TdGF0ZSAlZCAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFIiwgbW9kZWwtPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWNvZ25pdGlvbkV2ZW50LT5jYXB0dXJlX3Nlc3Npb24gPSBtb2RlbC0+bUNhcHR1cmVTZXNzaW9uOworICAgICAgICAgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOworICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+b25SZWNvZ25pdGlvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1NPVU5ETU9ERUw6IHsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKnNvdW5kbW9kZWxFdmVudCA9CisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKKyAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChzb3VuZG1vZGVsRXZlbnQtPm1vZGVsKTsKKyAgICAgICAgICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIG1vZGVsID09IDAiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+b25Tb3VuZE1vZGVsRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfU0VSVklDRV9TVEFURTogeworICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPm9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgib25DYWxsYmFja0V2ZW50IHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CisgICAgfQorfQorCitzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZGVsPiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWwoCisgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzcDxNb2RlbD4gbW9kZWw7CisgICAgc3NpemVfdCBpbmRleCA9IG1Nb2RlbHMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIG1vZGVsOworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpiaW5kZXJEaWVkKAorICAgIGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8gX191bnVzZWQpIHsKKyAgICBBTE9HVygiY2xpZW50IGJpbmRlciBkaWVkIGZvciBtb2R1bGUgJWQiLCBtRGVzY3JpcHRvci5oYW5kbGUpOworICAgIGRldGFjaCgpOworfQorCisvLyBDYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZAordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6c2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpCit7CisgICAgQUxPR1YoIk1vZHVsZTo6c2V0Q2FwdHVyZVN0YXRlX2wgJWQiLCBhY3RpdmUpOworICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZTsKKyAgICBzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZTsKKworICAgIFZlY3Rvcjwgc3A8SU1lbW9yeT4gPiBldmVudHM7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHN0YXRlID0gKGFjdGl2ZSAmJiAhbURlc2NyaXB0b3IucHJvcGVydGllcy5jb25jdXJyZW50X2NhcHR1cmUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX1NUQVRFX0RJU0FCTEVEIDogU09VTkRfVFJJR0dFUl9TVEFURV9FTkFCTEVEOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBtU2VydmljZVN0YXRlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtU2VydmljZVN0YXRlID0gc3RhdGU7CisKKyAgICAgICAgc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlID09IFNPVU5EX1RSSUdHRVJfU1RBVEVfRU5BQkxFRCkgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAobW9kZWwtPm1TdGF0ZSA9PSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgIC8vIGtlZXAgbW9kZWwgaW4gQUNUSVZFIHN0YXRlIHNvIHRoYXQgZXZlbnQgaXMgcHJvY2Vzc2VkIGJ5IG9uQ2FsbGJhY2tFdmVudCgpCisgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50IHBocmFzZUV2ZW50OworICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZWwtPm1UeXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKKyAgICAgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQubnVtX3BocmFzZXMgPSBtb2RlbC0+bUNvbmZpZy5udW1fcGhyYXNlczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHJhc2VFdmVudC5udW1fcGhyYXNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5waHJhc2VfZXh0cmFzW2ldID0gbW9kZWwtPm1Db25maWcucGhyYXNlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGhyYXNlRXZlbnQuY29tbW9uLnN0YXR1cyA9IFJFQ09HTklUSU9OX1NUQVRVU19BQk9SVDsKKyAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5jb21tb24udHlwZSA9IG1vZGVsLT5tVHlwZTsKKyAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5jb21tb24ubW9kZWwgPSBtb2RlbC0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5jb21tb24uZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHNlcnZpY2UtPnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woJnBocmFzZUV2ZW50LmNvbW1vbik7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50TWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmFkZChldmVudE1lbW9yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2VydmljZS0+c2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1JFQ09HTklUSU9OLCBldmVudHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKKyAgICB9CisKK2V4aXQ6CisgICAgc2VydmljZS0+c2VuZFNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUsIHRoaXMpOworfQorCisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kZWw6Ok1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWxfdHlwZV90IHR5cGUpIDoKKyAgICBtSGFuZGxlKGhhbmRsZSksIG1TdGF0ZShTVEFURV9JRExFKSwgbUNhcHR1cmVTZXNzaW9uKHNlc3Npb24pLAorICAgIG1DYXB0dXJlSU9IYW5kbGUoaW9IYW5kbGUpLCBtQ2FwdHVyZURldmljZShkZXZpY2UpLCBtVHlwZSh0eXBlKQoreworCit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpkdW1wKGludCBmZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZGFjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfU0VSVklDRV9ICisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKy8vI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeUhlYXBCYXNlOworCitjbGFzcyBTb3VuZFRyaWdnZXJId1NlcnZpY2UgOgorICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFNvdW5kVHJpZ2dlckh3U2VydmljZT4sCisgICAgcHVibGljIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlCit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8U291bmRUcmlnZ2VySHdTZXJ2aWNlPjsKK3B1YmxpYzoKKyAgICBjbGFzcyBNb2R1bGU7CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuc291bmRfdHJpZ2dlcl9odyI7IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisKKyAgICAvLyBJU291bmRUcmlnZ2VySHdTZXJ2aWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICBjbGFzcyBNb2RlbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgcHVibGljOgorCisgICAgICAgIGVudW0geworICAgICAgICAgICAgU1RBVEVfSURMRSwKKyAgICAgICAgICAgIFNUQVRFX0FDVElWRQorICAgICAgICB9OworCisgICAgICAgIE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCB0eXBlKTsKKyAgICAgICAgfk1vZGVsKCkge30KKworICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAgICBtSGFuZGxlOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU3RhdGU7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1DYXB0dXJlU2Vzc2lvbjsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUNhcHR1cmVJT0hhbmRsZTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbUNhcHR1cmVEZXZpY2U7CisgICAgICAgIHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWxfdHlwZV90IG1UeXBlOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgbUNvbmZpZzsKKyAgICB9OworCisgICAgY2xhc3MgQ2FsbGJhY2tFdmVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgICAgICBUWVBFX1JFQ09HTklUSU9OLAorICAgICAgICAgICAgVFlQRV9TT1VORE1PREVMLAorICAgICAgICAgICAgVFlQRV9TRVJWSUNFX1NUQVRFLAorICAgICAgICB9IGV2ZW50X3R5cGU7CisgICAgICAgIENhbGxiYWNrRXZlbnQoZXZlbnRfdHlwZSB0eXBlLCBzcDxJTWVtb3J5PiBtZW1vcnksIHdwPE1vZHVsZT4gbW9kdWxlKTsKKworICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5DYWxsYmFja0V2ZW50KCk7CisKKyAgICAgICAgZXZlbnRfdHlwZSBtVHlwZTsKKyAgICAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICAgICAgd3A8TW9kdWxlPiBtTW9kdWxlOworICAgIH07CisKKyAgICBjbGFzcyBNb2R1bGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBCblNvdW5kVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICBNb2R1bGUoY29uc3Qgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSwKKyAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqIGh3RGV2aWNlLAorICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpOworCisgICAgICAgdmlydHVhbCB+TW9kdWxlKCk7CisKKyAgICAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisKKyAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSAqaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KKyAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KKyAgICAgICB2b2lkIHNldENsaWVudChzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQpIHsgbUNsaWVudCA9IGNsaWVudDsgfQorICAgICAgIHZvaWQgY2xlYXJDbGllbnQoKSB7IG1DbGllbnQuY2xlYXIoKTsgfQorICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnQ7IH0KKyAgICAgICB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UoKSBjb25zdCB7IHJldHVybiBtU2VydmljZTsgfQorCisgICAgICAgdm9pZCBvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKworICAgICAgIHNwPE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgdm9pZCBzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSk7CisKKyAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgIHByaXZhdGU6CisKKyAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgIHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gICAgICAgICAgICAgIG1TZXJ2aWNlOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqICAgICAgICBtSHdEZXZpY2U7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIG1EZXNjcmlwdG9yOworICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiAgICAgICAgICAgICAgICBtQ2xpZW50OworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHNvdW5kX21vZGVsX2hhbmRsZV90LCBzcDxNb2RlbD4gPiAgICAgbU1vZGVsczsKKyAgICAgICAgc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3QgICAgICAgICAgbVNlcnZpY2VTdGF0ZTsKKyAgICB9OyAvLyBjbGFzcyBNb2R1bGUKKworICAgIGNsYXNzIENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgcHVibGljOgorCisgICAgICAgIENhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UpOworCisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkNhbGxiYWNrVGhyZWFkKCk7CisKKyAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCisgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOworCisgICAgICAgIC8vIFJlZkJhc2UKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZENhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gICBtU2VydmljZTsKKyAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0NvbmQ7CisgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tMb2NrOworICAgICAgICBWZWN0b3I8IHNwPENhbGxiYWNrRXZlbnQ+ID4gbUV2ZW50UXVldWU7CisgICAgfTsKKworICAgICAgICAgICB2b2lkIGRldGFjaE1vZHVsZShzcDxNb2R1bGU+IG1vZHVsZSk7CisKKyAgICBzdGF0aWMgdm9pZCByZWNvZ25pdGlvbkNhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpOworICAgICAgICAgICB2b2lkIHNlbmRSZWNvZ25pdGlvbkV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOworCisgICAgc3RhdGljIHZvaWQgc291bmRNb2RlbENhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCk7CisgICAgICAgICAgIHZvaWQgc2VuZFNvdW5kTW9kZWxFdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsIE1vZHVsZSAqbW9kdWxlKTsKKworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSk7CisgICAgICAgICAgIHZvaWQgc2VuZFNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsIE1vZHVsZSAqbW9kdWxlKTsKKworICAgICAgICAgICB2b2lkIHNlbmRDYWxsYmFja0V2ZW50X2woY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKworcHJpdmF0ZToKKworICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CisKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKKyAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1OZXh0VW5pcXVlSWQ7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCwgc3A8TW9kdWxlPiA+ICAgICBtTW9kdWxlczsKKyAgICBzcDxDYWxsYmFja1RocmVhZD4gIG1DYWxsYmFja1RocmVhZDsKKyAgICBzcDxNZW1vcnlEZWFsZXI+ICAgIG1NZW1vcnlEZWFsZXI7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtQ2FwdHVyZVN0YXRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFjNGMyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlTb3VuZFRyaWdnZXIuY3BwIFwKKwlJU291bmRUcmlnZ2VyLmNwcCBcCisJSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAgXAorCUlTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisJbGlidXRpbHMgXAorCWxpYmxvZyBcCisJbGliYmluZGVyIFwKKwlsaWJoYXJkd2FyZQorCisjTE9DQUxfQ19JTkNMVURFUyArPSBcCisJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBsaWJzb3VuZHRyaWdnZXIKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjgwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiSVNvdW5kVHJpZ2dlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgREVUQUNIID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBMT0FEX1NPVU5EX01PREVMLAorICAgIFVOTE9BRF9TT1VORF9NT0RFTCwKKyAgICBTVEFSVF9SRUNPR05JVElPTiwKKyAgICBTVE9QX1JFQ09HTklUSU9OLAorfTsKKworY2xhc3MgQnBTb3VuZFRyaWdnZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPgoreworcHVibGljOgorICAgIEJwU291bmRUcmlnZ2VyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGV0YWNoKCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJkZXRhY2giKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFVEFDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIGlmIChtb2RlbE1lbW9yeSA9PSAwIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIobW9kZWxNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTE9BRF9TT1VORF9NT0RFTCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQoaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOTE9BRF9TT1VORF9NT0RFTCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBpZiAoZGF0YU1lbW9yeSA9PSAwKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGF0YU1lbW9yeS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGRhdGFNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfUkVDT0dOSVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX1JFQ09HTklUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXIiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblNvdW5kVHJpZ2dlcjo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgREVUQUNIOiB7CisgICAgICAgICAgICBBTE9HVigiREVUQUNIIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZGV0YWNoKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9TT1VORF9NT0RFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1vZGVsTWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbG9hZFNvdW5kTW9kZWwobW9kZWxNZW1vcnksICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBVTkxPQURfU09VTkRfTU9ERUw6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmxvYWRTb3VuZE1vZGVsKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RBUlRfUkVDT0dOSVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBkYXRhTWVtb3J5OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGRhdGFNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydFJlY29nbml0aW9uKGhhbmRsZSwgZGF0YU1lbW9yeSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RPUF9SRUNPR05JVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI0NDI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgT05fUkVDT0dOSVRJT05fRVZFTlQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIE9OX1NPVU5ETU9ERUxfRVZFTlQsCisgICAgT05fU0VSVklDRV9TVEFURV9DSEFOR0UKK307CisKK2NsYXNzIEJwU291bmRUcmlnZ2VyQ2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckNsaWVudD4KK3sKKworcHVibGljOgorICAgIEJwU291bmRUcmlnZ2VyQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9SRUNPR05JVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblNvdW5kTW9kZWxFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NPVU5ETU9ERUxfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fU0VSVklDRV9TVEFURV9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXJDbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblNvdW5kVHJpZ2dlckNsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgT05fUkVDT0dOSVRJT05fRVZFTlQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uUmVjb2duaXRpb25FdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgT05fU09VTkRNT0RFTF9FVkVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25Tb3VuZE1vZGVsRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE9OX1NFUlZJQ0VfU1RBVEVfQ0hBTkdFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvblNlcnZpY2VTdGF0ZUNoYW5nZShldmVudE1lbW9yeSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzI4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnBTb3VuZFRyaWdnZXJId1NlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIExJU1RfTU9EVUxFUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgQVRUQUNILAorICAgIFNFVF9DQVBUVVJFX1NUQVRFLAorfTsKKworY2xhc3MgQnBTb3VuZFRyaWdnZXJId1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPgoreworcHVibGljOgorICAgIEJwU291bmRUcmlnZ2VySHdTZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKKyAgICB7CisgICAgICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgbW9kdWxlcyA9PSBOVUxMKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IChtb2R1bGVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICpudW1Nb2R1bGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigibGlzdE1vZHVsZXMoKSBzdGF0dXMgJWQgZ290ICpudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCAqbnVtTW9kdWxlcyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gKm51bU1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gKm51bU1vZHVsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKG1vZHVsZXMsIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgbW9kdWxlID0gaW50ZXJmYWNlX2Nhc3Q8SVNvdW5kVHJpZ2dlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFjdGl2ZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ0FQVFVSRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXJId1NlcnZpY2UiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTElTVF9NT0RVTEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXMgPSBudW1Nb2R1bGVzUmVxOworICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKiljYWxsb2MobnVtTW9kdWxlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdE1vZHVsZXMobW9kdWxlcywgJm51bU1vZHVsZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bU1vZHVsZXMpOworICAgICAgICAgICAgQUxPR1YoIkxJU1RfTU9EVUxFUyBzdGF0dXMgJWQgZ290IG51bU1vZHVsZXMgJWQiLCBzdGF0dXMsIG51bU1vZHVsZXMpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiBudW1Nb2R1bGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBudW1Nb2R1bGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUobW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShtb2R1bGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQVRUQUNIOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVNvdW5kVHJpZ2dlckNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4gbW9kdWxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoKGhhbmRsZSwgY2xpZW50LCBtb2R1bGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihtb2R1bGUtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9DQVBUVVJFX1NUQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0Q2FwdHVyZVN0YXRlKChib29sKWRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNWMzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAoQykgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisKKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiBnU291bmRUcmlnZ2VySHdTZXJ2aWNlOworICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIGtTb3VuZFRyaWdnZXJId1NlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgICBrU291bmRUcmlnZ2VySHdTZXJ2aWNlTmFtZSAgICAgID0gIm1lZGlhLnNvdW5kX3RyaWdnZXJfaHciOworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgIGdMb2NrOworCisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CisgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgICAgIGdTb3VuZFRyaWdnZXJId1NlcnZpY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dXKCJTb3VuZCB0cmlnZ2VyIHNlcnZpY2UgZGllZCEiKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxEZWF0aE5vdGlmaWVyPiAgICAgICAgIGdEZWF0aE5vdGlmaWVyOworfTsgLy8gbmFtZXNwYWNlIGFub255bW91cworCitjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgU291bmRUcmlnZ2VyOjpnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgaWYgKGdTb3VuZFRyaWdnZXJId1NlcnZpY2UuZ2V0KCkgPT0gMCkgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoa1NvdW5kVHJpZ2dlckh3U2VydmljZU5hbWUpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1coIlNvdW5kVHJpZ2dlckh3U2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICB1c2xlZXAoa1NvdW5kVHJpZ2dlckh3U2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChnRGVhdGhOb3RpZmllciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CisgICAgICAgIH0KKyAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnRGVhdGhOb3RpZmllcik7CisgICAgICAgIGdTb3VuZFRyaWdnZXJId1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPihiaW5kZXIpOworICAgIH0KKyAgICBBTE9HRV9JRihnU291bmRUcmlnZ2VySHdTZXJ2aWNlID09IDAsICJubyBTb3VuZFRyaWdnZXJId1NlcnZpY2UhPyIpOworICAgIHJldHVybiBnU291bmRUcmlnZ2VySHdTZXJ2aWNlOworfQorCisvLyBTdGF0aWMgbWV0aG9kcworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIik7CisgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMobW9kdWxlcywgbnVtTW9kdWxlcyk7Cit9CisKK3NwPFNvdW5kVHJpZ2dlcj4gU291bmRUcmlnZ2VyOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIEFMT0dWKCJhdHRhY2goKSIpOworICAgIHNwPFNvdW5kVHJpZ2dlcj4gc291bmRUcmlnZ2VyOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gc291bmRUcmlnZ2VyOworICAgIH0KKyAgICBzb3VuZFRyaWdnZXIgPSBuZXcgU291bmRUcmlnZ2VyKG1vZHVsZSwgY2FsbGJhY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcnZpY2UtPmF0dGFjaChtb2R1bGUsIHNvdW5kVHJpZ2dlciwgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlcik7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIgIT0gMCkgeworICAgICAgICBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChzb3VuZFRyaWdnZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSIsIHN0YXR1cyk7CisgICAgICAgIHNvdW5kVHJpZ2dlci5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gc291bmRUcmlnZ2VyOworfQorCisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKQoreworICAgIEFMT0dWKCJzZXRDYXB0dXJlU3RhdGUoJWQpIiwgYWN0aXZlKTsKKyAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSA9IGdldFNvdW5kVHJpZ2dlckh3U2VydmljZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5zZXRDYXB0dXJlU3RhdGUoYWN0aXZlKTsKK30KKworLy8gU291bmRUcmlnZ2VyCitTb3VuZFRyaWdnZXI6OlNvdW5kVHJpZ2dlcihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQorICAgIDogbU1vZHVsZShtb2R1bGUpLCBtQ2FsbGJhY2soY2FsbGJhY2spCit7Cit9CisKK1NvdW5kVHJpZ2dlcjo6flNvdW5kVHJpZ2dlcigpCit7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmRldGFjaCgpOworICAgIH0KK30KKworCit2b2lkIFNvdW5kVHJpZ2dlcjo6ZGV0YWNoKCkgeworICAgIEFMT0dWKCJkZXRhY2goKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyICE9IDApIHsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmRldGFjaCgpOworICAgICAgICBtSVNvdW5kVHJpZ2dlci0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXIgPSAwOworICAgIH0KK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKG1vZGVsTWVtb3J5LCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+dW5sb2FkU291bmRNb2RlbChoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihoYW5kbGUsIGRhdGFNZW1vcnkpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKK30KKworLy8gQnBTb3VuZFRyaWdnZXJDbGllbnQKK3ZvaWQgU291bmRUcmlnZ2VyOjpvblJlY29nbml0aW9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblJlY29nbml0aW9uRXZlbnQoCisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgfQorfQorCit2b2lkIFNvdW5kVHJpZ2dlcjo6b25Tb3VuZE1vZGVsRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNvdW5kTW9kZWxFdmVudCgKKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VyOjpvblNlcnZpY2VTdGF0ZUNoYW5nZShjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uU2VydmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgICAgICooKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSkpOworICAgIH0KK30KKworLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAordm9pZCBTb3VuZFRyaWdnZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1coIlNvdW5kVHJpZ2dlciBzZXJ2ZXIgYmluZGVyIERpZWQgIik7CisgICAgbUlTb3VuZFRyaWdnZXIgPSAwOworICAgIGlmIChtQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2stPm9uU2VydmljZURpZWQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6c3RyaW5nVG9HdWlkKGNvbnN0IGNoYXIgKnN0ciwgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQpCit7CisgICAgaWYgKHN0ciA9PSBOVUxMIHx8IGd1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZ3VpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgZ3VpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgZ3VpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgZ3VpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIGd1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgZ3VpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICBndWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIGd1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgZ3VpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICBndWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6Omd1aWRUb1N0cmluZyhjb25zdCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKQoreworICAgIGlmIChndWlkID09IE5VTEwgfHwgc3RyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzbnByaW50ZihzdHIsIG1heExlbiwgIiUwOHgtJTA0eC0lMDR4LSUwNHgtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgIGd1aWQtPnRpbWVMb3csCisgICAgICAgICAgICBndWlkLT50aW1lTWlkLAorICAgICAgICAgICAgZ3VpZC0+dGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICAgIGd1aWQtPmNsb2NrU2VxLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVswXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMV0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzJdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVszXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbNF0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzVdKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKaW5kZXggOGM4YTRlYS4uNjJlZGRjYSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL2Zpci5jcHAKQEAgLTIwLDE1ICsyMCwyNSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1zdGF0aWMgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNpbmMoZG91YmxlIHgpIHsKICAgICBpZiAoZmFicyh4KSA9PSAwLjBmKSByZXR1cm4gMS4wZjsKICAgICByZXR1cm4gc2luKHgpIC8geDsKIH0KIAotc3RhdGljIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNxcihkb3VibGUgeCkgewogICAgIHJldHVybiB4Kng7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwpIHsKKyAgICBpbnQ2NF90IHY7CisKKyAgICB2ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZmxvb3IoeCAqIG1heHZhbCArIDAuNSkpOworICAgIGlmICh2ID49IG1heHZhbCkgeworICAgICAgICByZXR1cm4gbWF4dmFsIC0gMTsgLy8gZXJyb3IhCisgICAgfQorICAgIHJldHVybiB2OworfQorCiBzdGF0aWMgZG91YmxlIEkwKGRvdWJsZSB4KSB7CiAgICAgLy8gZnJvbSB0aGUgTnVtZXJpY2FsIFJlY2lwZXMgaW4gQyBwLiAyMzcKICAgICBkb3VibGUgYXgsYW5zLHk7CkBAIC01NCwxMSArNjQsMTIgQEAKICAgICByZXR1cm4gSTAoYmV0YSAqIHNxcnQoMS4wIC0gc3FyKCgyLjAqaykvTiAtIDEuMCkpKSAvIEkwKGJldGEpOwogfQogCi0KIHN0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIG5hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10gWy1mIHtmbG9hdHxmaXhlZH1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCi0gICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIFstZiB7ZmxvYXR8Zml4ZWR9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgorICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSBbLWwgbGVycF1cbiIKKyAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gLXAgTS9OXG4iCiAgICAgICAgICAgICAiICAgIC1oICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iCiAgICAgICAgICAgICAiICAgIC1kICAgIGRlYnVnLCBwcmludCBjb21tYS1zZXBhcmF0ZWQgY29lZmZpY2llbnQgdGFibGVcbiIKICAgICAgICAgICAgICIgICAgLXAgICAgZ2VuZXJhdGUgcG9seS1waGFzZSBmaWx0ZXIgY29lZmZpY2llbnRzLCB3aXRoIHNhbXBsZSBpbmNyZW1lbnQgTS9OXG4iCkBAIC02Niw2ICs3Nyw3IEBACiAgICAgICAgICAgICAiICAgIC1jICAgIGN1dC1vZmYgZnJlcXVlbmN5ICgyMDQ3OClcbiIKICAgICAgICAgICAgICIgICAgLW4gICAgbnVtYmVyIG9mIHplcm8tY3Jvc3NpbmdzIG9uIG9uZSBzaWRlICg4KVxuIgogICAgICAgICAgICAgIiAgICAtbCAgICBudW1iZXIgb2YgbGVycGluZyBiaXRzICg0KVxuIgorICAgICAgICAgICAgIiAgICAtbSAgICBudW1iZXIgb2YgcG9seXBoYXNlcyAocmVsYXRlZCB0byAtbCwgZGVmYXVsdCAxNilcbiIKICAgICAgICAgICAgICIgICAgLWYgICAgb3V0cHV0IGZvcm1hdCwgY2FuIGJlIGZpeGVkLXBvaW50IG9yIGZsb2F0aW5nLXBvaW50IChmaXhlZClcbiIKICAgICAgICAgICAgICIgICAgLWIgICAga2Fpc2VyIHdpbmRvdyBwYXJhbWV0ZXIgYmV0YSAoNy44NjUgWy04MGRCXSlcbiIKICAgICAgICAgICAgICIgICAgLXYgICAgYXR0ZW51YXRpb24gaW4gZEJGUyAoMClcbiIsCkBAIC03Nyw4ICs4OSw3IEBACiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCiB7CiAgICAgLy8gbmMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHN0b3JlIHRoZSBjb2VmZmljaWVudHMKLSAgICBjb25zdCBpbnQgbmMgPSAzMjsKLQorICAgIGludCBuYyA9IDMyOwogICAgIGJvb2wgcG9seXBoYXNlID0gZmFsc2U7CiAgICAgdW5zaWduZWQgaW50IHBvbHlNID0gMTYwOwogICAgIHVuc2lnbmVkIGludCBwb2x5TiA9IDE0NzsKQEAgLTg4LDcgKzk5LDYgQEAKICAgICBkb3VibGUgYXR0ZW4gPSAxOwogICAgIGludCBmb3JtYXQgPSAwOwogCi0KICAgICAvLyBpbiBvcmRlciB0byBrZWVwIHRoZSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lYXIKICAgICAvLyBpbnRlcnBvbGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMgYmVsb3cgdGhlIHF1YW50aXphdGlvbiBlcnJvcgogICAgIC8vIHdlIG11c3Qgc2F0aXNmeToKQEAgLTEwNCw3ICsxMTQsNiBAQAogICAgIC8vIFNtaXRoLCBKLk8uIERpZ2l0YWwgQXVkaW8gUmVzYW1wbGluZyBIb21lIFBhZ2UKICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlLywgMjAxMS0wMy0yOQogICAgIC8vCi0gICAgaW50IG56ID0gNDsKIAogICAgIC8vICAgICAgICAgfCAwLjExMDIqKEEgLSA4LjcpICAgICAgICAgICAgICAgICAgICAgICAgIEEgPiA1MAogICAgIC8vICBiZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDw9IEEgPD0gNTAKQEAgLTEyMywzMyArMTMyLDMzIEBACiAgICAgLy8gICAxMDAgZEIgICAxMC4wNTYKICAgICBkb3VibGUgYmV0YSA9IDcuODY1OwogCi0KICAgICAvLyAyKm56YyA9IChBIC0gOCkgLyAoMi4yODUgKiBkdykKICAgICAvLyAgICAgIHdpdGggZHcgdGhlIHRyYW5zaXRpb24gd2lkdGggPSAyKnBpKmRGL0ZzCiAgICAgLy8KICAgICBpbnQgbnpjID0gODsKIAotICAgIC8vCi0gICAgLy8gRXhhbXBsZToKLSAgICAvLyA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZwotICAgIC8vIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6Ci0gICAgLy8gICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KLSAgICAvLyAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCi0gICAgLy8gIC4uLl9fX3xfX19fXwotICAgIC8vICAgICAgICB8ICAgICBcfAotICAgIC8vICAgICAgICB8IF9fX18vfFxfX19fCi0gICAgLy8gICAgICAgIHwvYWxpYXN8ICAgICBcCi0gICAgLy8gIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6Ci0gICAgLy8gICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgIC8qCisgICAgICogRXhhbXBsZToKKyAgICAgKiA0NC4xIEtIeiB0byA0OCBLSHogcmVzYW1wbGluZworICAgICAqIDEwMCBkQiByZWplY3Rpb24gYWJvdmUgMjggS0h6CisgICAgICogICAodGhlIHNwZWN0cnVtIHdpbGwgZm9sZCBhcm91bmQgMjQgS0h6IGFuZCB3ZSB3YW50IDEwMCBkQiByZWplY3Rpb24KKyAgICAgKiAgICBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGZvbGRpbmcgcmVhY2hlcyAyMCBLSHopCisgICAgICogIC4uLl9fX3xfX19fXworICAgICAqICAgICAgICB8ICAgICBcfAorICAgICAqICAgICAgICB8IF9fX18vfFxfX19fCisgICAgICogICAgICAgIHwvYWxpYXN8ICAgICBcCisgICAgICogIC0tLS0tLS8tLS0tLS0rLS0tLS0tXC0tLS0tLS0tLT4gS0h6CisgICAgICogICAgICAgMjAgICAgIDI0ICAgICAyOAorICAgICAqCisgICAgICogVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgorICAgICAqCisgICAgICogYmV0YSA9IDEwLjA1NgorICAgICAqIG56YyAgPSAyMAorICAgICAqLwogCi0gICAgLy8gVHJhbnNpdGlvbiBiYW5kIDggS0h6LCBvciBkdyA9IDEuMDQ3MgotICAgIC8vCi0gICAgLy8gYmV0YSA9IDEwLjA1NgotICAgIC8vIG56YyAgPSAyMAotICAgIC8vCi0KKyAgICBpbnQgTSA9IDEgPDwgNDsgLy8gbnVtYmVyIG9mIHBoYXNlcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6YjpwOnY6IikpICE9IC0xKSB7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOm06YjpwOnY6ejoiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOwpAQCAtMTY5LDEzICsxNzgsMjYgQEAKICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgIG56YyA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICAgIE0gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICBueiA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBNID0gMSA8PCBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsImZpeGVkIikpIGZvcm1hdCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsImZsb2F0IikpIGZvcm1hdCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChvcHRhcmcsICJmaXhlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZml4ZWQxNiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5jID0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZmxvYXQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnYic6CiAgICAgICAgICAgICAgICAgYmV0YSA9IGF0b2Yob3B0YXJnKTsKQEAgLTE5MywxMSArMjE1LDE0IEBACiAgICAgLy8gY3V0IG9mZiBmcmVxdWVuY3kgcmF0aW8gRmMvRnMKICAgICBkb3VibGUgRmNyID0gRmMgLyBGczsKIAotCiAgICAgLy8gdG90YWwgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyAob25lIHNpZGUpCi0gICAgY29uc3QgaW50IE0gPSAoMSA8PCBueik7CisKICAgICBjb25zdCBpbnQgTiA9IE0gKiBuemM7CiAKKyAgICAvLyBsZXJwICh3aGljaCBpcyBtb3N0IHVzZWZ1bCBpZiBNIGlzIGEgcG93ZXIgb2YgMikKKworICAgIGludCBueiA9IDA7IC8vIHJlY2FsY3VsYXRlIG56IGFzIHRoZSBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgTQorICAgIGZvciAoaW50IGkgPSBNLTEgOyBpOyBpPj49MSwgbnorKyk7CiAgICAgLy8gZ2VuZXJhdGUgdGhlIHJpZ2h0IGhhbGYgb2YgdGhlIGZpbHRlcgogICAgIGlmICghZGVidWcpIHsKICAgICAgICAgcHJpbnRmKCIvLyBjbWQtbGluZTogIik7CkBAIC0yMDcsNyArMjMyLDcgQEAKICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICBpZiAoIXBvbHlwaGFzZSkgewogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgTik7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0xFUlBfSU5UX0JJVFMgID0gJWQ7XG4iLCBueik7CisgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0lOVF9QSEFTRVMgICAgID0gJWQ7XG4iLCBNKTsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIG56Yyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCAyKm56Yypwb2x5Tik7CkBAIC0yMjQsNyArMjQ5LDcgQEAKICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTw9TSA7IGkrKykgeyAvLyBhbiBleHRyYSBzZXQgb2YgY29lZnMgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGZvciAoaW50IGo9MCA7IGo8bnpjIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgaW50IGl4ID0gaipNICsgaTsKLSAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICgyLjAgKiBNX1BJICogaXggKiBGY3IpIC8gKDEgPDwgbnopOworICAgICAgICAgICAgICAgIGRvdWJsZSB4ID0gKDIuMCAqIE1fUEkgKiBpeCAqIEZjcikgLyBNOwogICAgICAgICAgICAgICAgIGRvdWJsZSB5ID0ga2Fpc2VyKGl4K04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOwogICAgICAgICAgICAgICAgIHkgKj0gYXR0ZW47CiAKQEAgLTIzMiwxMSArMjU3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAgICIpOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyAiLCB5LCBkZWJ1ZyA/ICIsIiA6ICJmLCIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1NCw5ICsyODEsMTIgQEAKICAgICAgICAgICAgICAgICBkb3VibGUgeSA9IGthaXNlcihpK04sIDIqTiwgYmV0YSkgKiBzaW5jKHgpICogMi4wICogRmNyOzsKICAgICAgICAgICAgICAgICB5ICo9IGF0dGVuOwogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSBmbG9vcih5ICogKCgxVUxMPDwobmMtMSkpKSArIDAuNSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5aSA+PSAoMUxMPDwobmMtMSkpKSB5aSA9ICgxTEw8PChuYy0xKSktMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMiLCB5LCBkZWJ1ZyA/ICIiIDogImYiKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNzcsNSArMzA3LDMgQEAKIH0KIAogLy8gaHR0cDovL3d3dy5jc2VlLnVtYmMuZWR1L2hlbHAvc291bmQvQUZzcC1WMlIxL2h0bWwvYXVkaW8vUmVzYW1wQXVkaW8uaHRtbAotCi0K